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