/* 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) /* 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;