annotate libsci/util.h @ 85:cf49ab595e2e default tip @

sciworkerd: avoid spawning several tasks
author David Demelier <markand@malikania.fr>
date Thu, 09 Mar 2023 10:43:48 +0100
parents 71cd8447e3a4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * util.h -- miscellaneous utilities
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
80
71cd8447e3a4 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 63
diff changeset
4 * Copyright (c) 2021-2023 David Demelier <markand@malikania.fr>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
19 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
20 * \file util.h
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
21 * \brief Miscellaneous utilities.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
22 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
23 * Most of the allocations functions will exit with code 1 on memory
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
24 * exhaustion.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
25 */
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
26
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #ifndef SCI_UTIL_H
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #define SCI_UTIL_H
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <stddef.h>
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
31 #include <stdio.h>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
33 #include <jansson.h>
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
34
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
35 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
36 * Compute fixed size array length.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
37 */
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 #define UTIL_SIZE(x) (sizeof (x) / sizeof (x[0]))
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
40 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
41 * Wrap calloc or exit with code 1.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
42 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
43 * \param n the number of items
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
44 * \param w the bytes per item
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
45 * \return the pointer to the memory
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
46 */
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 void *
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
48 util_calloc(size_t n, size_t w);
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
50 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
51 * Wrap strdup or exit with code 1.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
52 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
53 * \pre str != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
54 * \param str the string to duplicate
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
55 * \return the copied string
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
56 */
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 char *
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
58 util_strdup(const char *str);
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
60 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
61 * Get the base name component from a path.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
62 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
63 * \pre path != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
64 * \param path the path to extract
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
65 * \return a static thread local value containing the base name
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
66 */
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 char *
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
68 util_basename(const char *path);
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
70 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
71 * Wrap open_memstream or exit with code 1.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
72 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
73 * \pre out != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
74 * \pre outsz != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
75 * \param out the destination string
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
76 * \param outsz the destination string length
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
77 * \return a non-NULL file pointer
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
78 */
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
79 FILE *
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
80 util_open_memstream(char **out, size_t *outsz);
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
82 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
83 * Read the whole content from the given file.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
84 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
85 * \pre path != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
86 * \param path the file to read
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
87 * \return the file content or NULL on error (and errno is set)
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
88 */
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
89 char *
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
90 util_read(const char *);
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
91
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
92 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
93 * Write an error message to error output and exit with code 1.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
94 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
95 * \pre fmt != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
96 * \param fmt the format string
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
97 */
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
98 void
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
99 util_die(const char *fmt, ...);
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
100
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
101 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
102 * Wrap json_pack or exit with code 1.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
103 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
104 * \pre fmt != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
105 * \param fmt the json_pack format string and its arguments
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
106 * \return a non-NULL JSON document
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
107 */
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
108 json_t *
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
109 util_json_pack(const char *fmt, ...);
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
110
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
111 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
112 * Wrap json_dump or exit with code 1.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
113 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
114 * \pre json != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
115 * \param json the JSON value to transform to string
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
116 */
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
117 char *
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
118 util_json_dump(const json_t *json);
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
119
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
120 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
121 * OpenBSD strlcpy extension builtin.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
122 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
123 * \pre dst != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
124 * \pre src != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
125 * \param dst the destination string
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
126 * \param src the source string
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
127 * \param size the maximum size in dst
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
128 * \return the number of bytes written
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
129 */
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
130 size_t
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
131 util_strlcpy(char *dst, const char *src, size_t size);
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
132
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
133 /**
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
134 * OpenBSD strtonum extension builtin.
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
135 *
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
136 * \pre str != NULL
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
137 * \param str the string to convert
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
138 * \param min the lower bound (included)
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
139 * \param max the upper bound (included)
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
140 * \param errstr the error string pointer to be set on error (not dynamically allocated)
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
141 * \return the converted value
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
142 */
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
143 long long
34
e52c762d8ba8 misc: cleanups
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
144 util_strtonum(const char *str, long long min, long long max, const char **errstr);
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
145
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
146 /**
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
147 * Wrap getopt(3) but handle invalid option or missing value with a predefined
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
148 * message.
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
149 *
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
150 * \param argc number of arguments
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
151 * \param argv arguments
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
152 * \param optstring the string format
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
153 * \return option or -1 when complete
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
154 */
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
155 int
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
156 util_getopt(int argc, char * const *argv, const char *optstring);
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
157
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 #endif /* !SCI_UTIL_H */