diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/dive.h | 2 | ||||
-rw-r--r-- | core/errorhelper.c | 38 |
2 files changed, 10 insertions, 30 deletions
diff --git a/core/dive.h b/core/dive.h index c155abbfd..3793cc359 100644 --- a/core/dive.h +++ b/core/dive.h @@ -719,7 +719,7 @@ extern "C" { extern int report_error(const char *fmt, ...); extern const char *get_error_string(void); -extern void set_error_cb(void(*cb)(void)); +extern void set_error_cb(void(*cb)(char *)); // Callback takes ownership of passed string extern struct dive *find_dive_including(timestamp_t when); extern bool dive_within_time_range(struct dive *dive, timestamp_t when, timestamp_t offset); diff --git a/core/errorhelper.c b/core/errorhelper.c index 0f544efb6..5390c4c20 100644 --- a/core/errorhelper.c +++ b/core/errorhelper.c @@ -8,43 +8,23 @@ #define VA_BUF(b, fmt) do { va_list args; va_start(args, fmt); put_vformat(b, fmt, args); va_end(args); } while (0) -static struct membuffer error_string_buffer = { 0 }; -static void (*error_cb)(void) = NULL; -/* - * Note that the act of "getting" the error string - * buffer doesn't de-allocate the buffer, but it does - * set the buffer length to zero, so that any future - * error reports will overwrite the string rather than - * append to it. - */ -const char *get_error_string(void) -{ - const char *str; - - if (!error_string_buffer.len) - return ""; - str = mb_cstring(&error_string_buffer); - error_string_buffer.len = 0; - return str; -} +static void (*error_cb)(char *) = NULL; int report_error(const char *fmt, ...) { - struct membuffer *buf = &error_string_buffer; + struct membuffer buf = { 0 }; - /* Previous unprinted errors? Add a newline in between */ - if (buf->len) - put_bytes(buf, "\n", 1); - VA_BUF(buf, fmt); - mb_cstring(buf); + /* if there is no error callback registered, don't produce errors */ + if (!error_cb) + return -1; - /* if an error callback is registered, call it */ - if (error_cb) - error_cb(); + VA_BUF(&buf, fmt); + mb_cstring(&buf); + error_cb(detach_buffer(&buf)); return -1; } -void set_error_cb(void(*cb)(void)) { +void set_error_cb(void(*cb)(char *)) { error_cb = cb; } |