62 lines
1.6 KiB
C
62 lines
1.6 KiB
C
#include <malloc.h>
|
|
|
|
#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;
|
|
}
|