View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update | 
|---|---|---|---|---|---|
| 0000508 | LDMud 3.3 | LPC Compiler/Preprocessor | public | 2007-08-07 03:40 | 2018-01-29 21:57 | 
| Reporter | Gnomi | Assigned To | |||
| Priority | normal | Severity | minor | Reproducibility | always | 
| Status | resolved | Resolution | fixed | ||
| Platform | i686 | OS | Debian GNU/Linux | OS Version | 3.1 | 
| Product Version | 3.3 | ||||
| Fixed in Version | 3.3.717 | ||||
| Summary | 0000508: There is an off-by-one in the linenumbers in include files using auto-include-strings | ||||
| Description | Hi, consider the following files: -- oneoff.c --- #pragma BeginC #include "oneoff.inc" #pragma EndC -- oneoff.inc --- #pragma IncFile And an auto-include hook return "#pragma AutoInc-IncFile\n" or "#pragma AutoInc-CFile\n" depending on whether it is the main file or an included file. These pragmas are just for giving warnings with the current line number. Compiling oneoff.c gives the following result: Warning: w/gnomi/oneoff.c (auto include) line 1: Unknown #pragma 'AutoInc-CFile' Warning: w/gnomi/oneoff.c line 1: Unknown #pragma 'BeginC' Warning: w/gnomi/oneoff.inc (auto include) line 2: Unknown #pragma 'AutoInc-IncFile' Warning: w/gnomi/oneoff.inc line 0: Unknown #pragma 'IncFile' Warning: w/gnomi/oneoff.c line 3: Unknown #pragma 'EndC' The linenumbers in oneoff.c and its auto include string are correct, but not these from oneoff.inc. The auto include string should start at line 1 not 2, and lineoff.inc should start at line 1 and not 0. The linenumber within the auto include string is one too high because the #include statement (in handle_preprocessor_statement()) will increment the linenumber after having handled the include stuff, and add_auto_include is not aware of that. The linenumber within the include file itself is one too low because the linenumbering for include files starts at zero (because the #include will increment it afterwards), for the main file it starts at one. add_auto_include() increments it, to make it correct for include files (because the #incude will now increment the linenumber of the auto include string and not of the include file itself), but the CHAR_EOF handling in yylex1 will decrement it to counteract the incrementation for the main file. I attached a diff that fixes this. I removed the linenumber adjustment in the CHAR_EOF handling and let add_auto_include() increment the linenumber just once, either before or after starting the auto include string depending on whether we are in the main file or include file. Greetings, Gnomi.  | ||||
| Tags | No tags attached. | ||||
| Attached Files |  incoffbyone.diff (1,698 bytes)   
 
Index: trunk/src/lex.c
===================================================================
--- trunk/src/lex.c	(Revision 2314)
+++ trunk/src/lex.c	(Arbeitskopie)
@@ -2592,10 +2592,12 @@
     if (auto_include_string != NULL)
     {
         /* The auto include string is handled like a normal include */
-        current_loc.line++; /* Make sure to restore to line 1 */
+        if (cur_file != NULL)   /* Otherwise we already are at line 1 */
+            current_loc.line++; /* Make sure to restore to line 1 */
         (void)start_new_include(-1, auto_include_string
                                , current_loc.file->name, "auto include", ')');
-        current_loc.line++; /* Make sure to start at line 1 */
+        if (cur_file == NULL)   /* Otherwise #include will increment it */
+            current_loc.line++; /* Make sure to start at line 1 */
     }
 } /* add_auto_include() */
 
@@ -4626,18 +4628,6 @@
                 current_loc = p->loc;
                 if (!was_string_source)
                     current_loc.line++;
-                else
-                {
-                    /* 'string' includes are supposed to be inline
-                     * so correct the line number information to take out
-                     * the assumed newlines.
-                     * This has to be done after store_include_end()
-                     * since that function may remove all line number
-                     * information since the start of the include.
-                     */
-                    current_loc.line -= 1;
-                    store_line_number_backward(1);
-                }
 
                 yyin = p->yyin;
                 saved_char = p->saved_char;
 | ||||
| Date Modified | Username | Field | Change | 
|---|---|---|---|
| 2007-08-07 03:40 | Gnomi | New Issue | |
| 2007-08-07 03:40 | Gnomi | File Added: incoffbyone.diff | |
| 2007-11-11 17:39 | 
					 | 
				Status | new => resolved | 
| 2007-11-11 17:39 | 
					 | 
				Fixed in Version | => 3.3.717 | 
| 2007-11-11 17:39 | 
					 | 
				Resolution | open => fixed | 
| 2007-11-11 17:39 | 
					 | 
				Assigned To | => lars | 
| 2007-11-11 17:39 | 
					 | 
				Note Added: 0000578 | |
| 2009-04-14 12:14 | zesstra | Project | LDMud => LDMud 3.3 | 
| 2010-11-16 09:42 | 
					 | 
				Source_changeset_attached | => ldmud.git master f49af147 | 
| 2018-01-29 18:59 | 
					 | 
				Source_changeset_attached | => ldmud.git master f49af147 | 
| 2018-01-29 21:57 | 
					 | 
				Source_changeset_attached | => ldmud.git master f49af147 |