shithub: scc

Download patch

ref: 5c04cc190d4bd20243bd2da081a6c2e17ed8e6a9
parent: 1ad6eb865750ec1c626341f349228919364cb552
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Wed Jul 3 13:27:55 EDT 2013

Store operators characters in yytext

yytext is used for reporting errors, so no updating it will means
incorrect error information.

--- a/lex.c
+++ b/lex.c
@@ -82,12 +82,16 @@
 static unsigned char
 follow(unsigned char op, unsigned char eq, unsigned char rep)
 {
-	register char c;
+	register char c = getc(yyin);
 
-	if ((c = getc(yyin)) == '=')
+	yytext[1] = c;
+	yytext[2] = '\0';
+	if (c == '=')
 		return eq;
 	else if (c == op && rep)
 		return rep;
+
+	yytext[1] = '\0';
 	ungetc(c, yyin);
 	return op;
 }
@@ -98,15 +102,22 @@
 	static char tokens[2][3] = {
 		{GE, SHL, SHL_EQ},
 		{LE, SHR, SHR_EQ}};
-	register char c;
+	register char c = getc(yyin);
 	register char *tp = tokens[op == '>'];
 
-	if ((c = getc(yyin)) == '=') {
+	yytext[1] = c;
+	yytext[2] = '\0';
+	if (c == '=') {
 		return tp[0];
 	} else if (c == op) {
-		if ((c = getc(yyin)) == '=')
+		if ((c = getc(yyin)) == '=')  {
+			yytext[2] = c;
+			yytext[3] = '\0';
 			return tp[2];
+		}
 		op = tp[1];
+	} else {
+		yytext[1] = '\0';
 	}
 	ungetc(c, yyin);
 	return op;
@@ -115,13 +126,15 @@
 static unsigned char
 minus(void)
 {
-	register int c;
+	register int c = getc(yyin);
 
-	switch (c = getc(yyin)) {
+	yytext[1] = c;
+	switch (c) {
 	case '-': return DEC;
 	case '>': return INDIR;
 	case '=': return SUB_EQ;
 	default:
+		yytext[1] = '\0';
 		ungetc(c, yyin);
 		return '-';
 	}
@@ -130,9 +143,11 @@
 static unsigned char
 operator(void)
 {
-	register unsigned char c;
+	register unsigned char c = getc(yyin);
 
-	switch (c = getc(yyin)) {
+	yytext[0] = c;
+	yytext[1] = '\0';
+	switch (c) {
 	case '=': return follow('=', EQ, 0);
 	case '^': return follow('^', XOR_EQ, 0);
 	case '*': return follow('*', MUL_EQ, 0);
--