hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#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