tor-browser

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

decode.c (107780B)


      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 #include <brotli/decode.h>
      8 
      9 #include "../common/constants.h"
     10 #include "../common/context.h"
     11 #include "../common/dictionary.h"
     12 #include "../common/platform.h"
     13 #include "../common/shared_dictionary_internal.h"
     14 #include "../common/transform.h"
     15 #include "../common/version.h"
     16 #include "bit_reader.h"
     17 #include "huffman.h"
     18 #include "prefix.h"
     19 #include "state.h"
     20 #include "static_init.h"
     21 
     22 #if defined(BROTLI_TARGET_NEON)
     23 #include <arm_neon.h>
     24 #endif
     25 
     26 #if defined(__cplusplus) || defined(c_plusplus)
     27 extern "C" {
     28 #endif
     29 
     30 #define BROTLI_FAILURE(CODE) (BROTLI_DUMP(), CODE)
     31 
     32 #define BROTLI_LOG_UINT(name)                                       \
     33  BROTLI_LOG(("[%s] %s = %lu\n", __func__, #name, (unsigned long)(name)))
     34 #define BROTLI_LOG_ARRAY_INDEX(array_name, idx)                     \
     35  BROTLI_LOG(("[%s] %s[%lu] = %lu\n", __func__, #array_name,        \
     36         (unsigned long)(idx), (unsigned long)array_name[idx]))
     37 
     38 #define HUFFMAN_TABLE_BITS 8U
     39 #define HUFFMAN_TABLE_MASK 0xFF
     40 
     41 /* We need the slack region for the following reasons:
     42    - doing up to two 16-byte copies for fast backward copying
     43    - inserting transformed dictionary word:
     44        255 prefix + 32 base + 255 suffix */
     45 static const brotli_reg_t kRingBufferWriteAheadSlack = 542;
     46 
     47 static const BROTLI_MODEL("small")
     48 uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = {
     49  1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
     50 };
     51 
     52 /* Static prefix code for the complex code length code lengths. */
     53 static const BROTLI_MODEL("small")
     54 uint8_t kCodeLengthPrefixLength[16] = {
     55  2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4,
     56 };
     57 
     58 static const BROTLI_MODEL("small")
     59 uint8_t kCodeLengthPrefixValue[16] = {
     60  0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5,
     61 };
     62 
     63 BROTLI_BOOL BrotliDecoderSetParameter(
     64    BrotliDecoderState* state, BrotliDecoderParameter p, uint32_t value) {
     65  if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
     66  switch (p) {
     67    case BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:
     68      state->canny_ringbuffer_allocation = !!value ? 0 : 1;
     69      return BROTLI_TRUE;
     70 
     71    case BROTLI_DECODER_PARAM_LARGE_WINDOW:
     72      state->large_window = TO_BROTLI_BOOL(!!value);
     73      return BROTLI_TRUE;
     74 
     75    default: return BROTLI_FALSE;
     76  }
     77 }
     78 
     79 BrotliDecoderState* BrotliDecoderCreateInstance(
     80    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
     81  BrotliDecoderState* state = 0;
     82  if (!BrotliDecoderEnsureStaticInit()) {
     83    BROTLI_DUMP();
     84    return 0;
     85  }
     86  if (!alloc_func && !free_func) {
     87    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
     88  } else if (alloc_func && free_func) {
     89    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
     90  }
     91  if (state == 0) {
     92    BROTLI_DUMP();
     93    return 0;
     94  }
     95  if (!BrotliDecoderStateInit(state, alloc_func, free_func, opaque)) {
     96    BROTLI_DUMP();
     97    if (!alloc_func && !free_func) {
     98      free(state);
     99    } else if (alloc_func && free_func) {
    100      free_func(opaque, state);
    101    }
    102    return 0;
    103  }
    104  return state;
    105 }
    106 
    107 /* Deinitializes and frees BrotliDecoderState instance. */
    108 void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
    109  if (!state) {
    110    return;
    111  } else {
    112    brotli_free_func free_func = state->free_func;
    113    void* opaque = state->memory_manager_opaque;
    114    BrotliDecoderStateCleanup(state);
    115    free_func(opaque, state);
    116  }
    117 }
    118 
    119 /* Saves error code and converts it to BrotliDecoderResult. */
    120 static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
    121    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
    122  s->error_code = (int)e;
    123  s->used_input += consumed_input;
    124  if ((s->buffer_length != 0) && (s->br.next_in == s->br.last_in)) {
    125    /* If internal buffer is depleted at last, reset it. */
    126    s->buffer_length = 0;
    127  }
    128  switch (e) {
    129    case BROTLI_DECODER_SUCCESS:
    130      return BROTLI_DECODER_RESULT_SUCCESS;
    131 
    132    case BROTLI_DECODER_NEEDS_MORE_INPUT:
    133      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
    134 
    135    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
    136      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
    137 
    138    default:
    139      return BROTLI_DECODER_RESULT_ERROR;
    140  }
    141 }
    142 
    143 /* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
    144   Precondition: bit-reader accumulator has at least 8 bits. */
    145 static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
    146                                               BrotliBitReader* br) {
    147  brotli_reg_t n;
    148  BROTLI_BOOL large_window = s->large_window;
    149  s->large_window = BROTLI_FALSE;
    150  BrotliTakeBits(br, 1, &n);
    151  if (n == 0) {
    152    s->window_bits = 16;
    153    return BROTLI_DECODER_SUCCESS;
    154  }
    155  BrotliTakeBits(br, 3, &n);
    156  if (n != 0) {
    157    s->window_bits = (17u + n) & 63u;
    158    return BROTLI_DECODER_SUCCESS;
    159  }
    160  BrotliTakeBits(br, 3, &n);
    161  if (n == 1) {
    162    if (large_window) {
    163      BrotliTakeBits(br, 1, &n);
    164      if (n == 1) {
    165        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
    166      }
    167      s->large_window = BROTLI_TRUE;
    168      return BROTLI_DECODER_SUCCESS;
    169    } else {
    170      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
    171    }
    172  }
    173  if (n != 0) {
    174    s->window_bits = (8u + n) & 63u;
    175    return BROTLI_DECODER_SUCCESS;
    176  }
    177  s->window_bits = 17;
    178  return BROTLI_DECODER_SUCCESS;
    179 }
    180 
    181 static BROTLI_INLINE void memmove16(uint8_t* dst, uint8_t* src) {
    182 #if defined(BROTLI_TARGET_NEON)
    183  vst1q_u8(dst, vld1q_u8(src));
    184 #else
    185  uint32_t buffer[4];
    186  memcpy(buffer, src, 16);
    187  memcpy(dst, buffer, 16);
    188 #endif
    189 }
    190 
    191 /* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
    192 static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
    193    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
    194  brotli_reg_t bits;
    195  switch (s->substate_decode_uint8) {
    196    case BROTLI_STATE_DECODE_UINT8_NONE:
    197      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
    198        return BROTLI_DECODER_NEEDS_MORE_INPUT;
    199      }
    200      if (bits == 0) {
    201        *value = 0;
    202        return BROTLI_DECODER_SUCCESS;
    203      }
    204    /* Fall through. */
    205 
    206    case BROTLI_STATE_DECODE_UINT8_SHORT:
    207      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
    208        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
    209        return BROTLI_DECODER_NEEDS_MORE_INPUT;
    210      }
    211      if (bits == 0) {
    212        *value = 1;
    213        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
    214        return BROTLI_DECODER_SUCCESS;
    215      }
    216      /* Use output value as a temporary storage. It MUST be persisted. */
    217      *value = bits;
    218    /* Fall through. */
    219 
    220    case BROTLI_STATE_DECODE_UINT8_LONG:
    221      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
    222        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
    223        return BROTLI_DECODER_NEEDS_MORE_INPUT;
    224      }
    225      *value = ((brotli_reg_t)1U << *value) + bits;
    226      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
    227      return BROTLI_DECODER_SUCCESS;
    228 
    229    default:
    230      return
    231          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
    232  }
    233 }
    234 
    235 /* Decodes a metablock length and flags by reading 2 - 31 bits. */
    236 static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
    237    BrotliDecoderState* s, BrotliBitReader* br) {
    238  brotli_reg_t bits;
    239  int i;
    240  for (;;) {
    241    switch (s->substate_metablock_header) {
    242      case BROTLI_STATE_METABLOCK_HEADER_NONE:
    243        if (!BrotliSafeReadBits(br, 1, &bits)) {
    244          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    245        }
    246        s->is_last_metablock = bits ? 1 : 0;
    247        s->meta_block_remaining_len = 0;
    248        s->is_uncompressed = 0;
    249        s->is_metadata = 0;
    250        if (!s->is_last_metablock) {
    251          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
    252          break;
    253        }
    254        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
    255      /* Fall through. */
    256 
    257      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
    258        if (!BrotliSafeReadBits(br, 1, &bits)) {
    259          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    260        }
    261        if (bits) {
    262          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
    263          return BROTLI_DECODER_SUCCESS;
    264        }
    265        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
    266      /* Fall through. */
    267 
    268      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
    269        if (!BrotliSafeReadBits(br, 2, &bits)) {
    270          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    271        }
    272        s->size_nibbles = (uint8_t)(bits + 4);
    273        s->loop_counter = 0;
    274        if (bits == 3) {
    275          s->is_metadata = 1;
    276          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
    277          break;
    278        }
    279        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
    280      /* Fall through. */
    281 
    282      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
    283        i = s->loop_counter;
    284        for (; i < (int)s->size_nibbles; ++i) {
    285          if (!BrotliSafeReadBits(br, 4, &bits)) {
    286            s->loop_counter = i;
    287            return BROTLI_DECODER_NEEDS_MORE_INPUT;
    288          }
    289          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
    290              bits == 0) {
    291            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
    292          }
    293          s->meta_block_remaining_len |= (int)(bits << (i * 4));
    294        }
    295        s->substate_metablock_header =
    296            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
    297      /* Fall through. */
    298 
    299      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
    300        if (!s->is_last_metablock) {
    301          if (!BrotliSafeReadBits(br, 1, &bits)) {
    302            return BROTLI_DECODER_NEEDS_MORE_INPUT;
    303          }
    304          s->is_uncompressed = bits ? 1 : 0;
    305        }
    306        ++s->meta_block_remaining_len;
    307        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
    308        return BROTLI_DECODER_SUCCESS;
    309 
    310      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
    311        if (!BrotliSafeReadBits(br, 1, &bits)) {
    312          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    313        }
    314        if (bits != 0) {
    315          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
    316        }
    317        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
    318      /* Fall through. */
    319 
    320      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
    321        if (!BrotliSafeReadBits(br, 2, &bits)) {
    322          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    323        }
    324        if (bits == 0) {
    325          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
    326          return BROTLI_DECODER_SUCCESS;
    327        }
    328        s->size_nibbles = (uint8_t)bits;
    329        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
    330      /* Fall through. */
    331 
    332      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
    333        i = s->loop_counter;
    334        for (; i < (int)s->size_nibbles; ++i) {
    335          if (!BrotliSafeReadBits(br, 8, &bits)) {
    336            s->loop_counter = i;
    337            return BROTLI_DECODER_NEEDS_MORE_INPUT;
    338          }
    339          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
    340              bits == 0) {
    341            return BROTLI_FAILURE(
    342                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
    343          }
    344          s->meta_block_remaining_len |= (int)(bits << (i * 8));
    345        }
    346        ++s->meta_block_remaining_len;
    347        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
    348        return BROTLI_DECODER_SUCCESS;
    349 
    350      default:
    351        return
    352            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
    353    }
    354  }
    355 }
    356 
    357 /* Decodes the Huffman code.
    358   This method doesn't read data from the bit reader, BUT drops the amount of
    359   bits that correspond to the decoded symbol.
    360   bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
    361 static BROTLI_INLINE brotli_reg_t DecodeSymbol(brotli_reg_t bits,
    362                                               const HuffmanCode* table,
    363                                               BrotliBitReader* br) {
    364  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
    365  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
    366  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
    367    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
    368    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
    369    BROTLI_HC_ADJUST_TABLE_INDEX(table,
    370        BROTLI_HC_FAST_LOAD_VALUE(table) +
    371        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
    372  }
    373  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
    374  return BROTLI_HC_FAST_LOAD_VALUE(table);
    375 }
    376 
    377 /* Reads and decodes the next Huffman code from bit-stream.
    378   This method peeks 16 bits of input and drops 0 - 15 of them. */
    379 static BROTLI_INLINE brotli_reg_t ReadSymbol(const HuffmanCode* table,
    380                                             BrotliBitReader* br) {
    381  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
    382 }
    383 
    384 /* Same as DecodeSymbol, but it is known that there is less than 15 bits of
    385   input are currently available. */
    386 static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
    387    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
    388  brotli_reg_t val;
    389  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
    390  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
    391  if (available_bits == 0) {
    392    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
    393      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
    394      return BROTLI_TRUE;
    395    }
    396    return BROTLI_FALSE;  /* No valid bits at all. */
    397  }
    398  val = BrotliGetBitsUnmasked(br);
    399  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
    400  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
    401    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
    402      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
    403      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
    404      return BROTLI_TRUE;
    405    } else {
    406      return BROTLI_FALSE;  /* Not enough bits for the first level. */
    407    }
    408  }
    409  if (available_bits <= HUFFMAN_TABLE_BITS) {
    410    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
    411  }
    412 
    413  /* Speculatively drop HUFFMAN_TABLE_BITS. */
    414  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
    415  available_bits -= HUFFMAN_TABLE_BITS;
    416  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
    417  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
    418    return BROTLI_FALSE;  /* Not enough bits for the second level. */
    419  }
    420 
    421  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
    422  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
    423  return BROTLI_TRUE;
    424 }
    425 
    426 static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
    427    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
    428  brotli_reg_t val;
    429  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
    430    *result = DecodeSymbol(val, table, br);
    431    return BROTLI_TRUE;
    432  }
    433  return SafeDecodeSymbol(table, br, result);
    434 }
    435 
    436 /* Makes a look-up in first level Huffman table. Peeks 8 bits. */
    437 static BROTLI_INLINE void PreloadSymbol(int safe,
    438                                        const HuffmanCode* table,
    439                                        BrotliBitReader* br,
    440                                        brotli_reg_t* bits,
    441                                        brotli_reg_t* value) {
    442  if (safe) {
    443    return;
    444  }
    445  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
    446  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
    447  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
    448  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
    449 }
    450 
    451 /* Decodes the next Huffman code using data prepared by PreloadSymbol.
    452   Reads 0 - 15 bits. Also peeks 8 following bits. */
    453 static BROTLI_INLINE brotli_reg_t ReadPreloadedSymbol(const HuffmanCode* table,
    454                                                  BrotliBitReader* br,
    455                                                  brotli_reg_t* bits,
    456                                                  brotli_reg_t* value) {
    457  brotli_reg_t result = *value;
    458  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
    459    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
    460    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
    461    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
    462    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
    463    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
    464    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
    465    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
    466    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
    467  } else {
    468    BrotliDropBits(br, *bits);
    469  }
    470  PreloadSymbol(0, table, br, bits, value);
    471  return result;
    472 }
    473 
    474 /* Reads up to limit symbols from br and copies them into ringbuffer,
    475   starting from pos. Caller must ensure that there is enough space
    476   for the write. Returns the amount of symbols actually copied. */
    477 static BROTLI_INLINE int BrotliCopyPreloadedSymbolsToU8(const HuffmanCode* table,
    478                                                        BrotliBitReader* br,
    479                                                        brotli_reg_t* bits,
    480                                                        brotli_reg_t* value,
    481                                                        uint8_t* ringbuffer,
    482                                                        int pos,
    483                                                        const int limit) {
    484  /* Calculate range where CheckInputAmount is always true.
    485     Start with the number of bytes we can read. */
    486  int64_t new_lim = br->guard_in - br->next_in;
    487  /* Convert to bits, since symbols use variable number of bits. */
    488  new_lim *= 8;
    489  /* At most 15 bits per symbol, so this is safe. */
    490  new_lim /= 15;
    491  const int kMaximalOverread = 4;
    492  int pos_limit = limit;
    493  int copies = 0;
    494  if ((new_lim - kMaximalOverread) <= limit) {
    495    // Safe cast, since new_lim is already < num_steps
    496    pos_limit = (int)(new_lim - kMaximalOverread);
    497  }
    498  if (pos_limit < 0) {
    499    pos_limit = 0;
    500  }
    501  copies = pos_limit;
    502  pos_limit += pos;
    503  /* Fast path, caller made sure it is safe to write,
    504     we verified that is is safe to read. */
    505  for (; pos < pos_limit; pos++) {
    506    BROTLI_DCHECK(BrotliCheckInputAmount(br));
    507    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
    508    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
    509  }
    510  /* Do the remainder, caller made sure it is safe to write,
    511     we need to bverify that it is safe to read. */
    512  while (BrotliCheckInputAmount(br) && copies < limit) {
    513    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
    514    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
    515    pos++;
    516    copies++;
    517  }
    518  return copies;
    519 }
    520 
    521 static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
    522  brotli_reg_t result = 0;
    523  while (x) {
    524    x >>= 1;
    525    ++result;
    526  }
    527  return result;
    528 }
    529 
    530 /* Reads (s->symbol + 1) symbols.
    531   Totally 1..4 symbols are read, 1..11 bits each.
    532   The list of symbols MUST NOT contain duplicates. */
    533 static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
    534    brotli_reg_t alphabet_size_max, brotli_reg_t alphabet_size_limit,
    535    BrotliDecoderState* s) {
    536  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
    537  BrotliBitReader* br = &s->br;
    538  BrotliMetablockHeaderArena* h = &s->arena.header;
    539  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
    540  brotli_reg_t i = h->sub_loop_counter;
    541  brotli_reg_t num_symbols = h->symbol;
    542  while (i <= num_symbols) {
    543    brotli_reg_t v;
    544    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
    545      h->sub_loop_counter = i;
    546      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
    547      return BROTLI_DECODER_NEEDS_MORE_INPUT;
    548    }
    549    if (v >= alphabet_size_limit) {
    550      return
    551          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
    552    }
    553    h->symbols_lists_array[i] = (uint16_t)v;
    554    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
    555    ++i;
    556  }
    557 
    558  for (i = 0; i < num_symbols; ++i) {
    559    brotli_reg_t k = i + 1;
    560    for (; k <= num_symbols; ++k) {
    561      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
    562        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
    563      }
    564    }
    565  }
    566 
    567  return BROTLI_DECODER_SUCCESS;
    568 }
    569 
    570 /* Process single decoded symbol code length:
    571    A) reset the repeat variable
    572    B) remember code length (if it is not 0)
    573    C) extend corresponding index-chain
    574    D) reduce the Huffman space
    575    E) update the histogram */
    576 static BROTLI_INLINE void ProcessSingleCodeLength(brotli_reg_t code_len,
    577    brotli_reg_t* symbol, brotli_reg_t* repeat, brotli_reg_t* space,
    578    brotli_reg_t* prev_code_len, uint16_t* symbol_lists,
    579    uint16_t* code_length_histo, int* next_symbol) {
    580  *repeat = 0;
    581  if (code_len != 0) {  /* code_len == 1..15 */
    582    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
    583    next_symbol[code_len] = (int)(*symbol);
    584    *prev_code_len = code_len;
    585    *space -= 32768U >> code_len;
    586    code_length_histo[code_len]++;
    587    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
    588        (int)*symbol, (int)code_len));
    589  }
    590  (*symbol)++;
    591 }
    592 
    593 /* Process repeated symbol code length.
    594    A) Check if it is the extension of previous repeat sequence; if the decoded
    595       value is not BROTLI_REPEAT_PREVIOUS_CODE_LENGTH, then it is a new
    596       symbol-skip
    597    B) Update repeat variable
    598    C) Check if operation is feasible (fits alphabet)
    599    D) For each symbol do the same operations as in ProcessSingleCodeLength
    600 
    601   PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
    602                 code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
    603 static BROTLI_INLINE void ProcessRepeatedCodeLength(brotli_reg_t code_len,
    604    brotli_reg_t repeat_delta, brotli_reg_t alphabet_size, brotli_reg_t* symbol,
    605    brotli_reg_t* repeat, brotli_reg_t* space, brotli_reg_t* prev_code_len,
    606    brotli_reg_t* repeat_code_len, uint16_t* symbol_lists,
    607    uint16_t* code_length_histo, int* next_symbol) {
    608  brotli_reg_t old_repeat;
    609  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
    610  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
    611  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
    612    new_len = *prev_code_len;
    613    extra_bits = 2;
    614  }
    615  if (*repeat_code_len != new_len) {
    616    *repeat = 0;
    617    *repeat_code_len = new_len;
    618  }
    619  old_repeat = *repeat;
    620  if (*repeat > 0) {
    621    *repeat -= 2;
    622    *repeat <<= extra_bits;
    623  }
    624  *repeat += repeat_delta + 3U;
    625  repeat_delta = *repeat - old_repeat;
    626  if (*symbol + repeat_delta > alphabet_size) {
    627    BROTLI_DUMP();
    628    *symbol = alphabet_size;
    629    *space = 0xFFFFF;
    630    return;
    631  }
    632  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
    633      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
    634  if (*repeat_code_len != 0) {
    635    brotli_reg_t last = *symbol + repeat_delta;
    636    int next = next_symbol[*repeat_code_len];
    637    do {
    638      symbol_lists[next] = (uint16_t)*symbol;
    639      next = (int)*symbol;
    640    } while (++(*symbol) != last);
    641    next_symbol[*repeat_code_len] = next;
    642    *space -= repeat_delta << (15 - *repeat_code_len);
    643    code_length_histo[*repeat_code_len] =
    644        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
    645  } else {
    646    *symbol += repeat_delta;
    647  }
    648 }
    649 
    650 /* Reads and decodes symbol codelengths. */
    651 static BrotliDecoderErrorCode ReadSymbolCodeLengths(
    652    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
    653  BrotliBitReader* br = &s->br;
    654  BrotliMetablockHeaderArena* h = &s->arena.header;
    655  brotli_reg_t symbol = h->symbol;
    656  brotli_reg_t repeat = h->repeat;
    657  brotli_reg_t space = h->space;
    658  brotli_reg_t prev_code_len = h->prev_code_len;
    659  brotli_reg_t repeat_code_len = h->repeat_code_len;
    660  uint16_t* symbol_lists = h->symbol_lists;
    661  uint16_t* code_length_histo = h->code_length_histo;
    662  int* next_symbol = h->next_symbol;
    663  if (!BrotliWarmupBitReader(br)) {
    664    return BROTLI_DECODER_NEEDS_MORE_INPUT;
    665  }
    666  while (symbol < alphabet_size && space > 0) {
    667    const HuffmanCode* p = h->table;
    668    brotli_reg_t code_len;
    669    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
    670    if (!BrotliCheckInputAmount(br)) {
    671      h->symbol = symbol;
    672      h->repeat = repeat;
    673      h->prev_code_len = prev_code_len;
    674      h->repeat_code_len = repeat_code_len;
    675      h->space = space;
    676      return BROTLI_DECODER_NEEDS_MORE_INPUT;
    677    }
    678    BrotliFillBitWindow16(br);
    679    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
    680        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
    681    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
    682    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
    683    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
    684      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
    685          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
    686    } else {  /* code_len == 16..17, extra_bits == 2..3 */
    687      brotli_reg_t extra_bits =
    688          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
    689      brotli_reg_t repeat_delta =
    690          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
    691      BrotliDropBits(br, extra_bits);
    692      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
    693          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
    694          symbol_lists, code_length_histo, next_symbol);
    695    }
    696  }
    697  h->space = space;
    698  return BROTLI_DECODER_SUCCESS;
    699 }
    700 
    701 static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
    702    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
    703  BrotliBitReader* br = &s->br;
    704  BrotliMetablockHeaderArena* h = &s->arena.header;
    705  BROTLI_BOOL get_byte = BROTLI_FALSE;
    706  while (h->symbol < alphabet_size && h->space > 0) {
    707    const HuffmanCode* p = h->table;
    708    brotli_reg_t code_len;
    709    brotli_reg_t available_bits;
    710    brotli_reg_t bits = 0;
    711    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
    712    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
    713    get_byte = BROTLI_FALSE;
    714    available_bits = BrotliGetAvailableBits(br);
    715    if (available_bits != 0) {
    716      bits = (uint32_t)BrotliGetBitsUnmasked(br);
    717    }
    718    BROTLI_HC_ADJUST_TABLE_INDEX(p,
    719        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
    720    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
    721      get_byte = BROTLI_TRUE;
    722      continue;
    723    }
    724    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
    725    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
    726      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
    727      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
    728          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
    729          h->next_symbol);
    730    } else {  /* code_len == 16..17, extra_bits == 2..3 */
    731      brotli_reg_t extra_bits = code_len - 14U;
    732      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
    733          BitMask(extra_bits);
    734      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
    735        get_byte = BROTLI_TRUE;
    736        continue;
    737      }
    738      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
    739      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
    740          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
    741          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
    742          h->next_symbol);
    743    }
    744  }
    745  return BROTLI_DECODER_SUCCESS;
    746 }
    747 
    748 /* Reads and decodes 15..18 codes using static prefix code.
    749   Each code is 2..4 bits long. In total 30..72 bits are used. */
    750 static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
    751  BrotliBitReader* br = &s->br;
    752  BrotliMetablockHeaderArena* h = &s->arena.header;
    753  brotli_reg_t num_codes = h->repeat;
    754  brotli_reg_t space = h->space;
    755  brotli_reg_t i = h->sub_loop_counter;
    756  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
    757    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
    758    brotli_reg_t ix;
    759    brotli_reg_t v;
    760    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
    761      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
    762      if (available_bits != 0) {
    763        ix = BrotliGetBitsUnmasked(br) & 0xF;
    764      } else {
    765        ix = 0;
    766      }
    767      if (kCodeLengthPrefixLength[ix] > available_bits) {
    768        h->sub_loop_counter = i;
    769        h->repeat = num_codes;
    770        h->space = space;
    771        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
    772        return BROTLI_DECODER_NEEDS_MORE_INPUT;
    773      }
    774    }
    775    v = kCodeLengthPrefixValue[ix];
    776    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
    777    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
    778    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
    779    if (v != 0) {
    780      space = space - (32U >> v);
    781      ++num_codes;
    782      ++h->code_length_histo[v];
    783      if (space - 1U >= 32U) {
    784        /* space is 0 or wrapped around. */
    785        break;
    786      }
    787    }
    788  }
    789  if (!(num_codes == 1 || space == 0)) {
    790    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
    791  }
    792  return BROTLI_DECODER_SUCCESS;
    793 }
    794 
    795 /* Decodes the Huffman tables.
    796   There are 2 scenarios:
    797    A) Huffman code contains only few symbols (1..4). Those symbols are read
    798       directly; their code lengths are defined by the number of symbols.
    799       For this scenario 4 - 49 bits will be read.
    800 
    801    B) 2-phase decoding:
    802    B.1) Small Huffman table is decoded; it is specified with code lengths
    803         encoded with predefined entropy code. 32 - 74 bits are used.
    804    B.2) Decoded table is used to decode code lengths of symbols in resulting
    805         Huffman table. In worst case 3520 bits are read. */
    806 static BrotliDecoderErrorCode ReadHuffmanCode(brotli_reg_t alphabet_size_max,
    807                                              brotli_reg_t alphabet_size_limit,
    808                                              HuffmanCode* table,
    809                                              brotli_reg_t* opt_table_size,
    810                                              BrotliDecoderState* s) {
    811  BrotliBitReader* br = &s->br;
    812  BrotliMetablockHeaderArena* h = &s->arena.header;
    813  /* State machine. */
    814  for (;;) {
    815    switch (h->substate_huffman) {
    816      case BROTLI_STATE_HUFFMAN_NONE:
    817        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
    818          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    819        }
    820        BROTLI_LOG_UINT(h->sub_loop_counter);
    821        /* The value is used as follows:
    822           1 for simple code;
    823           0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
    824        if (h->sub_loop_counter != 1) {
    825          h->space = 32;
    826          h->repeat = 0;  /* num_codes */
    827          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
    828              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
    829          memset(&h->code_length_code_lengths[0], 0,
    830              sizeof(h->code_length_code_lengths));
    831          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
    832          continue;
    833        }
    834      /* Fall through. */
    835 
    836      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
    837        /* Read symbols, codes & code lengths directly. */
    838        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
    839          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
    840          return BROTLI_DECODER_NEEDS_MORE_INPUT;
    841        }
    842        h->sub_loop_counter = 0;
    843      /* Fall through. */
    844 
    845      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
    846        BrotliDecoderErrorCode result =
    847            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
    848        if (result != BROTLI_DECODER_SUCCESS) {
    849          return result;
    850        }
    851      }
    852      /* Fall through. */
    853 
    854      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
    855        brotli_reg_t table_size;
    856        if (h->symbol == 3) {
    857          brotli_reg_t bits;
    858          if (!BrotliSafeReadBits(br, 1, &bits)) {
    859            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
    860            return BROTLI_DECODER_NEEDS_MORE_INPUT;
    861          }
    862          h->symbol += bits;
    863        }
    864        BROTLI_LOG_UINT(h->symbol);
    865        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
    866                                                   h->symbols_lists_array,
    867                                                   (uint32_t)h->symbol);
    868        if (opt_table_size) {
    869          *opt_table_size = table_size;
    870        }
    871        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
    872        return BROTLI_DECODER_SUCCESS;
    873      }
    874 
    875      /* Decode Huffman-coded code lengths. */
    876      case BROTLI_STATE_HUFFMAN_COMPLEX: {
    877        brotli_reg_t i;
    878        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
    879        if (result != BROTLI_DECODER_SUCCESS) {
    880          return result;
    881        }
    882        BrotliBuildCodeLengthsHuffmanTable(h->table,
    883                                           h->code_length_code_lengths,
    884                                           h->code_length_histo);
    885        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
    886        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
    887          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
    888          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
    889        }
    890 
    891        h->symbol = 0;
    892        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
    893        h->repeat = 0;
    894        h->repeat_code_len = 0;
    895        h->space = 32768;
    896        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
    897      }
    898      /* Fall through. */
    899 
    900      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
    901        brotli_reg_t table_size;
    902        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
    903            alphabet_size_limit, s);
    904        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
    905          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
    906        }
    907        if (result != BROTLI_DECODER_SUCCESS) {
    908          return result;
    909        }
    910 
    911        if (h->space != 0) {
    912          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
    913          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
    914        }
    915        table_size = BrotliBuildHuffmanTable(
    916            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
    917        if (opt_table_size) {
    918          *opt_table_size = table_size;
    919        }
    920        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
    921        return BROTLI_DECODER_SUCCESS;
    922      }
    923 
    924      default:
    925        return
    926            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
    927    }
    928  }
    929 }
    930 
    931 /* Decodes a block length by reading 3..39 bits. */
    932 static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
    933                                                  BrotliBitReader* br) {
    934  brotli_reg_t code;
    935  brotli_reg_t nbits;
    936  code = ReadSymbol(table, br);
    937  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
    938  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
    939 }
    940 
    941 /* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
    942   reading can't be continued with ReadBlockLength. */
    943 static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
    944    BrotliDecoderState* s, brotli_reg_t* result, const HuffmanCode* table,
    945    BrotliBitReader* br) {
    946  brotli_reg_t index;
    947  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
    948    if (!SafeReadSymbol(table, br, &index)) {
    949      return BROTLI_FALSE;
    950    }
    951  } else {
    952    index = s->block_length_index;
    953  }
    954  {
    955    brotli_reg_t bits;
    956    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
    957    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
    958    if (!BrotliSafeReadBits(br, nbits, &bits)) {
    959      s->block_length_index = index;
    960      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
    961      return BROTLI_FALSE;
    962    }
    963    *result = offset + bits;
    964    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
    965    return BROTLI_TRUE;
    966  }
    967 }
    968 
    969 /* Transform:
    970    1) initialize list L with values 0, 1,... 255
    971    2) For each input element X:
    972    2.1) let Y = L[X]
    973    2.2) remove X-th element from L
    974    2.3) prepend Y to L
    975    2.4) append Y to output
    976 
    977   In most cases max(Y) <= 7, so most of L remains intact.
    978   To reduce the cost of initialization, we reuse L, remember the upper bound
    979   of Y values, and reinitialize only first elements in L.
    980 
    981   Most of input values are 0 and 1. To reduce number of branches, we replace
    982   inner for loop with do-while. */
    983 static BROTLI_NOINLINE void InverseMoveToFrontTransform(
    984    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
    985  /* Reinitialize elements that could have been changed. */
    986  brotli_reg_t i = 1;
    987  brotli_reg_t upper_bound = state->mtf_upper_bound;
    988  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
    989  uint8_t* mtf_u8 = (uint8_t*)mtf;
    990  /* Load endian-aware constant. */
    991  const uint8_t b0123[4] = {0, 1, 2, 3};
    992  uint32_t pattern;
    993  memcpy(&pattern, &b0123, 4);
    994 
    995  /* Initialize list using 4 consequent values pattern. */
    996  mtf[0] = pattern;
    997  do {
    998    pattern += 0x04040404;  /* Advance all 4 values by 4. */
    999    mtf[i] = pattern;
   1000    i++;
   1001  } while (i <= upper_bound);
   1002 
   1003  /* Transform the input. */
   1004  upper_bound = 0;
   1005  for (i = 0; i < v_len; ++i) {
   1006    int index = v[i];
   1007    uint8_t value = mtf_u8[index];
   1008    upper_bound |= v[i];
   1009    v[i] = value;
   1010    mtf_u8[-1] = value;
   1011    do {
   1012      index--;
   1013      mtf_u8[index + 1] = mtf_u8[index];
   1014    } while (index >= 0);
   1015  }
   1016  /* Remember amount of elements to be reinitialized. */
   1017  state->mtf_upper_bound = upper_bound >> 2;
   1018 }
   1019 
   1020 /* Decodes a series of Huffman table using ReadHuffmanCode function. */
   1021 static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
   1022    HuffmanTreeGroup* group, BrotliDecoderState* s) {
   1023  BrotliMetablockHeaderArena* h = &s->arena.header;
   1024  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
   1025    h->next = group->codes;
   1026    h->htree_index = 0;
   1027    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
   1028  }
   1029  while (h->htree_index < group->num_htrees) {
   1030    brotli_reg_t table_size;
   1031    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
   1032        group->alphabet_size_limit, h->next, &table_size, s);
   1033    if (result != BROTLI_DECODER_SUCCESS) return result;
   1034    group->htrees[h->htree_index] = h->next;
   1035    h->next += table_size;
   1036    ++h->htree_index;
   1037  }
   1038  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
   1039  return BROTLI_DECODER_SUCCESS;
   1040 }
   1041 
   1042 /* Decodes a context map.
   1043   Decoding is done in 4 phases:
   1044    1) Read auxiliary information (6..16 bits) and allocate memory.
   1045       In case of trivial context map, decoding is finished at this phase.
   1046    2) Decode Huffman table using ReadHuffmanCode function.
   1047       This table will be used for reading context map items.
   1048    3) Read context map items; "0" values could be run-length encoded.
   1049    4) Optionally, apply InverseMoveToFront transform to the resulting map. */
   1050 static BrotliDecoderErrorCode DecodeContextMap(brotli_reg_t context_map_size,
   1051                                               brotli_reg_t* num_htrees,
   1052                                               uint8_t** context_map_arg,
   1053                                               BrotliDecoderState* s) {
   1054  BrotliBitReader* br = &s->br;
   1055  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
   1056  BrotliMetablockHeaderArena* h = &s->arena.header;
   1057 
   1058  switch ((int)h->substate_context_map) {
   1059    case BROTLI_STATE_CONTEXT_MAP_NONE:
   1060      result = DecodeVarLenUint8(s, br, num_htrees);
   1061      if (result != BROTLI_DECODER_SUCCESS) {
   1062        return result;
   1063      }
   1064      (*num_htrees)++;
   1065      h->context_index = 0;
   1066      BROTLI_LOG_UINT(context_map_size);
   1067      BROTLI_LOG_UINT(*num_htrees);
   1068      *context_map_arg =
   1069          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
   1070      if (*context_map_arg == 0) {
   1071        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
   1072      }
   1073      if (*num_htrees <= 1) {
   1074        memset(*context_map_arg, 0, (size_t)context_map_size);
   1075        return BROTLI_DECODER_SUCCESS;
   1076      }
   1077      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
   1078    /* Fall through. */
   1079 
   1080    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
   1081      brotli_reg_t bits;
   1082      /* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
   1083         to peek 4 bits ahead. */
   1084      if (!BrotliSafeGetBits(br, 5, &bits)) {
   1085        return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1086      }
   1087      if ((bits & 1) != 0) { /* Use RLE for zeros. */
   1088        h->max_run_length_prefix = (bits >> 1) + 1;
   1089        BrotliDropBits(br, 5);
   1090      } else {
   1091        h->max_run_length_prefix = 0;
   1092        BrotliDropBits(br, 1);
   1093      }
   1094      BROTLI_LOG_UINT(h->max_run_length_prefix);
   1095      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
   1096    }
   1097    /* Fall through. */
   1098 
   1099    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
   1100      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
   1101      result = ReadHuffmanCode(alphabet_size, alphabet_size,
   1102                               h->context_map_table, NULL, s);
   1103      if (result != BROTLI_DECODER_SUCCESS) return result;
   1104      h->code = 0xFFFF;
   1105      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
   1106    }
   1107    /* Fall through. */
   1108 
   1109    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
   1110      brotli_reg_t context_index = h->context_index;
   1111      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
   1112      uint8_t* context_map = *context_map_arg;
   1113      brotli_reg_t code = h->code;
   1114      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
   1115      while (context_index < context_map_size || skip_preamble) {
   1116        if (!skip_preamble) {
   1117          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
   1118            h->code = 0xFFFF;
   1119            h->context_index = context_index;
   1120            return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1121          }
   1122          BROTLI_LOG_UINT(code);
   1123 
   1124          if (code == 0) {
   1125            context_map[context_index++] = 0;
   1126            continue;
   1127          }
   1128          if (code > max_run_length_prefix) {
   1129            context_map[context_index++] =
   1130                (uint8_t)(code - max_run_length_prefix);
   1131            continue;
   1132          }
   1133        } else {
   1134          skip_preamble = BROTLI_FALSE;
   1135        }
   1136        /* RLE sub-stage. */
   1137        {
   1138          brotli_reg_t reps;
   1139          if (!BrotliSafeReadBits(br, code, &reps)) {
   1140            h->code = code;
   1141            h->context_index = context_index;
   1142            return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1143          }
   1144          reps += (brotli_reg_t)1U << code;
   1145          BROTLI_LOG_UINT(reps);
   1146          if (context_index + reps > context_map_size) {
   1147            return
   1148                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
   1149          }
   1150          do {
   1151            context_map[context_index++] = 0;
   1152          } while (--reps);
   1153        }
   1154      }
   1155    }
   1156    /* Fall through. */
   1157 
   1158    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
   1159      brotli_reg_t bits;
   1160      if (!BrotliSafeReadBits(br, 1, &bits)) {
   1161        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
   1162        return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1163      }
   1164      if (bits != 0) {
   1165        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
   1166      }
   1167      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
   1168      return BROTLI_DECODER_SUCCESS;
   1169    }
   1170 
   1171    default:
   1172      return
   1173          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
   1174  }
   1175 }
   1176 
   1177 /* Decodes a command or literal and updates block type ring-buffer.
   1178   Reads 3..54 bits. */
   1179 static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
   1180    int safe, BrotliDecoderState* s, int tree_type) {
   1181  brotli_reg_t max_block_type = s->num_block_types[tree_type];
   1182  const HuffmanCode* type_tree = &s->block_type_trees[
   1183      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
   1184  const HuffmanCode* len_tree = &s->block_len_trees[
   1185      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
   1186  BrotliBitReader* br = &s->br;
   1187  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
   1188  brotli_reg_t block_type;
   1189  if (max_block_type <= 1) {
   1190    return BROTLI_FALSE;
   1191  }
   1192 
   1193  /* Read 0..15 + 3..39 bits. */
   1194  if (!safe) {
   1195    block_type = ReadSymbol(type_tree, br);
   1196    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
   1197  } else {
   1198    BrotliBitReaderState memento;
   1199    BrotliBitReaderSaveState(br, &memento);
   1200    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
   1201    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
   1202      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
   1203      BrotliBitReaderRestoreState(br, &memento);
   1204      return BROTLI_FALSE;
   1205    }
   1206  }
   1207 
   1208  if (block_type == 1) {
   1209    block_type = ringbuffer[1] + 1;
   1210  } else if (block_type == 0) {
   1211    block_type = ringbuffer[0];
   1212  } else {
   1213    block_type -= 2;
   1214  }
   1215  if (block_type >= max_block_type) {
   1216    block_type -= max_block_type;
   1217  }
   1218  ringbuffer[0] = ringbuffer[1];
   1219  ringbuffer[1] = block_type;
   1220  return BROTLI_TRUE;
   1221 }
   1222 
   1223 static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
   1224    BrotliDecoderState* s) {
   1225  size_t i;
   1226  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
   1227  for (i = 0; i < s->num_block_types[0]; i++) {
   1228    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
   1229    size_t error = 0;
   1230    size_t sample = s->context_map[offset];
   1231    size_t j;
   1232    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
   1233      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
   1234      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
   1235    }
   1236    if (error == 0) {
   1237      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
   1238    }
   1239  }
   1240 }
   1241 
   1242 static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
   1243  uint8_t context_mode;
   1244  size_t trivial;
   1245  brotli_reg_t block_type = s->block_type_rb[1];
   1246  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
   1247  s->context_map_slice = s->context_map + context_offset;
   1248  trivial = s->trivial_literal_contexts[block_type >> 5];
   1249  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
   1250  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
   1251  context_mode = s->context_modes[block_type] & 3;
   1252  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
   1253 }
   1254 
   1255 /* Decodes the block type and updates the state for literal context.
   1256   Reads 3..54 bits. */
   1257 static BROTLI_INLINE BROTLI_BOOL DecodeLiteralBlockSwitchInternal(
   1258    int safe, BrotliDecoderState* s) {
   1259  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
   1260    return BROTLI_FALSE;
   1261  }
   1262  PrepareLiteralDecoding(s);
   1263  return BROTLI_TRUE;
   1264 }
   1265 
   1266 static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
   1267  DecodeLiteralBlockSwitchInternal(0, s);
   1268 }
   1269 
   1270 static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
   1271    BrotliDecoderState* s) {
   1272  return DecodeLiteralBlockSwitchInternal(1, s);
   1273 }
   1274 
   1275 /* Block switch for insert/copy length.
   1276   Reads 3..54 bits. */
   1277 static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
   1278    int safe, BrotliDecoderState* s) {
   1279  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
   1280    return BROTLI_FALSE;
   1281  }
   1282  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
   1283  return BROTLI_TRUE;
   1284 }
   1285 
   1286 static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
   1287  DecodeCommandBlockSwitchInternal(0, s);
   1288 }
   1289 
   1290 static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
   1291    BrotliDecoderState* s) {
   1292  return DecodeCommandBlockSwitchInternal(1, s);
   1293 }
   1294 
   1295 /* Block switch for distance codes.
   1296   Reads 3..54 bits. */
   1297 static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
   1298    int safe, BrotliDecoderState* s) {
   1299  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
   1300    return BROTLI_FALSE;
   1301  }
   1302  s->dist_context_map_slice = s->dist_context_map +
   1303      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
   1304  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
   1305  return BROTLI_TRUE;
   1306 }
   1307 
   1308 static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
   1309  DecodeDistanceBlockSwitchInternal(0, s);
   1310 }
   1311 
   1312 static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
   1313    BrotliDecoderState* s) {
   1314  return DecodeDistanceBlockSwitchInternal(1, s);
   1315 }
   1316 
   1317 static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
   1318  size_t pos = wrap && s->pos > s->ringbuffer_size ?
   1319      (size_t)s->ringbuffer_size : (size_t)(s->pos);
   1320  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
   1321  return partial_pos_rb - s->partial_pos_out;
   1322 }
   1323 
   1324 /* Dumps output.
   1325   Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push
   1326   and either ring-buffer is as big as window size, or |force| is true. */
   1327 static BrotliDecoderErrorCode BROTLI_NOINLINE WriteRingBuffer(
   1328    BrotliDecoderState* s, size_t* available_out, uint8_t** next_out,
   1329    size_t* total_out, BROTLI_BOOL force) {
   1330  uint8_t* start =
   1331      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
   1332  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
   1333  size_t num_written = *available_out;
   1334  if (num_written > to_write) {
   1335    num_written = to_write;
   1336  }
   1337  if (s->meta_block_remaining_len < 0) {
   1338    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
   1339  }
   1340  if (next_out && !*next_out) {
   1341    *next_out = start;
   1342  } else {
   1343    if (next_out) {
   1344      memcpy(*next_out, start, num_written);
   1345      *next_out += num_written;
   1346    }
   1347  }
   1348  *available_out -= num_written;
   1349  BROTLI_LOG_UINT(to_write);
   1350  BROTLI_LOG_UINT(num_written);
   1351  s->partial_pos_out += num_written;
   1352  if (total_out) {
   1353    *total_out = s->partial_pos_out;
   1354  }
   1355  if (num_written < to_write) {
   1356    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
   1357      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
   1358    } else {
   1359      return BROTLI_DECODER_SUCCESS;
   1360    }
   1361  }
   1362  /* Wrap ring buffer only if it has reached its maximal size. */
   1363  if (s->ringbuffer_size == (1 << s->window_bits) &&
   1364      s->pos >= s->ringbuffer_size) {
   1365    s->pos -= s->ringbuffer_size;
   1366    s->rb_roundtrips++;
   1367    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
   1368  }
   1369  return BROTLI_DECODER_SUCCESS;
   1370 }
   1371 
   1372 static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
   1373  if (s->should_wrap_ringbuffer) {
   1374    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
   1375    s->should_wrap_ringbuffer = 0;
   1376  }
   1377 }
   1378 
   1379 /* Allocates ring-buffer.
   1380 
   1381   s->ringbuffer_size MUST be updated by BrotliCalculateRingBufferSize before
   1382   this function is called.
   1383 
   1384   Last two bytes of ring-buffer are initialized to 0, so context calculation
   1385   could be done uniformly for the first two and all other positions. */
   1386 static BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer(
   1387    BrotliDecoderState* s) {
   1388  uint8_t* old_ringbuffer = s->ringbuffer;
   1389  if (s->ringbuffer_size == s->new_ringbuffer_size) {
   1390    return BROTLI_TRUE;
   1391  }
   1392 
   1393  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
   1394      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
   1395  if (s->ringbuffer == 0) {
   1396    /* Restore previous value. */
   1397    s->ringbuffer = old_ringbuffer;
   1398    return BROTLI_FALSE;
   1399  }
   1400  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
   1401  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
   1402 
   1403  if (!!old_ringbuffer) {
   1404    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
   1405    BROTLI_DECODER_FREE(s, old_ringbuffer);
   1406  }
   1407 
   1408  s->ringbuffer_size = s->new_ringbuffer_size;
   1409  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
   1410  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
   1411 
   1412  return BROTLI_TRUE;
   1413 }
   1414 
   1415 static BrotliDecoderErrorCode BROTLI_NOINLINE
   1416 SkipMetadataBlock(BrotliDecoderState* s) {
   1417  BrotliBitReader* br = &s->br;
   1418  int nbytes;
   1419 
   1420  if (s->meta_block_remaining_len == 0) {
   1421    return BROTLI_DECODER_SUCCESS;
   1422  }
   1423 
   1424  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
   1425 
   1426  /* Drain accumulator. */
   1427  if (BrotliGetAvailableBits(br) >= 8) {
   1428    uint8_t buffer[8];
   1429    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
   1430    BROTLI_DCHECK(nbytes <= 8);
   1431    if (nbytes > s->meta_block_remaining_len) {
   1432      nbytes = s->meta_block_remaining_len;
   1433    }
   1434    BrotliCopyBytes(buffer, br, (size_t)nbytes);
   1435    if (s->metadata_chunk_func) {
   1436      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
   1437                             (size_t)nbytes);
   1438    }
   1439    s->meta_block_remaining_len -= nbytes;
   1440    if (s->meta_block_remaining_len == 0) {
   1441      return BROTLI_DECODER_SUCCESS;
   1442    }
   1443  }
   1444 
   1445  /* Direct access to metadata is possible. */
   1446  nbytes = (int)BrotliGetRemainingBytes(br);
   1447  if (nbytes > s->meta_block_remaining_len) {
   1448    nbytes = s->meta_block_remaining_len;
   1449  }
   1450  if (nbytes > 0) {
   1451    if (s->metadata_chunk_func) {
   1452      s->metadata_chunk_func(s->metadata_callback_opaque, br->next_in,
   1453                             (size_t)nbytes);
   1454    }
   1455    BrotliDropBytes(br, (size_t)nbytes);
   1456    s->meta_block_remaining_len -= nbytes;
   1457    if (s->meta_block_remaining_len == 0) {
   1458      return BROTLI_DECODER_SUCCESS;
   1459    }
   1460  }
   1461 
   1462  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
   1463 
   1464  return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1465 }
   1466 
   1467 static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
   1468    size_t* available_out, uint8_t** next_out, size_t* total_out,
   1469    BrotliDecoderState* s) {
   1470  /* TODO(eustas): avoid allocation for single uncompressed block. */
   1471  if (!BrotliEnsureRingBuffer(s)) {
   1472    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
   1473  }
   1474 
   1475  /* State machine */
   1476  for (;;) {
   1477    switch (s->substate_uncompressed) {
   1478      case BROTLI_STATE_UNCOMPRESSED_NONE: {
   1479        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
   1480        if (nbytes > s->meta_block_remaining_len) {
   1481          nbytes = s->meta_block_remaining_len;
   1482        }
   1483        if (s->pos + nbytes > s->ringbuffer_size) {
   1484          nbytes = s->ringbuffer_size - s->pos;
   1485        }
   1486        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
   1487        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
   1488        s->pos += nbytes;
   1489        s->meta_block_remaining_len -= nbytes;
   1490        if (s->pos < 1 << s->window_bits) {
   1491          if (s->meta_block_remaining_len == 0) {
   1492            return BROTLI_DECODER_SUCCESS;
   1493          }
   1494          return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1495        }
   1496        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
   1497      }
   1498      /* Fall through. */
   1499 
   1500      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
   1501        BrotliDecoderErrorCode result;
   1502        result = WriteRingBuffer(
   1503            s, available_out, next_out, total_out, BROTLI_FALSE);
   1504        if (result != BROTLI_DECODER_SUCCESS) {
   1505          return result;
   1506        }
   1507        if (s->ringbuffer_size == 1 << s->window_bits) {
   1508          s->max_distance = s->max_backward_distance;
   1509        }
   1510        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
   1511        break;
   1512      }
   1513    }
   1514  }
   1515  BROTLI_DCHECK(0);  /* Unreachable */
   1516 }
   1517 
   1518 static BROTLI_BOOL AttachCompoundDictionary(
   1519    BrotliDecoderState* state, const uint8_t* data, size_t size) {
   1520  BrotliDecoderCompoundDictionary* addon = state->compound_dictionary;
   1521  if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
   1522  if (!addon) {
   1523    addon = (BrotliDecoderCompoundDictionary*)BROTLI_DECODER_ALLOC(
   1524        state, sizeof(BrotliDecoderCompoundDictionary));
   1525    if (!addon) return BROTLI_FALSE;
   1526    addon->num_chunks = 0;
   1527    addon->total_size = 0;
   1528    addon->br_length = 0;
   1529    addon->br_copied = 0;
   1530    addon->block_bits = -1;
   1531    addon->chunk_offsets[0] = 0;
   1532    state->compound_dictionary = addon;
   1533  }
   1534  if (addon->num_chunks == 15) return BROTLI_FALSE;
   1535  addon->chunks[addon->num_chunks] = data;
   1536  addon->num_chunks++;
   1537  addon->total_size += (int)size;
   1538  addon->chunk_offsets[addon->num_chunks] = addon->total_size;
   1539  return BROTLI_TRUE;
   1540 }
   1541 
   1542 static void EnsureCompoundDictionaryInitialized(BrotliDecoderState* state) {
   1543  BrotliDecoderCompoundDictionary* addon = state->compound_dictionary;
   1544  /* 256 = (1 << 8) slots in block map. */
   1545  int block_bits = 8;
   1546  int cursor = 0;
   1547  int index = 0;
   1548  if (addon->block_bits != -1) return;
   1549  while (((addon->total_size - 1) >> block_bits) != 0) block_bits++;
   1550  block_bits -= 8;
   1551  addon->block_bits = block_bits;
   1552  while (cursor < addon->total_size) {
   1553    while (addon->chunk_offsets[index + 1] < cursor) index++;
   1554    addon->block_map[cursor >> block_bits] = (uint8_t)index;
   1555    cursor += 1 << block_bits;
   1556  }
   1557 }
   1558 
   1559 static BROTLI_BOOL InitializeCompoundDictionaryCopy(BrotliDecoderState* s,
   1560    int address, int length) {
   1561  BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
   1562  int index;
   1563  EnsureCompoundDictionaryInitialized(s);
   1564  index = addon->block_map[address >> addon->block_bits];
   1565  while (address >= addon->chunk_offsets[index + 1]) index++;
   1566  if (addon->total_size < address + length) return BROTLI_FALSE;
   1567  /* Update the recent distances cache. */
   1568  s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
   1569  ++s->dist_rb_idx;
   1570  s->meta_block_remaining_len -= length;
   1571  addon->br_index = index;
   1572  addon->br_offset = address - addon->chunk_offsets[index];
   1573  addon->br_length = length;
   1574  addon->br_copied = 0;
   1575  return BROTLI_TRUE;
   1576 }
   1577 
   1578 static int GetCompoundDictionarySize(BrotliDecoderState* s) {
   1579  return s->compound_dictionary ? s->compound_dictionary->total_size : 0;
   1580 }
   1581 
   1582 static int CopyFromCompoundDictionary(BrotliDecoderState* s, int pos) {
   1583  BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
   1584  int orig_pos = pos;
   1585  while (addon->br_length != addon->br_copied) {
   1586    uint8_t* copy_dst = &s->ringbuffer[pos];
   1587    const uint8_t* copy_src =
   1588        addon->chunks[addon->br_index] + addon->br_offset;
   1589    int space = s->ringbuffer_size - pos;
   1590    int rem_chunk_length = (addon->chunk_offsets[addon->br_index + 1] -
   1591        addon->chunk_offsets[addon->br_index]) - addon->br_offset;
   1592    int length = addon->br_length - addon->br_copied;
   1593    if (length > rem_chunk_length) length = rem_chunk_length;
   1594    if (length > space) length = space;
   1595    memcpy(copy_dst, copy_src, (size_t)length);
   1596    pos += length;
   1597    addon->br_offset += length;
   1598    addon->br_copied += length;
   1599    if (length == rem_chunk_length) {
   1600      addon->br_index++;
   1601      addon->br_offset = 0;
   1602    }
   1603    if (pos == s->ringbuffer_size) break;
   1604  }
   1605  return pos - orig_pos;
   1606 }
   1607 
   1608 BROTLI_BOOL BrotliDecoderAttachDictionary(
   1609    BrotliDecoderState* state, BrotliSharedDictionaryType type,
   1610    size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]) {
   1611  brotli_reg_t i;
   1612  brotli_reg_t num_prefix_before = state->dictionary->num_prefix;
   1613  if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
   1614  if (!BrotliSharedDictionaryAttach(state->dictionary, type, data_size, data)) {
   1615    return BROTLI_FALSE;
   1616  }
   1617  for (i = num_prefix_before; i < state->dictionary->num_prefix; i++) {
   1618    if (!AttachCompoundDictionary(
   1619        state, state->dictionary->prefix[i],
   1620        state->dictionary->prefix_size[i])) {
   1621      return BROTLI_FALSE;
   1622    }
   1623  }
   1624  return BROTLI_TRUE;
   1625 }
   1626 
   1627 /* Calculates the smallest feasible ring buffer.
   1628 
   1629   If we know the data size is small, do not allocate more ring buffer
   1630   size than needed to reduce memory usage.
   1631 
   1632   When this method is called, metablock size and flags MUST be decoded. */
   1633 static void BROTLI_NOINLINE BrotliCalculateRingBufferSize(
   1634    BrotliDecoderState* s) {
   1635  int window_size = 1 << s->window_bits;
   1636  int new_ringbuffer_size = window_size;
   1637  /* We need at least 2 bytes of ring buffer size to get the last two
   1638     bytes for context from there */
   1639  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
   1640  int output_size;
   1641 
   1642  /* If maximum is already reached, no further extension is retired. */
   1643  if (s->ringbuffer_size == window_size) {
   1644    return;
   1645  }
   1646 
   1647  /* Metadata blocks does not touch ring buffer. */
   1648  if (s->is_metadata) {
   1649    return;
   1650  }
   1651 
   1652  if (!s->ringbuffer) {
   1653    output_size = 0;
   1654  } else {
   1655    output_size = s->pos;
   1656  }
   1657  output_size += s->meta_block_remaining_len;
   1658  min_size = min_size < output_size ? output_size : min_size;
   1659 
   1660  if (!!s->canny_ringbuffer_allocation) {
   1661    /* Reduce ring buffer size to save memory when server is unscrupulous.
   1662       In worst case memory usage might be 1.5x bigger for a short period of
   1663       ring buffer reallocation. */
   1664    while ((new_ringbuffer_size >> 1) >= min_size) {
   1665      new_ringbuffer_size >>= 1;
   1666    }
   1667  }
   1668 
   1669  s->new_ringbuffer_size = new_ringbuffer_size;
   1670 }
   1671 
   1672 /* Reads 1..256 2-bit context modes. */
   1673 static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
   1674  BrotliBitReader* br = &s->br;
   1675  int i = s->loop_counter;
   1676 
   1677  while (i < (int)s->num_block_types[0]) {
   1678    brotli_reg_t bits;
   1679    if (!BrotliSafeReadBits(br, 2, &bits)) {
   1680      s->loop_counter = i;
   1681      return BROTLI_DECODER_NEEDS_MORE_INPUT;
   1682    }
   1683    s->context_modes[i] = (uint8_t)bits;
   1684    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
   1685    i++;
   1686  }
   1687  return BROTLI_DECODER_SUCCESS;
   1688 }
   1689 
   1690 static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
   1691  int offset = s->distance_code - 3;
   1692  if (s->distance_code <= 3) {
   1693    /* Compensate double distance-ring-buffer roll for dictionary items. */
   1694    s->distance_context = 1 >> s->distance_code;
   1695    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
   1696    s->dist_rb_idx -= s->distance_context;
   1697  } else {
   1698    int index_delta = 3;
   1699    int delta;
   1700    int base = s->distance_code - 10;
   1701    if (s->distance_code < 10) {
   1702      base = s->distance_code - 4;
   1703    } else {
   1704      index_delta = 2;
   1705    }
   1706    /* Unpack one of six 4-bit values. */
   1707    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
   1708    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
   1709    if (s->distance_code <= 0) {
   1710      /* A huge distance will cause a BROTLI_FAILURE() soon.
   1711         This is a little faster than failing here. */
   1712      s->distance_code = 0x7FFFFFFF;
   1713    }
   1714  }
   1715 }
   1716 
   1717 static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
   1718    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
   1719  if (n_bits != 0) {
   1720    return BrotliSafeReadBits(br, n_bits, val);
   1721  } else {
   1722    *val = 0;
   1723    return BROTLI_TRUE;
   1724  }
   1725 }
   1726 
   1727 static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
   1728    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
   1729  if (n_bits != 0) {
   1730    return BrotliSafeReadBits32(br, n_bits, val);
   1731  } else {
   1732    *val = 0;
   1733    return BROTLI_TRUE;
   1734  }
   1735 }
   1736 
   1737 /*
   1738   RFC 7932 Section 4 with "..." shortenings and "[]" emendations.
   1739 
   1740   Each distance ... is represented with a pair <distance code, extra bits>...
   1741   The distance code is encoded using a prefix code... The number of extra bits
   1742   can be 0..24... Two additional parameters: NPOSTFIX (0..3), and ...
   1743   NDIRECT (0..120) ... are encoded in the meta-block header...
   1744 
   1745   The first 16 distance symbols ... reference past distances... ring buffer ...
   1746   Next NDIRECT distance symbols ... represent distances from 1 to NDIRECT...
   1747   [For] distance symbols 16 + NDIRECT and greater ... the number of extra bits
   1748   ... is given by the following formula:
   1749 
   1750   [ xcode = dcode - NDIRECT - 16 ]
   1751   ndistbits = 1 + [ xcode ] >> (NPOSTFIX + 1)
   1752 
   1753   ...
   1754 */
   1755 
   1756 /*
   1757   RFC 7932 Section 9.2 with "..." shortenings and "[]" emendations.
   1758 
   1759   ... to get the actual value of the parameter NDIRECT, left-shift this
   1760   four-bit number by NPOSTFIX bits ...
   1761 */
   1762 
   1763 /* Remaining formulas from RFC 7932 Section 4 could be rewritten as following:
   1764 
   1765     alphabet_size = 16 + NDIRECT + (max_distbits << (NPOSTFIX + 1))
   1766 
   1767     half = ((xcode >> NPOSTFIX) & 1) << ndistbits
   1768     postfix = xcode & ((1 << NPOSTFIX) - 1)
   1769     range_start = 2 * (1 << ndistbits - 1 - 1)
   1770 
   1771     distance = (range_start + half + extra) << NPOSTFIX + postfix + NDIRECT + 1
   1772 
   1773   NB: ndistbits >= 1 -> range_start >= 0
   1774   NB: range_start has factor 2, as the range is covered by 2 "halves"
   1775   NB: extra -1 offset in range_start formula covers the absence of
   1776       ndistbits = 0 case
   1777   NB: when NPOSTFIX = 0, NDIRECT is not greater than 15
   1778 
   1779   In other words, xcode has the following binary structure - XXXHPPP:
   1780    - XXX represent the number of extra distance bits
   1781    - H selects upper / lower range of distances
   1782    - PPP represent "postfix"
   1783 
   1784  "Regular" distance encoding has NPOSTFIX = 0; omitting the postfix part
   1785  simplifies distance calculation.
   1786 
   1787  Using NPOSTFIX > 0 allows cheaper encoding of regular structures, e.g. where
   1788  most of distances have the same reminder of division by 2/4/8. For example,
   1789  the table of int32_t values that come from different sources; if it is likely
   1790  that 3 highest bytes of values from the same source are the same, then
   1791  copy distance often looks like 4x + y.
   1792 
   1793  Distance calculation could be rewritten to:
   1794 
   1795    ndistbits = NDISTBITS(NDIRECT, NPOSTFIX)[dcode]
   1796    distance = OFFSET(NDIRECT, NPOSTFIX)[dcode] + extra << NPOSTFIX
   1797 
   1798  NDISTBITS and OFFSET could be pre-calculated, as NDIRECT and NPOSTFIX could
   1799  change only once per meta-block.
   1800 */
   1801 
   1802 /* Calculates distance lookup table.
   1803   NB: it is possible to have all 64 tables precalculated. */
   1804 static void CalculateDistanceLut(BrotliDecoderState* s) {
   1805  BrotliMetablockBodyArena* b = &s->arena.body;
   1806  brotli_reg_t npostfix = s->distance_postfix_bits;
   1807  brotli_reg_t ndirect = s->num_direct_distance_codes;
   1808  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
   1809  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
   1810  brotli_reg_t j;
   1811  brotli_reg_t bits = 1;
   1812  brotli_reg_t half = 0;
   1813 
   1814  /* Skip short codes. */
   1815  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
   1816 
   1817  /* Fill direct codes. */
   1818  for (j = 0; j < ndirect; ++j) {
   1819    b->dist_extra_bits[i] = 0;
   1820    b->dist_offset[i] = j + 1;
   1821    ++i;
   1822  }
   1823 
   1824  /* Fill regular distance codes. */
   1825  while (i < alphabet_size_limit) {
   1826    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
   1827    /* Always fill the complete group. */
   1828    for (j = 0; j < postfix; ++j) {
   1829      b->dist_extra_bits[i] = (uint8_t)bits;
   1830      b->dist_offset[i] = base + j;
   1831      ++i;
   1832    }
   1833    bits = bits + half;
   1834    half = half ^ 1;
   1835  }
   1836 }
   1837 
   1838 /* Precondition: s->distance_code < 0. */
   1839 static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
   1840    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
   1841  BrotliMetablockBodyArena* b = &s->arena.body;
   1842  brotli_reg_t code;
   1843  brotli_reg_t bits;
   1844  BrotliBitReaderState memento;
   1845  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
   1846  if (!safe) {
   1847    code = ReadSymbol(distance_tree, br);
   1848  } else {
   1849    BrotliBitReaderSaveState(br, &memento);
   1850    if (!SafeReadSymbol(distance_tree, br, &code)) {
   1851      return BROTLI_FALSE;
   1852    }
   1853  }
   1854  --s->block_length[2];
   1855  /* Convert the distance code to the actual distance by possibly
   1856     looking up past distances from the s->dist_rb. */
   1857  s->distance_context = 0;
   1858  if ((code & ~0xFu) == 0) {
   1859    s->distance_code = (int)code;
   1860    TakeDistanceFromRingBuffer(s);
   1861    return BROTLI_TRUE;
   1862  }
   1863  if (!safe) {
   1864    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
   1865  } else {
   1866    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
   1867      ++s->block_length[2];
   1868      BrotliBitReaderRestoreState(br, &memento);
   1869      return BROTLI_FALSE;
   1870    }
   1871  }
   1872  s->distance_code =
   1873      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
   1874  return BROTLI_TRUE;
   1875 }
   1876 
   1877 static BROTLI_INLINE void ReadDistance(
   1878    BrotliDecoderState* s, BrotliBitReader* br) {
   1879  ReadDistanceInternal(0, s, br);
   1880 }
   1881 
   1882 static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
   1883    BrotliDecoderState* s, BrotliBitReader* br) {
   1884  return ReadDistanceInternal(1, s, br);
   1885 }
   1886 
   1887 static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
   1888    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
   1889  brotli_reg_t cmd_code;
   1890  brotli_reg_t insert_len_extra = 0;
   1891  brotli_reg_t copy_length;
   1892  CmdLutElement v;
   1893  BrotliBitReaderState memento;
   1894  if (!safe) {
   1895    cmd_code = ReadSymbol(s->htree_command, br);
   1896  } else {
   1897    BrotliBitReaderSaveState(br, &memento);
   1898    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
   1899      return BROTLI_FALSE;
   1900    }
   1901  }
   1902  v = kCmdLut[cmd_code];
   1903  s->distance_code = v.distance_code;
   1904  s->distance_context = v.context;
   1905  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
   1906  *insert_length = v.insert_len_offset;
   1907  if (!safe) {
   1908    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
   1909      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
   1910    }
   1911    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
   1912  } else {
   1913    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
   1914        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
   1915      BrotliBitReaderRestoreState(br, &memento);
   1916      return BROTLI_FALSE;
   1917    }
   1918  }
   1919  s->copy_length = (int)copy_length + v.copy_len_offset;
   1920  --s->block_length[1];
   1921  *insert_length += (int)insert_len_extra;
   1922  return BROTLI_TRUE;
   1923 }
   1924 
   1925 static BROTLI_INLINE void ReadCommand(
   1926    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
   1927  ReadCommandInternal(0, s, br, insert_length);
   1928 }
   1929 
   1930 static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
   1931    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
   1932  return ReadCommandInternal(1, s, br, insert_length);
   1933 }
   1934 
   1935 static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
   1936    int safe, BrotliBitReader* const br) {
   1937  if (safe) {
   1938    return BROTLI_TRUE;
   1939  }
   1940  return BrotliCheckInputAmount(br);
   1941 }
   1942 
   1943 #define BROTLI_SAFE(METHOD)                       \
   1944  {                                               \
   1945    if (safe) {                                   \
   1946      if (!Safe##METHOD) {                        \
   1947        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
   1948        goto saveStateAndReturn;                  \
   1949      }                                           \
   1950    } else {                                      \
   1951      METHOD;                                     \
   1952    }                                             \
   1953  }
   1954 
   1955 static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
   1956    int safe, BrotliDecoderState* s) {
   1957  int pos = s->pos;
   1958  int i = s->loop_counter;
   1959  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
   1960  BrotliBitReader* br = &s->br;
   1961  int compound_dictionary_size = GetCompoundDictionarySize(s);
   1962 
   1963  if (!CheckInputAmount(safe, br)) {
   1964    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   1965    goto saveStateAndReturn;
   1966  }
   1967  if (!safe) {
   1968    BROTLI_UNUSED(BrotliWarmupBitReader(br));
   1969  }
   1970 
   1971  /* Jump into state machine. */
   1972  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
   1973    goto CommandBegin;
   1974  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
   1975    goto CommandInner;
   1976  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
   1977    goto CommandPostDecodeLiterals;
   1978  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
   1979    goto CommandPostWrapCopy;
   1980  } else {
   1981    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
   1982  }
   1983 
   1984 CommandBegin:
   1985  if (safe) {
   1986    s->state = BROTLI_STATE_COMMAND_BEGIN;
   1987  }
   1988  if (!CheckInputAmount(safe, br)) {
   1989    s->state = BROTLI_STATE_COMMAND_BEGIN;
   1990    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   1991    goto saveStateAndReturn;
   1992  }
   1993  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
   1994    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
   1995    goto CommandBegin;
   1996  }
   1997  /* Read the insert/copy length in the command. */
   1998  BROTLI_SAFE(ReadCommand(s, br, &i));
   1999  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
   2000              pos, i, s->copy_length));
   2001  if (i == 0) {
   2002    goto CommandPostDecodeLiterals;
   2003  }
   2004  s->meta_block_remaining_len -= i;
   2005 
   2006 CommandInner:
   2007  if (safe) {
   2008    s->state = BROTLI_STATE_COMMAND_INNER;
   2009  }
   2010  /* Read the literals in the command. */
   2011  if (s->trivial_literal_context) {
   2012    brotli_reg_t bits;
   2013    brotli_reg_t value;
   2014    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
   2015    if (!safe) {
   2016      // This is a hottest part of the decode, so we copy the loop below
   2017      // and optimize it by calculating the number of steps where all checks
   2018      // evaluate to false (ringbuffer size/block size/input size).
   2019      // Since all checks are loop invariant, we just need to find
   2020      // minimal number of iterations for a simple loop, and run
   2021      // the full version for the remainder.
   2022      int num_steps = i - 1;
   2023      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
   2024        // Safe cast, since block_length < steps
   2025        num_steps = (int)s->block_length[0];
   2026      }
   2027      if (s->ringbuffer_size >= pos &&
   2028          (s->ringbuffer_size - pos) <= num_steps) {
   2029        num_steps = s->ringbuffer_size - pos - 1;
   2030      }
   2031      if (num_steps < 0) {
   2032        num_steps = 0;
   2033      }
   2034      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
   2035                                                 &value, s->ringbuffer, pos,
   2036                                                 num_steps);
   2037      pos += num_steps;
   2038      s->block_length[0] -= (brotli_reg_t)num_steps;
   2039      i -= num_steps;
   2040      do {
   2041        if (!CheckInputAmount(safe, br)) {
   2042          s->state = BROTLI_STATE_COMMAND_INNER;
   2043          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2044          goto saveStateAndReturn;
   2045        }
   2046        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
   2047          goto NextLiteralBlock;
   2048        }
   2049        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
   2050                                       s->ringbuffer, pos, 1);
   2051        --s->block_length[0];
   2052        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
   2053        ++pos;
   2054        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
   2055          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
   2056          --i;
   2057          goto saveStateAndReturn;
   2058        }
   2059      } while (--i != 0);
   2060    } else { /* safe */
   2061      do {
   2062        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
   2063          goto NextLiteralBlock;
   2064        }
   2065        brotli_reg_t literal;
   2066        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
   2067          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2068          goto saveStateAndReturn;
   2069        }
   2070        s->ringbuffer[pos] = (uint8_t)literal;
   2071        --s->block_length[0];
   2072        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
   2073        ++pos;
   2074        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
   2075          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
   2076          --i;
   2077          goto saveStateAndReturn;
   2078        }
   2079      } while (--i != 0);
   2080    }
   2081  } else {
   2082    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
   2083    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
   2084    do {
   2085      const HuffmanCode* hc;
   2086      uint8_t context;
   2087      if (!CheckInputAmount(safe, br)) {
   2088        s->state = BROTLI_STATE_COMMAND_INNER;
   2089        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2090        goto saveStateAndReturn;
   2091      }
   2092      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
   2093        goto NextLiteralBlock;
   2094      }
   2095      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
   2096      BROTLI_LOG_UINT(context);
   2097      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
   2098      p2 = p1;
   2099      if (!safe) {
   2100        p1 = (uint8_t)ReadSymbol(hc, br);
   2101      } else {
   2102        brotli_reg_t literal;
   2103        if (!SafeReadSymbol(hc, br, &literal)) {
   2104          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2105          goto saveStateAndReturn;
   2106        }
   2107        p1 = (uint8_t)literal;
   2108      }
   2109      s->ringbuffer[pos] = p1;
   2110      --s->block_length[0];
   2111      BROTLI_LOG_UINT(s->context_map_slice[context]);
   2112      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
   2113      ++pos;
   2114      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
   2115        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
   2116        --i;
   2117        goto saveStateAndReturn;
   2118      }
   2119    } while (--i != 0);
   2120  }
   2121  BROTLI_LOG_UINT(s->meta_block_remaining_len);
   2122  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
   2123    s->state = BROTLI_STATE_METABLOCK_DONE;
   2124    goto saveStateAndReturn;
   2125  }
   2126 
   2127 CommandPostDecodeLiterals:
   2128  if (safe) {
   2129    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
   2130  }
   2131  if (s->distance_code >= 0) {
   2132    /* Implicit distance case. */
   2133    s->distance_context = s->distance_code ? 0 : 1;
   2134    --s->dist_rb_idx;
   2135    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
   2136  } else {
   2137    /* Read distance code in the command, unless it was implicitly zero. */
   2138    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
   2139      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
   2140    }
   2141    BROTLI_SAFE(ReadDistance(s, br));
   2142  }
   2143  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
   2144              pos, s->distance_code));
   2145  if (s->max_distance != s->max_backward_distance) {
   2146    s->max_distance =
   2147        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
   2148  }
   2149  i = s->copy_length;
   2150  /* Apply copy of LZ77 back-reference, or static dictionary reference if
   2151     the distance is larger than the max LZ77 distance */
   2152  if (s->distance_code > s->max_distance) {
   2153    /* The maximum allowed distance is BROTLI_MAX_ALLOWED_DISTANCE = 0x7FFFFFFC.
   2154       With this choice, no signed overflow can occur after decoding
   2155       a special distance code (e.g., after adding 3 to the last distance). */
   2156    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
   2157      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
   2158          "len: %d bytes left: %d\n",
   2159          pos, s->distance_code, i, s->meta_block_remaining_len));
   2160      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
   2161    }
   2162    if (s->distance_code - s->max_distance - 1 < compound_dictionary_size) {
   2163      int address = compound_dictionary_size -
   2164          (s->distance_code - s->max_distance);
   2165      if (!InitializeCompoundDictionaryCopy(s, address, i)) {
   2166        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_COMPOUND_DICTIONARY);
   2167      }
   2168      pos += CopyFromCompoundDictionary(s, pos);
   2169      if (pos >= s->ringbuffer_size) {
   2170        s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
   2171        goto saveStateAndReturn;
   2172      }
   2173    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
   2174               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
   2175      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
   2176      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
   2177      uint8_t dict_id = s->dictionary->context_based ?
   2178          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
   2179          : 0;
   2180      const BrotliDictionary* words = s->dictionary->words[dict_id];
   2181      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
   2182      int offset = (int)words->offsets_by_length[i];
   2183      brotli_reg_t shift = words->size_bits_by_length[i];
   2184      int address =
   2185          s->distance_code - s->max_distance - 1 - compound_dictionary_size;
   2186      int mask = (int)BitMask(shift);
   2187      int word_idx = address & mask;
   2188      int transform_idx = address >> shift;
   2189      /* Compensate double distance-ring-buffer roll. */
   2190      s->dist_rb_idx += s->distance_context;
   2191      offset += word_idx * i;
   2192      /* If the distance is out of bound, select a next static dictionary if
   2193         there exist multiple. */
   2194      if ((transform_idx >= (int)transforms->num_transforms ||
   2195          words->size_bits_by_length[i] == 0) &&
   2196          s->dictionary->num_dictionaries > 1) {
   2197        uint8_t dict_id2;
   2198        int dist_remaining = address -
   2199            (int)(((1u << shift) & ~1u)) * (int)transforms->num_transforms;
   2200        for (dict_id2 = 0; dict_id2 < s->dictionary->num_dictionaries;
   2201            dict_id2++) {
   2202          const BrotliDictionary* words2 = s->dictionary->words[dict_id2];
   2203          if (dict_id2 != dict_id && words2->size_bits_by_length[i] != 0) {
   2204            const BrotliTransforms* transforms2 =
   2205                s->dictionary->transforms[dict_id2];
   2206            brotli_reg_t shift2 = words2->size_bits_by_length[i];
   2207            int num = (int)((1u << shift2) & ~1u) *
   2208                (int)transforms2->num_transforms;
   2209            if (dist_remaining < num) {
   2210              dict_id = dict_id2;
   2211              words = words2;
   2212              transforms = transforms2;
   2213              address = dist_remaining;
   2214              shift = shift2;
   2215              mask = (int)BitMask(shift);
   2216              word_idx = address & mask;
   2217              transform_idx = address >> shift;
   2218              offset = (int)words->offsets_by_length[i] + word_idx * i;
   2219              break;
   2220            }
   2221            dist_remaining -= num;
   2222          }
   2223        }
   2224      }
   2225      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
   2226        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
   2227            "len: %d bytes left: %d\n",
   2228            pos, s->distance_code, i, s->meta_block_remaining_len));
   2229        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
   2230      }
   2231      if (BROTLI_PREDICT_FALSE(!words->data)) {
   2232        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
   2233      }
   2234      if (transform_idx < (int)transforms->num_transforms) {
   2235        const uint8_t* word = &words->data[offset];
   2236        int len = i;
   2237        if (transform_idx == transforms->cutOffTransforms[0]) {
   2238          memcpy(&s->ringbuffer[pos], word, (size_t)len);
   2239          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
   2240                      len, word));
   2241        } else {
   2242          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
   2243              transforms, transform_idx);
   2244          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
   2245                      " transform_idx = %d, transformed: [%.*s]\n",
   2246                      i, word, transform_idx, len, &s->ringbuffer[pos]));
   2247          if (len == 0 && s->distance_code <= 120) {
   2248            BROTLI_LOG(("Invalid length-0 dictionary word after transform\n"));
   2249            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
   2250          }
   2251        }
   2252        pos += len;
   2253        s->meta_block_remaining_len -= len;
   2254        if (pos >= s->ringbuffer_size) {
   2255          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
   2256          goto saveStateAndReturn;
   2257        }
   2258      } else {
   2259        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
   2260            "len: %d bytes left: %d\n",
   2261            pos, s->distance_code, i, s->meta_block_remaining_len));
   2262        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
   2263      }
   2264    } else {
   2265      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
   2266          "len: %d bytes left: %d\n",
   2267          pos, s->distance_code, i, s->meta_block_remaining_len));
   2268      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
   2269    }
   2270  } else {
   2271    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
   2272    uint8_t* copy_dst = &s->ringbuffer[pos];
   2273    uint8_t* copy_src = &s->ringbuffer[src_start];
   2274    int dst_end = pos + i;
   2275    int src_end = src_start + i;
   2276    /* Update the recent distances cache. */
   2277    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
   2278    ++s->dist_rb_idx;
   2279    s->meta_block_remaining_len -= i;
   2280    /* There are 32+ bytes of slack in the ring-buffer allocation.
   2281       Also, we have 16 short codes, that make these 16 bytes irrelevant
   2282       in the ring-buffer. Let's copy over them as a first guess. */
   2283    memmove16(copy_dst, copy_src);
   2284    if (src_end > pos && dst_end > src_start) {
   2285      /* Regions intersect. */
   2286      goto CommandPostWrapCopy;
   2287    }
   2288    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
   2289      /* At least one region wraps. */
   2290      goto CommandPostWrapCopy;
   2291    }
   2292    pos += i;
   2293    if (i > 16) {
   2294      if (i > 32) {
   2295        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
   2296      } else {
   2297        /* This branch covers about 45% cases.
   2298           Fixed size short copy allows more compiler optimizations. */
   2299        memmove16(copy_dst + 16, copy_src + 16);
   2300      }
   2301    }
   2302  }
   2303  BROTLI_LOG_UINT(s->meta_block_remaining_len);
   2304  if (s->meta_block_remaining_len <= 0) {
   2305    /* Next metablock, if any. */
   2306    s->state = BROTLI_STATE_METABLOCK_DONE;
   2307    goto saveStateAndReturn;
   2308  } else {
   2309    goto CommandBegin;
   2310  }
   2311 CommandPostWrapCopy:
   2312  {
   2313    int wrap_guard = s->ringbuffer_size - pos;
   2314    while (--i >= 0) {
   2315      s->ringbuffer[pos] =
   2316          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
   2317      ++pos;
   2318      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
   2319        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
   2320        goto saveStateAndReturn;
   2321      }
   2322    }
   2323  }
   2324  if (s->meta_block_remaining_len <= 0) {
   2325    /* Next metablock, if any. */
   2326    s->state = BROTLI_STATE_METABLOCK_DONE;
   2327    goto saveStateAndReturn;
   2328  } else {
   2329    goto CommandBegin;
   2330  }
   2331 
   2332 NextLiteralBlock:
   2333  BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
   2334  goto CommandInner;
   2335 
   2336 saveStateAndReturn:
   2337  s->pos = pos;
   2338  s->loop_counter = i;
   2339  return result;
   2340 }
   2341 
   2342 #undef BROTLI_SAFE
   2343 
   2344 static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
   2345    BrotliDecoderState* s) {
   2346  return ProcessCommandsInternal(0, s);
   2347 }
   2348 
   2349 static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
   2350    BrotliDecoderState* s) {
   2351  return ProcessCommandsInternal(1, s);
   2352 }
   2353 
   2354 BrotliDecoderResult BrotliDecoderDecompress(
   2355    size_t encoded_size,
   2356    const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)],
   2357    size_t* decoded_size,
   2358    uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]) {
   2359  BrotliDecoderState s;
   2360  BrotliDecoderResult result;
   2361  size_t total_out = 0;
   2362  size_t available_in = encoded_size;
   2363  const uint8_t* next_in = encoded_buffer;
   2364  size_t available_out = *decoded_size;
   2365  uint8_t* next_out = decoded_buffer;
   2366  if (!BrotliDecoderStateInit(&s, 0, 0, 0)) {
   2367    return BROTLI_DECODER_RESULT_ERROR;
   2368  }
   2369  result = BrotliDecoderDecompressStream(
   2370      &s, &available_in, &next_in, &available_out, &next_out, &total_out);
   2371  *decoded_size = total_out;
   2372  BrotliDecoderStateCleanup(&s);
   2373  if (result != BROTLI_DECODER_RESULT_SUCCESS) {
   2374    result = BROTLI_DECODER_RESULT_ERROR;
   2375  }
   2376  return result;
   2377 }
   2378 
   2379 /* Invariant: input stream is never overconsumed:
   2380    - invalid input implies that the whole stream is invalid -> any amount of
   2381      input could be read and discarded
   2382    - when result is "needs more input", then at least one more byte is REQUIRED
   2383      to complete decoding; all input data MUST be consumed by decoder, so
   2384      client could swap the input buffer
   2385    - when result is "needs more output" decoder MUST ensure that it doesn't
   2386      hold more than 7 bits in bit reader; this saves client from swapping input
   2387      buffer ahead of time
   2388    - when result is "success" decoder MUST return all unused data back to input
   2389      buffer; this is possible because the invariant is held on enter */
   2390 BrotliDecoderResult BrotliDecoderDecompressStream(
   2391    BrotliDecoderState* s, size_t* available_in, const uint8_t** next_in,
   2392    size_t* available_out, uint8_t** next_out, size_t* total_out) {
   2393  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
   2394  BrotliBitReader* br = &s->br;
   2395  size_t input_size = *available_in;
   2396 #define BROTLI_SAVE_ERROR_CODE(code) \
   2397    SaveErrorCode(s, (code), input_size - *available_in)
   2398  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
   2399  if (total_out) {
   2400    *total_out = s->partial_pos_out;
   2401  }
   2402  /* Do not try to process further in a case of unrecoverable error. */
   2403  if ((int)s->error_code < 0) {
   2404    return BROTLI_DECODER_RESULT_ERROR;
   2405  }
   2406  if (*available_out && (!next_out || !*next_out)) {
   2407    return BROTLI_SAVE_ERROR_CODE(
   2408        BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS));
   2409  }
   2410  if (!*available_out) next_out = 0;
   2411  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
   2412    BrotliBitReaderSetInput(br, *next_in, *available_in);
   2413  } else {
   2414    /* At least one byte of input is required. More than one byte of input may
   2415       be required to complete the transaction -> reading more data must be
   2416       done in a loop -> do it in a main loop. */
   2417    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2418    BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
   2419  }
   2420  /* State machine */
   2421  for (;;) {
   2422    if (result != BROTLI_DECODER_SUCCESS) {
   2423      /* Error, needs more input/output. */
   2424      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
   2425        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
   2426          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
   2427              available_out, next_out, total_out, BROTLI_TRUE);
   2428          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
   2429          if ((int)intermediate_result < 0) {
   2430            result = intermediate_result;
   2431            break;
   2432          }
   2433        }
   2434        if (s->buffer_length != 0) {  /* Used with internal buffer. */
   2435          if (br->next_in == br->last_in) {
   2436            /* Successfully finished read transaction.
   2437               Accumulator contains less than 8 bits, because internal buffer
   2438               is expanded byte-by-byte until it is enough to complete read. */
   2439            s->buffer_length = 0;
   2440            /* Switch to input stream and restart. */
   2441            result = BROTLI_DECODER_SUCCESS;
   2442            BrotliBitReaderSetInput(br, *next_in, *available_in);
   2443            continue;
   2444          } else if (*available_in != 0) {
   2445            /* Not enough data in buffer, but can take one more byte from
   2446               input stream. */
   2447            result = BROTLI_DECODER_SUCCESS;
   2448            BROTLI_DCHECK(s->buffer_length < 8);
   2449            s->buffer.u8[s->buffer_length] = **next_in;
   2450            s->buffer_length++;
   2451            BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
   2452            (*next_in)++;
   2453            (*available_in)--;
   2454            /* Retry with more data in buffer. */
   2455            continue;
   2456          }
   2457          /* Can't finish reading and no more input. */
   2458          break;
   2459        } else {  /* Input stream doesn't contain enough input. */
   2460          /* Copy tail to internal buffer and return. */
   2461          *next_in = br->next_in;
   2462          *available_in = BrotliBitReaderGetAvailIn(br);
   2463          while (*available_in) {
   2464            s->buffer.u8[s->buffer_length] = **next_in;
   2465            s->buffer_length++;
   2466            (*next_in)++;
   2467            (*available_in)--;
   2468          }
   2469          break;
   2470        }
   2471        /* Unreachable. */
   2472      }
   2473 
   2474      /* Fail or needs more output. */
   2475 
   2476      if (s->buffer_length != 0) {
   2477        /* Just consumed the buffered input and produced some output. Otherwise
   2478           it would result in "needs more input". Reset internal buffer. */
   2479        s->buffer_length = 0;
   2480      } else {
   2481        /* Using input stream in last iteration. When decoder switches to input
   2482           stream it has less than 8 bits in accumulator, so it is safe to
   2483           return unused accumulator bits there. */
   2484        BrotliBitReaderUnload(br);
   2485        *available_in = BrotliBitReaderGetAvailIn(br);
   2486        *next_in = br->next_in;
   2487      }
   2488      break;
   2489    }
   2490    switch (s->state) {
   2491      case BROTLI_STATE_UNINITED:
   2492        /* Prepare to the first read. */
   2493        if (!BrotliWarmupBitReader(br)) {
   2494          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2495          break;
   2496        }
   2497        /* Decode window size. */
   2498        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
   2499        if (result != BROTLI_DECODER_SUCCESS) {
   2500          break;
   2501        }
   2502        if (s->large_window) {
   2503          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
   2504          break;
   2505        }
   2506        s->state = BROTLI_STATE_INITIALIZE;
   2507        break;
   2508 
   2509      case BROTLI_STATE_LARGE_WINDOW_BITS: {
   2510        brotli_reg_t bits;
   2511        if (!BrotliSafeReadBits(br, 6, &bits)) {
   2512          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2513          break;
   2514        }
   2515        s->window_bits = bits & 63u;
   2516        if (s->window_bits < BROTLI_LARGE_MIN_WBITS ||
   2517            s->window_bits > BROTLI_LARGE_MAX_WBITS) {
   2518          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
   2519          break;
   2520        }
   2521        s->state = BROTLI_STATE_INITIALIZE;
   2522      }
   2523      /* Fall through. */
   2524 
   2525      case BROTLI_STATE_INITIALIZE:
   2526        BROTLI_LOG_UINT(s->window_bits);
   2527        /* Maximum distance, see section 9.1. of the spec. */
   2528        s->max_backward_distance = (1 << s->window_bits) - BROTLI_WINDOW_GAP;
   2529 
   2530        /* Allocate memory for both block_type_trees and block_len_trees. */
   2531        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
   2532            sizeof(HuffmanCode) * 3 *
   2533                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
   2534        if (s->block_type_trees == 0) {
   2535          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
   2536          break;
   2537        }
   2538        s->block_len_trees =
   2539            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
   2540 
   2541        s->state = BROTLI_STATE_METABLOCK_BEGIN;
   2542      /* Fall through. */
   2543 
   2544      case BROTLI_STATE_METABLOCK_BEGIN:
   2545        BrotliDecoderStateMetablockBegin(s);
   2546        BROTLI_LOG_UINT(s->pos);
   2547        s->state = BROTLI_STATE_METABLOCK_HEADER;
   2548      /* Fall through. */
   2549 
   2550      case BROTLI_STATE_METABLOCK_HEADER:
   2551        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
   2552        if (result != BROTLI_DECODER_SUCCESS) {
   2553          break;
   2554        }
   2555        BROTLI_LOG_UINT(s->is_last_metablock);
   2556        BROTLI_LOG_UINT(s->meta_block_remaining_len);
   2557        BROTLI_LOG_UINT(s->is_metadata);
   2558        BROTLI_LOG_UINT(s->is_uncompressed);
   2559        if (s->is_metadata || s->is_uncompressed) {
   2560          if (!BrotliJumpToByteBoundary(br)) {
   2561            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
   2562            break;
   2563          }
   2564        }
   2565        if (s->is_metadata) {
   2566          s->state = BROTLI_STATE_METADATA;
   2567          if (s->metadata_start_func) {
   2568            s->metadata_start_func(s->metadata_callback_opaque,
   2569                                   (size_t)s->meta_block_remaining_len);
   2570          }
   2571          break;
   2572        }
   2573        if (s->meta_block_remaining_len == 0) {
   2574          s->state = BROTLI_STATE_METABLOCK_DONE;
   2575          break;
   2576        }
   2577        BrotliCalculateRingBufferSize(s);
   2578        if (s->is_uncompressed) {
   2579          s->state = BROTLI_STATE_UNCOMPRESSED;
   2580          break;
   2581        }
   2582        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
   2583      /* Fall through. */
   2584 
   2585      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
   2586        BrotliMetablockHeaderArena* h = &s->arena.header;
   2587        s->loop_counter = 0;
   2588        /* Initialize compressed metablock header arena. */
   2589        h->sub_loop_counter = 0;
   2590        /* Make small negative indexes addressable. */
   2591        h->symbol_lists =
   2592            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
   2593        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
   2594        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
   2595        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
   2596        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
   2597      }
   2598      /* Fall through. */
   2599 
   2600      case BROTLI_STATE_HUFFMAN_CODE_0:
   2601        if (s->loop_counter >= 3) {
   2602          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
   2603          break;
   2604        }
   2605        /* Reads 1..11 bits. */
   2606        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
   2607        if (result != BROTLI_DECODER_SUCCESS) {
   2608          break;
   2609        }
   2610        s->num_block_types[s->loop_counter]++;
   2611        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
   2612        if (s->num_block_types[s->loop_counter] < 2) {
   2613          s->loop_counter++;
   2614          break;
   2615        }
   2616        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
   2617      /* Fall through. */
   2618 
   2619      case BROTLI_STATE_HUFFMAN_CODE_1: {
   2620        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
   2621        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
   2622        result = ReadHuffmanCode(alphabet_size, alphabet_size,
   2623            &s->block_type_trees[tree_offset], NULL, s);
   2624        if (result != BROTLI_DECODER_SUCCESS) break;
   2625        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
   2626      }
   2627      /* Fall through. */
   2628 
   2629      case BROTLI_STATE_HUFFMAN_CODE_2: {
   2630        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
   2631        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
   2632        result = ReadHuffmanCode(alphabet_size, alphabet_size,
   2633            &s->block_len_trees[tree_offset], NULL, s);
   2634        if (result != BROTLI_DECODER_SUCCESS) break;
   2635        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
   2636      }
   2637      /* Fall through. */
   2638 
   2639      case BROTLI_STATE_HUFFMAN_CODE_3: {
   2640        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
   2641        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
   2642            &s->block_len_trees[tree_offset], br)) {
   2643          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2644          break;
   2645        }
   2646        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
   2647        s->loop_counter++;
   2648        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
   2649        break;
   2650      }
   2651 
   2652      case BROTLI_STATE_UNCOMPRESSED: {
   2653        result = CopyUncompressedBlockToOutput(
   2654            available_out, next_out, total_out, s);
   2655        if (result != BROTLI_DECODER_SUCCESS) {
   2656          break;
   2657        }
   2658        s->state = BROTLI_STATE_METABLOCK_DONE;
   2659        break;
   2660      }
   2661 
   2662      case BROTLI_STATE_METADATA:
   2663        result = SkipMetadataBlock(s);
   2664        if (result != BROTLI_DECODER_SUCCESS) {
   2665          break;
   2666        }
   2667        s->state = BROTLI_STATE_METABLOCK_DONE;
   2668        break;
   2669 
   2670      case BROTLI_STATE_METABLOCK_HEADER_2: {
   2671        brotli_reg_t bits;
   2672        if (!BrotliSafeReadBits(br, 6, &bits)) {
   2673          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
   2674          break;
   2675        }
   2676        s->distance_postfix_bits = bits & BitMask(2);
   2677        bits >>= 2;
   2678        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
   2679        BROTLI_LOG_UINT(s->num_direct_distance_codes);
   2680        BROTLI_LOG_UINT(s->distance_postfix_bits);
   2681        s->context_modes =
   2682            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
   2683        if (s->context_modes == 0) {
   2684          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
   2685          break;
   2686        }
   2687        s->loop_counter = 0;
   2688        s->state = BROTLI_STATE_CONTEXT_MODES;
   2689      }
   2690      /* Fall through. */
   2691 
   2692      case BROTLI_STATE_CONTEXT_MODES:
   2693        result = ReadContextModes(s);
   2694        if (result != BROTLI_DECODER_SUCCESS) {
   2695          break;
   2696        }
   2697        s->state = BROTLI_STATE_CONTEXT_MAP_1;
   2698      /* Fall through. */
   2699 
   2700      case BROTLI_STATE_CONTEXT_MAP_1:
   2701        result = DecodeContextMap(
   2702            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
   2703            &s->num_literal_htrees, &s->context_map, s);
   2704        if (result != BROTLI_DECODER_SUCCESS) {
   2705          break;
   2706        }
   2707        DetectTrivialLiteralBlockTypes(s);
   2708        s->state = BROTLI_STATE_CONTEXT_MAP_2;
   2709      /* Fall through. */
   2710 
   2711      case BROTLI_STATE_CONTEXT_MAP_2: {
   2712        brotli_reg_t npostfix = s->distance_postfix_bits;
   2713        brotli_reg_t ndirect = s->num_direct_distance_codes;
   2714        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
   2715            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
   2716        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
   2717        BROTLI_BOOL allocation_success = BROTLI_TRUE;
   2718        if (s->large_window) {
   2719          BrotliDistanceCodeLimit limit = BrotliCalculateDistanceCodeLimit(
   2720              BROTLI_MAX_ALLOWED_DISTANCE, (uint32_t)npostfix,
   2721              (uint32_t)ndirect);
   2722          distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
   2723              npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS);
   2724          distance_alphabet_size_limit = limit.max_alphabet_size;
   2725        }
   2726        result = DecodeContextMap(
   2727            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
   2728            &s->num_dist_htrees, &s->dist_context_map, s);
   2729        if (result != BROTLI_DECODER_SUCCESS) {
   2730          break;
   2731        }
   2732        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
   2733            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
   2734            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
   2735        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
   2736            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
   2737            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
   2738        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
   2739            s, &s->distance_hgroup, distance_alphabet_size_max,
   2740            distance_alphabet_size_limit, s->num_dist_htrees);
   2741        if (!allocation_success) {
   2742          return BROTLI_SAVE_ERROR_CODE(
   2743              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
   2744        }
   2745        s->loop_counter = 0;
   2746        s->state = BROTLI_STATE_TREE_GROUP;
   2747      }
   2748      /* Fall through. */
   2749 
   2750      case BROTLI_STATE_TREE_GROUP: {
   2751        HuffmanTreeGroup* hgroup = NULL;
   2752        switch (s->loop_counter) {
   2753          case 0: hgroup = &s->literal_hgroup; break;
   2754          case 1: hgroup = &s->insert_copy_hgroup; break;
   2755          case 2: hgroup = &s->distance_hgroup; break;
   2756          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
   2757              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
   2758        }
   2759        result = HuffmanTreeGroupDecode(hgroup, s);
   2760        if (result != BROTLI_DECODER_SUCCESS) break;
   2761        s->loop_counter++;
   2762        if (s->loop_counter < 3) {
   2763          break;
   2764        }
   2765        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
   2766      }
   2767      /* Fall through. */
   2768 
   2769      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
   2770        PrepareLiteralDecoding(s);
   2771        s->dist_context_map_slice = s->dist_context_map;
   2772        s->htree_command = s->insert_copy_hgroup.htrees[0];
   2773        if (!BrotliEnsureRingBuffer(s)) {
   2774          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
   2775          break;
   2776        }
   2777        CalculateDistanceLut(s);
   2778        s->state = BROTLI_STATE_COMMAND_BEGIN;
   2779      /* Fall through. */
   2780 
   2781      case BROTLI_STATE_COMMAND_BEGIN:
   2782      /* Fall through. */
   2783      case BROTLI_STATE_COMMAND_INNER:
   2784      /* Fall through. */
   2785      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
   2786      /* Fall through. */
   2787      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
   2788        result = ProcessCommands(s);
   2789        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
   2790          result = SafeProcessCommands(s);
   2791        }
   2792        break;
   2793 
   2794      case BROTLI_STATE_COMMAND_INNER_WRITE:
   2795      /* Fall through. */
   2796      case BROTLI_STATE_COMMAND_POST_WRITE_1:
   2797      /* Fall through. */
   2798      case BROTLI_STATE_COMMAND_POST_WRITE_2:
   2799        result = WriteRingBuffer(
   2800            s, available_out, next_out, total_out, BROTLI_FALSE);
   2801        if (result != BROTLI_DECODER_SUCCESS) {
   2802          break;
   2803        }
   2804        WrapRingBuffer(s);
   2805        if (s->ringbuffer_size == 1 << s->window_bits) {
   2806          s->max_distance = s->max_backward_distance;
   2807        }
   2808        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
   2809          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
   2810          if (addon && (addon->br_length != addon->br_copied)) {
   2811            s->pos += CopyFromCompoundDictionary(s, s->pos);
   2812            if (s->pos >= s->ringbuffer_size) continue;
   2813          }
   2814          if (s->meta_block_remaining_len == 0) {
   2815            /* Next metablock, if any. */
   2816            s->state = BROTLI_STATE_METABLOCK_DONE;
   2817          } else {
   2818            s->state = BROTLI_STATE_COMMAND_BEGIN;
   2819          }
   2820          break;
   2821        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
   2822          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
   2823        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
   2824          if (s->loop_counter == 0) {
   2825            if (s->meta_block_remaining_len == 0) {
   2826              s->state = BROTLI_STATE_METABLOCK_DONE;
   2827            } else {
   2828              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
   2829            }
   2830            break;
   2831          }
   2832          s->state = BROTLI_STATE_COMMAND_INNER;
   2833        }
   2834        break;
   2835 
   2836      case BROTLI_STATE_METABLOCK_DONE:
   2837        if (s->meta_block_remaining_len < 0) {
   2838          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
   2839          break;
   2840        }
   2841        BrotliDecoderStateCleanupAfterMetablock(s);
   2842        if (!s->is_last_metablock) {
   2843          s->state = BROTLI_STATE_METABLOCK_BEGIN;
   2844          break;
   2845        }
   2846        if (!BrotliJumpToByteBoundary(br)) {
   2847          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
   2848          break;
   2849        }
   2850        if (s->buffer_length == 0) {
   2851          BrotliBitReaderUnload(br);
   2852          *available_in = BrotliBitReaderGetAvailIn(br);
   2853          *next_in = br->next_in;
   2854        }
   2855        s->state = BROTLI_STATE_DONE;
   2856      /* Fall through. */
   2857 
   2858      case BROTLI_STATE_DONE:
   2859        if (s->ringbuffer != 0) {
   2860          result = WriteRingBuffer(
   2861              s, available_out, next_out, total_out, BROTLI_TRUE);
   2862          if (result != BROTLI_DECODER_SUCCESS) {
   2863            break;
   2864          }
   2865        }
   2866        return BROTLI_SAVE_ERROR_CODE(result);
   2867    }
   2868  }
   2869  return BROTLI_SAVE_ERROR_CODE(result);
   2870 #undef BROTLI_SAVE_ERROR_CODE
   2871 }
   2872 
   2873 BROTLI_BOOL BrotliDecoderHasMoreOutput(const BrotliDecoderState* s) {
   2874  /* After unrecoverable error remaining output is considered nonsensical. */
   2875  if ((int)s->error_code < 0) {
   2876    return BROTLI_FALSE;
   2877  }
   2878  return TO_BROTLI_BOOL(
   2879      s->ringbuffer != 0 && UnwrittenBytes(s, BROTLI_FALSE) != 0);
   2880 }
   2881 
   2882 const uint8_t* BrotliDecoderTakeOutput(BrotliDecoderState* s, size_t* size) {
   2883  uint8_t* result = 0;
   2884  size_t available_out = *size ? *size : 1u << 24;
   2885  size_t requested_out = available_out;
   2886  BrotliDecoderErrorCode status;
   2887  if ((s->ringbuffer == 0) || ((int)s->error_code < 0)) {
   2888    *size = 0;
   2889    return 0;
   2890  }
   2891  WrapRingBuffer(s);
   2892  status = WriteRingBuffer(s, &available_out, &result, 0, BROTLI_TRUE);
   2893  /* Either WriteRingBuffer returns those "success" codes... */
   2894  if (status == BROTLI_DECODER_SUCCESS ||
   2895      status == BROTLI_DECODER_NEEDS_MORE_OUTPUT) {
   2896    *size = requested_out - available_out;
   2897  } else {
   2898    /* ... or stream is broken. Normally this should be caught by
   2899       BrotliDecoderDecompressStream, this is just a safeguard. */
   2900    if ((int)status < 0) SaveErrorCode(s, status, 0);
   2901    *size = 0;
   2902    result = 0;
   2903  }
   2904  return result;
   2905 }
   2906 
   2907 BROTLI_BOOL BrotliDecoderIsUsed(const BrotliDecoderState* s) {
   2908  return TO_BROTLI_BOOL(s->state != BROTLI_STATE_UNINITED ||
   2909      BrotliGetAvailableBits(&s->br) != 0);
   2910 }
   2911 
   2912 BROTLI_BOOL BrotliDecoderIsFinished(const BrotliDecoderState* s) {
   2913  return TO_BROTLI_BOOL(s->state == BROTLI_STATE_DONE) &&
   2914      !BrotliDecoderHasMoreOutput(s);
   2915 }
   2916 
   2917 BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
   2918  return (BrotliDecoderErrorCode)s->error_code;
   2919 }
   2920 
   2921 const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
   2922  switch (c) {
   2923 #define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
   2924    case BROTLI_DECODER ## PREFIX ## NAME: return #PREFIX #NAME;
   2925 #define BROTLI_NOTHING_
   2926    BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_CASE_, BROTLI_NOTHING_)
   2927 #undef BROTLI_ERROR_CODE_CASE_
   2928 #undef BROTLI_NOTHING_
   2929    default: return "INVALID";
   2930  }
   2931 }
   2932 
   2933 uint32_t BrotliDecoderVersion(void) {
   2934  return BROTLI_VERSION;
   2935 }
   2936 
   2937 void BrotliDecoderSetMetadataCallbacks(
   2938    BrotliDecoderState* state,
   2939    brotli_decoder_metadata_start_func start_func,
   2940    brotli_decoder_metadata_chunk_func chunk_func, void* opaque) {
   2941  state->metadata_start_func = start_func;
   2942  state->metadata_chunk_func = chunk_func;
   2943  state->metadata_callback_opaque = opaque;
   2944 }
   2945 
   2946 /* Escalate internal functions visibility; for testing purposes only. */
   2947 #if defined(BROTLI_TEST)
   2948 BROTLI_BOOL BrotliSafeReadSymbolForTest(
   2949    const HuffmanCode*, BrotliBitReader*, brotli_reg_t*);
   2950 BROTLI_BOOL BrotliSafeReadSymbolForTest(
   2951    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
   2952  return SafeReadSymbol(table, br, result);
   2953 }
   2954 void BrotliInverseMoveToFrontTransformForTest(
   2955    uint8_t*, brotli_reg_t, BrotliDecoderState*);
   2956 void BrotliInverseMoveToFrontTransformForTest(
   2957    uint8_t* v, brotli_reg_t l, BrotliDecoderState* s) {
   2958  InverseMoveToFrontTransform(v, l, s);
   2959 }
   2960 #endif
   2961 
   2962 #if defined(__cplusplus) || defined(c_plusplus)
   2963 }  /* extern "C" */
   2964 #endif