165 lines
5.1 KiB
C
165 lines
5.1 KiB
C
/* errors.c */
|
|
|
|
#include "computorv1.h"
|
|
|
|
static void print_context_input()
|
|
{
|
|
ft_dprintf(STDERR_FILENO, "\ninput : %s\n", input_g_err);
|
|
}
|
|
|
|
static void print_context_tokens()
|
|
{
|
|
int i;
|
|
|
|
ft_putchar_fd('\n', STDERR_FILENO);
|
|
i = 0;
|
|
while (tokens_g_err[i].type != TOKEN_END)
|
|
{
|
|
ft_dprintf(STDERR_FILENO, "token[%2i] - type : ", i);
|
|
|
|
if (tokens_g_err[i].type == TOKEN_VARIABLE)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_VARIABLE");
|
|
else if (tokens_g_err[i].type == TOKEN_NUMBER_INT)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_NUMBER_INT");
|
|
else if (tokens_g_err[i].type == TOKEN_NUMBER_DOUBLE)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_NUMBER_DOUBLE");
|
|
else if (tokens_g_err[i].type == TOKEN_POWER)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_POWER");
|
|
else if (tokens_g_err[i].type == TOKEN_SIGN_PLUS)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_SIGN_PLUS");
|
|
else if (tokens_g_err[i].type == TOKEN_SIGN_MINUS)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_SIGN_MINUS");
|
|
else if (tokens_g_err[i].type == TOKEN_FACTOR_MULT)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_FACTOR_MULT");
|
|
else if (tokens_g_err[i].type == TOKEN_FACTOR_DIV)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_FACTOR_DIV");
|
|
else if (tokens_g_err[i].type == TOKEN_EQUAL)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_EQUAL");
|
|
else if (tokens_g_err[i].type == TOKEN_END)
|
|
ft_dprintf(STDERR_FILENO, "%20s", "TOKEN_END");
|
|
|
|
ft_putstr(" - value : ");
|
|
|
|
if (tokens_g_err[i].type == TOKEN_NUMBER_INT)
|
|
{
|
|
ft_dprintf(STDERR_FILENO, "%i\n", tokens_g_err[i].value_int);
|
|
}
|
|
else if (tokens_g_err[i].type == TOKEN_NUMBER_DOUBLE)
|
|
{
|
|
dprintf(STDERR_FILENO, "%g\n", tokens_g_err[i].value_double);
|
|
}
|
|
else
|
|
{
|
|
ft_dprintf(STDERR_FILENO, "%c\n", tokens_g_err[i].value_char);
|
|
}
|
|
i++;
|
|
}
|
|
ft_putchar_fd('\n', STDERR_FILENO);
|
|
}
|
|
|
|
static void print_context_terms()
|
|
{
|
|
int i;
|
|
|
|
i = 0;
|
|
while (terms_g_err[i].position != TERM_END)
|
|
{
|
|
ft_dprintf(STDERR_FILENO, "term[%2i] - ", i);
|
|
|
|
// position
|
|
ft_dprintf(STDERR_FILENO, "%8s : ", "position");
|
|
if (terms_g_err[i].position == TERM_LEFT)
|
|
ft_dprintf(STDERR_FILENO, "%10s", "TERM_LEFT");
|
|
else if (terms_g_err[i].position == TERM_RIGHT)
|
|
ft_dprintf(STDERR_FILENO, "%10s", "TERM_RIGHT");
|
|
else
|
|
ft_dprintf(STDERR_FILENO, "%10s", "");
|
|
|
|
// sign
|
|
ft_dprintf(STDERR_FILENO, " | %4s : ", "sign");
|
|
if (terms_g_err[i].sign == TERM_PLUS)
|
|
ft_dprintf(STDERR_FILENO, "%10s", "TERM_PLUS");
|
|
else if (terms_g_err[i].sign == TERM_MINUS)
|
|
ft_dprintf(STDERR_FILENO, "%10s", "TERM_MINUS");
|
|
else
|
|
ft_dprintf(STDERR_FILENO, "%10s", "");
|
|
|
|
// coefficient
|
|
dprintf(STDERR_FILENO, " | %10s : %13g", "coefficient", terms_g_err[i].coefficient);
|
|
|
|
// exponent
|
|
ft_dprintf(STDERR_FILENO, " | %8s : %d\n", "exponent", terms_g_err[i].exponent);
|
|
i++;
|
|
}
|
|
ft_putchar_fd('\n', STDERR_FILENO);
|
|
}
|
|
|
|
static void print_context_polynom()
|
|
{
|
|
int i;
|
|
|
|
ft_putnbr_fd(polynom_len_g_err, STDERR_FILENO);
|
|
ft_putchar_fd('\n', STDERR_FILENO);
|
|
i = 0;
|
|
while (i < polynom_len_g_err)
|
|
{
|
|
dprintf(STDERR_FILENO, "polynom[%i]: %10g\n", i, polynom_g_err[i]);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void print_state()
|
|
{
|
|
if (!debug_mode)
|
|
return;
|
|
ft_dprintf(STDERR_FILENO, "\nSTATE :\n");
|
|
if (input_g_err)
|
|
print_context_input();
|
|
if (tokens_g_err)
|
|
print_context_tokens();
|
|
if (terms_g_err)
|
|
print_context_terms();
|
|
if (polynom_g_err)
|
|
print_context_polynom();
|
|
}
|
|
|
|
int stop_errors(e_program_error err, const char *details, ...)
|
|
{
|
|
// the base error message
|
|
const char *msg = "error: error type is out of range";
|
|
|
|
// map error codes to messages
|
|
const char *error_messages[ERROR_SENTINEL] = {
|
|
[ERROR_BASE] = "undefined error",
|
|
[ARGUMENTS_ERROR] = "arguments error",
|
|
[ERROR_UNKNOWN_TOKEN] = "LEXER - unknown token",
|
|
[ERROR_NUMBER_TOO_BIG] = "LEXER - number is too big",
|
|
[ERROR_PARSING] = "PARSER - too much terms to parse",
|
|
[ERROR_TOKEN_POSITION] = "PARSER - token position is not good in grammar",
|
|
[ERROR_VAR_DIFF] = "PARSER - expression must only contain one variable",
|
|
[ERROR_TOKEN_COUNT] = "LEXER - token count error",
|
|
[ERROR_TERM_COUNT] = "PARSER - term count error",
|
|
};
|
|
|
|
// override msg if err is in the error_messages array
|
|
if (err >= ERROR_BASE && err < ERROR_SENTINEL)
|
|
{
|
|
msg = error_messages[err];
|
|
}
|
|
|
|
// print context
|
|
print_state();
|
|
|
|
// print the base message
|
|
ft_dprintf(STDERR_FILENO, "error: (%i) %s - details: ", err, msg);
|
|
|
|
// print the formatted details
|
|
va_list args;
|
|
va_start(args, details);
|
|
ft_vdprintf(STDERR_FILENO, details, args);
|
|
va_end(args);
|
|
|
|
ft_putchar_fd('\n', STDERR_FILENO);
|
|
|
|
exit(err);
|
|
} |