aboutsummaryrefslogtreecommitdiff
path: root/src/cyn_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cyn_log.c')
-rw-r--r--src/cyn_log.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/cyn_log.c b/src/cyn_log.c
new file mode 100644
index 0000000..d2d18f2
--- /dev/null
+++ b/src/cyn_log.c
@@ -0,0 +1,73 @@
+#include <stdio.h>
+
+Log_Level cyn_current_log_level = UN_LOG_INFO;
+
+void cyn_log_write_internal(Log_Level level, String format, va_list vaptr) {
+ Allocator talloc;
+ String output;
+
+ if (level < cyn_current_log_level) return;
+
+
+ talloc = un_allocator_get_temporary();
+
+ switch (level) {
+ case UN_LOG_TRACE:
+ output = UN_STR("[TRACE] ");
+ break;
+ case UN_LOG_DEBUG:
+ output = UN_STR("[DEBUG] ");
+ break;
+ case UN_LOG_INFO:
+ output = UN_STR("[INFO] ");
+ break;
+ case UN_LOG_WARNING:
+ output = UN_STR("[WARNING] ");
+ break;
+ case UN_LOG_ERROR:
+ output = UN_STR("[ERROR] ");
+ break;
+ case UN_LOG_FATAL:
+ output = UN_STR("[FATAL] ");
+ break;
+ default:
+ break;
+ }
+
+ output = un_string_concat(output, un_string_vformat(talloc, format, vaptr), talloc);
+
+ switch (level) {
+ case UN_LOG_RAW:
+ break;
+ case UN_LOG_FATAL: // @todo, logging should be part of Cynic.
+ default:
+ output = un_string_concat(output, UN_STR("\n"), talloc);
+ break;
+ }
+
+ fprintf(stderr, CSTR un_string_to_cstring(output, talloc));
+}
+
+extern void cyn_log_write_cstring(Log_Level level, u8 *format, ...) {
+ va_list vaptr;
+ String temp;
+
+ if (level < cyn_current_log_level) return;
+
+ temp.size = un_string_get_length(format);
+ temp.data = format;
+
+ va_start(vaptr, format);
+ cyn_log_write_internal(level, temp, vaptr);
+ va_end(vaptr);
+}
+
+void cyn_log_write(Log_Level level, String format, ...) {
+ va_list vaptr;
+
+ if (level < cyn_current_log_level) return;
+
+ va_start(vaptr, format);
+ cyn_log_write_internal(level, format, vaptr);
+ va_end(vaptr);
+}