Mercurial > sci
annotate libsci/util.c @ 66:5076be758687 0.1.0
misc: update before 0.1.0 release
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 20 Aug 2022 10:36:55 +0200 |
parents | 67470b67e460 |
children | 71cd8447e3a4 |
rev | line source |
---|---|
0 | 1 /* |
2 * util.c -- miscellaneous utilities | |
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 | 5 * |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
19 #include <sys/stat.h> |
0 | 20 #include <assert.h> |
30 | 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 | 23 #include <libgen.h> |
24 #include <limits.h> | |
25 #include <stdarg.h> | |
26 #include <stdio.h> | |
27 #include <stdlib.h> | |
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 | 30 |
31 #include "util.h" | |
32 | |
33 void * | |
34 util_calloc(size_t n, size_t size) | |
35 { | |
36 void *ret; | |
37 | |
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 | 40 |
41 return ret; | |
42 } | |
43 | |
44 char * | |
45 util_strdup(const char *src) | |
46 { | |
47 char *ret; | |
48 | |
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 | 51 |
52 return ret; | |
53 } | |
54 | |
55 char * | |
56 util_basename(const char *str) | |
57 { | |
58 static char ret[PATH_MAX]; | |
59 char tmp[PATH_MAX]; | |
60 | |
20 | 61 util_strlcpy(tmp, str, sizeof (tmp)); |
62 util_strlcpy(ret, basename(tmp), sizeof (ret)); | |
0 | 63 |
64 return ret; | |
65 } | |
66 | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
67 FILE * |
30 | 68 util_open_memstream(char **out, size_t *outsz) |
0 | 69 { |
30 | 70 assert(out); |
71 assert(outsz); | |
0 | 72 |
30 | 73 FILE *fp; |
0 | 74 |
30 | 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 | 77 |
30 | 78 return fp; |
0 | 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 | 105 void |
106 util_die(const char *fmt, ...) | |
107 { | |
108 assert(fmt); | |
109 | |
110 va_list ap; | |
111 | |
112 va_start(ap, fmt); | |
113 vfprintf(stderr, fmt, ap); | |
114 va_end(ap); | |
115 exit(1); | |
116 } | |
30 | 117 |
118 json_t * | |
119 util_json_pack(const char *fmt, ...) | |
120 { | |
121 va_list ap; | |
122 json_t *doc; | |
123 json_error_t err; | |
124 | |
125 va_start(ap, fmt); | |
126 doc = json_vpack_ex(&err, 0, fmt, ap); | |
127 va_end(ap); | |
128 | |
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 | 131 |
132 return doc; | |
133 } | |
134 | |
135 char * | |
136 util_json_dump(const json_t *json) | |
137 { | |
138 assert(json); | |
139 | |
140 char *ret; | |
141 | |
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 | 144 |
145 return ret; | |
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 } |