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);
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;
}
+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: %s.\n", pe->message);
+ /* Si no hay mensaje. */
+ } else {
+ return fprintf(fp, "Error no especificado.\n");
+ }
+ /* 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);
+ }
+ }
+}