Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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 *)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
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
}