X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Ferrors.c;h=08dd87efa21a698074499f4fe492b907a668e59e;hb=c881aa3386c00d7021ffabf2f66275d6c110c1c1;hp=73fa1be7430d277998fd9c070b003bc96bf7fabb;hpb=e536ce9e39cc1bfa82ecd1d6d73f874af655f9db;p=inform.git diff --git a/src/errors.c b/src/errors.c index 73fa1be..08dd87e 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 - 2020 */ -/* */ -/* 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: @@ -90,6 +91,43 @@ static void print_preamble(void) } } +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) 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 +293,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;