1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.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
checkhideset(int hs,Nlist * np)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
newhideset(int hs,Nlist * np)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 *)realloc(hidesets, (sizeof (Hideset *))*maxhidesets);
57 if (hidesets == NULL)
58 error(FATAL, "Out of memory from realloc");
59 }
60 hs1 = (Hideset)domalloc(len*sizeof(Hideset));
61 memmove(hs1, nhs, len*sizeof(Hideset));
62 hidesets[nhidesets] = hs1;
63 return nhidesets++;
64 }
65
66 int
inserths(Hideset dhs,Hideset shs,Nlist * np)67 inserths(Hideset dhs, Hideset shs, Nlist *np)
68 {
69 Hideset odhs = dhs;
70
71 while (*shs && *shs < np)
72 *dhs++ = *shs++;
73 if (*shs != np)
74 *dhs++ = np;
75 do {
76 *dhs++ = *shs;
77 } while (*shs++);
78 return dhs - odhs;
79 }
80
81 /*
82 * Hideset union
83 */
84 int
unionhideset(int hs1,int hs2)85 unionhideset(int hs1, int hs2)
86 {
87 Hideset hp;
88
89 for (hp = hidesets[hs2]; *hp; hp++)
90 hs1 = newhideset(hs1, *hp);
91 return hs1;
92 }
93
94 void
iniths(void)95 iniths(void)
96 {
97 hidesets = (Hideset *)domalloc(maxhidesets*sizeof(Hideset *));
98 hidesets[0] = (Hideset)domalloc(sizeof(Hideset));
99 *hidesets[0] = NULL;
100 nhidesets++;
101 }
102
103 void
prhideset(int hs)104 prhideset(int hs)
105 {
106 Hideset np;
107
108 for (np = hidesets[hs]; *np; np++) {
109 fprintf(stderr, (char*)(*np)->name, (*np)->len);
110 fprintf(stderr, " ");
111 }
112 }
113