Utility.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "utils/Utility.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. static Core::ExitHandler exitHandler = nullptr;
  6. static void* exitData = nullptr;
  7. const char* Core::getErrorName(Error e) {
  8. switch(e) {
  9. case Error::NONE: return "NONE";
  10. case Error::NEGATIVE_ARGUMENT: return "NEGATIVE_ARGUMENT";
  11. case Error::CAPACITY_REACHED: return "CAPACITY_REACHED";
  12. case Error::BLOCKED_STDOUT: return "BLOCKED_STDOUT";
  13. case Error::OUT_OF_MEMORY: return "OUT_OF_MEMORY";
  14. case Error::INVALID_CHAR: return "INVALID_CHAR";
  15. case Error::NOT_FOUND: return "NOT_FOUND";
  16. case Error::INVALID_STATE: return "INVALID_STATE";
  17. case Error::INVALID_INDEX: return "INVALID_INDEX";
  18. case Error::INVALID_ARGUMENT: return "INVALID_ARGUMENT";
  19. case Error::TIME_NOT_AVAILABLE: return "TIME_NOT_AVAILABLE";
  20. case Error::SLEEP_INTERRUPTED: return "SLEEP_INTERRUPTED";
  21. case Error::THREAD_ERROR: return "THREAD_ERROR";
  22. case Error::INVALID_ID: return "INVALID_ID";
  23. case Error::EXISTING_KEY: return "EXISTING_KEY";
  24. case Error::CANNOT_OPEN_FILE: return "CANNOT_OPEN_FILE";
  25. case Error::END_OF_FILE: return "END_OF_FILE";
  26. }
  27. return "?";
  28. }
  29. void* operator new(size_t bytes) noexcept {
  30. return malloc(bytes);
  31. }
  32. void* operator new[](size_t bytes) noexcept {
  33. return malloc(bytes);
  34. }
  35. void operator delete(void* p) noexcept {
  36. free(p);
  37. }
  38. void operator delete[](void* p) noexcept {
  39. free(p);
  40. }
  41. void operator delete(void* p, size_t bytes) noexcept {
  42. (void)bytes;
  43. free(p);
  44. }
  45. void operator delete[](void* p, size_t bytes) noexcept {
  46. (void)bytes;
  47. free(p);
  48. }
  49. void* operator new(size_t bytes, void* p) noexcept {
  50. (void)bytes;
  51. return p;
  52. }
  53. /*void* operator new[](size_t bytes, void* p) noexcept {
  54. (void)bytes;
  55. return p;
  56. }*/
  57. void Core::exitWithHandler(const char* file, int line, int value) {
  58. if(value != 0) {
  59. printf("\33[1;31mExit from %s:%d with value %d\33[39;49m\n", file, line,
  60. value);
  61. }
  62. if(exitHandler != nullptr) {
  63. exitHandler(value, exitData);
  64. }
  65. exit(value);
  66. }
  67. void Core::setExitHandler(ExitHandler eh, void* data) {
  68. exitHandler = eh;
  69. exitData = data;
  70. }
  71. #define CORE_TO_STRING(type, cast, format) \
  72. check_return Core::Error Core::toString(type t, char* buffer, int size) { \
  73. if(size < 0) { \
  74. return Error::NEGATIVE_ARGUMENT; \
  75. } \
  76. return snprintf(buffer, static_cast<unsigned int>(size), format, \
  77. static_cast<cast>(t)) >= size \
  78. ? Error::CAPACITY_REACHED \
  79. : Error::NONE; \
  80. }
  81. CORE_TO_STRING(signed short, signed short, "%hd")
  82. CORE_TO_STRING(unsigned short, unsigned short, "%hu")
  83. CORE_TO_STRING(signed int, signed int, "%d")
  84. CORE_TO_STRING(unsigned int, unsigned int, "%u")
  85. CORE_TO_STRING(signed long, signed long, "%ld")
  86. CORE_TO_STRING(unsigned long, unsigned long, "%lu")
  87. CORE_TO_STRING(signed long long, signed long long, "%lld")
  88. CORE_TO_STRING(unsigned long long, unsigned long long, "%llu")
  89. CORE_TO_STRING(float, double, "%.2f")
  90. CORE_TO_STRING(double, double, "%.2lf")
  91. CORE_TO_STRING(long double, long double, "%.2Lf")
  92. Core::Error Core::putChar(int c) {
  93. return putchar(c) == EOF ? Error::BLOCKED_STDOUT : Error::NONE;
  94. }
  95. void Core::memorySet(void* p, int c, int n) {
  96. if(n <= 0) {
  97. return;
  98. }
  99. memset(p, c, static_cast<unsigned int>(n));
  100. }
  101. void Core::memoryCopy(void* dest, const void* src, int n) {
  102. if(n <= 0) {
  103. return;
  104. }
  105. memcpy(dest, src, static_cast<unsigned int>(n));
  106. }
  107. bool Core::memoryCompare(const void* a, const void* b, int n) {
  108. return n <= 0 ? true : memcmp(a, b, static_cast<unsigned int>(n)) == 0;
  109. }
  110. Core::Error Core::reallocate(char*& p, int n) {
  111. if(n <= 0) {
  112. free(p);
  113. p = nullptr;
  114. return Error::NONE;
  115. }
  116. char* newP = static_cast<char*>(realloc(p, static_cast<unsigned int>(n)));
  117. if(newP == nullptr) {
  118. return Error::OUT_OF_MEMORY;
  119. }
  120. p = newP;
  121. return Error::NONE;
  122. }
  123. void Core::free(void* p) {
  124. ::free(p);
  125. }
  126. const char* Core::getFileName(const char* path) {
  127. int end = 0;
  128. while(path[end] != '\0') {
  129. end++;
  130. }
  131. while(end > 0 && path[end - 1] != '/') {
  132. end--;
  133. }
  134. return path + end;
  135. }