#include <stdio.h>
#include <string.h>
+#include "memdebug_debugger.h"
+
ParseError* ParseError_new(void) {
ParseError* pe = malloc(sizeof(ParseError));
if (pe) {
void ParseError_delete(ParseError* pe) {
if (pe) {
- free(pe->message);
+ if (pe->message) {
+ free(pe->message);
+ }
}
free(pe);
}
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);
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);
+ }
+ }
+}