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