Mercurial > sci
view 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 |
line wrap: on
line source
/* * util.c -- miscellaneous utilities * * Copyright (c) 2021 David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <sys/stat.h> #include <assert.h> #include <err.h> #include <fcntl.h> #include <libgen.h> #include <limits.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "util.h" void * util_malloc(size_t size) { void *ret; if (!(ret = malloc(size))) err(1, "malloc"); return ret; } void * util_calloc(size_t n, size_t size) { void *ret; if (!(ret = calloc(n, size))) err(1, "calloc"); return ret; } void * util_realloc(void *ptr, size_t size) { void *ret; if (!(ret = realloc(ptr, size)) && size) err(1, "realloc"); return ret; } void * util_memdup(const void *ptr, size_t size) { void *ret; if (!(ret = malloc(size))) err(1, "malloc"); return memcpy(ret, ptr, size); } char * util_strdup(const char *src) { char *ret; if (!(ret = strdup(src))) err(1, "strdup"); return ret; } char * util_strndup(const char *src, size_t n) { assert(src); char *ret; if (!(ret = strndup(src, n))) err(1, "strndup"); return ret; } char * util_basename(const char *str) { static char ret[PATH_MAX]; char tmp[PATH_MAX]; strlcpy(tmp, str, sizeof (tmp)); strlcpy(ret, basename(tmp), sizeof (ret)); return ret; } char * util_dirname(const char *str) { static char ret[PATH_MAX]; char tmp[PATH_MAX]; strlcpy(tmp, str, sizeof (tmp)); strlcpy(ret, dirname(tmp), sizeof (ret)); return ret; } FILE * util_fmemopen(void *buf, size_t size, const char *mode) { FILE *fp; if (!(fp = fmemopen(buf, size, mode))) err(1, "fmemopen"); return fp; } char * util_printf(char *buf, size_t bufsz, const char *fmt, ...) { assert(buf); assert(bufsz); assert(fmt); va_list ap; va_start(ap, fmt); vsnprintf(buf, bufsz, fmt, ap); va_end(ap); return buf; } char * util_read(const char *path) { int fd; struct stat st; char *ret; if ((fd = open(path, O_RDONLY)) < 0) return NULL; if (fstat(fd, &st) < 0) return close(fd), NULL; ret = util_calloc(1, st.st_size + 1); if (read(fd, ret, st.st_size) != st.st_size) { free(ret); ret = NULL; } close(fd); return ret; } const char * util_path(const char *filename) { assert(filename); /* Build path to the template file. */ static char path[PATH_MAX]; //snprintf(path, sizeof (path), "%s/%s", config.themedir, filename); return path; }