xref: /netbsd-src/external/bsd/pdisk/dist/bitfield.c (revision 48a628ae0434c4247b560ad8f2eb1dc06d0dd070)
1 //
2 // bitfield.c - extract and set bit fields
3 //
4 // Written by Eryk Vershen
5 //
6 // See comments in bitfield.h
7 //
8 
9 /*
10  * Copyright 1996, 1997 by Apple Computer, Inc.
11  *              All Rights Reserved
12  *
13  * Permission to use, copy, modify, and distribute this software and
14  * its documentation for any purpose and without fee is hereby granted,
15  * provided that the above copyright notice appears in all copies and
16  * that both the copyright notice and this permission notice appear in
17  * supporting documentation.
18  *
19  * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
20  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE.
22  *
23  * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
24  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
25  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
26  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
27  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
28  */
29 
30 #include <stdint.h>
31 #include "bitfield.h"
32 
33 
34 //
35 // Defines
36 //
37 
38 
39 //
40 // Types
41 //
42 
43 
44 //
45 // Global Constants
46 //
47 const uint32_t masks[] = {
48     0x00000000,
49     0x00000001, 0x00000003, 0x00000007, 0x0000000F,
50     0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
51     0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
52     0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
53     0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
54     0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
55     0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
56     0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
57 };
58 
59 
60 //
61 // Global Variables
62 //
63 
64 
65 //
66 // Forward declarations
67 //
68 
69 
70 //
71 // Routines
72 //
73 uint32_t
bitfield_set(uint32_t * bf,int base,int length,uint32_t value)74 bitfield_set(uint32_t *bf, int base, int length, uint32_t value)
75 {
76     uint32_t t;
77     uint32_t m;
78     int s;
79 
80     // compute shift & mask, coerce value to correct number of bits,
81     // zap the old bits and stuff the new value
82     // return the masked value in case someone wants it.
83     s = (base + 1) - length;
84     m = masks[length];
85     t = value & m;
86     *bf = (*bf & ~(m << s)) | (t << s);
87     return t;
88 }
89 
90 
91 uint32_t
bitfield_get(uint32_t bf,int base,int length)92 bitfield_get(uint32_t bf, int base, int length)
93 {
94     uint32_t m;
95     int s;
96 
97     // compute shift & mask
98     // return the correct number of bits (shifted to low end)
99     s = (base + 1) - length;
100     m = masks[length];
101     return ((bf >> s) & m);
102 }
103