| #ifndef __GATE_SET_H | |
| #define __GATE_SET_H | |
| /* set.h | |
| The following is a general-purpose set library originally developed | |
| by Hank Dietz and enhanced by Terence Parr to allow dynamic sets. | |
| Sets are now structs containing the #words in the set and | |
| a pointer to the actual set words. | |
| 1987 by Hank Dietz | |
| Modified by: | |
| Terence Parr | |
| Purdue University | |
| October 1989 | |
| Added ANSI prototyping Dec. 1992 -- TJP | |
| */ | |
| #include "pcctscfg.h" | |
| #ifdef NOT_USED /* SEE config.h */ | |
| /* Define usable bits per unsigned int word */ | |
| #ifdef PC | |
| #define WORDSIZE 16 | |
| #define LogWordSize 4 | |
| #else | |
| #define WORDSIZE 32 | |
| #define LogWordSize 5 | |
| #endif | |
| #define BytesPerWord sizeof(unsigned) | |
| #endif | |
| #define SETSIZE(a) ((a).n<<LogWordSize) /* Maximum items per set */ | |
| #define MODWORD(x) ((x) & (WORDSIZE-1)) /* x % WORDSIZE */ | |
| #define DIVWORD(x) ((x) >> LogWordSize) /* x / WORDSIZE */ | |
| #define nil (~((unsigned) 0)) /* An impossible set member all bits on (big!) */ | |
| typedef struct _set { | |
| unsigned int n; /* Number of words in set */ | |
| unsigned *setword; | |
| } set; | |
| #define set_init {0, NULL} | |
| #define set_null(a) ((a).setword==NULL) | |
| #define NumBytes(x) (((x)>>3)+1) /* Num bytes to hold x */ | |
| #define NumWords(x) ((((unsigned)(x))>>LogWordSize)+1) /* Num words to hold x */ | |
| /* M a c r o s */ | |
| /* make arg1 a set big enough to hold max elem # of arg2 */ | |
| #define set_new(a,_max) \ | |
| if (((a).setword=(unsigned *)calloc(NumWords(_max),BytesPerWord))==NULL) \ | |
| fprintf(stderr, "set_new: Cannot allocate set with max of %d\n", _max); \ | |
| (a).n = NumWords(_max); | |
| #define set_free(a) \ | |
| {if ( (a).setword != NULL ) free((char *)((a).setword)); \ | |
| (a) = empty;} | |
| #ifdef __USE_PROTOS | |
| extern void set_size( unsigned ); | |
| extern unsigned int set_deg( set ); | |
| extern set set_or( set, set ); | |
| extern set set_and( set, set ); | |
| extern set set_dif( set, set ); | |
| extern set set_of( unsigned ); | |
| extern void set_ext( set *, unsigned int ); | |
| extern set set_not( set ); | |
| extern int set_equ( set, set ); | |
| extern int set_sub( set, set ); | |
| extern unsigned set_int( set ); | |
| extern int set_el( unsigned, set ); | |
| extern int set_nil( set ); | |
| extern char * set_str( set ); | |
| extern set set_val( register char * ); | |
| extern void set_orel( unsigned, set * ); | |
| extern void set_orin( set *, set ); | |
| extern void set_andin( set *, set ); | |
| extern void set_rm( unsigned, set ); | |
| extern void set_clr( set ); | |
| extern set set_dup( set ); | |
| extern void set_PDQ( set, register unsigned * ); | |
| extern unsigned *set_pdq( set ); | |
| extern void _set_pdq( set a, register unsigned *q ); | |
| extern unsigned int set_hash( set, register unsigned int ); | |
| #else | |
| extern void set_size(); | |
| extern unsigned int set_deg(); | |
| extern set set_or(); | |
| extern set set_and(); | |
| extern set set_dif(); | |
| extern set set_of(); | |
| extern void set_ext(); | |
| extern set set_not(); | |
| extern int set_equ(); | |
| extern int set_sub(); | |
| extern unsigned set_int(); | |
| extern int set_el(); | |
| extern int set_nil(); | |
| extern char * set_str(); | |
| extern set set_val(); | |
| extern void set_orel(); | |
| extern void set_orin(); | |
| extern void set_andin(); | |
| extern void set_rm(); | |
| extern void set_clr(); | |
| extern set set_dup(); | |
| extern void set_PDQ(); | |
| extern unsigned *set_pdq(); | |
| extern void _set_pdq(); | |
| extern unsigned int set_hash(); | |
| #endif | |
| extern set empty; | |
| #endif |