]> git.pond.sub.org Git - empserver/blob - src/lib/gen/bit.c
Indented with src/scripts/indent-emp.
[empserver] / src / lib / gen / bit.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                           Ken Stevens, Steve McClure
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *  ---
21  *
22  *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
23  *  related information and legal notices. It is expected that any future
24  *  projects/authors will amend these files as needed.
25  *
26  *  ---
27  *
28  *  bit.c: Allocate and search select bitfields
29  * 
30  *  Known contributors to this file:
31  *     Steve McClure, 2000
32  */
33
34 #include "misc.h"
35 #include "bit.h"
36 #include "gen.h"                /* getfdtablesize etc. */
37
38 static int bit_nbytes;
39
40 bit_fdmask
41 bit_newfdmask(void)
42 {
43     bit_fdmask mask;
44     int nfile;
45
46     if (bit_nbytes == 0) {
47         nfile = getfdtablesize();
48         bit_nbytes = (nfile + (BIT_BITSPERMASK - 1)) / BIT_NBBY;
49     }
50     mask = (bit_fdmask)malloc(bit_nbytes);
51     (void)bit_zero(mask);
52     return mask;
53 }
54
55 /*
56  * zero the bitfield
57  */
58 void
59 bit_zero(bit_fdmask bitp)
60 {
61     bit_mask *mask;
62     register int i;
63     register int nwords;
64
65     mask = bitp;
66     nwords = bit_nbytes / sizeof(*mask);
67     for (i = 0; i < nwords; i++)
68         *mask++ = 0;
69 }
70
71 /*
72  * zero the bitfield
73  */
74 void
75 bit_not(bit_fdmask bitp)
76 {
77     register bit_mask *mask;
78     register int i;
79     register int nwords;
80
81     mask = bitp;
82     nwords = bit_nbytes / sizeof(*mask);
83     for (i = 0; i < nwords; i++, mask++)
84         *mask = ~(*mask);
85 }
86
87 /*
88  * zero the bitfield
89  */
90 void
91 bit_copy(bit_fdmask bitsrc, bit_fdmask bitdst)
92 {
93     register bit_mask *src;
94     register bit_mask *dst;
95     register int i;
96     register int nwords;
97
98     dst = bitdst;
99     src = bitsrc;
100     nwords = bit_nbytes / sizeof(*dst);
101     for (i = 0; i < nwords; i++)
102         *dst++ = *src++;
103 }
104
105 /*
106  * zero the bitfield
107  */
108 void
109 bit_or(bit_fdmask bitsrc, bit_fdmask bitdst)
110 {
111     register bit_mask *src;
112     register bit_mask *dst;
113     register int i;
114     register int nwords;
115
116     nwords = bit_nbytes / sizeof(*dst);
117     src = bitsrc;
118     dst = bitdst;
119     for (i = 0; i < nwords; i++)
120         *dst++ |= *src++;
121 }
122
123 /*
124  * zero the bitfield
125  */
126 void
127 bit_or3(bit_fdmask bitsrc1, bit_fdmask bitsrc2, bit_fdmask bitdst)
128 {
129     register bit_mask *src1;
130     register bit_mask *src2;
131     register bit_mask *dst;
132     register int i;
133     register int nwords;
134
135     src1 = bitsrc1;
136     src2 = bitsrc2;
137     dst = bitdst;
138     nwords = bit_nbytes / sizeof(*dst);
139     for (i = 0; i < nwords; i++)
140         *dst++ = *src1++ | *src2++;
141 }
142
143 /*
144  * zero the bitfield
145  */
146 void
147 bit_and(bit_fdmask bitsrc, bit_fdmask bitdst)
148 {
149     register bit_mask *src;
150     register bit_mask *dst;
151     register int i;
152     register int nwords;
153
154     nwords = bit_nbytes / sizeof(*src);
155     src = bitsrc;
156     dst = bitdst;
157     for (i = 0; i < nwords; i++)
158         *dst++ &= *src++;
159 }
160
161 /*
162  * zero the bitfield
163  */
164 void
165 bit_and3(bit_fdmask bitsrc1, bit_fdmask bitsrc2, bit_fdmask bitdst)
166 {
167     register bit_mask *src1;
168     register bit_mask *src2;
169     register bit_mask *dst;
170     register int i;
171     register int nwords;
172
173     src1 = bitsrc1;
174     src2 = bitsrc2;
175     dst = bitdst;
176     nwords = bit_nbytes / sizeof(*dst);
177     for (i = 0; i < nwords; i++)
178         *dst++ = *src1++ & *src2++;
179 }
180
181 /*
182  * Return first bit set in fd mask.
183  * speedy version, not using BIT_ISSETB()
184  */
185 int
186 bit_fd(bit_fdmask bitp)
187 {
188     register bit_mask *mask;
189     register unsigned int j;
190     register bit_mask m;
191     register int i;
192     int nwords;
193
194     mask = bitp;
195     nwords = bit_nbytes / sizeof(m);
196     for (i = 0; i < nwords; i++, mask++) {
197         if ((m = *mask) == 0)
198             continue;
199         for (j = 0; j < BIT_BITSPERMASK; j++) {
200             if (m & bit(j))
201                 return i * BIT_BITSPERMASK + j;
202         }
203         /*NOTREACHED*/
204     }
205     return -1;
206 }