diff options
author | Jacob Moody <moody@posixcafe.org> | 2023-03-25 19:24:01 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2023-03-25 19:24:01 +0000 |
commit | ee5be0d4d45549d727f46c720158a75b02d53ade (patch) | |
tree | e381b1e92aff1bb2c09c5dbff3f58348915e508c /sys/src/cmd | |
parent | b55b1f31e139271852c3581924ddc92a10f54883 (diff) |
cpp: correct #pragma once uniqueness check
Diffstat (limited to 'sys/src/cmd')
-rw-r--r-- | sys/src/cmd/cpp/cpp.c | 6 | ||||
-rw-r--r-- | sys/src/cmd/cpp/cpp.h | 8 | ||||
-rw-r--r-- | sys/src/cmd/cpp/include.c | 24 |
3 files changed, 31 insertions, 7 deletions
diff --git a/sys/src/cmd/cpp/cpp.c b/sys/src/cmd/cpp/cpp.c index aed6ecb7c..68c501cdb 100644 --- a/sys/src/cmd/cpp/cpp.c +++ b/sys/src/cmd/cpp/cpp.c @@ -86,6 +86,7 @@ control(Tokenrow *trp) Nlist *np; Token *tp; Dir *d; + Once n; tp = trp->tp; if (tp->type!=NAME) { @@ -157,7 +158,10 @@ control(Tokenrow *trp) d = dirfstat(cursource->fd); if (d == nil) error(FATAL, "Out of memory from dirfstat"); - incblocked[nblocked++] = d->qid; + n.qid = d->qid; + n.type = d->type; + n.dev = d->dev; + incblocked[nblocked++] = n; free(d); break; diff --git a/sys/src/cmd/cpp/cpp.h b/sys/src/cmd/cpp/cpp.h index 0d5a5c269..614b7bd47 100644 --- a/sys/src/cmd/cpp/cpp.h +++ b/sys/src/cmd/cpp/cpp.h @@ -73,6 +73,12 @@ typedef struct nlist { char flag; /* is defined, is pp name */ } Nlist; +typedef struct nonce { + Qid qid; + uint type; + uint dev; +} Once; + typedef struct includelist { char deleted; char always; @@ -154,6 +160,6 @@ extern int verbose; extern int Cplusplus; extern Nlist *kwdefined; extern Includelist includelist[NINCLUDE]; -extern Qid incblocked[NONCE]; +extern Once incblocked[NONCE]; extern int nblocked; extern char wd[]; diff --git a/sys/src/cmd/cpp/include.c b/sys/src/cmd/cpp/include.c index 347916981..e6e8d7b09 100644 --- a/sys/src/cmd/cpp/include.c +++ b/sys/src/cmd/cpp/include.c @@ -6,9 +6,21 @@ Includelist includelist[NINCLUDE]; char *objname; -Qid incblocked[NONCE]; +Once incblocked[NONCE]; int nblocked = 0; +static int +oncecmp(Once *a, Once *b) +{ + if(a->qid.path == b->qid.path) + if(a->qid.vers == b->qid.vers) + if(a->qid.type == b->qid.type) + if(a->dev == b->dev) + if(a->type == b->type) + return 0; + return 1; +} + void doinclude(Tokenrow *trp) { @@ -16,6 +28,7 @@ doinclude(Tokenrow *trp) Includelist *ip; int angled, len, fd, i; Dir *d; + Once n; trp->tp += 1; if (trp->tp>=trp->lp) @@ -94,12 +107,13 @@ doinclude(Tokenrow *trp) d = dirfstat(fd); if (d == nil) error(FATAL, "Out of memory from dirfstat"); + n.qid = d->qid; + n.type = d->type; + n.dev = d->dev; + free(d); for (i=0; i<nblocked; i++) - if (incblocked[i].path == d->qid.path && incblocked[i].type == d->qid.type) { - free(d); + if (oncecmp(incblocked+i, &n) == 0) return; - } - free(d); if (++incdepth > 20) error(FATAL, "#include too deeply nested"); setsource((char*)newstring((uchar*)iname, strlen(iname), 0), fd, NULL); |