xref: /onnv-gate/usr/src/lib/libntfs/common/include/ntfs/bitmap.h (revision 9663:ace9a2ac3683)
1 /*
2  * bitmap.h - Exports for bitmap handling. Part of the Linux-NTFS project.
3  *
4  * Copyright (c) 2000-2004 Anton Altaparmakov
5  * Copyright (c) 2004-2005 Richard Russon
6  *
7  * This program/include file is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as published
9  * by the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program/include file is distributed in the hope that it will be
13  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program (in the main directory of the Linux-NTFS
19  * distribution in the file COPYING); if not, write to the Free Software
20  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22 
23 #ifndef _NTFS_BITMAP_H
24 #define _NTFS_BITMAP_H
25 
26 #include "types.h"
27 #include "attrib.h"
28 
29 /*
30  * NOTES:
31  *
32  * - Operations are 8-bit only to ensure the functions work both on little
33  *   and big endian machines! So don't make them 32-bit ops!
34  * - bitmap starts at bit = 0 and ends at bit = bitmap size - 1.
35  * - _Caller_ has to make sure that the bit to operate on is less than the
36  *   size of the bitmap.
37  */
38 
39 /**
40  * ntfs_bit_set - set a bit in a field of bits
41  * @bitmap:	field of bits
42  * @bit:	bit to set
43  * @new_value:	value to set bit to (0 or 1)
44  *
45  * Set the bit @bit in the @bitmap to @new_value. Ignore all errors.
46  */
ntfs_bit_set(u8 * bitmap,const u64 bit,const u8 new_value)47 static __inline__ void ntfs_bit_set(u8 *bitmap, const u64 bit,
48 		const u8 new_value)
49 {
50 	if (!bitmap || new_value > 1)
51 		return;
52 	if (!new_value)
53 		bitmap[bit >> 3] &= ~(1 << (bit & 7));
54 	else
55 		bitmap[bit >> 3] |= (1 << (bit & 7));
56 }
57 
58 /**
59  * ntfs_bit_get - get value of a bit in a field of bits
60  * @bitmap:	field of bits
61  * @bit:	bit to get
62  *
63  * Get and return the value of the bit @bit in @bitmap (0 or 1).
64  * Return -1 on error.
65  */
ntfs_bit_get(const u8 * bitmap,const u64 bit)66 static __inline__ char ntfs_bit_get(const u8 *bitmap, const u64 bit)
67 {
68 	if (!bitmap)
69 		return -1;
70 	return (bitmap[bit >> 3] >> (bit & 7)) & 1;
71 }
72 
ntfs_bit_change(u8 * bitmap,const u64 bit)73 static __inline__ void ntfs_bit_change(u8 *bitmap, const u64 bit)
74 {
75 	if (!bitmap)
76 		return;
77 	bitmap[bit >> 3] ^= 1 << (bit & 7);
78 }
79 
80 /**
81  * ntfs_bit_get_and_set - get value of a bit in a field of bits and set it
82  * @bitmap:	field of bits
83  * @bit:	bit to get/set
84  * @new_value:	value to set bit to (0 or 1)
85  *
86  * Return the value of the bit @bit and set it to @new_value (0 or 1).
87  * Return -1 on error.
88  */
ntfs_bit_get_and_set(u8 * bitmap,const u64 bit,const u8 new_value)89 static __inline__ char ntfs_bit_get_and_set(u8 *bitmap, const u64 bit,
90 		const u8 new_value)
91 {
92 	register u8 old_bit, shift;
93 
94 	if (!bitmap || new_value > 1)
95 		return -1;
96 	shift = bit & 7;
97 	old_bit = (bitmap[bit >> 3] >> shift) & 1;
98 	if (new_value != old_bit)
99 		bitmap[bit >> 3] ^= 1 << shift;
100 	return old_bit;
101 }
102 
103 extern int ntfs_bitmap_set_run(ntfs_attr *na, s64 start_bit, s64 count);
104 extern int ntfs_bitmap_clear_run(ntfs_attr *na, s64 start_bit, s64 count);
105 
106 /**
107  * ntfs_bitmap_set_bit - set a bit in a bitmap
108  * @na:		attribute containing the bitmap
109  * @bit:	bit to set
110  *
111  * Set the @bit in the bitmap described by the attribute @na.
112  *
113  * On success return 0 and on error return -1 with errno set to the error code.
114  */
ntfs_bitmap_set_bit(ntfs_attr * na,s64 bit)115 static __inline__ int ntfs_bitmap_set_bit(ntfs_attr *na, s64 bit)
116 {
117 	return ntfs_bitmap_set_run(na, bit, 1);
118 }
119 
120 /**
121  * ntfs_bitmap_clear_bit - clear a bit in a bitmap
122  * @na:		attribute containing the bitmap
123  * @bit:	bit to clear
124  *
125  * Clear @bit in the bitmap described by the attribute @na.
126  *
127  * On success return 0 and on error return -1 with errno set to the error code.
128  */
ntfs_bitmap_clear_bit(ntfs_attr * na,s64 bit)129 static __inline__ int ntfs_bitmap_clear_bit(ntfs_attr *na, s64 bit)
130 {
131 	return ntfs_bitmap_clear_run(na, bit, 1);
132 }
133 
134 #endif /* defined _NTFS_BITMAP_H */
135