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