1 /* Copyright 2013 Google Inc. All Rights Reserved.
2 
3    Distributed under MIT license.
4    See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5 */
6 
7 /* Bit reading helpers */
8 
9 #include "./bit_reader.h"
10 
11 #include <brotli/types.h>
12 #include "./port.h"
13 
14 #if defined(__cplusplus) || defined(c_plusplus)
15 extern "C" {
16 #endif
17 
BrotliInitBitReader(BrotliBitReader * const br)18 void BrotliInitBitReader(BrotliBitReader* const br) {
19   br->val_ = 0;
20   br->bit_pos_ = sizeof(br->val_) << 3;
21 }
22 
BrotliWarmupBitReader(BrotliBitReader * const br)23 BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
24   size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1;
25   /* Fixing alignment after unaligned BrotliFillWindow would result accumulator
26      overflow. If unalignment is caused by BrotliSafeReadBits, then there is
27      enough space in accumulator to fix alignment. */
28   if (!BROTLI_ALIGNED_READ) {
29     aligned_read_mask = 0;
30   }
31   if (BrotliGetAvailableBits(br) == 0) {
32     if (!BrotliPullByte(br)) {
33       return BROTLI_FALSE;
34     }
35   }
36 
37   while ((((size_t)br->next_in) & aligned_read_mask) != 0) {
38     if (!BrotliPullByte(br)) {
39       /* If we consumed all the input, we don't care about the alignment. */
40       return BROTLI_TRUE;
41     }
42   }
43   return BROTLI_TRUE;
44 }
45 
46 #if defined(__cplusplus) || defined(c_plusplus)
47 }  /* extern "C" */
48 #endif
49