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/cpp/include.c | |
parent | b55b1f31e139271852c3581924ddc92a10f54883 (diff) |
cpp: correct #pragma once uniqueness check
Diffstat (limited to 'sys/src/cmd/cpp/include.c')
-rw-r--r-- | sys/src/cmd/cpp/include.c | 24 |
1 files changed, 19 insertions, 5 deletions
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); |