Update to commit e33eef4f8fab800eaf4a32b2d159cde6c4bbb38e
[inform.git] / src / errors.c
index d13039890700112fc767ad8b63a7931833ac07df..195bfe9f90948bee4ef85c2cec4df79979630d11 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 - 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;
 
@@ -402,8 +489,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)