#include #include "hydroforth/hydroforth.h" void hydroforth__result__add_backtrace(HYDROFORTH__RESULT *const result, const char *const s) { result->backtrace = realloc(result->backtrace, sizeof(char *) * (result->backtrace_len + 1)); result->backtrace[result->backtrace_len++] = s; } void hydroforth__result__set(HYDROFORTH__RESULT *const result, HYDROFORTH__ERROR error, const char *const s) { result->error = error; hydroforth__result__add_backtrace(result, s); } const char *hydroforth__result__get_error_message(HYDROFORTH__ERROR error) { switch (error) { case OK: return "OK"; case ERR_UNKNOWN: return "Unknown error"; case ERR_INVALID_HEX_CHAR: return "Invalid hexadecimal char in number"; case ERR_UNKNOWN_SINGLE_CHAR_WORD: case ERR_UNKNOWN_WORD: return "Unknown word"; case ERR_UNTERMINATED_WORD_DEFINITION: return "Unterminated word definition"; case ERR_WORD_NAME_CANT_BE_NUMBER: return "Word name can't be a number"; case ERR_WORD_DEF_INSIDE_WORD_DEF: return "Can't define a word inside a word definition"; default: return "???"; } } int hydroforth__result__unwrap(HYDROFORTH__RESULT *const result, int code) { printf("BACKTRACE LEN: %u\n", result->backtrace_len); puts("ERROR! Backtrace:"); printf("Error: %u -> \"%s\"\n", result->error, hydroforth__result__get_error_message(result->error)); for (unsigned short i = 0; i < result->backtrace_len; i++) { printf("%u: %s\n", result->backtrace_len - i - 1, result->backtrace[i]); } printf("EXITING with code: %u!\n", code); free(result->backtrace); return code; }