summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cpp/cpp.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/cpp.c
parentec19c5697f3caf52e6be57049169e2eb048299e6 (diff)
cpp: #pragma once support
Diffstat (limited to 'sys/src/cmd/cpp/cpp.c')
-rw-r--r--sys/src/cmd/cpp/cpp.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/src/cmd/cpp/cpp.c b/sys/src/cmd/cpp/cpp.c
index 2a49ea8bc..aed6ecb7c 100644
--- a/sys/src/cmd/cpp/cpp.c
+++ b/sys/src/cmd/cpp/cpp.c
@@ -85,6 +85,7 @@ control(Tokenrow *trp)
{
Nlist *np;
Token *tp;
+ Dir *d;
tp = trp->tp;
if (tp->type!=NAME) {
@@ -148,7 +149,17 @@ control(Tokenrow *trp)
break;
case KPRAGMA:
- return;
+ tp += 1;
+ if (tp->type!=NAME || tp->len < 4 || memcmp(tp->t, "once", 4) != 0)
+ return;
+ if (nblocked >= NONCE)
+ error(FATAL, "#pragma once list max length exceeded");
+ d = dirfstat(cursource->fd);
+ if (d == nil)
+ error(FATAL, "Out of memory from dirfstat");
+ incblocked[nblocked++] = d->qid;
+ free(d);
+ break;
case KIFDEF:
case KIFNDEF: