diff options
Diffstat (limited to 'lib')
| -rwxr-xr-x | lib/build.sh | 2 | ||||
| -rw-r--r-- | lib/log.c | 56 | ||||
| -rw-r--r-- | lib/log.h | 23 | ||||
| -rw-r--r-- | lib/world.c | 1 |
4 files changed, 81 insertions, 1 deletions
diff --git a/lib/build.sh b/lib/build.sh index 8cf9d11..725c237 100755 --- a/lib/build.sh +++ b/lib/build.sh @@ -8,7 +8,7 @@ fail() { CC=cc CFLAGS="-std=c99 -Wall -Wextra -Wpedantic -D_POSIX_C_SOURCE=200809L" LDFLAGS="-fPIC" -SOURCES="test.c vec2.c world.c" +SOURCES="test.c vec2.c world.c log.c" output="build" for arg ; do diff --git a/lib/log.c b/lib/log.c new file mode 100644 index 0000000..51ab107 --- /dev/null +++ b/lib/log.c @@ -0,0 +1,56 @@ +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> +#include <time.h> + +#include "log.h" + +/* Message buffer */ +#define MBUF_SIZE 512 + +static void (*log_output)(int level, const char *source, int line, const char *msg) = NULL; +static int min_level = LOGL_INFO; + +void +dp_log_set_output(void (*output)(int, const char *, int, const char *)) +{ + log_output = output; +} + +void +dp_log_set_level(int level) +{ + min_level = level; +} + +void +dp_log_write(int level, const char *source, int line, const char *fmt, ...) +{ + char mbuf[MBUF_SIZE]; + char *msg; + va_list va; + int len; + + if (level < min_level) + return; + if (!log_output) + return; + + msg = mbuf; + va_start(va, fmt); + len = vsnprintf(msg, MBUF_SIZE, fmt, va); + va_end(va); + + if (len >= MBUF_SIZE) + { + msg = (char *)malloc(len + 1); + va_start(va, fmt); + len = vsnprintf(msg, len + 1, fmt, va); + va_end(va); + } + + log_output(level, source, line, msg); + + if (msg != mbuf) + free(msg); +} diff --git a/lib/log.h b/lib/log.h new file mode 100644 index 0000000..e1cdcb8 --- /dev/null +++ b/lib/log.h @@ -0,0 +1,23 @@ +#include <stdio.h> + +enum { LOGL_TRACE, LOGL_DEBUG, LOGL_INFO, LOGL_WARN, LOGL_ERROR, LOGL_FATAL }; + +/* + * log_info("Hello %s!", "World"); + * log_warn("warning"); + */ +#define log_trace(...) dp_log_write(LOGL_TRACE, __FILE__, __LINE__, __VA_ARGS__) +#define log_debug(...) dp_log_write(LOGL_DEBUG, __FILE__, __LINE__, __VA_ARGS__) +#define log_info(...) dp_log_write(LOGL_INFO, __FILE__, __LINE__, __VA_ARGS__) +#define log_warn(...) dp_log_write(LOGL_WARN, __FILE__, __LINE__, __VA_ARGS__) +#define log_error(...) dp_log_write(LOGL_ERROR, __FILE__, __LINE__, __VA_ARGS__) +#define log_fatal(...) dp_log_write(LOGL_FATAL, __FILE__, __LINE__, __VA_ARGS__) + +void dp_log_set_output(void (*)(int level, const char *source, int line, const char *msg)); + +/* + * Sets the minimum log level. Level is inclusive. + */ +void dp_log_set_level(int level); + +void dp_log_write(int level, const char *source, int line, const char *fmt, ...); diff --git a/lib/world.c b/lib/world.c index 954aa94..34d7489 100644 --- a/lib/world.c +++ b/lib/world.c @@ -3,6 +3,7 @@ #include "types.h" #include "world.h" +#include "log.h" struct world { struct entity entities[WORLD_MAX_ENTITIES]; |
