tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

bit_reader.c (2282B)


      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 "../common/platform.h"
     12 
     13 #if defined(__cplusplus) || defined(c_plusplus)
     14 extern "C" {
     15 #endif
     16 
     17 const BROTLI_MODEL("small")
     18 brotli_reg_t kBrotliBitMask[33] = {     0x00000000,
     19    0x00000001, 0x00000003, 0x00000007, 0x0000000F,
     20    0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
     21    0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
     22    0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
     23    0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
     24    0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
     25    0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
     26    0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
     27 };
     28 
     29 void BrotliInitBitReader(BrotliBitReader* const br) {
     30  br->val_ = 0;
     31  br->bit_pos_ = 0;
     32 }
     33 
     34 BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
     35  size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1;
     36  /* Fixing alignment after unaligned BrotliFillWindow would result accumulator
     37     overflow. If unalignment is caused by BrotliSafeReadBits, then there is
     38     enough space in accumulator to fix alignment. */
     39  if (BROTLI_UNALIGNED_READ_FAST) {
     40    aligned_read_mask = 0;
     41  }
     42  if (BrotliGetAvailableBits(br) == 0) {
     43    br->val_ = 0;
     44    if (!BrotliPullByte(br)) {
     45      return BROTLI_FALSE;
     46    }
     47  }
     48 
     49  while ((((size_t)br->next_in) & aligned_read_mask) != 0) {
     50    if (!BrotliPullByte(br)) {
     51      /* If we consumed all the input, we don't care about the alignment. */
     52      return BROTLI_TRUE;
     53    }
     54  }
     55  return BROTLI_TRUE;
     56 }
     57 
     58 BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br,
     59    brotli_reg_t n_bits, brotli_reg_t* val) {
     60  brotli_reg_t low_val;
     61  brotli_reg_t high_val;
     62  BrotliBitReaderState memento;
     63  BROTLI_DCHECK(n_bits <= 32);
     64  BROTLI_DCHECK(n_bits > 24);
     65  BrotliBitReaderSaveState(br, &memento);
     66  if (!BrotliSafeReadBits(br, 16, &low_val) ||
     67      !BrotliSafeReadBits(br, n_bits - 16, &high_val)) {
     68    BrotliBitReaderRestoreState(br, &memento);
     69    return BROTLI_FALSE;
     70  }
     71  *val = low_val | (high_val << 16);
     72  return BROTLI_TRUE;
     73 }
     74 
     75 #if defined(__cplusplus) || defined(c_plusplus)
     76 }  /* extern "C" */
     77 #endif