summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cpp/include.c
diff options
context:
space:
mode:
authorJacob Moody <moody@posixcafe.org>2023-03-21 21:24:16 +0000
committerJacob Moody <moody@posixcafe.org>2023-03-21 21:24:16 +0000
commitd79edf98b8d3dd8c1cbf9ad1be7728e13ed7a364 (patch)
treeb56605292a50c28e7e8c2e1e83b91f2f7a5a259b /sys/src/cmd/cpp/include.c
parentec19c5697f3caf52e6be57049169e2eb048299e6 (diff)
cpp: #pragma once support
Diffstat (limited to 'sys/src/cmd/cpp/include.c')
-rw-r--r--sys/src/cmd/cpp/include.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/src/cmd/cpp/include.c b/sys/src/cmd/cpp/include.c
index a4e716482..347916981 100644
--- a/sys/src/cmd/cpp/include.c
+++ b/sys/src/cmd/cpp/include.c
@@ -6,12 +6,16 @@ Includelist includelist[NINCLUDE];
char *objname;
+Qid incblocked[NONCE];
+int nblocked = 0;
+
void
doinclude(Tokenrow *trp)
{
char fname[256], iname[256], *p;
Includelist *ip;
int angled, len, fd, i;
+ Dir *d;
trp->tp += 1;
if (trp->tp>=trp->lp)
@@ -87,6 +91,15 @@ doinclude(Tokenrow *trp)
write(1,"\n",1);
}
if (fd >= 0) {
+ d = dirfstat(fd);
+ if (d == nil)
+ error(FATAL, "Out of memory from dirfstat");
+ for (i=0; i<nblocked; i++)
+ if (incblocked[i].path == d->qid.path && incblocked[i].type == d->qid.type) {
+ free(d);
+ return;
+ }
+ free(d);
if (++incdepth > 20)
error(FATAL, "#include too deeply nested");
setsource((char*)newstring((uchar*)iname, strlen(iname), 0), fd, NULL);