]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blob - parseerror.c
- Se usa el memdug en ParseError y Equation.
[z.facultad/75.42/calculadora.git] / parseerror.c
1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 2:
6  * Programa calculadora.
7  *
8  * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9  * Puede copiar, modificar y distribuir este programa bajo los términos de
10  * la licencia GPL (http://www.gnu.org/).
11  *
12  * Creado: lun sep 15 00:02:35 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "parseerror.h"
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21
22 #include "memdebug_debugger.h"
23
24 ParseError* ParseError_new(void) {
25     ParseError* pe = malloc(sizeof(ParseError));
26     if (pe) {
27         pe->line        = 0;
28         pe->pos         = 0;
29         pe->message     = NULL;
30     }
31     return pe;
32 }
33
34 void ParseError_delete(ParseError* pe) {
35     if (pe) {
36         free(pe->message);
37     }
38     free(pe);
39 }
40
41 bool ParseError_set_message(ParseError* pe, const char* msg) {
42     /* Si había otro mensaje, liberamos la memoria */
43     if (pe->message) {
44         free(pe->message);
45     }
46     /* Aloco nueva memoria. */
47     pe->message = malloc(sizeof(char) * (strlen(msg) + 1));
48     if (pe->message) {
49         strcpy(pe->message, msg);
50     }
51     return pe->message ? TRUE : FALSE;
52 }
53
54 bool ParseError_set_pos_message(ParseError* pe, const char* msg, size_t pos,
55         char wrong_char) {
56     /* Pongo la posición */
57     pe->pos = pos;
58     /* Si había otro mensaje, liberamos la memoria */
59     if (pe->message) {
60         free(pe->message);
61     }
62     /* Aloco nueva memoria. */
63     pe->message = malloc(
64             sizeof("Se buscaba ")
65             + sizeof(char) * strlen(msg) /* Tamaño del mensaje */ 
66             + sizeof(", pero se encontró '")
67             + sizeof(char) /* un char para imprimir el caracter encontrado */
68             + sizeof("' (0x")
69             + sizeof(char) * 2 /* dos char para poner el numero */
70             + sizeof(")")
71             + sizeof(char) /* un char para el caracter nulo (fin de string) */
72             );
73     if (pe->message) {
74         /* Copio el nuevo mensaje. */
75         sprintf(pe->message, "Se buscaba %s pero se encontró '%c' (0x%02X)",
76                 msg, wrong_char, wrong_char);
77     }
78     return pe->message ? TRUE : FALSE;
79 }
80
81 size_t ParseError_print(ParseError* pe, FILE* fp) {
82     /* No es un error de interpretación específico. */
83     if (!pe->pos) {
84         /* Si hay mensaje. */
85         if (pe->message) {
86             return fprintf(fp, "Error: %s.\n", pe->message);
87         /* Si no hay mensaje. */
88         } else {
89             return fprintf(fp, "Error no especificado.\n");
90         }
91     /* Es un error de interpretación en una posición específica. */
92     } else {
93         /* Si hay mensaje. */
94         if (pe->message) {
95             return fprintf(fp, "Error en la línea %u, posición %u: %s.\n",
96                     pe->line, pe->pos, pe->message);
97         /* Si no hay mensaje. */
98         } else {
99             return fprintf(fp,
100                     "Error en la línea %u, posición %u no especificado.\n",
101                     pe->line, pe->pos);
102         }
103     }
104 }