Mercurial > sci
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/util.c Tue Jul 12 20:20:51 2022 +0200 @@ -0,0 +1,187 @@ +/* + * 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; +}