annotate util.c @ 0:f1de39079243

misc: initial import
author David Demelier <markand@malikania.fr>
date Mon, 07 Jun 2021 09:41:37 +0200
parents
children 5afdb14df924
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 *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr>
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
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <err.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <libgen.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <limits.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <stdarg.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdio.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdlib.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <string.h>
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "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 void *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 util_malloc(size_t size)
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 *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 if (!(ret = malloc(size)))
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 err(1, "malloc");
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 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 }
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 void *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 util_calloc(size_t n, size_t size)
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 void *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 if (!(ret = calloc(n, size)))
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 err(1, "calloc");
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 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 }
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 void *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 util_realloc(void *ptr, size_t size)
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 void *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 if (!(ret = realloc(ptr, size)) && size)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 err(1, "realloc");
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 void *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 util_memdup(const void *ptr, size_t size)
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 void *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 if (!(ret = malloc(size)))
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 err(1, "malloc");
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 return memcpy(ret, ptr, size);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 util_strdup(const char *src)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 char *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 if (!(ret = strdup(src)))
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 err(1, "strdup");
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 util_strndup(const char *src, size_t n)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 assert(src);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 char *ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 if (!(ret = strndup(src, n)))
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 err(1, "strndup");
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 util_basename(const char *str)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 static char ret[PATH_MAX];
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 char tmp[PATH_MAX];
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 strlcpy(tmp, str, sizeof (tmp));
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 strlcpy(ret, basename(tmp), sizeof (ret));
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 util_dirname(const char *str)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 static char ret[PATH_MAX];
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 char tmp[PATH_MAX];
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 strlcpy(tmp, str, sizeof (tmp));
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 strlcpy(ret, dirname(tmp), sizeof (ret));
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 return ret;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 size_t
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 util_split(char *line, const char **args, size_t max, char delim)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 size_t idx;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (!*line)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 return 0;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 for (idx = 0; idx < max; ++idx) {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 char *sp = strchr(line, delim);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 if (!sp || idx + 1 >= max) {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 args[idx++] = line;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 break;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 *sp = '\0';
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 args[idx] = line;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 line = sp + 1;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 return idx;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 }
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 char *
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 util_printf(char *buf, size_t bufsz, const char *fmt, ...)
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 {
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 assert(buf);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 assert(bufsz);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 assert(fmt);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 va_list ap;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 va_start(ap, fmt);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 vsnprintf(buf, bufsz, fmt, ap);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 va_end(ap);
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 return buf;
f1de39079243 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 }