blob: a69cc36395fe15cfdb4fef0c81b7c1db0ebcb962 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Bitset primitives used by the parser generator */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014#include "bitset.h"
15
16bitset
Thomas Wouters23c9e002000-07-22 19:20:54 +000017newbitset(int nbits)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018{
19 int nbytes = NBYTES(nbits);
Guido van Rossum86bea461997-04-29 21:03:06 +000020 bitset ss = PyMem_NEW(BYTE, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021
22 if (ss == NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000023 Py_FatalError("no mem for bitset");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024
25 ss += nbytes;
26 while (--nbytes >= 0)
27 *--ss = 0;
28 return ss;
29}
30
31void
Thomas Wouters23c9e002000-07-22 19:20:54 +000032delbitset(bitset ss)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033{
Guido van Rossum86bea461997-04-29 21:03:06 +000034 PyMem_DEL(ss);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035}
36
37int
Thomas Wouters23c9e002000-07-22 19:20:54 +000038addbit(bitset ss, int ibit)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
40 int ibyte = BIT2BYTE(ibit);
41 BYTE mask = BIT2MASK(ibit);
42
43 if (ss[ibyte] & mask)
44 return 0; /* Bit already set */
45 ss[ibyte] |= mask;
46 return 1;
47}
48
49#if 0 /* Now a macro */
50int
Thomas Wouters23c9e002000-07-22 19:20:54 +000051testbit(bitset ss, int ibit)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052{
53 return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
54}
55#endif
56
57int
Thomas Wouters23c9e002000-07-22 19:20:54 +000058samebitset(bitset ss1, bitset ss2, int nbits)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059{
60 int i;
61
62 for (i = NBYTES(nbits); --i >= 0; )
63 if (*ss1++ != *ss2++)
64 return 0;
65 return 1;
66}
67
68void
Thomas Wouters23c9e002000-07-22 19:20:54 +000069mergebitset(bitset ss1, bitset ss2, int nbits)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070{
71 int i;
72
73 for (i = NBYTES(nbits); --i >= 0; )
74 *ss1++ |= *ss2++;
75}