1 #ifndef __GATE_SET_H
2 #define __GATE_SET_H
3 
4 /*	set.h
5 
6 	The following is a general-purpose set library originally developed
7 	by Hank Dietz and enhanced by Terence Parr to allow dynamic sets.
8 
9 	Sets are now structs containing the #words in the set and
10 	a pointer to the actual set words.
11 
12 	1987 by Hank Dietz
13 
14 	Modified by:
15 		Terence Parr
16 		Purdue University
17 		October 1989
18 
19 		Added ANSI prototyping Dec. 1992 -- TJP
20 */
21 
22 #include "pcctscfg.h"
23 
24 #ifdef NOT_USED /* SEE config.h */
25 /* Define usable bits per unsigned int word */
26 #ifdef PC
27 #define WORDSIZE 16
28 #define LogWordSize	4
29 #else
30 #define	WORDSIZE 32
31 #define LogWordSize 5
32 #endif
33 #define BytesPerWord	sizeof(unsigned)
34 #endif
35 
36 #define	SETSIZE(a) ((a).n<<LogWordSize)		/* Maximum items per set */
37 #define	MODWORD(x) ((x) & (WORDSIZE-1))		/* x % WORDSIZE */
38 #define	DIVWORD(x) ((x) >> LogWordSize)		/* x / WORDSIZE */
39 #define	nil	(~((unsigned) 0))	/* An impossible set member all bits on (big!) */
40 
41 typedef struct _set {
42 			unsigned int n;		/* Number of words in set */
43 			unsigned *setword;
44 		} set;
45 
46 #define set_init	{0, NULL}
47 #define set_null(a)	((a).setword==NULL)
48 
49 #define	NumBytes(x)		(((x)>>3)+1)						/* Num bytes to hold x */
50 #define	NumWords(x)		((((unsigned)(x))>>LogWordSize)+1)	/* Num words to hold x */
51 
52 
53 /* M a c r o s */
54 
55 /* make arg1 a set big enough to hold max elem # of arg2 */
56 #define set_new(a,_max) \
57 if (((a).setword=(unsigned *)calloc(NumWords(_max),BytesPerWord))==NULL) \
58         fprintf(stderr, "set_new: Cannot allocate set with max of %d\n", _max); \
59         (a).n = NumWords(_max);
60 
61 #define set_free(a)									\
62 	{if ( (a).setword != NULL ) free((char *)((a).setword));	\
63 	(a) = empty;}
64 
65 #ifdef __USE_PROTOS
66 extern void set_size( unsigned );
67 extern unsigned int set_deg( set );
68 extern set set_or( set, set );
69 extern set set_and( set, set );
70 extern set set_dif( set, set );
71 extern set set_of( unsigned );
72 extern void set_ext( set *, unsigned int );
73 extern set set_not( set );
74 extern int set_equ( set, set );
75 extern int set_sub( set, set );
76 extern unsigned set_int( set );
77 extern int set_el( unsigned, set );
78 extern int set_nil( set );
79 extern char * set_str( set );
80 extern set set_val( register char * );
81 extern void set_orel( unsigned, set * );
82 extern void set_orin( set *, set );
83 extern void set_andin( set *, set );
84 extern void set_rm( unsigned, set );
85 extern void set_clr( set );
86 extern set set_dup( set );
87 extern void set_PDQ( set, register unsigned * );
88 extern unsigned *set_pdq( set );
89 extern void _set_pdq( set a, register unsigned *q );
90 extern unsigned int set_hash( set, register unsigned int );
91 #else
92 extern void set_size();
93 extern unsigned int set_deg();
94 extern set set_or();
95 extern set set_and();
96 extern set set_dif();
97 extern set set_of();
98 extern void set_ext();
99 extern set set_not();
100 extern int set_equ();
101 extern int set_sub();
102 extern unsigned set_int();
103 extern int set_el();
104 extern int set_nil();
105 extern char * set_str();
106 extern set set_val();
107 extern void set_orel();
108 extern void set_orin();
109 extern void set_andin();
110 extern void set_rm();
111 extern void set_clr();
112 extern set set_dup();
113 extern void set_PDQ();
114 extern unsigned *set_pdq();
115 extern void _set_pdq();
116 extern unsigned int set_hash();
117 #endif
118 
119 extern set empty;
120 
121 #endif
122