diff options
author | flu0r1ne <flu0r1ne@flu0r1ne.net> | 2022-10-30 19:30:29 -0500 |
---|---|---|
committer | flu0r1ne <flu0r1ne@flu0r1ne.net> | 2022-10-30 19:30:29 -0500 |
commit | 20e52f326cdf1b6c2ca9b2c0b5be07637d9196d2 (patch) | |
tree | 1d957cfd5ca8b9ccd0a91fa5d5415599edd241d1 /util/err.c | |
download | qidx-20e52f326cdf1b6c2ca9b2c0b5be07637d9196d2.tar.xz qidx-20e52f326cdf1b6c2ca9b2c0b5be07637d9196d2.zip |
Initial commit
Diffstat (limited to 'util/err.c')
-rw-r--r-- | util/err.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/util/err.c b/util/err.c new file mode 100644 index 0000000..1f3fb6d --- /dev/null +++ b/util/err.c @@ -0,0 +1,80 @@ +#include "util.h" + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> + +#define FORMAT_MAX_SIZE 1024 + +extern int errno; + +void NORETURN die(char const * format, ...) { + va_list vargs; + va_start (vargs, format); + + vfprintf(stderr, format, vargs); + fprintf(stderr, "\n"); + + va_end(vargs); + exit(1); +} + +void err(char const * format, ...) { + va_list vargs; + va_start (vargs, format); + + vfprintf(stderr, format, vargs); + fprintf(stderr, "\n"); + + va_end(vargs); +} + +void format_with_errno(char * buf, size_t n, char const * format) { + char const * errstr = strerror(errno); + char fmt_err[256]; + + size_t i = 0, + j = 0; + while(errstr[j] && i < sizeof(fmt_err) - 1) { + if((fmt_err[i++] = errstr[j++]) != '%') + continue; + + if(i < sizeof(fmt_err) - 1) { + fmt_err[i++] = '%'; + } else { + i--; + } + } + + fmt_err[i] = '\0'; + + snprintf(buf, n, "%s: %s", format, fmt_err); +} + + +void NORETURN die_errno(char const * format, ...) { + va_list vargs; + va_start (vargs, format); + + char buf[FORMAT_MAX_SIZE]; + format_with_errno(buf, sizeof(buf), format); + vfprintf(stderr, buf, vargs); + fprintf(stderr, "\n"); + exit(1); + + va_end(vargs); +} + +void err_errno(char const * format, ...) { + va_list vargs; + va_start (vargs, format); + + char buf[FORMAT_MAX_SIZE]; + + format_with_errno(buf, sizeof(buf), format); + vfprintf(stderr, buf, vargs); + fprintf(stderr, "\n"); + + va_end(vargs); +} |