Mercurial > sci
annotate lib/util.c @ 18:600204c31bf0
misc: refactor
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 12 Jul 2022 20:20:51 +0200 |
parents | util.c@215c0c3b3609 |
children | de4bf839b565 |
rev | line source |
---|---|
0 | 1 /* |
2 * util.c -- miscellaneous utilities | |
3 * | |
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr> | |
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> |
21 #include <err.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_malloc(size_t size) | |
35 { | |
36 void *ret; | |
37 | |
38 if (!(ret = malloc(size))) | |
39 err(1, "malloc"); | |
40 | |
41 return ret; | |
42 } | |
43 | |
44 void * | |
45 util_calloc(size_t n, size_t size) | |
46 { | |
47 void *ret; | |
48 | |
49 if (!(ret = calloc(n, size))) | |
50 err(1, "calloc"); | |
51 | |
52 return ret; | |
53 } | |
54 | |
55 void * | |
56 util_realloc(void *ptr, size_t size) | |
57 { | |
58 void *ret; | |
59 | |
60 if (!(ret = realloc(ptr, size)) && size) | |
61 err(1, "realloc"); | |
62 | |
63 return ret; | |
64 } | |
65 | |
66 void * | |
67 util_memdup(const void *ptr, size_t size) | |
68 { | |
69 void *ret; | |
70 | |
71 if (!(ret = malloc(size))) | |
72 err(1, "malloc"); | |
73 | |
74 return memcpy(ret, ptr, size); | |
75 } | |
76 | |
77 char * | |
78 util_strdup(const char *src) | |
79 { | |
80 char *ret; | |
81 | |
82 if (!(ret = strdup(src))) | |
83 err(1, "strdup"); | |
84 | |
85 return ret; | |
86 } | |
87 | |
88 char * | |
89 util_strndup(const char *src, size_t n) | |
90 { | |
91 assert(src); | |
92 | |
93 char *ret; | |
94 | |
95 if (!(ret = strndup(src, n))) | |
96 err(1, "strndup"); | |
97 | |
98 return ret; | |
99 } | |
100 | |
101 char * | |
102 util_basename(const char *str) | |
103 { | |
104 static char ret[PATH_MAX]; | |
105 char tmp[PATH_MAX]; | |
106 | |
107 strlcpy(tmp, str, sizeof (tmp)); | |
108 strlcpy(ret, basename(tmp), sizeof (ret)); | |
109 | |
110 return ret; | |
111 } | |
112 | |
113 char * | |
114 util_dirname(const char *str) | |
115 { | |
116 static char ret[PATH_MAX]; | |
117 char tmp[PATH_MAX]; | |
118 | |
119 strlcpy(tmp, str, sizeof (tmp)); | |
120 strlcpy(ret, dirname(tmp), sizeof (ret)); | |
121 | |
122 return ret; | |
123 } | |
124 | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
125 FILE * |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
126 util_fmemopen(void *buf, size_t size, const char *mode) |
0 | 127 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
128 FILE *fp; |
0 | 129 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
130 if (!(fp = fmemopen(buf, size, mode))) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
131 err(1, "fmemopen"); |
0 | 132 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
133 return fp; |
0 | 134 } |
135 | |
136 char * | |
137 util_printf(char *buf, size_t bufsz, const char *fmt, ...) | |
138 { | |
139 assert(buf); | |
140 assert(bufsz); | |
141 assert(fmt); | |
142 | |
143 va_list ap; | |
144 | |
145 va_start(ap, fmt); | |
146 vsnprintf(buf, bufsz, fmt, ap); | |
147 va_end(ap); | |
148 | |
149 return buf; | |
150 } | |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
151 |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
152 char * |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
153 util_read(const char *path) |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
154 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
155 int fd; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
156 struct stat st; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
157 char *ret; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
158 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
159 if ((fd = open(path, O_RDONLY)) < 0) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
160 return NULL; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
161 if (fstat(fd, &st) < 0) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
162 return close(fd), NULL; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
163 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
164 ret = util_calloc(1, st.st_size + 1); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
165 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
166 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
|
167 free(ret); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
168 ret = NULL; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
169 } |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
170 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
171 close(fd); |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
172 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
173 return ret; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
174 } |
2
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
175 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
176 const char * |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
177 util_path(const char *filename) |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
178 { |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
179 assert(filename); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
180 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
181 /* Build path to the template file. */ |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
182 static char path[PATH_MAX]; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
183 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
184 //snprintf(path, sizeof (path), "%s/%s", config.themedir, filename); |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
185 |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
186 return path; |
5fa3d2f479b2
sci: initial upload support
David Demelier <markand@malikania.fr>
parents:
1
diff
changeset
|
187 } |