2D Run-and-gun shooter inspired by One Man's Doomsday, Counter-Strike, and Metal Slug.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

159 rivejä
4.0 KiB

  1. #include "IZ_log.h"
  2. bool IZ_LogIsSupportedTerminal() {
  3. bool result;
  4. const char *term = getenv("TERM");
  5. result = term && strcmp(term, "") != 0;
  6. #ifndef IZ_WINDOWS
  7. return result;
  8. #else
  9. if (result) {
  10. return 1;
  11. }
  12. // Attempt to enable virtual terminal processing on Windows.
  13. // See: https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
  14. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  15. if (hOut == INVALID_HANDLE_VALUE) {
  16. return 0;
  17. }
  18. DWORD dwMode = 0;
  19. if (!GetConsoleMode(hOut, &dwMode)) {
  20. return 0;
  21. }
  22. dwMode |= 0x4; // ENABLE_VIRTUAL_TERMINAL_PROCESSING
  23. if (!SetConsoleMode(hOut, dwMode)) {
  24. return 0;
  25. }
  26. return 1;
  27. #endif
  28. }
  29. bool IZ_LogIsSupportedColor(FILE* s) {
  30. return isatty(fileno(s)) && IZ_LogIsSupportedTerminal();
  31. }
  32. void IZ_LogInitialize(const char* context, bool force_output) {
  33. if (force_output) {
  34. stdout_dest = stdout;
  35. stderr_dest = stderr;
  36. return;
  37. }
  38. #ifdef IZ_DEBUG
  39. stdout_dest = stdout;
  40. stderr_dest = stderr;
  41. #else
  42. const char* log_dir = "logs";
  43. if (!IZ_isdir(log_dir)) {
  44. IZ_mkdir(log_dir);
  45. }
  46. char stdout_filename[128] = "";
  47. char stderr_filename[128] = "";
  48. char* now = IZ_TimerNowPathSafe();
  49. // fixme
  50. sprintf(stdout_filename, "%s/%s-out-%s.log", log_dir, context, now);
  51. sprintf(stderr_filename, "%s/%s-err-%s.log", log_dir, context, now);
  52. IZ_fopen(&stdout_dest, stdout_filename, "a");
  53. IZ_fopen(&stderr_dest, stderr_filename, "a");
  54. #endif
  55. }
  56. void IZ_LogTeardown() {
  57. #ifndef IZ_DEBUG
  58. if (IZ_LogIsSupportedColor(stdout_dest)) {
  59. return;
  60. }
  61. fclose(stdout_dest);
  62. fclose(stderr_dest);
  63. #endif
  64. }
  65. void IZ_LogError(const char* context, const char* fmt, ...) {
  66. #ifdef IZ_LOG_LEVEL_FLAG_ERROR
  67. char buffer[4096];
  68. va_list args;
  69. va_start(args, fmt);
  70. vsnprintf(buffer, sizeof(buffer), fmt, args);
  71. va_end(args);
  72. if (IZ_LogIsSupportedColor(stdout_dest)) {
  73. fprintf(stdout_dest, RED "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  74. return;
  75. }
  76. fprintf(stderr_dest, "%24s" " " "%-6s" " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  77. #endif
  78. }
  79. void IZ_LogInfo(IZ_LogCategory category, const char* context, const char* fmt, ...) {
  80. #ifdef IZ_LOG_LEVEL_FLAG_INFO
  81. char buffer[4096];
  82. va_list args;
  83. va_start(args, fmt);
  84. vsnprintf(buffer, sizeof(buffer), fmt, args);
  85. va_end(args);
  86. if (IZ_LogIsSupportedColor(stdout_dest)) {
  87. switch (category) {
  88. default:
  89. case IZ_LOG_CATEGORY_GENERIC:
  90. fprintf(stdout_dest, CYN "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  91. break;
  92. case IZ_LOG_CATEGORY_GLOBAL:
  93. fprintf(stdout_dest, MAG "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  94. break;
  95. case IZ_LOG_CATEGORY_INPUT:
  96. fprintf(stdout_dest, WHT "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  97. break;
  98. }
  99. return;
  100. }
  101. fprintf(stdout_dest, "%24s" " " "%-6s" " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  102. #endif
  103. }
  104. void IZ_LogWarn(bool is_critical, const char* context, const char* fmt, ...) {
  105. #ifdef IZ_LOG_LEVEL_FLAG_WARN
  106. char buffer[4096];
  107. va_list args;
  108. va_start(args, fmt);
  109. vsnprintf(buffer, sizeof(buffer), fmt, args);
  110. va_end(args);
  111. if (IZ_LogIsSupportedColor(stdout_dest)) {
  112. if (is_critical) {
  113. fprintf(stdout_dest, GRN "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  114. } else {
  115. fprintf(stdout_dest, YEL "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  116. }
  117. return;
  118. }
  119. fprintf(stdout_dest, "%24s" " " "%-6s" " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  120. #endif
  121. }
  122. void IZ_Log(const char* context, const char* fmt, ...) {
  123. #ifdef IZ_LOG_LEVEL_FLAG_DEBUG
  124. char buffer[4096];
  125. va_list args;
  126. va_start(args, fmt);
  127. vsnprintf(buffer, sizeof(buffer), fmt, args);
  128. va_end(args);
  129. if (IZ_LogIsSupportedColor(stdout_dest)) {
  130. fprintf(stdout_dest, BLU "%24s" RESET " " BOLD "%-6s" RESET " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  131. return;
  132. }
  133. fprintf(stdout_dest, "%24s" " " "%-6s" " %s\n", IZ_LOG_DATE_FUNCTION(), context, buffer);
  134. fflush(stdout_dest);
  135. #endif
  136. }