1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Programa calculadora.
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/).
12 * Creado: lun sep 15 00:02:35 ART 2003
17 #include "parseerror.h"
22 ParseError* ParseError_new(void) {
23 ParseError* pe = malloc(sizeof(ParseError));
32 void ParseError_delete(ParseError* pe) {
39 bool ParseError_set_message(ParseError* pe, const char* msg) {
40 /* Si había otro mensaje, liberamos la memoria */
44 /* Aloco nueva memoria. */
45 pe->message = malloc(sizeof(char) * (strlen(msg) + 1));
47 strcpy(pe->message, msg);
49 return pe->message ? TRUE : FALSE;
52 bool ParseError_set_pos_message(ParseError* pe, const char* msg, size_t pos,
54 /* Pongo la posición */
56 /* Si había otro mensaje, liberamos la memoria */
60 /* Aloco nueva memoria. */
63 + sizeof(char) * strlen(msg) /* Tamaño del mensaje */
64 + sizeof(", pero se encontró '")
65 + sizeof(char) /* un char para imprimir el caracter encontrado */
67 + sizeof(char) * 2 /* dos char para poner el numero */
69 + sizeof(char) /* un char para el caracter nulo (fin de string) */
72 /* Copio el nuevo mensaje. */
73 sprintf(pe->message, "Se buscaba %s pero se encontró '%c' (0x%02X)",
74 msg, wrong_char, wrong_char);
76 return pe->message ? TRUE : FALSE;
79 size_t ParseError_print(ParseError* pe, FILE* fp) {
80 /* No es un error de interpretación específico. */
84 return fprintf(fp, "Error: %s.\n", pe->message);
85 /* Si no hay mensaje. */
87 return fprintf(fp, "Error no especificado.\n");
89 /* Es un error de interpretación en una posición específica. */
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. */
98 "Error en la línea %u, posición %u no especificado.\n",