summaryrefslogtreecommitdiff
path: root/sys/src/cmd
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-10-06 06:34:30 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-10-06 06:34:30 +0200
commit651b2a32be9a0d0daebe9f6ff4ddee675908a8fc (patch)
tree1e46ee1df2f22ccba579b763dca1dd7a6f783d83 /sys/src/cmd
parent2d59b15c39dc0412e2722141cb5d48bf72b5665e (diff)
cc: allow runes as macro names (from charles forsyth)
Diffstat (limited to 'sys/src/cmd')
-rw-r--r--sys/src/cmd/cc/macbody54
1 files changed, 33 insertions, 21 deletions
diff --git a/sys/src/cmd/cc/macbody b/sys/src/cmd/cc/macbody
index 7c86bac19..fa381ca49 100644
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -18,22 +18,27 @@ getnsn(void)
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 @@ getsym(void)
*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 @@ void
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 @@ macdef(void)
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 @@ macdef(void)
c = getc();
break;
}
- if(c == '\n') {
+ if(0 && c == '\n') {
yyerror("comment and newline in define: %s", s->name);
break;
}