1b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka/* Copyright 2013 Google Inc. All Rights Reserved.
2b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka
324ffa78414663b545b66be392caff7eb5574a62cEugene Klyuchnikov   Distributed under MIT license.
4771eb107985566d2e458e3f06f2c7bd1b21c2dcaEugene Klyuchnikov   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5b8a100856942f8bf98d7b523a72bdaf8a929bfc7Zoltan Szabadka*/
68f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
781cb09f1b3c35c3b37dc013196a9bfb02a474276Lode Vandevenne/* Bit reading helpers */
881cb09f1b3c35c3b37dc013196a9bfb02a474276Lode Vandevenne
98f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#include "./bit_reader.h"
1092e3023914f10c411575194d24d13aff63d64eccEugene Kliuchnikov
1181480011581d1bb40e2ed26566a95d060f2767b3Eugene Kliuchnikov#include <brotli/types.h>
1283aa24dc8686b62177d776a3baab5f69badc1a78Zoltan Szabadka#include "./port.h"
138f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
148f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus)
158f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadkaextern "C" {
168f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#endif
178f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
18c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikovvoid BrotliInitBitReader(BrotliBitReader* const br) {
198f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  br->val_ = 0;
20a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka  br->bit_pos_ = sizeof(br->val_) << 3;
218270250b40f9979f61d92542739b5a786914c922Lode Vandevenne}
228270250b40f9979f61d92542739b5a786914c922Lode Vandevenne
2343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene KliuchnikovBROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
24e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka  size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1;
25e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka  /* Fixing alignment after unaligned BrotliFillWindow would result accumulator
26e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka     overflow. If unalignment is caused by BrotliSafeReadBits, then there is
27e9b278ac6e097beb763e8a46eeafcaa3f6f63f18Eugene Kliuchnikov     enough space in accumulator to fix alignment. */
28e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka  if (!BROTLI_ALIGNED_READ) {
29e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka    aligned_read_mask = 0;
30e44caf98355b9ac27023d5590d2636ef67a9a1f5Zoltan Szabadka  }
31c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  if (BrotliGetAvailableBits(br) == 0) {
32c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!BrotliPullByte(br)) {
3343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_FALSE;
34a7cedfc26d74b3ffffb454ea11dd8f8def92fe64Zoltan Szabadka    }
35c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  }
36c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov
37c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov  while ((((size_t)br->next_in) & aligned_read_mask) != 0) {
38c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    if (!BrotliPullByte(br)) {
39c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov      /* If we consumed all the input, we don't care about the alignment. */
4043d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov      return BROTLI_TRUE;
41c0ba6d6f5eb44836b856e9b1eeb8586e4c2633bbEugene Klyuchnikov    }
428f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka  }
4343d4f45b6e8635406e1709fcc938c12f3d11d76fEugene Kliuchnikov  return BROTLI_TRUE;
448f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka}
458f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka
468f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus)
4723934731f55d06e5b83701bf82c2f53bb9ddf56dEugene Kliuchnikov}  /* extern "C" */
488f30907d0f2ef354c2b31bdee340c2b11dda0fbZoltan Szabadka#endif
49