blob: fba9331fe55a64da64a4e08eb4887e6d0f944735 [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
17newbitset(nbits)
18 int nbits;
19{
20 int nbytes = NBYTES(nbits);
Guido van Rossum86bea461997-04-29 21:03:06 +000021 bitset ss = PyMem_NEW(BYTE, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022
23 if (ss == NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000024 Py_FatalError("no mem for bitset");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025
26 ss += nbytes;
27 while (--nbytes >= 0)
28 *--ss = 0;
29 return ss;
30}
31
32void
33delbitset(ss)
34 bitset ss;
35{
Guido van Rossum86bea461997-04-29 21:03:06 +000036 PyMem_DEL(ss);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037}
38
39int
40addbit(ss, ibit)
41 bitset ss;
42 int ibit;
43{
44 int ibyte = BIT2BYTE(ibit);
45 BYTE mask = BIT2MASK(ibit);
46
47 if (ss[ibyte] & mask)
48 return 0; /* Bit already set */
49 ss[ibyte] |= mask;
50 return 1;
51}
52
53#if 0 /* Now a macro */
54int
55testbit(ss, ibit)
56 bitset ss;
57 int ibit;
58{
59 return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
60}
61#endif
62
63int
64samebitset(ss1, ss2, nbits)
65 bitset ss1, ss2;
66 int nbits;
67{
68 int i;
69
70 for (i = NBYTES(nbits); --i >= 0; )
71 if (*ss1++ != *ss2++)
72 return 0;
73 return 1;
74}
75
76void
77mergebitset(ss1, ss2, nbits)
78 bitset ss1, ss2;
79 int nbits;
80{
81 int i;
82
83 for (i = NBYTES(nbits); --i >= 0; )
84 *ss1++ |= *ss2++;
85}