1*cfb92d14SAndroid Build Coastguard Worker /* 2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2018, Sam Kumar <[email protected]> 3*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2018, University of California, Berkeley 4*cfb92d14SAndroid Build Coastguard Worker * All rights reserved. 5*cfb92d14SAndroid Build Coastguard Worker * 6*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 7*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 8*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the 14*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products 15*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 16*cfb92d14SAndroid Build Coastguard Worker * 17*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 28*cfb92d14SAndroid Build Coastguard Worker */ 29*cfb92d14SAndroid Build Coastguard Worker 30*cfb92d14SAndroid Build Coastguard Worker #ifndef BITMAP_H_ 31*cfb92d14SAndroid Build Coastguard Worker #define BITMAP_H_ 32*cfb92d14SAndroid Build Coastguard Worker 33*cfb92d14SAndroid Build Coastguard Worker #include <stdint.h> 34*cfb92d14SAndroid Build Coastguard Worker #include <stdlib.h> 35*cfb92d14SAndroid Build Coastguard Worker 36*cfb92d14SAndroid Build Coastguard Worker /* Computes the number of bytes required to store the specified number of bits. */ 37*cfb92d14SAndroid Build Coastguard Worker #define BITS_TO_BYTES(bits) (((bits) >> 3) + (((bits) & 0x7) ? 1 : 0)) 38*cfb92d14SAndroid Build Coastguard Worker 39*cfb92d14SAndroid Build Coastguard Worker /* Initializes a bitmap to all zeros. */ 40*cfb92d14SAndroid Build Coastguard Worker void bmp_init(uint8_t* buf, size_t numbytes); 41*cfb92d14SAndroid Build Coastguard Worker 42*cfb92d14SAndroid Build Coastguard Worker /* Sets the specified range of bits. START is the index 43*cfb92d14SAndroid Build Coastguard Worker of the first bit to be set. LEN is the number of bits 44*cfb92d14SAndroid Build Coastguard Worker to be set. */ 45*cfb92d14SAndroid Build Coastguard Worker void bmp_setrange(uint8_t* buf, size_t start, size_t len); 46*cfb92d14SAndroid Build Coastguard Worker 47*cfb92d14SAndroid Build Coastguard Worker /* Clears the specified range of bits. START is the index 48*cfb92d14SAndroid Build Coastguard Worker of the first bit to be cleared. LEN is the number of bits 49*cfb92d14SAndroid Build Coastguard Worker to be cleared. */ 50*cfb92d14SAndroid Build Coastguard Worker void bmp_clrrange(uint8_t* buf, size_t start, size_t len); 51*cfb92d14SAndroid Build Coastguard Worker 52*cfb92d14SAndroid Build Coastguard Worker /* Counts the number of set bits in BUF starting at START. BUF has length 53*cfb92d14SAndroid Build Coastguard Worker BUFLEN, in bytes. Counts the number of set bits until it either (1) finds 54*cfb92d14SAndroid Build Coastguard Worker a bit that isn't set, in which case it returns the number of set bits, 55*cfb92d14SAndroid Build Coastguard Worker (2) it has counted at least LIMIT bits, in which case it returns a number 56*cfb92d14SAndroid Build Coastguard Worker greater than or equal to LIMIT, or (3) reaches the end of the buffer, in 57*cfb92d14SAndroid Build Coastguard Worker which case it returns exactly the number of set bits it found. */ 58*cfb92d14SAndroid Build Coastguard Worker size_t bmp_countset(uint8_t* buf, size_t buflen, size_t start, size_t limit); 59*cfb92d14SAndroid Build Coastguard Worker 60*cfb92d14SAndroid Build Coastguard Worker /* Swaps two non-overlapping regions of the bitmap. START_1 is the index of 61*cfb92d14SAndroid Build Coastguard Worker the first region, START_2 is the index of the secoind region, and LEN is 62*cfb92d14SAndroid Build Coastguard Worker the length of each region, in bits. */ 63*cfb92d14SAndroid Build Coastguard Worker void bmp_swap(uint8_t* buf, size_t start_1, size_t start_2, size_t len); 64*cfb92d14SAndroid Build Coastguard Worker 65*cfb92d14SAndroid Build Coastguard Worker /* Returns 1 if the bitmap is all zeros, and 0 otherwise. */ 66*cfb92d14SAndroid Build Coastguard Worker int bmp_isempty(uint8_t* buf, size_t buflen); 67*cfb92d14SAndroid Build Coastguard Worker 68*cfb92d14SAndroid Build Coastguard Worker /* Prints out the bitmap in hexadecimal (used for debugging). */ 69*cfb92d14SAndroid Build Coastguard Worker void bmp_print(uint8_t* buf, size_t buflen); 70*cfb92d14SAndroid Build Coastguard Worker 71*cfb92d14SAndroid Build Coastguard Worker #endif 72