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  */
  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  */
  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 
  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  */
  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  */
 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  */
 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 */