ref: 20b2f5ee2f7cfe8f100c30b6ff6236e63daf76be
parent: 9b40663d543db447e2790fb41761626be651233e
author: ISSOtm <[email protected]>
date: Sat Aug 31 23:42:50 EDT 2019
Fix incorrect line numbers with some IF blocks If a line ended with a string's closing quote, or a newline escape, then skipping over that line via IF/ELIF/ELSE would fail to count that line, offsetting the rest of the file. I have no idea why but for some reason 9829be1 changed *specifically* `if_skip_to_else` to have incorrect behavior on string endings. The incorrect behavior on newline escapes seems to have been here since the beginning. Also added a test to check for both of those behaviors in both functions. Honestly, it baffles me that nobody ever noticed. I didn't until I started working on #395.
--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -354,20 +354,14 @@
src++;
}
} else {
- switch (*src) {
- case '\\':
- src += 2;
- break;
-
- case '\"':
- src += 2;
+ if (*src == '\"') {
inString = false;
- break;
-
- default:
- src++;
- break;
+ } else if (*src == '\\') {
+ /* Escaped quotes don't end the string */
+ if (*++src != '\"')
+ src--;
}
+ src++;
}
}
@@ -405,21 +399,14 @@
src++;
}
} else {
- switch (*src) {
-
- case '\\':
- src += 2;
- break;
-
- case '\"':
- src++;
+ if (*src == '\"') {
inString = false;
- break;
-
- default:
- src++;
- break;
+ } else if (*src == '\\') {
+ /* Escaped quotes don't end the string */
+ if (*++src != '\"')
+ src--;
}
+ src++;
}
}
--- /dev/null
+++ b/test/asm/correct-line-number.asm
@@ -1,0 +1,11 @@
+IF 0
+ "\
+ "
+ELIF 1
+ WARN "Am I geting ahead of myself?"
+ELSE
+ "\
+ "
+ENDC
+
+WARN "Hopefully not."
\ No newline at end of file
--- /dev/null
+++ b/test/asm/correct-line-number.out
@@ -1,0 +1,4 @@
+warning: correct-line-number.asm(5):
+ Am I geting ahead of myself?
+warning: correct-line-number.asm(11):
+ Hopefully not.
--- /dev/null
+++ b/test/asm/correct-line-number.out.pipe
@@ -1,0 +1,4 @@
+warning: -(5):
+ Am I geting ahead of myself?
+warning: -(11):
+ Hopefully not.
--- a/test/asm/multiple-charmaps.out
+++ b/test/asm/multiple-charmaps.out
@@ -1,6 +1,6 @@
warning: multiple-charmaps.asm(75):
Using 'charmap' within a section when the current charmap is 'main' is deprecated
-ERROR: multiple-charmaps.asm(100) -> new_(5):
+ERROR: multiple-charmaps.asm(100) -> new_(6):
Charmap 'map1' already exists
ERROR: multiple-charmaps.asm(102) -> set_(2):
Charmap 'map5' doesn't exist
--- a/test/asm/multiple-charmaps.out.pipe
+++ b/test/asm/multiple-charmaps.out.pipe
@@ -1,6 +1,6 @@
warning: -(75):
Using 'charmap' within a section when the current charmap is 'main' is deprecated
-ERROR: -(100) -> new_(5):
+ERROR: -(100) -> new_(6):
Charmap 'map1' already exists
ERROR: -(102) -> set_(2):
Charmap 'map5' doesn't exist