ref: 28fe2577dcd698837def524a1d56f7198e5442b6
parent: 36e61f8fc87848e3ec686f1a6f5fd649c94dc8e1
author: cinap_lenrek <cinap_lenrek@felloff.net>
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);
--
⑨