| #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 "config.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 __STDC__ |
| 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_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_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 |