errors.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "errors.h"
  2. #include "log.h"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. static void debug_break(void) {
  6. #ifndef NDEBUG
  7. #if defined(_MSC_VER)
  8. __debugbreak();
  9. #elif defined(__clang__)
  10. __builtin_debugtrap();
  11. #else
  12. #if defined(__aarch64__)
  13. __asm__ volatile(".inst 0xd4200000");
  14. #elif defined(__x86_64__)
  15. __asm__ volatile("int $0x03");
  16. #else
  17. kong_log(LOG_LEVEL_WARNING, "Oh no, debug_break is not implemented for the current compiler and CPU.");
  18. #endif
  19. #endif
  20. #endif
  21. }
  22. ////
  23. bool kong_error = false;
  24. ////
  25. void error_args(debug_context context, const char *message, va_list args) {
  26. char buffer[4096];
  27. if (context.filename != NULL) {
  28. sprintf(buffer, "In column %i at line %i in %s: ", context.column + 1, context.line + 1, context.filename);
  29. }
  30. else {
  31. sprintf(buffer, "In column %i at line %i: ", context.column + 1, context.line + 1);
  32. }
  33. strcat(buffer, message);
  34. kong_log_args(LOG_LEVEL_ERROR, buffer, args);
  35. ////
  36. // debug_break();
  37. // exit(1);
  38. kong_error = true;
  39. ////
  40. }
  41. void error_args_no_context(const char *message, va_list args) {
  42. kong_log_args(LOG_LEVEL_ERROR, message, args);
  43. ////
  44. // exit(1);
  45. kong_error = true;
  46. ////
  47. }
  48. void error(debug_context context, const char *message, ...) {
  49. va_list args;
  50. va_start(args, message);
  51. error_args(context, message, args);
  52. va_end(args);
  53. }
  54. void error_no_context(const char *message, ...) {
  55. va_list args;
  56. va_start(args, message);
  57. error_args_no_context(message, args);
  58. va_end(args);
  59. }
  60. void check_args(bool test, debug_context context, const char *message, va_list args) {
  61. if (!test) {
  62. error_args(context, message, args);
  63. }
  64. }
  65. void check_function(bool test, debug_context context, const char *message, ...) {
  66. if (!test) {
  67. va_list args;
  68. va_start(args, message);
  69. error_args(context, message, args);
  70. va_end(args);
  71. }
  72. }