From ee5be0d4d45549d727f46c720158a75b02d53ade Mon Sep 17 00:00:00 2001 From: Jacob Moody Date: Sat, 25 Mar 2023 19:24:01 +0000 Subject: cpp: correct #pragma once uniqueness check --- sys/src/cmd/cpp/include.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'sys/src/cmd/cpp/include.c') 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; iqid.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); -- cgit v1.2.3