A collection of basic/generally desirable code I use across multiple C++ projects.
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.

185 lines
6.0 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #pragma once
  2. #ifndef ULE_PRINT_H
  3. #define ULE_PRINT_H
  4. #include <stdarg.h> // va_list
  5. #include "config.h"
  6. #include "string.h"
  7. #include "types.h"
  8. #ifndef _WIN32
  9. // comment this line out if you don't want terminal output to contain ANSI escape codes
  10. // by default on windows executables it's disabled, since things like the command prompt still doesn't support ANSI color codes
  11. #define PRINT_H_USE_ANSI_COLOR_ESCAPE_CODES
  12. #endif
  13. #ifdef PRINT_H_USE_ANSI_COLOR_ESCAPE_CODES
  14. #define ANSI_BLACK "\x001B[30m"
  15. #define ANSI_RED "\x001B[31m"
  16. #define ANSI_GREEN "\x001B[32m"
  17. #define ANSI_YELLOW "\x001B[33m"
  18. #define ANSI_BLUE "\x001B[34m"
  19. #define ANSI_PURPLE "\x001B[35m"
  20. #define ANSI_CYAN "\x001B[36m"
  21. #define ANSI_WHITE "\x001B[37m"
  22. #define ANSI_BRIGHT_BLACK "\x001B[90m"
  23. #define ANSI_BRIGHT_RED "\x001B[91m"
  24. #define ANSI_BRIGHT_GREEN "\x001B[92m"
  25. #define ANSI_BRIGHT_YELLOW "\x001B[93m"
  26. #define ANSI_BRIGHT_BLUE "\x001B[94m"
  27. #define ANSI_BRIGHT_MAGENTA "\x001B[95m"
  28. #define ANSI_BRIGHT_CYAN "\x001B[96m"
  29. #define ANSI_BRIGHT_WHITE "\x001B[97m"
  30. #define ANSI_BLACK_BACKGROUND "\x001B[40m"
  31. #define ANSI_RED_BACKGROUND "\x001B[41m"
  32. #define ANSI_GREEN_BACKGROUND "\x001B[42m"
  33. #define ANSI_YELLOW_BACKGROUND "\x001B[43m"
  34. #define ANSI_BLUE_BACKGROUND "\x001B[44m"
  35. #define ANSI_PURPLE_BACKGROUND "\x001B[45m"
  36. #define ANSI_CYAN_BACKGROUND "\x001B[46m"
  37. #define ANSI_WHITE_BACKGROUND "\x001B[47m"
  38. #define ANSI_WRAP "\x001B[7m"
  39. #define ANSI_BLINK "\x001B[5m"
  40. #define ANSI_CLEAR "\x001B[2J\x001B[;H"
  41. #define ANSI_RESET "\x001B[0m"
  42. #else
  43. #define ANSI_BLACK ""
  44. #define ANSI_RED ""
  45. #define ANSI_GREEN ""
  46. #define ANSI_YELLOW ""
  47. #define ANSI_BLUE ""
  48. #define ANSI_PURPLE ""
  49. #define ANSI_CYAN ""
  50. #define ANSI_WHITE ""
  51. #define ANSI_BRIGHT_BLACK ""
  52. #define ANSI_BRIGHT_RED ""
  53. #define ANSI_BRIGHT_GREEN ""
  54. #define ANSI_BRIGHT_YELLOW ""
  55. #define ANSI_BRIGHT_BLUE ""
  56. #define ANSI_BRIGHT_MAGENTA ""
  57. #define ANSI_BRIGHT_CYAN ""
  58. #define ANSI_BRIGHT_WHITE ""
  59. #define ANSI_BLACK_BACKGROUND ""
  60. #define ANSI_RED_BACKGROUND ""
  61. #define ANSI_GREEN_BACKGROUND ""
  62. #define ANSI_YELLOW_BACKGROUND ""
  63. #define ANSI_BLUE_BACKGROUND ""
  64. #define ANSI_PURPLE_BACKGROUND ""
  65. #define ANSI_CYAN_BACKGROUND ""
  66. #define ANSI_WHITE_BACKGROUND ""
  67. #define ANSI_WRAP ""
  68. #define ANSI_BLINK ""
  69. #define ANSI_CLEAR ""
  70. #define ANSI_RESET ""
  71. #endif
  72. extern void vprint(const char* format, va_list args);
  73. extern void vprintln(const char* format, va_list args);
  74. extern void print(const char* format, ...);
  75. extern void println(const char* format, ...);
  76. // prints the |count| * 8 little endian bits pointed to by |ptr|
  77. extern void printBitsLE(const size_t count, void* ptr);
  78. // Prints a stack trace, or concatenates the stack trace to |string| if it is not null.
  79. extern void trace(String* string = null);
  80. // on windows only
  81. extern void writeMinidump(void* exceptionPointers);
  82. // This ends the program and calls trace(). generally you should use 'massert' instead
  83. void _die(
  84. const char* date,
  85. const char* time,
  86. const char* filename,
  87. const int line,
  88. const char* format,
  89. ...
  90. );
  91. #define die(format, ...) _die(__DATE__, __TIME__, __FILE__, __LINE__, format, ##__VA_ARGS__)
  92. // when calling 'die', instead of the default behavior,
  93. // (print a stack trace and then call 'exit(1)')
  94. // do something else.
  95. //
  96. // The function will get passed a string which is the formatted string you passed to 'die' + a stack trace.
  97. extern void setCustomDieBehavior(void (*dieBehavior)(const char* string));
  98. #ifdef PRINT_DEBUG
  99. // simple wrapper to allow custom messages...
  100. //#define massert(test, message) (((void)(message), test))
  101. #define massert(test, message) if (!(test)) die("%s\n", message);
  102. extern void _debug(
  103. const char* date,
  104. const char* time,
  105. const char* filename,
  106. const int line,
  107. const char* format,
  108. ...
  109. );
  110. #define debug(format, ...) _debug(__DATE__, __TIME__, __FILE__, __LINE__, format, ##__VA_ARGS__)
  111. // @NOTE there's a conflict on win32 with the name 'warning'...
  112. extern void _warn(
  113. const char* date,
  114. const char* time,
  115. const char* filename,
  116. const int line,
  117. const char* format,
  118. ...
  119. );
  120. #define warn(format, ...) _warn(__DATE__, __TIME__, __FILE__, __LINE__, format, ##__VA_ARGS__)
  121. #else
  122. // define some empty macros
  123. #define massert(test, message) ((void) 0)
  124. #define debug(format, ...)
  125. #define warn(format, ...)
  126. #endif
  127. extern void print(bool b);
  128. extern void print(char c);
  129. extern void print(signed int i);
  130. extern void print(unsigned int i);
  131. extern void print(float f);
  132. extern void print(double d);
  133. extern void print(void* p);
  134. extern void print(char* s);
  135. #ifndef _WIN32
  136. extern void print(size_t i);
  137. extern void println(size_t i);
  138. #endif
  139. extern void println(bool b);
  140. extern void println(char c);
  141. extern void println(signed int i);
  142. extern void println(unsigned int i);
  143. extern void println(float f);
  144. extern void println(double d);
  145. extern void println(void* p);
  146. extern void println(char* s);
  147. extern void println();
  148. #ifdef ULE_CONFIG_OPTION_USE_GLM
  149. extern void print(glm::vec<2, float, (glm::qualifier) 3>);
  150. extern void print(glm::vec<3, float, (glm::qualifier) 3>);
  151. extern void print(glm::vec<4, float, (glm::qualifier) 3>);
  152. extern void print(glm::mat<2, 2, float, (glm::qualifier) 3>);
  153. extern void print(glm::mat<3, 3, float, (glm::qualifier) 3>);
  154. extern void print(glm::mat<4, 4, float, (glm::qualifier) 3>);
  155. extern void println(glm::vec<2, float, (glm::qualifier) 3> v);
  156. extern void println(glm::vec<3, float, (glm::qualifier) 3> v);
  157. extern void println(glm::vec<3, float, (glm::qualifier) 3> v);
  158. extern void println(glm::mat<2, 2, float, (glm::qualifier) 3> m);
  159. extern void println(glm::mat<3, 3, float, (glm::qualifier) 3> m);
  160. extern void println(glm::mat<4, 4, float, (glm::qualifier) 3> m);
  161. #endif
  162. #endif