blob: ba6666e4df2b7e637113c328b3f7e6942a0b9904 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumb9f8d6e1995-01-04 19:08:09 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum3f5da241990-12-20 15:06:42 +000017/* Bitset primitives used by the parser generator */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
Guido van Rossum3f5da241990-12-20 15:06:42 +000019#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020#include "bitset.h"
21
22bitset
23newbitset(nbits)
24 int nbits;
25{
26 int nbytes = NBYTES(nbits);
Guido van Rossum86bea461997-04-29 21:03:06 +000027 bitset ss = PyMem_NEW(BYTE, nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028
29 if (ss == NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000030 Py_FatalError("no mem for bitset");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031
32 ss += nbytes;
33 while (--nbytes >= 0)
34 *--ss = 0;
35 return ss;
36}
37
38void
39delbitset(ss)
40 bitset ss;
41{
Guido van Rossum86bea461997-04-29 21:03:06 +000042 PyMem_DEL(ss);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043}
44
45int
46addbit(ss, ibit)
47 bitset ss;
48 int ibit;
49{
50 int ibyte = BIT2BYTE(ibit);
51 BYTE mask = BIT2MASK(ibit);
52
53 if (ss[ibyte] & mask)
54 return 0; /* Bit already set */
55 ss[ibyte] |= mask;
56 return 1;
57}
58
59#if 0 /* Now a macro */
60int
61testbit(ss, ibit)
62 bitset ss;
63 int ibit;
64{
65 return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
66}
67#endif
68
69int
70samebitset(ss1, ss2, nbits)
71 bitset ss1, ss2;
72 int nbits;
73{
74 int i;
75
76 for (i = NBYTES(nbits); --i >= 0; )
77 if (*ss1++ != *ss2++)
78 return 0;
79 return 1;
80}
81
82void
83mergebitset(ss1, ss2, nbits)
84 bitset ss1, ss2;
85 int nbits;
86{
87 int i;
88
89 for (i = NBYTES(nbits); --i >= 0; )
90 *ss1++ |= *ss2++;
91}