#include "utils/Utility.h" #include #include #include static Core::ExitHandler exitHandler = nullptr; static void* exitData = nullptr; const char* Core::getErrorName(Error e) { switch(e) { case Error::NONE: return "NONE"; case Error::NEGATIVE_ARGUMENT: return "NEGATIVE_ARGUMENT"; case Error::CAPACITY_REACHED: return "CAPACITY_REACHED"; case Error::BLOCKED_STDOUT: return "BLOCKED_STDOUT"; case Error::OUT_OF_MEMORY: return "OUT_OF_MEMORY"; case Error::INVALID_CHAR: return "INVALID_CHAR"; case Error::NOT_FOUND: return "NOT_FOUND"; case Error::INVALID_STATE: return "INVALID_STATE"; case Error::INVALID_INDEX: return "INVALID_INDEX"; case Error::INVALID_ARGUMENT: return "INVALID_ARGUMENT"; case Error::TIME_NOT_AVAILABLE: return "TIME_NOT_AVAILABLE"; case Error::SLEEP_INTERRUPTED: return "SLEEP_INTERRUPTED"; case Error::THREAD_ERROR: return "THREAD_ERROR"; case Error::INVALID_ID: return "INVALID_ID"; case Error::EXISTING_KEY: return "EXISTING_KEY"; } return "?"; } void* operator new(size_t bytes) noexcept { return malloc(bytes); } void* operator new[](size_t bytes) noexcept { return malloc(bytes); } void operator delete(void* p) noexcept { free(p); } void operator delete[](void* p) noexcept { free(p); } void operator delete(void* p, size_t bytes) noexcept { (void)bytes; free(p); } void operator delete[](void* p, size_t bytes) noexcept { (void)bytes; free(p); } void* operator new(size_t bytes, void* p) noexcept { (void)bytes; return p; } /*void* operator new[](size_t bytes, void* p) noexcept { (void)bytes; return p; }*/ void Core::exitWithHandler(const char* file, int line, int value) { if(value != 0) { printf("\33[1;31mExit from %s:%d with value %d\33[39;49m\n", file, line, value); } if(exitHandler != nullptr) { exitHandler(value, exitData); } exit(value); } void Core::setExitHandler(ExitHandler eh, void* data) { exitHandler = eh; exitData = data; } #define CORE_TO_STRING(type, cast, format) \ check_return Core::Error Core::toString(type t, char* buffer, int size) { \ if(size < 0) { \ return Error::NEGATIVE_ARGUMENT; \ } \ return snprintf(buffer, static_cast(size), format, \ static_cast(t)) >= size \ ? Error::CAPACITY_REACHED \ : Error::NONE; \ } CORE_TO_STRING(signed short, signed short, "%hd") CORE_TO_STRING(unsigned short, unsigned short, "%hu") CORE_TO_STRING(signed int, signed int, "%d") CORE_TO_STRING(unsigned int, unsigned int, "%u") CORE_TO_STRING(signed long, signed long, "%ld") CORE_TO_STRING(unsigned long, unsigned long, "%lu") CORE_TO_STRING(signed long long, signed long long, "%lld") CORE_TO_STRING(unsigned long long, unsigned long long, "%llu") CORE_TO_STRING(float, double, "%.2f") CORE_TO_STRING(double, double, "%.2lf") CORE_TO_STRING(long double, long double, "%.2Lf") Core::Error Core::putChar(int c) { return putchar(c) == EOF ? Error::BLOCKED_STDOUT : Error::NONE; } void Core::memorySet(void* p, int c, int n) { if(n <= 0) { return; } memset(p, c, static_cast(n)); } void Core::memoryCopy(void* dest, const void* src, int n) { if(n <= 0) { return; } memcpy(dest, src, static_cast(n)); } bool Core::memoryCompare(const void* a, const void* b, int n) { return n <= 0 ? true : memcmp(a, b, static_cast(n)) == 0; } Core::Error Core::reallocate(char*& p, int n) { if(n <= 0) { free(p); p = nullptr; return Error::NONE; } char* newP = static_cast(realloc(p, static_cast(n))); if(newP == nullptr) { return Error::OUT_OF_MEMORY; } p = newP; return Error::NONE; } void Core::free(void* p) { ::free(p); } const char* Core::getFileName(const char* path) { int end = 0; while(path[end] != '\0') { end++; } while(end > 0 && path[end - 1] != '/') { end--; } return path + end; }