bitstring.h revision 290001
1/*
2 * Copyright (C) 2004-2007  Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1999-2001  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* $Id: bitstring.h,v 1.14 2007/06/19 23:47:18 tbox Exp $ */
19
20#ifndef ISC_BITSTRING_H
21#define ISC_BITSTRING_H 1
22
23/*****
24 ***** Module Info
25 *****/
26
27/*! \file isc/bitstring.h
28 *
29 * \brief Bitstring manipulation functions.
30 *
31 * A bitstring is a packed array of bits, stored in a contiguous
32 * sequence of octets.  The "most significant bit" (msb) of a bitstring
33 * is the high bit of the first octet.  The "least significant bit" of a
34 * bitstring is the low bit of the last octet.
35 *
36 * Two bit numbering schemes are supported, "msb0" and "lsb0".
37 *
38 * In the "msb0" scheme, bit number 0 designates the most significant bit,
39 * and any padding bits required to make the bitstring a multiple of 8 bits
40 * long are added to the least significant end of the last octet.
41 *
42 * In the "lsb0" scheme, bit number 0 designates the least significant bit,
43 * and any padding bits required to make the bitstring a multiple of 8 bits
44 * long are added to the most significant end of the first octet.
45 *
46 * E.g., consider the bitstring "11010001111".  This bitstring is 11 bits
47 * long and will take two octets.  Let "p" denote a pad bit.  In the msb0
48 * encoding, it would be
49 *
50 * \verbatim
51 *             Octet 0           Octet 1
52 *                         |
53 *         1 1 0 1 0 0 0 1 | 1 1 1 p p p p p
54 *         ^               |               ^
55 *         |                               |
56 *         bit 0                           bit 15
57 * \endverbatim
58 *
59 * In the lsb0 encoding, it would be
60 *
61 * \verbatim
62 *             Octet 0           Octet 1
63 *                         |
64 *         p p p p p 1 1 0 | 1 0 0 0 1 1 1 1
65 *         ^               |               ^
66 *         |                               |
67 *         bit 15                          bit 0
68 * \endverbatim
69 */
70
71/***
72 *** Imports
73 ***/
74
75#include <isc/lang.h>
76#include <isc/types.h>
77
78ISC_LANG_BEGINDECLS
79
80/***
81 *** Types
82 ***/
83
84struct isc_bitstring {
85	unsigned int		magic;
86	unsigned char *		data;
87	unsigned int		length;
88	unsigned int		size;
89	isc_boolean_t		lsb0;
90};
91
92/***
93 *** Functions
94 ***/
95
96void
97isc_bitstring_init(isc_bitstring_t *bitstring, unsigned char *data,
98		   unsigned int length, unsigned int size, isc_boolean_t lsb0);
99/*!<
100 * \brief Make 'bitstring' refer to the bitstring of 'size' bits starting
101 * at 'data'.  'length' bits of the bitstring are valid.  If 'lsb0'
102 * is set then, bit 0 refers to the least significant bit of the
103 * bitstring.  Otherwise bit 0 is the most significant bit.
104 *
105 * Requires:
106 *
107 *\li	'bitstring' points to a isc_bitstring_t.
108 *
109 *\li	'data' points to an array of unsigned char large enough to hold
110 *	'size' bits.
111 *
112 *\li	'length' <= 'size'.
113 *
114 * Ensures:
115 *
116 *\li	'bitstring' is a valid bitstring.
117 */
118
119void
120isc_bitstring_invalidate(isc_bitstring_t *bitstring);
121/*!<
122 * \brief Invalidate 'bitstring'.
123 *
124 * Requires:
125 *
126 *\li	'bitstring' is a valid bitstring.
127 *
128 * Ensures:
129 *
130 *\li	'bitstring' is not a valid bitstring.
131 */
132
133void
134isc_bitstring_copy(isc_bitstring_t *source, unsigned int sbitpos,
135		   isc_bitstring_t *target, unsigned int tbitpos,
136		   unsigned int n);
137/*!<
138 * \brief Starting at bit 'sbitpos', copy 'n' bits from 'source' to
139 * the 'n' bits of 'target' starting at 'tbitpos'.
140 *
141 * Requires:
142 *
143 *\li	'source' and target are valid bitstrings with the same lsb0 setting.
144 *
145 *\li	'sbitpos' + 'n' is less than or equal to the length of 'source'.
146 *
147 *\li	'tbitpos' + 'n' is less than or equal to the size of 'target'.
148 *
149 * Ensures:
150 *
151 *\li	The specified bits have been copied, and the length of 'target'
152 *	adjusted (if required).
153 */
154
155ISC_LANG_ENDDECLS
156
157#endif /* ISC_BITSTRING_H */
158