]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blobdiff - parseerror.c
Versión preliminar del programa del TP. Falta evaluar ecuaciones.
[z.facultad/75.42/calculadora.git] / parseerror.c
index 398143a87bf3465502b4fee82656036b56cbc3d7..038314df067c434c55141a23ccdb923f183e6880 100644 (file)
@@ -19,6 +19,8 @@
 #include <stdio.h>
 #include <string.h>
 
 #include <stdio.h>
 #include <string.h>
 
+#include "memdebug_debugger.h"
+
 ParseError* ParseError_new(void) {
     ParseError* pe = malloc(sizeof(ParseError));
     if (pe) {
 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) {
 
 void ParseError_delete(ParseError* pe) {
     if (pe) {
-        free(pe->message);
+        if (pe->message) {
+            free(pe->message);
+        }
     }
     free(pe);
 }
     }
     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) {
 
 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);
     /* 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)",
     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;
 }
 
     }
     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);
+        }
+    }
+}