shithub: scc

Download patch

ref: 7bef3d1fcbbb59778de9e883f818978696a39617
parent: 09944e394b7a4474d0a13a8628164cd1fe170472
author: Roberto E. Vargas Caballero <[email protected]>
date: Sat Oct 31 05:37:49 EDT 2015

Fix escape sequences parsing

We were not incrementing the pointer in the case of escape sequences of only
1 letter, and it was generating garbage fat the end of the character.

--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -398,16 +398,16 @@
 	int c, base;
 
 	switch (*++input->p) {
-	case '\\': return '\\';
-	case 'a':  return '\a';
-	case 'f':  return '\f';
-	case 'n':  return '\n';
-	case 'r':  return '\r';
-	case 't':  return '\t';
-	case 'v':  return '\v';
-	case '\'': return '\\';
-	case '"':  return'"';
-	case '?':  return '?';
+	case '\\': c = '\\'; goto escape_letter;
+	case 'a':  c = '\a'; goto escape_letter;
+	case 'f':  c = '\f'; goto escape_letter;
+	case 'n':  c = '\n'; goto escape_letter;
+	case 'r':  c = '\r'; goto escape_letter;
+	case 't':  c = '\t'; goto escape_letter;
+	case 'v':  c = '\v'; goto escape_letter;
+	case '\'': c = '\\'; goto escape_letter;
+	case '"':  c = '"'; goto escape_letter;
+	case '?':  c = '?'; goto escape_letter;
 	case 'u':  base = 10; break;
 	case 'x':  base = 16; break;
 	case '0':  base = 8; break;
@@ -419,6 +419,10 @@
 	c = strtoul(++input->p, &input->p, base);
 	if (errno || c > 255)
 		warn("character constant out of range");
+	return c;
+
+escape_letter:
+	++input->p;
 	return c;
 }