]> git.llucax.com Git - z.facultad/75.42/calculadora.git/blob - parseerror.c
Se hace una prueba del parser_equation() y se corrigen varios bugs.
[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 ParseError* ParseError_new(void) {
23     ParseError* pe = malloc(sizeof(ParseError));
24     if (pe) {
25         pe->line        = 0;
26         pe->pos         = 0;
27         pe->message     = NULL;
28     }
29     return pe;
30 }
31
32 void ParseError_delete(ParseError* pe) {
33     if (pe) {
34         free(pe->message);
35     }
36     free(pe);
37 }
38
39 bool ParseError_set_message(ParseError* pe, const char* msg) {
40     /* Si había otro mensaje, liberamos la memoria */
41     if (pe->message) {
42         free(pe->message);
43     }
44     /* Aloco nueva memoria. */
45     pe->message = malloc(sizeof(char) * (strlen(msg) + 1));
46     if (pe->message) {
47         strcpy(pe->message, msg);
48     }
49     return pe->message ? TRUE : FALSE;
50 }
51
52 bool ParseError_set_pos_message(ParseError* pe, const char* msg, size_t pos,
53         char wrong_char) {
54     /* Pongo la posición */
55     pe->pos = pos;
56     /* Si había otro mensaje, liberamos la memoria */
57     if (pe->message) {
58         free(pe->message);
59     }
60     /* Aloco nueva memoria. */
61     pe->message = malloc(
62             sizeof("Se buscaba ")
63             + sizeof(char) * strlen(msg) /* Tamaño del mensaje */ 
64             + sizeof(", pero se encontró '")
65             + sizeof(char) /* un char para imprimir el caracter encontrado */
66             + sizeof("' (0x")
67             + sizeof(char) * 2 /* dos char para poner el numero */
68             + sizeof(")")
69             + sizeof(char) /* un char para el caracter nulo (fin de string) */
70             );
71     if (pe->message) {
72         /* Copio el nuevo mensaje. */
73         sprintf(pe->message, "Se buscaba %s pero se encontró '%c' (0x%02X)",
74                 msg, wrong_char, wrong_char);
75     }
76     return pe->message ? TRUE : FALSE;
77 }
78
79 size_t ParseError_print(ParseError* pe, FILE* fp) {
80     /* No es un error de interpretación específico. */
81     if (!pe->pos) {
82         /* Si hay mensaje. */
83         if (pe->message) {
84             return fprintf(fp, "Error: %s.\n", pe->message);
85         /* Si no hay mensaje. */
86         } else {
87             return fprintf(fp, "Error no especificado.\n");
88         }
89     /* Es un error de interpretación en una posición específica. */
90     } else {
91         /* Si hay mensaje. */
92         if (pe->message) {
93             return fprintf(fp, "Error en la línea %u, posición %u: %s.\n",
94                     pe->line, pe->pos, pe->message);
95         /* Si no hay mensaje. */
96         } else {
97             return fprintf(fp,
98                     "Error en la línea %u, posición %u no especificado.\n",
99                     pe->line, pe->pos);
100         }
101     }
102 }