logger.odin 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package sokol_helpers
  2. // Pass sokol logs into native odin logging system
  3. import sapp "../app"
  4. import sg "../gfx"
  5. import "base:runtime"
  6. import "core:log"
  7. Logger :: struct {
  8. func: proc "c" (
  9. tag: cstring,
  10. log_level: u32,
  11. log_item: u32,
  12. message: cstring,
  13. line_nr: u32,
  14. filename: cstring,
  15. user_data: rawptr,
  16. ),
  17. user_data: rawptr,
  18. }
  19. // context_ptr: a pointer to a context which persists during the lifetime of the program.
  20. // Note: you can transmute() this into a logger for any specific sokol library.
  21. logger :: proc "contextless" (context_ptr: ^runtime.Context) -> Logger {
  22. return {func = logger_proc, user_data = cast(rawptr)context_ptr}
  23. }
  24. logger_proc :: proc "c" (
  25. tag: cstring,
  26. log_level: u32,
  27. log_item: u32,
  28. message: cstring,
  29. line_nr: u32,
  30. filename: cstring,
  31. user_data: rawptr,
  32. ) {
  33. context = (cast(^runtime.Context)user_data)^
  34. loc := runtime.Source_Code_Location {
  35. file_path = string(filename),
  36. line = i32(line_nr),
  37. }
  38. level: log.Level
  39. switch log_level {
  40. case 0:
  41. log.panicf("Sokol Panic: (%i) %s: %s", log_item, tag, message, location = loc)
  42. case 1:
  43. level = .Error
  44. case 2:
  45. level = .Warning
  46. case:
  47. level = .Info
  48. }
  49. log.logf(level, "(%i) %s: %s", log_item, tag, message, location = loc)
  50. }