annotate libsci/util.c @ 73:b0d1166de7d3

themes: improve status
author David Demelier <markand@malikania.fr>
date Tue, 24 Jan 2023 10:51:48 +0100
parents 67470b67e460
children 71cd8447e3a4
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.c -- miscellaneous utilities
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
32
081e1c258e64 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
4 * Copyright (c) 2021-2022 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
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
19 #include <sys/stat.h>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <assert.h>
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
21 #include <errno.h>
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
22 #include <fcntl.h>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <libgen.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <limits.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdarg.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <stdio.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <stdlib.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <string.h>
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
29 #include <unistd.h>
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "util.h"
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 void *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 util_calloc(size_t n, size_t size)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 void *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 if (!(ret = calloc(n, size)))
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
39 util_die("abort: calloc: %s\n", strerror(errno));
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 util_strdup(const char *src)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 char *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 if (!(ret = strdup(src)))
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
50 util_die("abort: strdup: %s\n", strerror(errno));
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 util_basename(const char *str)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 static char ret[PATH_MAX];
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 char tmp[PATH_MAX];
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
61 util_strlcpy(tmp, str, sizeof (tmp));
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
62 util_strlcpy(ret, basename(tmp), sizeof (ret));
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
67 FILE *
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
68 util_open_memstream(char **out, size_t *outsz)
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 {
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
70 assert(out);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
71 assert(outsz);
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
73 FILE *fp;
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
75 if (!(fp = open_memstream(out, outsz)))
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
76 util_die("abort: open_memstream: %s\n", strerror(errno));
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
78 return fp;
0
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 }
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
80
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
81 char *
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
82 util_read(const char *path)
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
83 {
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
84 int fd;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
85 struct stat st;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
86 char *ret;
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
87
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
88 if ((fd = open(path, O_RDONLY)) < 0)
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
89 return NULL;
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
90 if (fstat(fd, &st) < 0)
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
91 return close(fd), NULL;
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
92
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
93 ret = util_calloc(1, st.st_size + 1);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
94
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
95 if (read(fd, ret, st.st_size) != st.st_size) {
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
96 free(ret);
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
97 ret = NULL;
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
98 }
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
99
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
100 close(fd);
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
101
3
215c0c3b3609 misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
102 return ret;
1
5afdb14df924 sci: add support for storing results
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
103 }
2
5fa3d2f479b2 sci: initial upload support
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
104
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
105 void
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
106 util_die(const char *fmt, ...)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
107 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
108 assert(fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
109
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
110 va_list ap;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
111
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
112 va_start(ap, fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
113 vfprintf(stderr, fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
114 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
115 exit(1);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents: 18
diff changeset
116 }
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
117
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
118 json_t *
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
119 util_json_pack(const char *fmt, ...)
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
120 {
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
121 va_list ap;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
122 json_t *doc;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
123 json_error_t err;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
124
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
125 va_start(ap, fmt);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
126 doc = json_vpack_ex(&err, 0, fmt, ap);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
127 va_end(ap);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
128
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
129 if (!doc)
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
130 util_die("abort: json_vpack_ex: %s\n", err.text);
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
131
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
132 return doc;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
133 }
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
134
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
135 char *
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
136 util_json_dump(const json_t *json)
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
137 {
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
138 assert(json);
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
139
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
140 char *ret;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
141
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
142 if (!(ret = json_dumps(json, JSON_COMPACT)))
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
143 util_die("abort: json_dump: %s\n", strerror(ENOMEM));
30
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
144
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
145 return ret;
43333d18e4b8 scid: document theme
David Demelier <markand@malikania.fr>
parents: 26
diff changeset
146 }
53
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
147
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
148 int
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
149 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
150 {
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
151 int ch;
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
152
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
153 opterr = 0;
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 switch ((ch = getopt(argc, argv, optstring))) {
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
156 case '?':
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
157 util_die("abort: invalid option: %c\n", ch);
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
158 break;
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
159 case ':':
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
160 util_die("abort: missing value for option %c\n", ch);
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
161 break;
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
162 default:
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
163 break;
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
164 }
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
165
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
166 return ch;
319979427566 misc: refactor using util_getopt
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
167 }