xref: /plan9/sys/src/cmd/cpp/hideset.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
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