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.

155 lines
5.3 KiB

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