diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | serd/serd.h | 22 | ||||
-rw-r--r-- | src/world.c | 16 | ||||
-rw-r--r-- | src/world.h | 3 |
4 files changed, 40 insertions, 2 deletions
@@ -12,6 +12,7 @@ serd (1.0.0) unstable; * Use a fixed-size reader stack * Simplify writer style options * Simplify streaming API and improve pretty printing + * Add logging functions to public API -- David Robillard <d@drobilla.net> Sat, 19 Jan 2019 13:31:12 +0100 diff --git a/serd/serd.h b/serd/serd.h index 9b3e35f6..ec5d9228 100644 --- a/serd/serd.h +++ b/serd/serd.h @@ -42,6 +42,12 @@ # define SERD_API #endif +#if defined(__GNUC__) +# define SERD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SERD_LOG_FUNC(fmt, arg1) +#endif + #ifdef __cplusplus extern "C" { #endif @@ -823,6 +829,22 @@ serd_world_set_message_sink(SerdWorld* world, SerdMessageSink msg_sink, void* handle); +/// Write a message to the log +SERD_API +SerdStatus +serd_world_log(const SerdWorld* world, const SerdMessage* msg); + +/// Write a message to the log +SERD_API +SERD_LOG_FUNC(5, 6) +SerdStatus +serd_world_logf(const SerdWorld* world, + SerdStatus st, + SerdLogLevel level, + const SerdCursor* cursor, + const char* fmt, + ...); + /** @} @name Environment diff --git a/src/world.c b/src/world.c index 483c46a6..7b0343cc 100644 --- a/src/world.c +++ b/src/world.c @@ -70,6 +70,22 @@ serd_world_log(const SerdWorld* world, const SerdMessage* msg) } SerdStatus +serd_world_logf(const SerdWorld* world, + SerdStatus st, + SerdLogLevel level, + const SerdCursor* cursor, + const char* fmt, + ...) +{ + va_list args; + va_start(args, fmt); + const SerdMessage msg = {st, level, cursor, fmt, &args}; + serd_world_log(world, &msg); + va_end(args); + return st; +} + +SerdStatus serd_world_errorf(const SerdWorld* world, SerdStatus st, const char* fmt, ...) { va_list args; diff --git a/src/world.h b/src/world.h index f4e7ee3e..9d6dd4d2 100644 --- a/src/world.h +++ b/src/world.h @@ -39,8 +39,7 @@ struct SerdWorldImpl { FILE* serd_world_fopen(SerdWorld* world, const char* path, const char* mode); -SerdStatus serd_world_log(const SerdWorld* world, const SerdMessage* msg); - +SERD_LOG_FUNC(3, 4) SerdStatus serd_world_errorf(const SerdWorld* world, SerdStatus st, const char* fmt, ...); |