X-Git-Url: https://git.llucax.com/z.facultad/75.42/calculadora.git/blobdiff_plain/536f6abd563c15019e14a1a0e573b21e909bd88b..8f5992a5811ef292022a3ca3ac293c231e2b065b:/parseerror.c?ds=inline diff --git a/parseerror.c b/parseerror.c index 398143a..038314d 100644 --- a/parseerror.c +++ b/parseerror.c @@ -19,6 +19,8 @@ #include #include +#include "memdebug_debugger.h" + ParseError* ParseError_new(void) { ParseError* pe = malloc(sizeof(ParseError)); if (pe) { @@ -31,7 +33,9 @@ ParseError* ParseError_new(void) { void ParseError_delete(ParseError* pe) { if (pe) { - free(pe->message); + if (pe->message) { + free(pe->message); + } } free(pe); } @@ -51,6 +55,8 @@ bool ParseError_set_message(ParseError* pe, const char* msg) { bool ParseError_set_pos_message(ParseError* pe, const char* msg, size_t pos, char wrong_char) { + /* Pongo la posición */ + pe->pos = pos; /* Si había otro mensaje, liberamos la memoria */ if (pe->message) { free(pe->message); @@ -69,8 +75,34 @@ bool ParseError_set_pos_message(ParseError* pe, const char* msg, size_t pos, if (pe->message) { /* Copio el nuevo mensaje. */ sprintf(pe->message, "Se buscaba %s pero se encontró '%c' (0x%02X)", - msg, wrong_char, pos); + msg, wrong_char, wrong_char); } return pe->message ? TRUE : FALSE; } +size_t ParseError_print(ParseError* pe, FILE* fp) { + /* No es un error de interpretación específico. */ + if (!pe->pos) { + /* Si hay mensaje. */ + if (pe->message) { + return fprintf(fp, "Error en la línea %u: %s.\n", pe->line, + pe->message); + /* Si no hay mensaje. */ + } else { + return fprintf(fp, "Error en la línea %u no especificado.\n", + pe->line); + } + /* Es un error de interpretación en una posición específica. */ + } else { + /* Si hay mensaje. */ + if (pe->message) { + return fprintf(fp, "Error en la línea %u, posición %u: %s.\n", + pe->line, pe->pos, pe->message); + /* Si no hay mensaje. */ + } else { + return fprintf(fp, + "Error en la línea %u, posición %u no especificado.\n", + pe->line, pe->pos); + } + } +}