Update to commit e2647ad952b4d7afc9a186429c181efbc4958786
[inform.git] / src / errors.c
index d13039890700112fc767ad8b63a7931833ac07df..c1e62412873f35669fdde5852bfb38fd56ceef0e 100644 (file)
@@ -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 - 2020                                 */
 /*                                                                           */
 /* 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,42 @@ static void print_preamble(void)
     }
 }
 
+static char *location_text(brief_location report_line)
+{
+    /* 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);
+
+    int j;
+    char *p;
+    
+    j = errpos.file_number;
+    if (j <= 0 || j > total_files) p = errpos.source;
+    else p = InputFiles[j-1].filename;
+    
+    if (!p) p = "";
+
+    int 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 +292,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;
 
@@ -402,8 +445,7 @@ Check to see if there is a more recent version available, from which\n\
 the problem may have been removed. If not, please report this fault\n\
 and if at all possible, please include your source code, as faults\n\
 such as these are rare and often difficult to reproduce. Sorry.\n\
-***********************************************************************\n",
-    (RELEASE_NUMBER/100)%10, RELEASE_NUMBER%100, RELEASE_DATE);
+***********************************************************************\n");
 }
 
 extern int compiler_error(char *s)