Update to commit e33eef4f8fab800eaf4a32b2d159cde6c4bbb38e
[inform.git] / src / errors.c
index 73fa1be7430d277998fd9c070b003bc96bf7fabb..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;