ref: b3c3c3e63df2958dfc3f972abefa8f892d8345d3
parent: 1656782f7919856b6a627a5f15a4209ee853f7f1
author: cinap_lenrek <[email protected]>
date: Mon Oct 11 23:06:20 EDT 2021
cc: do not expand function-like macros for non-function invocations It is a bit of a annoyance that kenc will try to expand function like macros on any symbol with the same name and then complain when it doesnt see the '(' in the invocation. test case below: void foo(int) { } struct Bar { int baz; /* <- should not conflict */ }; void main(void) { baz(123); }
--- a/sys/src/cmd/1a/a.h
+++ b/sys/src/cmd/1a/a.h
@@ -156,7 +156,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);
--- a/sys/src/cmd/2a/a.h
+++ b/sys/src/cmd/2a/a.h
@@ -157,7 +157,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);
--- a/sys/src/cmd/5a/a.h
+++ b/sys/src/cmd/5a/a.h
@@ -137,7 +137,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void maclin(void);
void macprag(void);
--- a/sys/src/cmd/6a/a.h
+++ b/sys/src/cmd/6a/a.h
@@ -151,7 +151,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);
--- a/sys/src/cmd/7a/a.h
+++ b/sys/src/cmd/7a/a.h
@@ -143,7 +143,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void maclin(void);
void macprag(void);
--- a/sys/src/cmd/8a/a.h
+++ b/sys/src/cmd/8a/a.h
@@ -152,7 +152,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);
--- a/sys/src/cmd/cc/cc.h
+++ b/sys/src/cmd/cc/cc.h
@@ -556,7 +556,7 @@
void macdef(void);
void macprag(void);
void macend(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macif(int);
void macinc(void);
void maclin(void);
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -755,18 +755,22 @@
if(s->macro) {
newio();
cp = ionext->b;
- macexpand(s, cp, sizeof(ionext->b)-1);
- pushio();
- ionext->link = iostack;
- iostack = ionext;
- fi.p = cp;
- fi.c = strlen(cp);
- if(peekc != IGN) {
- cp[fi.c++] = peekc;
- cp[fi.c] = 0;
- peekc = IGN;
+ if(macexpand(s, cp, sizeof(ionext->b)-1)){
+ pushio();
+ ionext->link = iostack;
+ iostack = ionext;
+ fi.p = cp;
+ fi.c = strlen(cp);
+ if(peekc != IGN) {
+ cp[fi.c++] = peekc;
+ cp[fi.c] = 0;
+ peekc = IGN;
+ }
+ goto l0;
+ } else {
+ ionext->link = iofree;
+ iofree = ionext;
}
- goto l0;
}
yylval.sym = s;
if(s->class == CTYPEDEF || s->class == CTYPESTR)
--- a/sys/src/cmd/cc/lexbody
+++ b/sys/src/cmd/cc/lexbody
@@ -238,18 +238,22 @@
if(s->macro) {
newio();
cp = ionext->b;
- macexpand(s, cp, sizeof(ionext->b)-1);
- pushio();
- ionext->link = iostack;
- iostack = ionext;
- fi.p = cp;
- fi.c = strlen(cp);
- if(peekc != IGN) {
- cp[fi.c++] = peekc;
- cp[fi.c] = 0;
- peekc = IGN;
+ if(macexpand(s, cp, sizeof(ionext->b)-1)){
+ pushio();
+ ionext->link = iostack;
+ iostack = ionext;
+ fi.p = cp;
+ fi.c = strlen(cp);
+ if(peekc != IGN) {
+ cp[fi.c++] = peekc;
+ cp[fi.c] = 0;
+ peekc = IGN;
+ }
+ goto l0;
+ } else {
+ ionext->link = iofree;
+ iofree = ionext;
}
- goto l0;
}
if(s->type == 0)
s->type = LNAME;
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -372,7 +372,7 @@
macend();
}
-void
+int
macexpand(Sym *s, char *b, int blen)
{
char buf[2000];
@@ -386,7 +386,7 @@
goto toobig;
if(debug['m'])
print("#expand %s %s\n", s->name, b);
- return;
+ return 1;
}
nargs = (char)(*s->macro & ~VARMAC) - 1;
@@ -393,8 +393,10 @@
dots = *s->macro & VARMAC;
c = getnsc();
- if(c != '(')
- goto bad;
+ if(c != '('){
+ unget(c);
+ return 0;
+ }
n = 0;
c = getc();
if(c != ')') {
@@ -490,7 +492,7 @@
if(n != nargs) {
yyerror("argument mismatch expanding: %s", s->name);
*b = 0;
- return;
+ return 0;
}
ob = b;
eb = b + blen-1;
@@ -526,16 +528,17 @@
*b = 0;
if(debug['m'])
print("#expand %s %s\n", s->name, ob);
- return;
+ return 1;
bad:
yyerror("syntax in macro expansion: %s", s->name);
*b = 0;
- return;
+ return 0;
toobig:
yyerror("too much text in macro expansion: %s", s->name);
*b = 0;
+ return 0;
}
void
--- a/sys/src/cmd/ka/a.h
+++ b/sys/src/cmd/ka/a.h
@@ -136,7 +136,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);
--- a/sys/src/cmd/qa/a.h
+++ b/sys/src/cmd/qa/a.h
@@ -138,7 +138,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);
--- a/sys/src/cmd/va/a.h
+++ b/sys/src/cmd/va/a.h
@@ -136,7 +136,7 @@
void domacro(void);
void macund(void);
void macdef(void);
-void macexpand(Sym*, char*, int);
+int macexpand(Sym*, char*, int);
void macinc(void);
void maclin(void);
void macprag(void);