Showing the changes to sys/src/cmd/cpp/cpp.c (1 of 3 files). Show all
Unified · Split
| @@ -85,6 +85,7 @@ control(Tokenrow *trp) · 84 unmodified lines | ||
| 85 | 85 | { |
| 86 | 86 | Nlist *np; |
| 87 | 87 | Token *tp; |
| 88 | + Dir *d; | |
| 88 | 89 | |
| 89 | 90 | tp = trp->tp; |
| 90 | 91 | if (tp->type!=NAME) { |
| @@ -148,7 +149,17 @@ control(Tokenrow *trp) · 57 unmodified lines | ||
| 148 | 149 | break; |
| 149 | 150 | |
| 150 | 151 | case KPRAGMA: |
| 151 | − return; | |
| 152 | + tp += 1; | |
| 153 | + if (tp->type!=NAME || tp->len < 4 || memcmp(tp->t, "once", 4) != 0) | |
| 154 | + return; | |
| 155 | + if (nblocked >= NONCE) | |
| 156 | + error(FATAL, "#pragma once list max length exceeded"); | |
| 157 | + d = dirfstat(cursource->fd); | |
| 158 | + if (d == nil) | |
| 159 | + error(FATAL, "Out of memory from dirfstat"); | |
| 160 | + incblocked[nblocked++] = d->qid; | |
| 161 | + free(d); | |
| 162 | + break; | |
| 152 | 163 | |
| 153 | 164 | case KIFDEF: |
| 154 | 165 | case KIFNDEF: |