errors.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. void error_args(debug_context context, const char *message, va_list args) {
  23. char buffer[4096];
  24. if (context.filename != NULL) {
  25. sprintf(buffer, "In column %i at line %i in %s: ", context.column + 1, context.line + 1, context.filename);
  26. }
  27. else {
  28. sprintf(buffer, "In column %i at line %i: ", context.column + 1, context.line + 1);
  29. }
  30. strcat(buffer, message);
  31. kong_log_args(LOG_LEVEL_ERROR, buffer, args);
  32. debug_break();
  33. exit(1);
  34. }
  35. void error_args_no_context(const char *message, va_list args) {
  36. kong_log_args(LOG_LEVEL_ERROR, message, args);
  37. exit(1);
  38. }
  39. void error(debug_context context, const char *message, ...) {
  40. va_list args;
  41. va_start(args, message);
  42. error_args(context, message, args);
  43. va_end(args);
  44. }
  45. void error_no_context(const char *message, ...) {
  46. va_list args;
  47. va_start(args, message);
  48. error_args_no_context(message, args);
  49. va_end(args);
  50. }
  51. void check_args(bool test, debug_context context, const char *message, va_list args) {
  52. if (!test) {
  53. error_args(context, message, args);
  54. }
  55. }
  56. void check_function(bool test, debug_context context, const char *message, ...) {
  57. if (!test) {
  58. va_list args;
  59. va_start(args, message);
  60. error_args(context, message, args);
  61. va_end(args);
  62. }
  63. }