From a228788769d7e3c71154606609a13eafb03a5fc2 Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@tavianator.com>
Date: Thu, 29 Feb 2024 13:16:14 -0500
Subject: diag: New bfs_diag() macro

---
 src/diag.c | 17 ++++++++++++++---
 src/diag.h | 13 +++++++++++++
 2 files changed, 27 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/diag.c b/src/diag.c
index efa7ebd..656fa89 100644
--- a/src/diag.c
+++ b/src/diag.c
@@ -14,15 +14,26 @@
 #include <stdlib.h>
 #include <string.h>
 
-noreturn void bfs_abortf(const struct bfs_loc *loc, const char *format, ...) {
+/** bfs_diagf() implementation. */
+attr(printf(2, 0))
+static void bfs_vdiagf(const struct bfs_loc *loc, const char *format, va_list args) {
 	fprintf(stderr, "%s: %s@%s:%d: ", xgetprogname(), loc->func, loc->file, loc->line);
+	vfprintf(stderr, format, args);
+	fprintf(stderr, "\n");
+}
 
+void bfs_diagf(const struct bfs_loc *loc, const char *format, ...) {
 	va_list args;
 	va_start(args, format);
-	vfprintf(stderr, format, args);
+	bfs_vdiagf(loc, format, args);
 	va_end(args);
+}
 
-	fprintf(stderr, "\n");
+noreturn void bfs_abortf(const struct bfs_loc *loc, const char *format, ...) {
+	va_list args;
+	va_start(args, format);
+	bfs_vdiagf(loc, format, args);
+	va_end(args);
 
 	abort();
 }
diff --git a/src/diag.h b/src/diag.h
index 791c065..4054c48 100644
--- a/src/diag.h
+++ b/src/diag.h
@@ -41,6 +41,19 @@ struct bfs_loc {
 #  define bfs_location() (&(const struct bfs_loc)BFS_LOC_INIT)
 #endif
 
+/**
+ * Print a low-level diagnostic message to standard error, formatted like
+ *
+ *     bfs: func@src/file.c:0: Message
+ */
+attr(printf(2, 3))
+void bfs_diagf(const struct bfs_loc *loc, const char *format, ...);
+
+/**
+ * Unconditional diagnostic message.
+ */
+#define bfs_diag(...) bfs_diagf(bfs_location(), __VA_ARGS__)
+
 /**
  * Print a message to standard error and abort.
  */
-- 
cgit v1.2.3