void create_last_word_mask(MY_BITMAP *map) { unsigned char const mask= invers_last_byte_mask(map->n_bits); /* The first bytes are to be set to zero since they represent real bits in the bitvector. The last bytes are set to 0xFF since they represent bytes not used by the bitvector. Finally the last byte contains bits as set by the mask above. */ unsigned char *ptr= (unsigned char*)&map->last_word_mask; map->last_word_ptr= map->bitmap + no_words_in_map(map)-1; switch (no_bytes_in_map(map) & 3) { case 1: map->last_word_mask= ~0U; ptr[0]= mask; return; case 2: map->last_word_mask= ~0U; ptr[0]= 0; ptr[1]= mask; return; case 3: map->last_word_mask= 0U; ptr[2]= mask; ptr[3]= 0xFFU; return; case 0: map->last_word_mask= 0U; ptr[3]= mask; return; } }
void create_last_word_mask(MY_BITMAP *map) { /* Get the number of used bits (1..8) in the last byte */ unsigned int const used= 1U + ((map->n_bits-1U) & 0x7U); /* Create a mask with the upper 'unused' bits set and the lower 'used' bits clear. The bits within each byte is stored in big-endian order. */ unsigned char const mask= (~((1 << used) - 1)) & 255; /* The first bytes are to be set to zero since they represent real bits in the bitvector. The last bytes are set to 0xFF since they represent bytes not used by the bitvector. Finally the last byte contains bits as set by the mask above. */ unsigned char *ptr= (unsigned char*)&map->last_word_mask; /* Avoid out-of-bounds read/write if we have zero bits. */ map->last_word_ptr= map->n_bits == 0 ? map->bitmap : map->bitmap + no_words_in_map(map) - 1; switch (no_bytes_in_map(map) & 3) { case 1: map->last_word_mask= ~0U; ptr[0]= mask; return; case 2: map->last_word_mask= ~0U; ptr[0]= 0; ptr[1]= mask; return; case 3: map->last_word_mask= 0U; ptr[2]= mask; ptr[3]= 0xFFU; return; case 0: map->last_word_mask= 0U; ptr[3]= mask; return; } }