/* Copyright (c) 1991 by the Vrije Universiteit, Amsterdam, the Netherlands. * For full copyright and restrictions on use see the file COPYING in the top * level of the LLgen tree. */ #ifndef SETS_H_ #define SETS_H_ /* * L L G E N * * An Extended LL(1) Parser Generator * * Author : Ceriel J.H. Jacobs */ /* * $Id$ * Some macros that deal with bitsets and their size */ # define BITS (8 * sizeof (int)) # define IN(a,i) ((a)[(i)/BITS] & (1<<((i) % BITS))) # define NTIN(a,i) ((a)[(i)/BITS+tsetsize]&(1<<((i)%BITS))) # define PUTIN(a,i) ((a)[(i)/BITS] |=(1<<((i) % BITS))) # define NTPUTIN(a,i) ((a)[(i)/BITS+tsetsize]|=(1<<((i)%BITS))) # define NBYTES(n) (((n) + 7) / 8) /* * The next two macros operate on byte counts! */ # define NINTS(n) (((n) + (int) (sizeof(int) - 1)) / (int) sizeof(int)) # define ALIGN(n) (NINTS(n) * (int) sizeof (int)) extern int tsetsize; extern p_set *setptr, *maxptr; extern int nbytes; /* * Initialises some variables needed for setcomputations */ void setinit(int nt_needed); /* * Allocate a set that cannot be freed */ p_set get_set(void); /* * Allocate a set which can later be freed. */ p_set setalloc(void); /* * a = a union b. * Return 1 if the set a changed */ int setunion(register p_set a,register p_set b); /* * a = a intersect b. * return 1 if the result is empty */ int setintersect(register p_set a,register p_set b); /* * a = a setminus b */ void setminus(register p_set a,register p_set b); /* * Return 1 if the set p is empty */ int setempty(register p_set p); /* * The set "set" will serve as a recovery set. * Search for it in the table. If not present, enter it. * Here is room for improvement. At the moment, the list of * sets is examined with linear search. */ int findindex(p_set set); int setcount(register p_set set, int *saved); #endif /* SETS_H_ */