]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cpp/hideset.c
upas/fs: fix more locking bugs, remove debugging clutter, remove planb mbox code
[plan9front.git] / sys / src / cmd / cpp / hideset.c
1 #include <u.h>
2 #include <libc.h>
3 #include <stdio.h>
4 #include "cpp.h"
5
6 /*
7  * A hideset is a null-terminated array of Nlist pointers.
8  * They are referred to by indices in the hidesets array.
9  * Hideset 0 is empty.
10  */
11
12 #define HSSIZ   32
13 typedef Nlist   **Hideset;
14 Hideset *hidesets;
15 int     nhidesets = 0;
16 int     maxhidesets = 3;
17 int     inserths(Hideset, Hideset, Nlist *);
18
19 /*
20  * Test for membership in a hideset
21  */
22 int
23 checkhideset(int hs, Nlist *np)
24 {
25         Hideset hsp;
26
27         if (hs>=nhidesets)
28                 abort();
29         for (hsp = hidesets[hs]; *hsp; hsp++) {
30                 if (*hsp == np)
31                         return 1;
32         }
33         return 0;
34 }
35
36 /*
37  * Return the (possibly new) hideset obtained by adding np to hs.
38  */
39 int
40 newhideset(int hs, Nlist *np)
41 {
42         int i, len;
43         Nlist *nhs[HSSIZ+3];
44         Hideset hs1, hs2;
45
46         len = inserths(nhs, hidesets[hs], np);
47         for (i=0; i<nhidesets; i++) {
48                 for (hs1=nhs, hs2=hidesets[i]; *hs1==*hs2; hs1++, hs2++)
49                         if (*hs1 == NULL)
50                                 return i;
51         }
52         if (len>=HSSIZ)
53                 return hs;
54         if (nhidesets >= maxhidesets) {
55                 maxhidesets = 3*maxhidesets/2+1;
56                 hidesets = (Hideset *)dorealloc(hidesets, (sizeof (Hideset *))*maxhidesets);
57         }
58         hs1 = (Hideset)domalloc(len*sizeof(Hideset));
59         memmove(hs1, nhs, len*sizeof(Hideset));
60         hidesets[nhidesets] = hs1;
61         return nhidesets++;
62 }
63
64 int
65 inserths(Hideset dhs, Hideset shs, Nlist *np)
66 {
67         Hideset odhs = dhs;
68
69         while (*shs && *shs < np)
70                 *dhs++ = *shs++;
71         if (*shs != np)
72                 *dhs++ = np;
73         do {
74                 *dhs++ = *shs;
75         } while (*shs++);
76         return dhs - odhs;
77 }
78
79 /*
80  * Hideset union
81  */
82 int
83 unionhideset(int hs1, int hs2)
84 {
85         Hideset hp;
86
87         for (hp = hidesets[hs2]; *hp; hp++)
88                 hs1 = newhideset(hs1, *hp);
89         return hs1;
90 }
91
92 void
93 iniths(void)
94 {
95         hidesets = (Hideset *)domalloc(maxhidesets*sizeof(Hideset *));
96         hidesets[0] = (Hideset)domalloc(sizeof(Hideset));
97         *hidesets[0] = NULL;
98         nhidesets++;
99 }
100
101 void
102 prhideset(int hs)
103 {
104         Hideset np;
105
106         for (np = hidesets[hs]; *np; np++) {
107                 fprintf(stderr, (char*)(*np)->name, (*np)->len);
108                 fprintf(stderr, " ", 1);
109         }
110 }