X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Ferrors.c;h=195bfe9f90948bee4ef85c2cec4df79979630d11;hb=d8d68d0bd4c45af6f0dc69b4fc33d37d961aca85;hp=8a4d288f4b34a6800b2d277f59003e83ee90428e;hpb=18379907e684280f6e70bf5c2205c2968e56fa67;p=inform.git diff --git a/src/errors.c b/src/errors.c index 8a4d288..195bfe9 100644 --- a/src/errors.c +++ b/src/errors.c @@ -2,9 +2,8 @@ /* "errors" : Warnings, errors and fatal errors */ /* (with error throwback code for RISC OS machines) */ /* */ -/* Copyright (c) Graham Nelson 1993 - 2018 */ -/* */ -/* This file is part of Inform. */ +/* Part of Inform 6.35 */ +/* copyright (c) Graham Nelson 1993 - 2021 */ /* */ /* Inform is free software: you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ @@ -32,6 +31,8 @@ static char error_message_buff[ERROR_BUFLEN+4]; /* room for ellipsis */ ErrorPosition ErrorReport; /* Maintained by "lexer.c" */ +static char other_pos_buff[ERROR_BUFLEN+1]; /* Used by location_text() */ + static void print_preamble(void) { /* Only really prints the preamble to an error or warning message: @@ -55,6 +56,7 @@ static void print_preamble(void) if (!(ErrorReport.main_flag)) printf("\"%s\", ", p); printf("line %d: ", ErrorReport.line_number); + if (ErrorReport.orig_file) { char *op; if (ErrorReport.orig_file <= 0 || ErrorReport.orig_file > total_files) @@ -80,16 +82,95 @@ static void print_preamble(void) } printf("%s", p); if (with_extension_flag) printf("%s", Source_Extension); - printf("(%d): ", ErrorReport.line_number); + printf("(%d)", ErrorReport.line_number); + + if (ErrorReport.orig_file) { + char *op; + if (ErrorReport.orig_file <= 0 || ErrorReport.orig_file > total_files) + op = ErrorReport.orig_source; + else + op = InputFiles[ErrorReport.orig_file-1].filename; + printf("|%s", op); + if (ErrorReport.orig_line) { + printf("(%d", ErrorReport.orig_line); + if (ErrorReport.orig_char) { + printf(":%d", ErrorReport.orig_char); + } + printf(")"); + } + } + + printf(": "); break; case 2: /* Macintosh Programmer's Workshop error message format */ - printf("File \"%s\"; Line %d\t# ", p, ErrorReport.line_number); + printf("File \"%s\"; Line %d", p, ErrorReport.line_number); + + if (ErrorReport.orig_file) { + char *op; + if (ErrorReport.orig_file <= 0 || ErrorReport.orig_file > total_files) + op = ErrorReport.orig_source; + else + op = InputFiles[ErrorReport.orig_file-1].filename; + printf(": (\"%s\"", op); + if (ErrorReport.orig_line) { + printf("; Line %d", ErrorReport.orig_line); + if (ErrorReport.orig_char) { + printf("; Char %d", ErrorReport.orig_char); + } + } + printf(")"); + } + + printf("\t# "); break; } } +static char *location_text(brief_location report_line) +{ + int j; + char *p; + int len; + + /* Convert the location to a brief string. + (Some error messages need to report a secondary location.) + This uses the static buffer other_pos_buff. */ + + ErrorPosition errpos; + errpos.file_number = -1; + errpos.source = NULL; + errpos.line_number = 0; + errpos.main_flag = 0; + errpos.orig_source = NULL; + export_brief_location(report_line, &errpos); + + j = errpos.file_number; + if (j <= 0 || j > total_files) p = errpos.source; + else p = InputFiles[j-1].filename; + + if (!p && errpos.line_number == 0) { + /* Special case */ + strcpy(other_pos_buff, "compiler setup"); + return other_pos_buff; + } + + if (!p) p = ""; + + len = 0; + + if (!(errpos.main_flag)) { + snprintf(other_pos_buff+len, ERROR_BUFLEN-len, + "\"%s\", ", p); + len = strlen(other_pos_buff); + } + snprintf(other_pos_buff+len, ERROR_BUFLEN-len, + "line %d", errpos.line_number); + + return other_pos_buff; +} + static void ellipsize_error_message_buff(void) { /* If the error buffer was actually filled up by a message, it was @@ -255,6 +336,12 @@ extern void ebf_error(char *s1, char *s2) error(error_message_buff); } +extern void ebf_symbol_error(char *s1, char *name, char *type, brief_location report_line) +{ snprintf(error_message_buff, ERROR_BUFLEN, "\"%s\" is a name already in use and may not be used as a %s (%s \"%s\" was defined at %s)", name, s1, type, name, location_text(report_line)); + ellipsize_error_message_buff(); + error(error_message_buff); +} + extern void char_error(char *s, int ch) { int32 uni;