shithub: scc

Download patch

ref: 11c2f9d8aedc5338cdb03b6c53d9461e12f9aaaa
parent: 1126acd115d8cded1f3b6a6e20134b60266f382e
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon May 11 12:29:28 EDT 2015

Merge consecutive strings

--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -1,5 +1,4 @@
 
-#include <assert.h>
 #include <errno.h>
 #include <inttypes.h>
 #include <setjmp.h>
@@ -353,21 +352,36 @@
 static uint8_t
 string(void)
 {
-	static char buf[STRINGSIZ+1];
+	char buf[STRINGSIZ+1];
 	Symbol *sym;
 	char *bp = buf, c;
 
-	assert(STRINGSIZ <= INPUTSIZ);
-	for (++input->p; (c = *input->p) != '\0'; ++input->p) {
-		if (c == '"')
-			break;
+repeat:
+	for (++input->p; (c = *input->p) != '\0' && c != '"'; ++input->p) {
 		if (c == '\\')
 			c = escape();
+		if (bp == &buf[STRINGSIZ])
+			error("string too long");
 		*bp++ = c;
 	}
 
 	if (c == '\0')
 		error("missing terminating '\"' character");
+	++input->p;
+
+	for (;;) {
+		if (isspace((c = *input->p))) {
+			++input->p;
+		} else if (c == '\0') {
+			input->begin = input->p;
+			fill();
+		} else if (c == '"') {
+			goto repeat;
+		} else {
+			break;
+		}
+	}
+
 	*bp = '\0';
 	sym = install("", NS_IDEN);
 	sym->u.s = xstrdup(buf);