summaryrefslogtreecommitdiff
path: root/lib/log.odin
diff options
context:
space:
mode:
Diffstat (limited to 'lib/log.odin')
-rw-r--r--lib/log.odin116
1 files changed, 116 insertions, 0 deletions
diff --git a/lib/log.odin b/lib/log.odin
new file mode 100644
index 0000000..eb80b5a
--- /dev/null
+++ b/lib/log.odin
@@ -0,0 +1,116 @@
+package djup
+
+import "base:runtime"
+import "core:c/libc"
+import "core:fmt"
+import "core:log"
+
+LogLevel :: enum i32 {
+ Debug = 0,
+ Info = 1,
+ Warning = 2,
+ Error = 3,
+ Fatal = 4,
+}
+
+LogFunc :: #type proc "c" (
+ level: LogLevel,
+ message: string,
+ source_procedure: string,
+ source_file: string,
+ source_line: i32,
+)
+
+AssertFunc :: #type proc "c" (
+ prefix, message: string,
+ source_procedure: string,
+ source_file: string,
+ source_line: i32,
+)
+
+@(export = true)
+sim_log_init :: proc "c" (ctx: ^SimulationContext, logf: LogFunc, assertf: AssertFunc) {
+ if ctx == nil {
+ return
+ }
+
+ log_proc :: proc(
+ data: rawptr,
+ level: runtime.Logger_Level,
+ msg: string,
+ _: runtime.Logger_Options,
+ loc: runtime.Source_Code_Location,
+ ) {
+ f: LogFunc = cast(LogFunc)data
+ log_level: LogLevel
+ switch level {
+ case .Debug:
+ log_level = .Debug
+ case .Info:
+ log_level = .Info
+ case .Warning:
+ log_level = .Warning
+ case .Error:
+ log_level = .Error
+ case .Fatal:
+ log_level = .Fatal
+ }
+ f(log_level, msg, loc.procedure, loc.file_path, loc.line)
+ }
+ ctx.assert_func = assertf
+
+ assert_proc :: proc(prefix, message: string, loc: runtime.Source_Code_Location) -> ! {
+ ctx := cast(^SimulationContext)context.user_ptr
+ if ctx.assert_func == nil {
+ fmt.eprintfln(
+ "assertion failure: %s (%s:%d): %s %s",
+ loc.procedure,
+ loc.file_path,
+ loc.line,
+ prefix,
+ message,
+ )
+ libc.abort()
+ }
+ ctx.assert_func(prefix, message, loc.procedure, loc.file_path, loc.line)
+ fmt.println("AssertFunc returned")
+ libc.abort()
+ }
+
+ if logf != nil {
+ ctx.ctx.logger = runtime.Logger {
+ procedure = log_proc,
+ data = cast(rawptr)logf,
+ }
+ } else {
+ context = ctx.ctx
+ ctx.ctx.logger = log.nil_logger()
+ }
+
+ if assertf != nil {
+ ctx.ctx.assertion_failure_proc = assert_proc
+ }
+}
+
+@(export = true)
+sim_set_log_level :: proc "c" (ctx: ^SimulationContext, level: LogLevel) {
+ minimum_level: runtime.Logger_Level
+ switch level {
+ case .Debug:
+ minimum_level = .Debug
+ case .Info:
+ minimum_level = .Info
+ case .Warning:
+ minimum_level = .Warning
+ case .Error:
+ minimum_level = .Error
+ case .Fatal:
+ minimum_level = .Fatal
+ case:
+ context = ctx.ctx
+ log.errorf("Invalid minimum log level %d", level)
+ return
+ }
+
+ ctx.ctx.logger.lowest_level = minimum_level
+}