aboutsummaryrefslogtreecommitdiff
path: root/src/common/cerr.c
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-02-13 13:02:28 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-02-13 13:11:47 +0100
commit79e6af86ca526d5fb56af6f6ca3da713e3a5e9f9 (patch)
tree752f1c26d1f122dcf58374ac78db109c9578be45 /src/common/cerr.c
Genesis commit
Diffstat (limited to 'src/common/cerr.c')
-rw-r--r--src/common/cerr.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/common/cerr.c b/src/common/cerr.c
new file mode 100644
index 0000000..0032795
--- /dev/null
+++ b/src/common/cerr.c
@@ -0,0 +1,73 @@
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "cerr.h"
+
+#define SGR_BOLD "\33[1m"
+#define SGR_DONE "\33[0m"
+
+static bool color;
+static const char *progname;
+
+void
+cerrinit(const char *s)
+{
+ const char *p = strrchr(s, '/');
+ progname = p ? p + 1 : s;
+
+ if (isatty(STDOUT_FILENO)) {
+ const char *ev = getenv("NO_COLOR");
+ if (!ev || !*ev)
+ color = true;
+ }
+}
+
+void
+die(const char *fmt, ...)
+{
+ va_list ap;
+ int e = errno;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "%s%s:%s ", color ? SGR_BOLD : "", progname,
+ color ? SGR_DONE : "");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ": %s\n", strerror(e));
+ va_end(ap);
+
+ exit(EXIT_FAILURE);
+}
+
+void
+diex(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "%s%s:%s ", color ? SGR_BOLD : "", progname,
+ color ? SGR_DONE : "");
+ vfprintf(stderr, fmt, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+
+ exit(EXIT_FAILURE);
+}
+
+void
+die_with_off(const char *file, size_t off, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "%s%s:%s:%zu:%s ", color ? SGR_BOLD : "", progname, file,
+ off, color ? SGR_DONE : "");
+ vfprintf(stderr, fmt, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+
+ exit(EXIT_FAILURE);
+}