shithub: riscv

Download patch

ref: 651b2a32be9a0d0daebe9f6ff4ddee675908a8fc
parent: 2d59b15c39dc0412e2722141cb5d48bf72b5665e
author: cinap_lenrek <[email protected]>
date: Tue Oct 6 02:34:30 EDT 2015

cc: allow runes as macro names (from charles forsyth)

--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -18,22 +18,27 @@
 	return n;
 }
 
-Sym*
-getsym(void)
+static void
+nextsym(int c)
 {
-	int c;
+	int c1;
 	char *cp;
 
-	c = getnsc();
-	if(!isalpha(c) && c != '_' && c < Runeself) {
-		unget(c);
-		return S;
-	}
 	for(cp = symb;;) {
-		if(cp <= symb+NSYMB-4)
-			*cp++ = c;
+		if(c >= Runeself) {
+			for(c1=0;;) {
+				if(cp <= symb+NSYMB-4)
+					cp[c1++] = c;
+				if(fullrune(cp, c1))
+					break;
+				c = getc();
+			}
+			cp += c1;
+		}else
+			if(cp <= symb+NSYMB-4)
+				*cp++ = c;
 		c = getc();
-		if(isalnum(c) || c == '_' || c >= Runeself)
+		if(c >= Runeself || isalnum(c) || c == '_')
 			continue;
 		unget(c);
 		break;
@@ -41,6 +46,19 @@
 	*cp = 0;
 	if(cp > symb+NSYMB-4)
 		yyerror("symbol too large: %s", symb);
+}
+
+Sym*
+getsym(void)
+{
+	int c;
+
+	c = getnsc();
+	if(c < Runeself && !isalpha(c) && c != '_') {
+		unget(c);
+		return S;
+	}
+	nextsym(c);
 	return lookup();
 }
 
@@ -193,7 +211,7 @@
 macdef(void)
 {
 	Sym *s, *a;
-	char *args[NARG], *np, *base;
+	char *args[NARG], *base;
 	int n, i, c, len, dots;
 	int ischr;
 
@@ -235,15 +253,9 @@
 	len = 1;
 	ischr = 0;
 	for(;;) {
-		if(isalpha(c) || c == '_') {
-			np = symb;
-			*np++ = c;
+		if(c >= Runeself || isalpha(c) || c == '_') {
+			nextsym(c);
 			c = getc();
-			while(isalnum(c) || c == '_') {
-				*np++ = c;
-				c = getc();
-			}
-			*np = 0;
 			for(i=0; i<n; i++)
 				if(strcmp(symb, args[i]) == 0)
 					break;
@@ -295,7 +307,7 @@
 							c = getc();
 							break;
 						}
-						if(c == '\n') {
+						if(0 && c == '\n') {
 							yyerror("comment and newline in define: %s", s->name);
 							break;
 						}