comparison 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
comparison
equal deleted inserted replaced
17:40fe70256fb0 18:600204c31bf0
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 <sys/stat.h>
20 #include <assert.h>
21 #include <err.h>
22 #include <fcntl.h>
23 #include <libgen.h>
24 #include <limits.h>
25 #include <stdarg.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
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
125 FILE *
126 util_fmemopen(void *buf, size_t size, const char *mode)
127 {
128 FILE *fp;
129
130 if (!(fp = fmemopen(buf, size, mode)))
131 err(1, "fmemopen");
132
133 return fp;
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 }
151
152 char *
153 util_read(const char *path)
154 {
155 int fd;
156 struct stat st;
157 char *ret;
158
159 if ((fd = open(path, O_RDONLY)) < 0)
160 return NULL;
161 if (fstat(fd, &st) < 0)
162 return close(fd), NULL;
163
164 ret = util_calloc(1, st.st_size + 1);
165
166 if (read(fd, ret, st.st_size) != st.st_size) {
167 free(ret);
168 ret = NULL;
169 }
170
171 close(fd);
172
173 return ret;
174 }
175
176 const char *
177 util_path(const char *filename)
178 {
179 assert(filename);
180
181 /* Build path to the template file. */
182 static char path[PATH_MAX];
183
184 //snprintf(path, sizeof (path), "%s/%s", config.themedir, filename);
185
186 return path;
187 }