summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/cmd/cc/cc.h2
-rw-r--r--sys/src/cmd/cc/lex.c3
-rw-r--r--sys/src/cmd/cc/lexbody2
-rw-r--r--sys/src/cmd/cc/macbody24
4 files changed, 13 insertions, 18 deletions
diff --git a/sys/src/cmd/cc/cc.h b/sys/src/cmd/cc/cc.h
index 92ce0f8f4..357de549d 100644
--- a/sys/src/cmd/cc/cc.h
+++ b/sys/src/cmd/cc/cc.h
@@ -143,6 +143,8 @@ EXTERN struct
int c;
} fi;
+#define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
+
struct Io
{
Io* link;
diff --git a/sys/src/cmd/cc/lex.c b/sys/src/cmd/cc/lex.c
index 73d994968..7c22cb464 100644
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -430,7 +430,6 @@ syminit(Sym *s)
#define EOF (-1)
#define IGN (-2)
#define ESC (1<<20)
-#define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
enum
{
@@ -756,7 +755,7 @@ talph:
if(s->macro) {
newio();
cp = ionext->b;
- macexpand(s, cp, sizeof(ionext->b));
+ macexpand(s, cp, sizeof(ionext->b)-1);
pushio();
ionext->link = iostack;
iostack = ionext;
diff --git a/sys/src/cmd/cc/lexbody b/sys/src/cmd/cc/lexbody
index 2dcb9696e..7996c8ba1 100644
--- a/sys/src/cmd/cc/lexbody
+++ b/sys/src/cmd/cc/lexbody
@@ -238,7 +238,7 @@ l1:
if(s->macro) {
newio();
cp = ionext->b;
- macexpand(s, cp, sizeof(ionext->b));
+ macexpand(s, cp, sizeof(ionext->b)-1);
pushio();
ionext->link = iostack;
iostack = ionext;
diff --git a/sys/src/cmd/cc/macbody b/sys/src/cmd/cc/macbody
index c78aada98..ec15369f7 100644
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -350,7 +350,7 @@ macdef(void)
}
base = allocn(base, len, 1);
base[len++] = c;
- c = ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff));
+ c = GETC();
if(c == '\n')
lineno++;
if(c == -1) {
@@ -387,7 +387,10 @@ macexpand(Sym *s, char *b, int blen)
char *arg[NARG], *cp, *ob, *eb, *ecp, dots;
if(*s->macro == 0) {
+ b[blen-1] = 0;
strncpy(b, s->macro+1, blen);
+ if(b[blen-1] != '\0')
+ goto toobig;
if(debug['m'])
print("#expand %s %s\n", s->name, b);
return;
@@ -573,32 +576,23 @@ macinc(void)
if(c != '\n')
goto bad;
f = -1;
- c = 0;
for(i=0; i<ninclude; i++) {
if(i == 0 && c0 == '>')
continue;
- c = snprint(symb, NSYMB, "%s/%s", include[i], str)+1;
- if(strncmp(symb, "./", 2) == 0){
+ c = snprint(symb, NSYMB, "%s/%s", include[i], str);;
+ while(strncmp(symb, "./", 2) == 0){
c -= 2;
- memmove(symb, symb+2, c);
+ memmove(symb, symb+2, c+1);
}
f = open(symb, 0);
if(f >= 0)
break;
}
if(f < 0)
- c = snprint(symb, NSYMB, "%s", str)+1;
- while(c & 3)
- c++;
- while(nhunk < c)
- gethunk();
- hp = hunk;
- memmove(hunk, symb, c);
- nhunk -= c;
- hunk += c;
+ snprint(symb, NSYMB, "%s", str);
newio();
pushio();
- newfile(hp, f);
+ newfile(strdup(symb), f);
return;
bad: