Mercurial > sci
diff libsci/util.c @ 33:1d0ddf9e6efd
misc: general documentation
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 04 Aug 2022 16:47:10 +0200 |
parents | lib/util.c@081e1c258e64 |
children | e52c762d8ba8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libsci/util.c Thu Aug 04 16:47:10 2022 +0200 @@ -0,0 +1,215 @@ +/* + * util.c -- miscellaneous utilities + * + * Copyright (c) 2021-2022 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 <errno.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))) + util_die("malloc: %s\n", strerror(errno)); + + return ret; +} + +void * +util_calloc(size_t n, size_t size) +{ + void *ret; + + if (!(ret = calloc(n, size))) + util_die("calloc: %s\n", strerror(errno)); + + return ret; +} + +void * +util_realloc(void *ptr, size_t size) +{ + void *ret; + + if (!(ret = realloc(ptr, size)) && size) + util_die("realloc: %s\n", strerror(errno)); + + return ret; +} + +void * +util_memdup(const void *ptr, size_t size) +{ + void *ret; + + if (!(ret = malloc(size))) + util_die("malloc: %s\n", strerror(errno)); + + return memcpy(ret, ptr, size); +} + +char * +util_strdup(const char *src) +{ + char *ret; + + if (!(ret = strdup(src))) + util_die("strdup: %s\n", strerror(errno)); + + return ret; +} + +char * +util_strndup(const char *src, size_t n) +{ + assert(src); + + char *ret; + + if (!(ret = strndup(src, n))) + util_die("strndup: %s\n", strerror(errno)); + + return ret; +} + +char * +util_basename(const char *str) +{ + static char ret[PATH_MAX]; + char tmp[PATH_MAX]; + + util_strlcpy(tmp, str, sizeof (tmp)); + util_strlcpy(ret, basename(tmp), sizeof (ret)); + + return ret; +} + +char * +util_dirname(const char *str) +{ + static char ret[PATH_MAX]; + char tmp[PATH_MAX]; + + util_strlcpy(tmp, str, sizeof (tmp)); + util_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))) + util_die("fmemopen: %s\n", strerror(errno)); + + return fp; +} + +FILE * +util_open_memstream(char **out, size_t *outsz) +{ + assert(out); + assert(outsz); + + FILE *fp; + + if (!(fp = open_memstream(out, outsz))) + util_die("open_memstream: %s\n", strerror(errno)); + + return fp; +} + +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; +} + +void +util_die(const char *fmt, ...) +{ + assert(fmt); + + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + exit(1); +} + +json_t * +util_json_pack(const char *fmt, ...) +{ + va_list ap; + json_t *doc; + json_error_t err; + + va_start(ap, fmt); + doc = json_vpack_ex(&err, 0, fmt, ap); + va_end(ap); + + if (!doc) + util_die("json_vpack_ex: %s\n", err.text); + + return doc; +} + +char * +util_json_dump(const json_t *json) +{ + assert(json); + + char *ret; + + if (!(ret = json_dumps(json, JSON_COMPACT))) + util_die("json_dump: %s\n", strerror(ENOMEM)); + + return ret; +}