Mercurial > sci
view libsci/util.c @ 85:cf49ab595e2e default tip @
sciworkerd: avoid spawning several tasks
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 09 Mar 2023 10:43:48 +0100 |
parents | 71cd8447e3a4 |
children |
line wrap: on
line source
/* * util.c -- miscellaneous utilities * * Copyright (c) 2021-2023 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_calloc(size_t n, size_t size) { void *ret; if (!(ret = calloc(n, size))) util_die("abort: calloc: %s\n", strerror(errno)); return ret; } char * util_strdup(const char *src) { char *ret; if (!(ret = strdup(src))) util_die("abort: strdup: %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; } FILE * util_open_memstream(char **out, size_t *outsz) { assert(out); assert(outsz); FILE *fp; if (!(fp = open_memstream(out, outsz))) util_die("abort: 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("abort: 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("abort: json_dump: %s\n", strerror(ENOMEM)); return ret; } int util_getopt(int argc, char * const *argv, const char *optstring) { int ch; opterr = 0; switch ((ch = getopt(argc, argv, optstring))) { case '?': util_die("abort: invalid option: %c\n", ch); break; case ':': util_die("abort: missing value for option %c\n", ch); break; default: break; } return ch; }