xref: /plan9/sys/src/cmd/cpp/hideset.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
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
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 	}
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
inserths(Hideset dhs,Hideset shs,Nlist * np)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
unionhideset(int hs1,int hs2)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
iniths(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
prhideset(int hs)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 }
111