* NAME: bit->read() * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value */
| 139 | * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value |
| 140 | */ |
| 141 | unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) |
| 142 | { |
| 143 | unsigned long value; |
| 144 | |
| 145 | if (bitptr->left == CHAR_BIT) |
| 146 | bitptr->cache = *bitptr->byte; |
| 147 | |
| 148 | if (len < bitptr->left) { |
| 149 | value = (bitptr->cache & ((1 << bitptr->left) - 1)) >> |
| 150 | (bitptr->left - len); |
| 151 | bitptr->left -= len; |
| 152 | |
| 153 | return value; |
| 154 | } |
| 155 | |
| 156 | /* remaining bits in current byte */ |
| 157 | |
| 158 | value = bitptr->cache & ((1 << bitptr->left) - 1); |
| 159 | len -= bitptr->left; |
| 160 | |
| 161 | bitptr->byte++; |
| 162 | bitptr->left = CHAR_BIT; |
| 163 | |
| 164 | /* more bytes */ |
| 165 | |
| 166 | while (len >= CHAR_BIT) { |
| 167 | value = (value << CHAR_BIT) | *bitptr->byte++; |
| 168 | len -= CHAR_BIT; |
| 169 | } |
| 170 | |
| 171 | if (len > 0) { |
| 172 | bitptr->cache = *bitptr->byte; |
| 173 | |
| 174 | value = (value << len) | (bitptr->cache >> (CHAR_BIT - len)); |
| 175 | bitptr->left -= len; |
| 176 | } |
| 177 | |
| 178 | return value; |
| 179 | } |
| 180 | |
| 181 | # if 0 |
| 182 | /* |
no outgoing calls
no test coverage detected