blob: 457ccc41d8e40528839157107b2e4e755b4131a6 [file] [log] [blame]
#ifndef PUFFS_FLATE_H
#define PUFFS_FLATE_H
// Code generated by puffs-c. DO NOT EDIT.
#ifndef PUFFS_BASE_HEADER_H
#define PUFFS_BASE_HEADER_H
// Copyright 2017 The Puffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
// Puffs requires a word size of at least 32 bits because it assumes that
// converting a u32 to usize will never overflow. For example, the size of a
// decoded image is often represented, explicitly or implicitly in an image
// file, as a u32, and it is convenient to compare that to a buffer size.
//
// Similarly, the word size is at most 64 bits because it assumes that
// converting a usize to u64 will never overflow.
#if __WORDSIZE < 32
#error "Puffs requires a word size of at least 32 bits"
#elif __WORDSIZE > 64
#error "Puffs requires a word size of at most 64 bits"
#endif
// PUFFS_VERSION is the major.minor version number as a uint32. The major
// number is the high 16 bits. The minor number is the low 16 bits.
//
// The intention is to bump the version number at least on every API / ABI
// backwards incompatible change.
//
// For now, the API and ABI are simply unstable and can change at any time.
//
// TODO: don't hard code this in base-header.h.
#define PUFFS_VERSION (0x00001)
// puffs_base__slice_u8 is a 1-dimensional buffer (a pointer and length).
//
// A value with all fields NULL or zero is a valid, empty slice.
typedef struct {
uint8_t* ptr;
size_t len;
} puffs_base__slice_u8;
// puffs_base__buf1 is a 1-dimensional buffer (a pointer and length), plus
// additional indexes into that buffer, plus an opened / closed flag.
//
// A value with all fields NULL or zero is a valid, empty buffer.
typedef struct {
uint8_t* ptr; // Pointer.
size_t len; // Length.
size_t wi; // Write index. Invariant: wi <= len.
size_t ri; // Read index. Invariant: ri <= wi.
bool closed; // No further writes are expected.
} puffs_base__buf1;
// puffs_base__limit1 provides a limited view of a 1-dimensional byte stream:
// its first N bytes. That N can be greater than a buffer's current read or
// write capacity. N decreases naturally over time as bytes are read from or
// written to the stream.
//
// A value with all fields NULL or zero is a valid, unlimited view.
typedef struct puffs_base__limit1 {
uint64_t* ptr_to_len; // Pointer to N.
struct puffs_base__limit1* next; // Linked list of limits.
} puffs_base__limit1;
typedef struct {
puffs_base__buf1* buf;
puffs_base__limit1 limit;
} puffs_base__reader1;
typedef struct {
puffs_base__buf1* buf;
puffs_base__limit1 limit;
} puffs_base__writer1;
#endif // PUFFS_BASE_HEADER_H
#ifdef __cplusplus
extern "C" {
#endif
// ---------------- Status Codes
// Status codes are int32_t values:
// - the sign bit indicates a non-recoverable status code: an error
// - bits 10-30 hold the packageid: a namespace
// - bits 8-9 are reserved
// - bits 0-7 are a package-namespaced numeric code
//
// Do not manipulate these bits directly. Use the API functions such as
// puffs_flate__status__is_error instead.
typedef int32_t puffs_flate__status;
#define puffs_flate__packageid 967230 // 0x000ec23e
#define PUFFS_FLATE__STATUS_OK 0 // 0x00000000
#define PUFFS_FLATE__ERROR_BAD_PUFFS_VERSION -2147483647 // 0x80000001
#define PUFFS_FLATE__ERROR_BAD_RECEIVER -2147483646 // 0x80000002
#define PUFFS_FLATE__ERROR_BAD_ARGUMENT -2147483645 // 0x80000003
#define PUFFS_FLATE__ERROR_INITIALIZER_NOT_CALLED -2147483644 // 0x80000004
#define PUFFS_FLATE__ERROR_CLOSED_FOR_WRITES -2147483643 // 0x80000005
#define PUFFS_FLATE__ERROR_UNEXPECTED_EOF -2147483642 // 0x80000006
#define PUFFS_FLATE__SUSPENSION_SHORT_READ 7 // 0x00000007
#define PUFFS_FLATE__SUSPENSION_SHORT_WRITE 8 // 0x00000008
#define PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_OVER_SUBSCRIBED \
-1157040128 // 0xbb08f800
#define PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_UNDER_SUBSCRIBED \
-1157040127 // 0xbb08f801
#define PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_LENGTH_COUNT \
-1157040126 // 0xbb08f802
#define PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_LENGTH_REPETITION \
-1157040125 // 0xbb08f803
#define PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE -1157040124 // 0xbb08f804
#define PUFFS_FLATE__ERROR_BAD_HUFFMAN_MINIMUM_CODE_LENGTH \
-1157040123 // 0xbb08f805
#define PUFFS_FLATE__ERROR_BAD_DISTANCE -1157040122 // 0xbb08f806
#define PUFFS_FLATE__ERROR_BAD_DISTANCE_CODE_COUNT -1157040121 // 0xbb08f807
#define PUFFS_FLATE__ERROR_BAD_FLATE_BLOCK -1157040120 // 0xbb08f808
#define PUFFS_FLATE__ERROR_BAD_LITERAL_LENGTH_CODE_COUNT \
-1157040119 // 0xbb08f809
#define PUFFS_FLATE__ERROR_CHECKSUM_MISMATCH -1157040118 // 0xbb08f80a
#define PUFFS_FLATE__ERROR_INCONSISTENT_STORED_BLOCK_LENGTH \
-1157040117 // 0xbb08f80b
#define PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE \
-1157040116 // 0xbb08f80c
#define PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_N_BITS \
-1157040115 // 0xbb08f80d
#define PUFFS_FLATE__ERROR_MISSING_END_OF_BLOCK_CODE -1157040114 // 0xbb08f80e
#define PUFFS_FLATE__ERROR_NO_HUFFMAN_CODES -1157040113 // 0xbb08f80f
#define PUFFS_FLATE__ERROR_INVALID_ZLIB_COMPRESSION_METHOD \
-1157040112 // 0xbb08f810
#define PUFFS_FLATE__ERROR_INVALID_ZLIB_COMPRESSION_WINDOW_SIZE \
-1157040111 // 0xbb08f811
#define PUFFS_FLATE__ERROR_INVALID_ZLIB_PARITY_CHECK -1157040110 // 0xbb08f812
#define PUFFS_FLATE__ERROR_TODO_UNSUPPORTED_ZLIB_PRESET_DICTIONARY \
-1157040109 // 0xbb08f813
bool puffs_flate__status__is_error(puffs_flate__status s);
const char* puffs_flate__status__string(puffs_flate__status s);
// ---------------- Public Consts
// ---------------- Structs
typedef struct {
// Do not access the private_impl's fields directly. There is no API/ABI
// compatibility or safety guarantee if you do so. Instead, use the
// puffs_flate__flate_decoder__etc functions.
//
// In C++, these fields would be "private", but C does not support that.
//
// It is a struct, not a struct*, so that it can be stack allocated.
struct {
puffs_flate__status status;
uint32_t magic;
uint32_t f_bits;
uint32_t f_n_bits;
uint32_t f_huffs[2][1234];
uint32_t f_n_huffs_bits[2];
uint8_t f_history[32768];
uint32_t f_history_index;
uint8_t f_code_lengths[320];
struct {
uint32_t coro_susp_point;
puffs_flate__status v_z;
uint64_t v_n_copied;
uint32_t v_already_full;
} c_decode[1];
struct {
uint32_t coro_susp_point;
uint32_t v_final;
uint32_t v_type;
} c_decode_blocks[1];
struct {
uint32_t coro_susp_point;
uint32_t v_length;
uint32_t v_n_copied;
uint64_t scratch;
} c_decode_uncompressed[1];
struct {
uint32_t coro_susp_point;
uint32_t v_bits;
uint32_t v_n_bits;
uint32_t v_table_entry;
uint32_t v_table_entry_n_bits;
uint32_t v_lmask;
uint32_t v_dmask;
uint32_t v_redir_top;
uint32_t v_redir_mask;
uint32_t v_length;
uint32_t v_distance;
uint32_t v_n_copied;
uint32_t v_hlen;
uint32_t v_hdist;
} c_decode_huffman[1];
struct {
uint32_t coro_susp_point;
uint32_t v_i;
} c_init_fixed_huffman[1];
struct {
uint32_t coro_susp_point;
uint32_t v_bits;
uint32_t v_n_bits;
uint32_t v_n_lit;
uint32_t v_n_dist;
uint32_t v_n_clen;
uint32_t v_i;
uint32_t v_mask;
uint32_t v_table_entry;
uint32_t v_table_entry_n_bits;
uint32_t v_n_extra_bits;
uint8_t v_rep_symbol;
uint32_t v_rep_count;
} c_init_dynamic_huffman[1];
} private_impl;
} puffs_flate__flate_decoder;
typedef struct {
// Do not access the private_impl's fields directly. There is no API/ABI
// compatibility or safety guarantee if you do so. Instead, use the
// puffs_flate__adler32__etc functions.
//
// In C++, these fields would be "private", but C does not support that.
//
// It is a struct, not a struct*, so that it can be stack allocated.
struct {
puffs_flate__status status;
uint32_t magic;
uint32_t f_state;
} private_impl;
} puffs_flate__adler32;
typedef struct {
// Do not access the private_impl's fields directly. There is no API/ABI
// compatibility or safety guarantee if you do so. Instead, use the
// puffs_flate__zlib_decoder__etc functions.
//
// In C++, these fields would be "private", but C does not support that.
//
// It is a struct, not a struct*, so that it can be stack allocated.
struct {
puffs_flate__status status;
uint32_t magic;
puffs_flate__flate_decoder f_flate;
puffs_flate__adler32 f_adler;
struct {
uint32_t coro_susp_point;
uint16_t v_x;
uint32_t v_checksum;
puffs_flate__status v_z;
uint64_t scratch;
} c_decode[1];
} private_impl;
} puffs_flate__zlib_decoder;
// ---------------- Public Initializer Prototypes
// puffs_flate__flate_decoder__initialize is an initializer function.
//
// It should be called before any other puffs_flate__flate_decoder__* function.
//
// Pass PUFFS_VERSION and 0 for puffs_version and for_internal_use_only.
void puffs_flate__flate_decoder__initialize(puffs_flate__flate_decoder* self,
uint32_t puffs_version,
uint32_t for_internal_use_only);
// puffs_flate__zlib_decoder__initialize is an initializer function.
//
// It should be called before any other puffs_flate__zlib_decoder__* function.
//
// Pass PUFFS_VERSION and 0 for puffs_version and for_internal_use_only.
void puffs_flate__zlib_decoder__initialize(puffs_flate__zlib_decoder* self,
uint32_t puffs_version,
uint32_t for_internal_use_only);
// ---------------- Public Function Prototypes
puffs_flate__status puffs_flate__flate_decoder__decode(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src);
puffs_flate__status puffs_flate__zlib_decoder__decode(
puffs_flate__zlib_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // PUFFS_FLATE_H
// C HEADER ENDS HERE.
#ifndef PUFFS_BASE_IMPL_H
#define PUFFS_BASE_IMPL_H
// Copyright 2017 The Puffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#define PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(x) (void)(x)
// PUFFS_BASE__MAGIC is a magic number to check that initializers are called.
// It's not foolproof, given C doesn't automatically zero memory before use,
// but it should catch 99.99% of cases.
//
// Its (non-zero) value is arbitrary, based on md5sum("puffs").
#define PUFFS_BASE__MAGIC (0xCB3699CCU)
// PUFFS_BASE__ALREADY_ZEROED is passed from a container struct's initializer
// to a containee struct's initializer when the container has already zeroed
// the containee's memory.
//
// Its (non-zero) value is arbitrary, based on md5sum("zeroed").
#define PUFFS_BASE__ALREADY_ZEROED (0x68602EF1U)
// Use switch cases for coroutine suspension points, similar to the technique
// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
//
// We use a trivial macro instead of an explicit assignment and case statement
// so that clang-format doesn't get confused by the unusual "case"s.
#define PUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \
coro_susp_point = n; \
case n:;
#define PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
if (status < 0) { \
goto exit; \
} else if (status == 0) { \
goto ok; \
} \
coro_susp_point = n; \
goto suspend; \
case n:;
// Clang also defines "__GNUC__".
#if defined(__GNUC__)
#define PUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1))
#define PUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0))
// Declare the printf prototype. The generated code shouldn't need this at all,
// but it's useful for manual printf debugging.
extern int printf(const char* __restrict __format, ...);
#else
#define PUFFS_BASE__LIKELY(expr) (expr)
#define PUFFS_BASE__UNLIKELY(expr) (expr)
#endif
// ---------------- Static Inline Functions
//
// The helpers below are functions, instead of macros, because their arguments
// can be an expression that we shouldn't evaluate more than once.
//
// They are in base-impl.h and hence copy/pasted into every generated C file,
// instead of being in some "base.c" file, since a design goal is that users of
// the generated C code can often just #include a single .c file, such as
// "gif.c", without having to additionally include or otherwise build and link
// a "base.c" file.
//
// They are static, so that linking multiple puffs .o files won't complain about
// duplicate function definitions.
//
// They are explicitly marked inline, even if modern compilers don't use the
// inline attribute to guide optimizations such as inlining, to avoid the
// -Wunused-function warning, and we like to compile with -Wall -Werror.
static inline uint16_t puffs_base__load_u16be(uint8_t* p) {
return ((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0);
}
static inline uint16_t puffs_base__load_u16le(uint8_t* p) {
return ((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8);
}
static inline uint32_t puffs_base__load_u32be(uint8_t* p) {
return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) |
((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0);
}
static inline uint32_t puffs_base__load_u32le(uint8_t* p) {
return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);
}
static inline puffs_base__slice_u8 puffs_base__slice_u8__subslice_i(
puffs_base__slice_u8 s,
uint64_t i) {
if ((i <= SIZE_MAX) && (i <= s.len)) {
return ((puffs_base__slice_u8){
.ptr = s.ptr + i,
.len = s.len - i,
});
}
return ((puffs_base__slice_u8){});
}
static inline puffs_base__slice_u8 puffs_base__slice_u8__subslice_j(
puffs_base__slice_u8 s,
uint64_t j) {
if ((j <= SIZE_MAX) && (j <= s.len)) {
return ((puffs_base__slice_u8){.ptr = s.ptr, .len = j});
}
return ((puffs_base__slice_u8){});
}
static inline puffs_base__slice_u8 puffs_base__slice_u8__subslice_ij(
puffs_base__slice_u8 s,
uint64_t i,
uint64_t j) {
if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) {
return ((puffs_base__slice_u8){
.ptr = s.ptr + i,
.len = j - i,
});
}
return ((puffs_base__slice_u8){});
}
// puffs_base__slice_u8__prefix returns up to the first up_to bytes of s.
static inline puffs_base__slice_u8 puffs_base__slice_u8__prefix(
puffs_base__slice_u8 s,
uint64_t up_to) {
if ((uint64_t)(s.len) > up_to) {
s.len = up_to;
}
return s;
}
// puffs_base__slice_u8__suffix returns up to the last up_to bytes of s.
static inline puffs_base__slice_u8 puffs_base__slice_u8_suffix(
puffs_base__slice_u8 s,
uint64_t up_to) {
if ((uint64_t)(s.len) > up_to) {
s.ptr += (uint64_t)(s.len) - up_to;
s.len = up_to;
}
return s;
}
// puffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr,
// length) where length is the minimum of dst.len and src.len.
//
// Passing a puffs_base__slice_u8 with all fields NULL or zero (a valid, empty
// slice) is valid and results in a no-op.
static inline uint64_t puffs_base__slice_u8__copy_from_slice(
puffs_base__slice_u8 dst,
puffs_base__slice_u8 src) {
size_t length = dst.len < src.len ? dst.len : src.len;
if (length > 0) {
memmove(dst.ptr, src.ptr, length);
}
return length;
}
static inline uint32_t puffs_base__writer1__copy_from_history32(
uint8_t** ptr_ptr,
uint8_t* start,
uint8_t* end,
uint32_t distance,
uint32_t length) {
uint8_t* ptr = *ptr_ptr;
size_t d = ptr - start;
if ((d == 0) || (d < (size_t)(distance))) {
return 0;
}
start = ptr - distance;
size_t n = end - ptr;
if ((size_t)(length) > n) {
length = n;
} else {
n = length;
}
// TODO: is manual unrolling actually helpful?
for (; n >= 8; n -= 8) {
*ptr++ = *start++;
*ptr++ = *start++;
*ptr++ = *start++;
*ptr++ = *start++;
*ptr++ = *start++;
*ptr++ = *start++;
*ptr++ = *start++;
*ptr++ = *start++;
}
for (; n; n--) {
*ptr++ = *start++;
}
*ptr_ptr = ptr;
return length;
}
static inline uint32_t puffs_base__writer1__copy_from_reader32(
uint8_t** ptr_wptr,
uint8_t* wend,
uint8_t** ptr_rptr,
uint8_t* rend,
uint32_t length) {
uint8_t* wptr = *ptr_wptr;
size_t n = length;
if (n > wend - wptr) {
n = wend - wptr;
}
uint8_t* rptr = *ptr_rptr;
if (n > rend - rptr) {
n = rend - rptr;
}
if (n > 0) {
memmove(wptr, rptr, n);
*ptr_wptr += n;
*ptr_rptr += n;
}
return n;
}
static inline uint64_t puffs_base__writer1__copy_from_slice(
uint8_t** ptr_wptr,
uint8_t* wend,
puffs_base__slice_u8 src) {
uint8_t* wptr = *ptr_wptr;
size_t n = src.len;
if (n > wend - wptr) {
n = wend - wptr;
}
if (n > 0) {
memmove(wptr, src.ptr, n);
*ptr_wptr += n;
}
return n;
}
static inline uint32_t puffs_base__writer1__copy_from_slice32(
uint8_t** ptr_wptr,
uint8_t* wend,
puffs_base__slice_u8 src,
uint32_t length) {
uint8_t* wptr = *ptr_wptr;
size_t n = src.len;
if (n > length) {
n = length;
}
if (n > wend - wptr) {
n = wend - wptr;
}
if (n > 0) {
memmove(wptr, src.ptr, n);
*ptr_wptr += n;
}
return n;
}
#endif // PUFFS_BASE_IMPL_H
// ---------------- Status Codes Implementations
bool puffs_flate__status__is_error(puffs_flate__status s) {
return s < 0;
}
const char* puffs_flate__status__strings0[9] = {
"flate: ok",
"flate: bad puffs version",
"flate: bad receiver",
"flate: bad argument",
"flate: initializer not called",
"flate: closed for writes",
"flate: unexpected EOF",
"flate: short read",
"flate: short write",
};
const char* puffs_flate__status__strings1[20] = {
"flate: bad Huffman code (over-subscribed)",
"flate: bad Huffman code (under-subscribed)",
"flate: bad Huffman code length count",
"flate: bad Huffman code length repetition",
"flate: bad Huffman code",
"flate: bad Huffman minimum code length",
"flate: bad distance",
"flate: bad distance code count",
"flate: bad flate block",
"flate: bad literal/length code count",
"flate: checksum mismatch",
"flate: inconsistent stored block length",
"flate: internal error: inconsistent Huffman decoder state",
"flate: internal error: inconsistent n_bits",
"flate: missing end-of-block code",
"flate: no Huffman codes",
"flate: invalid zlib compression method",
"flate: invalid zlib compression window size",
"flate: invalid zlib parity check",
"flate: TODO: unsupported zlib preset dictionary",
};
const char* puffs_flate__status__string(puffs_flate__status s) {
const char** a = NULL;
uint32_t n = 0;
switch ((s >> 10) & 0x1fffff) {
case 0:
a = puffs_flate__status__strings0;
n = 9;
break;
case puffs_flate__packageid:
a = puffs_flate__status__strings1;
n = 20;
break;
}
uint32_t i = s & 0xff;
return i < n ? a[i] : "flate: unknown status";
}
// ---------------- Private Consts
static const uint8_t puffs_flate__code_order[19] = {
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15,
};
static const uint8_t puffs_flate__reverse8[256] = {
0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240,
8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248,
4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244,
12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252,
2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242,
10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250,
6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246,
14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254,
1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241,
9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249,
5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245,
13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253,
3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243,
11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251,
7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247,
15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255,
};
static const uint32_t puffs_flate__lcode_magic_numbers[32] = {
1073742592, 1073742848, 1073743104, 1073743360, 1073743616, 1073743872,
1073744128, 1073744384, 1073744656, 1073745168, 1073745680, 1073746192,
1073746720, 1073747744, 1073748768, 1073749792, 1073750832, 1073752880,
1073754928, 1073756976, 1073759040, 1073763136, 1073767232, 1073771328,
1073775440, 1073783632, 1073791824, 1073800016, 1073807872, 134217728,
134217728, 134217728,
};
static const uint32_t puffs_flate__dcode_magic_numbers[32] = {
1073742080, 1073742336, 1073742592, 1073742848, 1073743120, 1073743632,
1073744160, 1073745184, 1073746224, 1073748272, 1073750336, 1073754432,
1073758544, 1073766736, 1073774944, 1073791328, 1073807728, 1073840496,
1073873280, 1073938816, 1074004368, 1074135440, 1074266528, 1074528672,
1074790832, 1075315120, 1075839424, 1076888000, 1077936592, 1080033744,
134217728, 134217728,
};
// ---------------- Private Initializer Prototypes
void puffs_flate__adler32__initialize(puffs_flate__adler32* self,
uint32_t puffs_version,
uint32_t for_internal_use_only);
// ---------------- Private Function Prototypes
puffs_flate__status puffs_flate__flate_decoder__decode_blocks(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src);
puffs_flate__status puffs_flate__flate_decoder__decode_uncompressed(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src);
puffs_flate__status puffs_flate__flate_decoder__decode_huffman(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src);
puffs_flate__status puffs_flate__flate_decoder__init_fixed_huffman(
puffs_flate__flate_decoder* self);
puffs_flate__status puffs_flate__flate_decoder__init_dynamic_huffman(
puffs_flate__flate_decoder* self,
puffs_base__reader1 a_src);
puffs_flate__status puffs_flate__flate_decoder__init_huff(
puffs_flate__flate_decoder* self,
uint32_t a_which,
uint32_t a_n_codes0,
uint32_t a_n_codes1,
uint32_t a_base_symbol);
uint32_t puffs_flate__adler32__update(puffs_flate__adler32* self,
puffs_base__slice_u8 a_x);
// ---------------- Initializer Implementations
void puffs_flate__flate_decoder__initialize(puffs_flate__flate_decoder* self,
uint32_t puffs_version,
uint32_t for_internal_use_only) {
if (!self) {
return;
}
if (puffs_version != PUFFS_VERSION) {
self->private_impl.status = PUFFS_FLATE__ERROR_BAD_PUFFS_VERSION;
return;
}
if (for_internal_use_only != PUFFS_BASE__ALREADY_ZEROED) {
memset(self, 0, sizeof(*self));
}
self->private_impl.magic = PUFFS_BASE__MAGIC;
}
void puffs_flate__adler32__initialize(puffs_flate__adler32* self,
uint32_t puffs_version,
uint32_t for_internal_use_only) {
if (!self) {
return;
}
if (puffs_version != PUFFS_VERSION) {
self->private_impl.status = PUFFS_FLATE__ERROR_BAD_PUFFS_VERSION;
return;
}
if (for_internal_use_only != PUFFS_BASE__ALREADY_ZEROED) {
memset(self, 0, sizeof(*self));
}
self->private_impl.magic = PUFFS_BASE__MAGIC;
self->private_impl.f_state = 1;
}
void puffs_flate__zlib_decoder__initialize(puffs_flate__zlib_decoder* self,
uint32_t puffs_version,
uint32_t for_internal_use_only) {
if (!self) {
return;
}
if (puffs_version != PUFFS_VERSION) {
self->private_impl.status = PUFFS_FLATE__ERROR_BAD_PUFFS_VERSION;
return;
}
if (for_internal_use_only != PUFFS_BASE__ALREADY_ZEROED) {
memset(self, 0, sizeof(*self));
}
self->private_impl.magic = PUFFS_BASE__MAGIC;
puffs_flate__flate_decoder__initialize(
&self->private_impl.f_flate, PUFFS_VERSION, PUFFS_BASE__ALREADY_ZEROED);
puffs_flate__adler32__initialize(&self->private_impl.f_adler, PUFFS_VERSION,
PUFFS_BASE__ALREADY_ZEROED);
}
// ---------------- Function Implementations
puffs_flate__status puffs_flate__flate_decoder__decode(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src) {
if (!self) {
return PUFFS_FLATE__ERROR_BAD_RECEIVER;
}
if (self->private_impl.magic != PUFFS_BASE__MAGIC) {
self->private_impl.status = PUFFS_FLATE__ERROR_INITIALIZER_NOT_CALLED;
}
if (self->private_impl.status < 0) {
return self->private_impl.status;
}
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
puffs_flate__status v_z;
puffs_base__slice_u8 v_written;
uint64_t v_n_copied;
uint32_t v_already_full;
uint8_t* b_wptr_dst = NULL;
uint8_t* b_wstart_dst = NULL;
uint8_t* b_wend_dst = NULL;
if (a_dst.buf) {
b_wptr_dst = a_dst.buf->ptr + a_dst.buf->wi;
b_wstart_dst = b_wptr_dst;
b_wend_dst = b_wptr_dst;
if (!a_dst.buf->closed) {
size_t len = a_dst.buf->len - a_dst.buf->wi;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_wend_dst += len;
}
}
uint32_t coro_susp_point = self->private_impl.c_decode[0].coro_susp_point;
if (coro_susp_point) {
v_z = self->private_impl.c_decode[0].v_z;
v_written = ((puffs_base__slice_u8){});
v_n_copied = self->private_impl.c_decode[0].v_n_copied;
v_already_full = self->private_impl.c_decode[0].v_already_full;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
/* placeholder */
while (true) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
if (a_dst.buf) {
size_t n = b_wptr_dst - (a_dst.buf->ptr + a_dst.buf->wi);
a_dst.buf->wi += n;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
}
puffs_flate__status t_0 =
puffs_flate__flate_decoder__decode_blocks(self, a_dst, a_src);
if (a_dst.buf) {
b_wptr_dst = a_dst.buf->ptr + a_dst.buf->wi;
b_wend_dst = b_wptr_dst;
if (!a_dst.buf->closed) {
size_t len = a_dst.buf->len - a_dst.buf->wi;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_wend_dst += len;
}
}
v_z = t_0;
if (!(v_z > 0)) {
status = v_z;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
}
v_written = ((puffs_base__slice_u8){
.ptr = b_wstart_dst,
.len = b_wptr_dst - b_wstart_dst,
});
if (((uint64_t)(v_written.len)) >= 32768) {
v_written = puffs_base__slice_u8_suffix(v_written, 32768);
puffs_base__slice_u8__copy_from_slice(
((puffs_base__slice_u8){.ptr = self->private_impl.f_history,
.len = 32768}),
v_written);
self->private_impl.f_history_index = 32768;
} else {
v_n_copied = puffs_base__slice_u8__copy_from_slice(
puffs_base__slice_u8__subslice_i(
((puffs_base__slice_u8){.ptr = self->private_impl.f_history,
.len = 32768}),
self->private_impl.f_history_index & 32767),
v_written);
if (v_n_copied < ((uint64_t)(v_written.len))) {
v_written = puffs_base__slice_u8__subslice_i(v_written, v_n_copied);
v_n_copied = puffs_base__slice_u8__copy_from_slice(
((puffs_base__slice_u8){.ptr = self->private_impl.f_history,
.len = 32768}),
v_written);
self->private_impl.f_history_index =
(((uint32_t)((v_n_copied & 32767))) + 32768);
} else {
v_already_full = 0;
if (self->private_impl.f_history_index >= 32768) {
v_already_full = 32768;
}
self->private_impl.f_history_index =
((self->private_impl.f_history_index & 32767) +
((uint32_t)((v_n_copied & 32767))) + v_already_full);
}
}
status = v_z;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
}
goto ok;
ok:
self->private_impl.c_decode[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_decode[0].coro_susp_point = coro_susp_point;
self->private_impl.c_decode[0].v_z = v_z;
self->private_impl.c_decode[0].v_n_copied = v_n_copied;
self->private_impl.c_decode[0].v_already_full = v_already_full;
exit:
if (a_dst.buf) {
size_t n = b_wptr_dst - (a_dst.buf->ptr + a_dst.buf->wi);
a_dst.buf->wi += n;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wstart_dst);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wend_dst);
}
self->private_impl.status = status;
return status;
}
puffs_flate__status puffs_flate__flate_decoder__decode_blocks(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src) {
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint32_t v_final;
uint32_t v_type;
uint8_t* b_rptr_src = NULL;
uint8_t* b_rstart_src = NULL;
uint8_t* b_rend_src = NULL;
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
b_rstart_src = b_rptr_src;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
uint32_t coro_susp_point =
self->private_impl.c_decode_blocks[0].coro_susp_point;
if (coro_susp_point) {
v_final = self->private_impl.c_decode_blocks[0].v_final;
v_type = self->private_impl.c_decode_blocks[0].v_type;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
v_final = 0;
label_0_continue:;
while (v_final == 0) {
while (self->private_impl.f_n_bits < 3) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_0 = *b_rptr_src++;
self->private_impl.f_bits |=
(((uint32_t)(t_0)) << self->private_impl.f_n_bits);
self->private_impl.f_n_bits += 8;
}
v_final = (self->private_impl.f_bits & 1);
v_type = ((self->private_impl.f_bits >> 1) & 3);
self->private_impl.f_bits >>= 3;
self->private_impl.f_n_bits -= 3;
if (v_type == 0) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
}
status =
puffs_flate__flate_decoder__decode_uncompressed(self, a_dst, a_src);
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
if (status) {
goto suspend;
}
goto label_0_continue;
} else if (v_type == 1) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
status = puffs_flate__flate_decoder__init_fixed_huffman(self);
if (status) {
goto suspend;
}
} else if (v_type == 2) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
}
status = puffs_flate__flate_decoder__init_dynamic_huffman(self, a_src);
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
if (status) {
goto suspend;
}
} else {
status = PUFFS_FLATE__ERROR_BAD_FLATE_BLOCK;
goto exit;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
}
status = puffs_flate__flate_decoder__decode_huffman(self, a_dst, a_src);
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
if (status) {
goto suspend;
}
}
goto ok;
ok:
self->private_impl.c_decode_blocks[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_decode_blocks[0].coro_susp_point = coro_susp_point;
self->private_impl.c_decode_blocks[0].v_final = v_final;
self->private_impl.c_decode_blocks[0].v_type = v_type;
exit:
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rstart_src);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rend_src);
}
return status;
short_read_src:
if (a_src.buf && a_src.buf->closed && !a_src.limit.ptr_to_len) {
status = PUFFS_FLATE__ERROR_UNEXPECTED_EOF;
goto exit;
}
status = PUFFS_FLATE__SUSPENSION_SHORT_READ;
goto suspend;
}
puffs_flate__status puffs_flate__flate_decoder__decode_uncompressed(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src) {
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint32_t v_length;
uint32_t v_n_copied;
uint8_t* b_wptr_dst = NULL;
uint8_t* b_wstart_dst = NULL;
uint8_t* b_wend_dst = NULL;
if (a_dst.buf) {
b_wptr_dst = a_dst.buf->ptr + a_dst.buf->wi;
b_wstart_dst = b_wptr_dst;
b_wend_dst = b_wptr_dst;
if (!a_dst.buf->closed) {
size_t len = a_dst.buf->len - a_dst.buf->wi;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_wend_dst += len;
}
}
uint8_t* b_rptr_src = NULL;
uint8_t* b_rstart_src = NULL;
uint8_t* b_rend_src = NULL;
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
b_rstart_src = b_rptr_src;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
uint32_t coro_susp_point =
self->private_impl.c_decode_uncompressed[0].coro_susp_point;
if (coro_susp_point) {
v_length = self->private_impl.c_decode_uncompressed[0].v_length;
v_n_copied = self->private_impl.c_decode_uncompressed[0].v_n_copied;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
if (self->private_impl.f_n_bits >= 8) {
status = PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_N_BITS;
goto exit;
}
self->private_impl.f_n_bits = 0;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
uint32_t t_1;
if (PUFFS_BASE__LIKELY(b_rend_src - b_rptr_src >= 4)) {
t_1 = puffs_base__load_u32le(b_rptr_src);
b_rptr_src += 4;
} else {
self->private_impl.c_decode_uncompressed[0].scratch = 0;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
while (true) {
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint32_t t_0 =
self->private_impl.c_decode_uncompressed[0].scratch >> 56;
self->private_impl.c_decode_uncompressed[0].scratch <<= 8;
self->private_impl.c_decode_uncompressed[0].scratch >>= 8;
self->private_impl.c_decode_uncompressed[0].scratch |=
((uint64_t)(*b_rptr_src++)) << t_0;
if (t_0 == 24) {
t_1 = self->private_impl.c_decode_uncompressed[0].scratch;
break;
}
t_0 += 8;
self->private_impl.c_decode_uncompressed[0].scratch |= ((uint64_t)(t_0))
<< 56;
}
}
v_length = t_1;
if ((((v_length) & ((1 << (16)) - 1)) + ((v_length) >> (32 - (16)))) !=
65535) {
status = PUFFS_FLATE__ERROR_INCONSISTENT_STORED_BLOCK_LENGTH;
goto exit;
}
v_length = ((v_length) & ((1 << (16)) - 1));
while (true) {
v_n_copied = puffs_base__writer1__copy_from_reader32(
&b_wptr_dst, b_wend_dst, &b_rptr_src, b_rend_src, v_length);
if (v_length <= v_n_copied) {
v_length = 0;
goto label_0_break;
}
v_length -= v_n_copied;
if (((uint64_t)(b_wend_dst - b_wptr_dst)) == 0) {
status = PUFFS_FLATE__SUSPENSION_SHORT_WRITE;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
} else {
status = PUFFS_FLATE__SUSPENSION_SHORT_READ;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
}
}
label_0_break:;
goto ok;
ok:
self->private_impl.c_decode_uncompressed[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_decode_uncompressed[0].coro_susp_point = coro_susp_point;
self->private_impl.c_decode_uncompressed[0].v_length = v_length;
self->private_impl.c_decode_uncompressed[0].v_n_copied = v_n_copied;
exit:
if (a_dst.buf) {
size_t n = b_wptr_dst - (a_dst.buf->ptr + a_dst.buf->wi);
a_dst.buf->wi += n;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wstart_dst);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wend_dst);
}
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rstart_src);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rend_src);
}
return status;
short_read_src:
if (a_src.buf && a_src.buf->closed && !a_src.limit.ptr_to_len) {
status = PUFFS_FLATE__ERROR_UNEXPECTED_EOF;
goto exit;
}
status = PUFFS_FLATE__SUSPENSION_SHORT_READ;
goto suspend;
}
puffs_flate__status puffs_flate__flate_decoder__decode_huffman(
puffs_flate__flate_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src) {
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint32_t v_bits;
uint32_t v_n_bits;
uint32_t v_table_entry;
uint32_t v_table_entry_n_bits;
uint32_t v_lmask;
uint32_t v_dmask;
uint32_t v_redir_top;
uint32_t v_redir_mask;
uint32_t v_length;
uint32_t v_distance;
uint32_t v_n_copied;
uint32_t v_hlen;
uint32_t v_hdist;
uint8_t* b_wptr_dst = NULL;
uint8_t* b_wstart_dst = NULL;
uint8_t* b_wend_dst = NULL;
if (a_dst.buf) {
b_wptr_dst = a_dst.buf->ptr + a_dst.buf->wi;
b_wstart_dst = b_wptr_dst;
b_wend_dst = b_wptr_dst;
if (!a_dst.buf->closed) {
size_t len = a_dst.buf->len - a_dst.buf->wi;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_wend_dst += len;
}
}
uint8_t* b_rptr_src = NULL;
uint8_t* b_rstart_src = NULL;
uint8_t* b_rend_src = NULL;
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
b_rstart_src = b_rptr_src;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
uint32_t coro_susp_point =
self->private_impl.c_decode_huffman[0].coro_susp_point;
if (coro_susp_point) {
v_bits = self->private_impl.c_decode_huffman[0].v_bits;
v_n_bits = self->private_impl.c_decode_huffman[0].v_n_bits;
v_table_entry = self->private_impl.c_decode_huffman[0].v_table_entry;
v_table_entry_n_bits =
self->private_impl.c_decode_huffman[0].v_table_entry_n_bits;
v_lmask = self->private_impl.c_decode_huffman[0].v_lmask;
v_dmask = self->private_impl.c_decode_huffman[0].v_dmask;
v_redir_top = self->private_impl.c_decode_huffman[0].v_redir_top;
v_redir_mask = self->private_impl.c_decode_huffman[0].v_redir_mask;
v_length = self->private_impl.c_decode_huffman[0].v_length;
v_distance = self->private_impl.c_decode_huffman[0].v_distance;
v_n_copied = self->private_impl.c_decode_huffman[0].v_n_copied;
v_hlen = self->private_impl.c_decode_huffman[0].v_hlen;
v_hdist = self->private_impl.c_decode_huffman[0].v_hdist;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
v_bits = self->private_impl.f_bits;
v_n_bits = self->private_impl.f_n_bits;
v_table_entry = 0;
v_table_entry_n_bits = 0;
v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
label_0_continue:;
while (true) {
while (true) {
v_table_entry = self->private_impl.f_huffs[0][v_bits & v_lmask];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
goto label_1_break;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_0 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_0)) << v_n_bits);
v_n_bits += 8;
}
label_1_break:;
if ((v_table_entry >> 31) != 0) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
if (b_wptr_dst == b_wend_dst) {
status = PUFFS_FLATE__SUSPENSION_SHORT_WRITE;
goto suspend;
}
*b_wptr_dst++ = ((v_table_entry >> 8) & 255);
goto label_0_continue;
} else if ((v_table_entry >> 30) != 0) {
} else if ((v_table_entry >> 29) != 0) {
goto label_0_break;
} else if ((v_table_entry >> 28) != 0) {
v_redir_top = ((v_table_entry >> 8) & 65535);
v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
while (true) {
if ((v_redir_top + (v_bits & v_redir_mask)) >= 1234) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_table_entry =
self->private_impl
.f_huffs[0][v_redir_top + (v_bits & v_redir_mask)];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
goto label_2_break;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_1 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_1)) << v_n_bits);
v_n_bits += 8;
}
label_2_break:;
if ((v_table_entry >> 31) != 0) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
if (b_wptr_dst == b_wend_dst) {
status = PUFFS_FLATE__SUSPENSION_SHORT_WRITE;
goto suspend;
}
*b_wptr_dst++ = ((v_table_entry >> 8) & 255);
goto label_0_continue;
} else if ((v_table_entry >> 30) != 0) {
} else if ((v_table_entry >> 29) != 0) {
goto label_0_break;
} else if ((v_table_entry >> 28) != 0) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
} else if ((v_table_entry >> 27) != 0) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE;
goto exit;
} else {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
} else if ((v_table_entry >> 27) != 0) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE;
goto exit;
} else {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_length = ((v_table_entry >> 8) & 32767);
v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
while (v_n_bits < v_table_entry_n_bits) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_2 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_2)) << v_n_bits);
v_n_bits += 8;
}
v_length =
((v_length + ((v_bits) & ((1 << (v_table_entry_n_bits)) - 1))) &
32767);
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
while (true) {
v_table_entry = self->private_impl.f_huffs[1][v_bits & v_dmask];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
goto label_3_break;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_3 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_3)) << v_n_bits);
v_n_bits += 8;
}
label_3_break:;
if ((v_table_entry >> 28) == 1) {
v_redir_top = ((v_table_entry >> 8) & 65535);
v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1);
while (true) {
if ((v_redir_top + (v_bits & v_redir_mask)) >= 1234) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_table_entry =
self->private_impl
.f_huffs[1][v_redir_top + (v_bits & v_redir_mask)];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
goto label_4_break;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_4 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_4)) << v_n_bits);
v_n_bits += 8;
}
label_4_break:;
if ((v_table_entry >> 31) != 0) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
}
if ((v_table_entry >> 24) != 64) {
if ((v_table_entry >> 24) == 8) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE;
goto exit;
}
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_distance = ((v_table_entry >> 8) & 32767);
v_table_entry_n_bits = ((v_table_entry >> 4) & 15);
while (v_n_bits < v_table_entry_n_bits) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_5 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_5)) << v_n_bits);
v_n_bits += 8;
}
v_distance =
((v_distance + ((v_bits) & ((1 << (v_table_entry_n_bits)) - 1))) &
32767);
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
v_n_copied = 0;
while (true) {
if (((uint64_t)(v_distance)) >
((uint64_t)(b_wptr_dst - b_wstart_dst))) {
v_hlen = 0;
v_hdist = ((uint32_t)((((uint64_t)(v_distance)) -
((uint64_t)(b_wptr_dst - b_wstart_dst)))));
if (v_length > v_hdist) {
v_length -= v_hdist;
v_hlen = v_hdist;
} else {
v_hlen = v_length;
v_length = 0;
}
if (self->private_impl.f_history_index < v_hdist) {
status = PUFFS_FLATE__ERROR_BAD_DISTANCE;
goto exit;
}
v_hdist = ((self->private_impl.f_history_index - v_hdist) & 32767);
while (true) {
v_n_copied = puffs_base__writer1__copy_from_slice32(
&b_wptr_dst, b_wend_dst,
puffs_base__slice_u8__subslice_i(
((puffs_base__slice_u8){.ptr = self->private_impl.f_history,
.len = 32768}),
v_hdist),
v_hlen);
if (v_hlen <= v_n_copied) {
v_hlen = 0;
goto label_5_break;
}
if (v_n_copied > 0) {
v_hlen -= v_n_copied;
v_hdist = ((v_hdist + v_n_copied) & 32767);
if (v_hdist == 0) {
goto label_5_break;
}
}
status = PUFFS_FLATE__SUSPENSION_SHORT_WRITE;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
}
label_5_break:;
if (v_hlen > 0) {
while (true) {
v_n_copied = puffs_base__writer1__copy_from_slice32(
&b_wptr_dst, b_wend_dst,
puffs_base__slice_u8__subslice_i(
((puffs_base__slice_u8){
.ptr = self->private_impl.f_history, .len = 32768}),
v_hdist),
v_hlen);
if (v_hlen <= v_n_copied) {
v_hlen = 0;
goto label_6_break;
}
v_hlen -= v_n_copied;
v_hdist = ((v_hdist + (v_n_copied & 32767)) & 32767);
status = PUFFS_FLATE__SUSPENSION_SHORT_WRITE;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
}
label_6_break:;
}
if (v_length == 0) {
goto label_0_continue;
}
}
v_n_copied = puffs_base__writer1__copy_from_history32(
&b_wptr_dst, b_wstart_dst, b_wend_dst, v_distance, v_length);
if (v_length <= v_n_copied) {
v_length = 0;
goto label_7_break;
}
v_length -= v_n_copied;
status = PUFFS_FLATE__SUSPENSION_SHORT_WRITE;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
}
label_7_break:;
}
label_0_break:;
self->private_impl.f_bits = v_bits;
self->private_impl.f_n_bits = v_n_bits;
goto ok;
ok:
self->private_impl.c_decode_huffman[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_decode_huffman[0].coro_susp_point = coro_susp_point;
self->private_impl.c_decode_huffman[0].v_bits = v_bits;
self->private_impl.c_decode_huffman[0].v_n_bits = v_n_bits;
self->private_impl.c_decode_huffman[0].v_table_entry = v_table_entry;
self->private_impl.c_decode_huffman[0].v_table_entry_n_bits =
v_table_entry_n_bits;
self->private_impl.c_decode_huffman[0].v_lmask = v_lmask;
self->private_impl.c_decode_huffman[0].v_dmask = v_dmask;
self->private_impl.c_decode_huffman[0].v_redir_top = v_redir_top;
self->private_impl.c_decode_huffman[0].v_redir_mask = v_redir_mask;
self->private_impl.c_decode_huffman[0].v_length = v_length;
self->private_impl.c_decode_huffman[0].v_distance = v_distance;
self->private_impl.c_decode_huffman[0].v_n_copied = v_n_copied;
self->private_impl.c_decode_huffman[0].v_hlen = v_hlen;
self->private_impl.c_decode_huffman[0].v_hdist = v_hdist;
exit:
if (a_dst.buf) {
size_t n = b_wptr_dst - (a_dst.buf->ptr + a_dst.buf->wi);
a_dst.buf->wi += n;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wstart_dst);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wend_dst);
}
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rstart_src);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rend_src);
}
return status;
short_read_src:
if (a_src.buf && a_src.buf->closed && !a_src.limit.ptr_to_len) {
status = PUFFS_FLATE__ERROR_UNEXPECTED_EOF;
goto exit;
}
status = PUFFS_FLATE__SUSPENSION_SHORT_READ;
goto suspend;
}
puffs_flate__status puffs_flate__flate_decoder__init_fixed_huffman(
puffs_flate__flate_decoder* self) {
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint32_t v_i;
uint32_t coro_susp_point =
self->private_impl.c_init_fixed_huffman[0].coro_susp_point;
if (coro_susp_point) {
v_i = self->private_impl.c_init_fixed_huffman[0].v_i;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
v_i = 0;
while (v_i < 144) {
self->private_impl.f_code_lengths[v_i] = 8;
v_i += 1;
}
while (v_i < 256) {
self->private_impl.f_code_lengths[v_i] = 9;
v_i += 1;
}
while (v_i < 280) {
self->private_impl.f_code_lengths[v_i] = 7;
v_i += 1;
}
while (v_i < 288) {
self->private_impl.f_code_lengths[v_i] = 8;
v_i += 1;
}
while (v_i < 320) {
self->private_impl.f_code_lengths[v_i] = 5;
v_i += 1;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
status = puffs_flate__flate_decoder__init_huff(self, 0, 0, 288, 257);
if (status) {
goto suspend;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
status = puffs_flate__flate_decoder__init_huff(self, 1, 288, 320, 0);
if (status) {
goto suspend;
}
goto ok;
ok:
self->private_impl.c_init_fixed_huffman[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_init_fixed_huffman[0].coro_susp_point = coro_susp_point;
self->private_impl.c_init_fixed_huffman[0].v_i = v_i;
exit:
return status;
}
puffs_flate__status puffs_flate__flate_decoder__init_dynamic_huffman(
puffs_flate__flate_decoder* self,
puffs_base__reader1 a_src) {
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint32_t v_bits;
uint32_t v_n_bits;
uint32_t v_n_lit;
uint32_t v_n_dist;
uint32_t v_n_clen;
uint32_t v_i;
uint32_t v_mask;
uint32_t v_table_entry;
uint32_t v_table_entry_n_bits;
uint32_t v_n_extra_bits;
uint8_t v_rep_symbol;
uint32_t v_rep_count;
uint8_t* b_rptr_src = NULL;
uint8_t* b_rstart_src = NULL;
uint8_t* b_rend_src = NULL;
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
b_rstart_src = b_rptr_src;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
uint32_t coro_susp_point =
self->private_impl.c_init_dynamic_huffman[0].coro_susp_point;
if (coro_susp_point) {
v_bits = self->private_impl.c_init_dynamic_huffman[0].v_bits;
v_n_bits = self->private_impl.c_init_dynamic_huffman[0].v_n_bits;
v_n_lit = self->private_impl.c_init_dynamic_huffman[0].v_n_lit;
v_n_dist = self->private_impl.c_init_dynamic_huffman[0].v_n_dist;
v_n_clen = self->private_impl.c_init_dynamic_huffman[0].v_n_clen;
v_i = self->private_impl.c_init_dynamic_huffman[0].v_i;
v_mask = self->private_impl.c_init_dynamic_huffman[0].v_mask;
v_table_entry = self->private_impl.c_init_dynamic_huffman[0].v_table_entry;
v_table_entry_n_bits =
self->private_impl.c_init_dynamic_huffman[0].v_table_entry_n_bits;
v_n_extra_bits =
self->private_impl.c_init_dynamic_huffman[0].v_n_extra_bits;
v_rep_symbol = self->private_impl.c_init_dynamic_huffman[0].v_rep_symbol;
v_rep_count = self->private_impl.c_init_dynamic_huffman[0].v_rep_count;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
v_bits = self->private_impl.f_bits;
v_n_bits = self->private_impl.f_n_bits;
while (v_n_bits < 14) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_0 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_0)) << v_n_bits);
v_n_bits += 8;
}
v_n_lit = (((v_bits) & ((1 << (5)) - 1)) + 257);
if (v_n_lit > 286) {
status = PUFFS_FLATE__ERROR_BAD_LITERAL_LENGTH_CODE_COUNT;
goto exit;
}
v_bits >>= 5;
v_n_dist = (((v_bits) & ((1 << (5)) - 1)) + 1);
if (v_n_dist > 30) {
status = PUFFS_FLATE__ERROR_BAD_DISTANCE_CODE_COUNT;
goto exit;
}
v_bits >>= 5;
v_n_clen = (((v_bits) & ((1 << (4)) - 1)) + 4);
v_bits >>= 4;
v_n_bits -= 14;
v_i = 0;
while (v_i < v_n_clen) {
while (v_n_bits < 3) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_1 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_1)) << v_n_bits);
v_n_bits += 8;
}
self->private_impl.f_code_lengths[puffs_flate__code_order[v_i]] =
((uint8_t)((v_bits & 7)));
v_bits >>= 3;
v_n_bits -= 3;
v_i += 1;
}
while (v_i < 19) {
self->private_impl.f_code_lengths[puffs_flate__code_order[v_i]] = 0;
v_i += 1;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
status = puffs_flate__flate_decoder__init_huff(self, 0, 0, 19, 4095);
if (status) {
goto suspend;
}
v_mask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
v_i = 0;
label_0_continue:;
while (v_i < (v_n_lit + v_n_dist)) {
v_table_entry = 0;
while (true) {
v_table_entry = self->private_impl.f_huffs[0][v_bits & v_mask];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
goto label_1_break;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_2 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_2)) << v_n_bits);
v_n_bits += 8;
}
label_1_break:;
if ((v_table_entry >> 24) != 128) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_table_entry = ((v_table_entry >> 8) & 255);
if (v_table_entry < 16) {
self->private_impl.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
v_i += 1;
goto label_0_continue;
}
v_n_extra_bits = 0;
v_rep_symbol = 0;
v_rep_count = 0;
if (v_table_entry == 16) {
v_n_extra_bits = 2;
if (v_i <= 0) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_LENGTH_REPETITION;
goto exit;
}
v_rep_symbol = self->private_impl.f_code_lengths[v_i - 1];
v_rep_count = 3;
} else if (v_table_entry == 17) {
v_n_extra_bits = 3;
v_rep_symbol = 0;
v_rep_count = 3;
} else if (v_table_entry == 18) {
v_n_extra_bits = 7;
v_rep_symbol = 0;
v_rep_count = 11;
} else {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
while (v_n_bits < v_n_extra_bits) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint8_t t_3 = *b_rptr_src++;
v_bits |= (((uint32_t)(t_3)) << v_n_bits);
v_n_bits += 8;
}
v_rep_count += ((v_bits) & ((1 << (v_n_extra_bits)) - 1));
v_bits >>= v_n_extra_bits;
v_n_bits -= v_n_extra_bits;
while (v_rep_count > 0) {
if (v_i >= (v_n_lit + v_n_dist)) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_LENGTH_COUNT;
goto exit;
}
self->private_impl.f_code_lengths[v_i] = v_rep_symbol;
v_i += 1;
v_rep_count -= 1;
}
}
if (v_i != (v_n_lit + v_n_dist)) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_LENGTH_COUNT;
goto exit;
}
if (self->private_impl.f_code_lengths[256] == 0) {
status = PUFFS_FLATE__ERROR_MISSING_END_OF_BLOCK_CODE;
goto exit;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
status = puffs_flate__flate_decoder__init_huff(self, 0, 0, v_n_lit, 257);
if (status) {
goto suspend;
}
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
status = puffs_flate__flate_decoder__init_huff(self, 1, v_n_lit,
(v_n_lit + v_n_dist), 0);
if (status) {
goto suspend;
}
self->private_impl.f_bits = v_bits;
self->private_impl.f_n_bits = v_n_bits;
goto ok;
ok:
self->private_impl.c_init_dynamic_huffman[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_init_dynamic_huffman[0].coro_susp_point =
coro_susp_point;
self->private_impl.c_init_dynamic_huffman[0].v_bits = v_bits;
self->private_impl.c_init_dynamic_huffman[0].v_n_bits = v_n_bits;
self->private_impl.c_init_dynamic_huffman[0].v_n_lit = v_n_lit;
self->private_impl.c_init_dynamic_huffman[0].v_n_dist = v_n_dist;
self->private_impl.c_init_dynamic_huffman[0].v_n_clen = v_n_clen;
self->private_impl.c_init_dynamic_huffman[0].v_i = v_i;
self->private_impl.c_init_dynamic_huffman[0].v_mask = v_mask;
self->private_impl.c_init_dynamic_huffman[0].v_table_entry = v_table_entry;
self->private_impl.c_init_dynamic_huffman[0].v_table_entry_n_bits =
v_table_entry_n_bits;
self->private_impl.c_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits;
self->private_impl.c_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol;
self->private_impl.c_init_dynamic_huffman[0].v_rep_count = v_rep_count;
exit:
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rstart_src);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rend_src);
}
return status;
short_read_src:
if (a_src.buf && a_src.buf->closed && !a_src.limit.ptr_to_len) {
status = PUFFS_FLATE__ERROR_UNEXPECTED_EOF;
goto exit;
}
status = PUFFS_FLATE__SUSPENSION_SHORT_READ;
goto suspend;
}
puffs_flate__status puffs_flate__flate_decoder__init_huff(
puffs_flate__flate_decoder* self,
uint32_t a_which,
uint32_t a_n_codes0,
uint32_t a_n_codes1,
uint32_t a_base_symbol) {
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint16_t v_counts[16];
uint32_t v_i;
uint32_t v_remaining;
uint16_t v_offsets[16];
uint32_t v_n_symbols;
uint32_t v_count;
uint16_t v_symbols[320];
uint32_t v_min_cl;
uint32_t v_max_cl;
uint32_t v_initial_high_bits;
uint32_t v_prev_cl;
uint32_t v_prev_redirect_key;
uint32_t v_top;
uint32_t v_next_top;
uint32_t v_code;
uint32_t v_key;
uint32_t v_value;
uint32_t v_cl;
uint32_t v_tmp;
uint32_t v_redirect_key;
uint32_t v_j;
uint32_t v_reversed_key;
uint32_t v_symbol;
uint32_t v_high_bits;
uint32_t v_delta;
memset(v_counts, 0, sizeof(v_counts));
v_i = a_n_codes0;
while (v_i < a_n_codes1) {
if (v_counts[self->private_impl.f_code_lengths[v_i]] >= 320) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_counts[self->private_impl.f_code_lengths[v_i]] += 1;
v_i += 1;
}
if ((((uint32_t)(v_counts[0])) + a_n_codes0) == a_n_codes1) {
status = PUFFS_FLATE__ERROR_NO_HUFFMAN_CODES;
goto exit;
}
v_remaining = 1;
v_i = 1;
while (v_i <= 15) {
if (v_remaining > 1073741824) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_remaining <<= 1;
if (v_remaining < ((uint32_t)(v_counts[v_i]))) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_OVER_SUBSCRIBED;
goto exit;
}
v_remaining -= ((uint32_t)(v_counts[v_i]));
v_i += 1;
}
if (v_remaining != 0) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_CODE_UNDER_SUBSCRIBED;
goto exit;
}
memset(v_offsets, 0, sizeof(v_offsets));
v_n_symbols = 0;
v_i = 1;
while (v_i <= 15) {
v_offsets[v_i] = ((uint16_t)(v_n_symbols));
v_count = ((uint32_t)(v_counts[v_i]));
if (v_n_symbols > (320 - v_count)) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_n_symbols = (v_n_symbols + v_count);
v_i += 1;
}
if (v_n_symbols > 288) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
memset(v_symbols, 0, sizeof(v_symbols));
v_i = a_n_codes0;
while (v_i < a_n_codes1) {
if (v_i < a_n_codes0) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
if (self->private_impl.f_code_lengths[v_i] != 0) {
if (v_offsets[self->private_impl.f_code_lengths[v_i]] >= 320) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_symbols[v_offsets[self->private_impl.f_code_lengths[v_i]]] =
((uint16_t)((v_i - a_n_codes0)));
v_offsets[self->private_impl.f_code_lengths[v_i]] += 1;
}
v_i += 1;
}
v_min_cl = 1;
while (true) {
if (v_counts[v_min_cl] != 0) {
goto label_0_break;
}
if (v_min_cl >= 9) {
status = PUFFS_FLATE__ERROR_BAD_HUFFMAN_MINIMUM_CODE_LENGTH;
goto exit;
}
v_min_cl += 1;
}
label_0_break:;
v_max_cl = 15;
while (true) {
if (v_counts[v_max_cl] != 0) {
goto label_1_break;
}
if (v_max_cl <= 1) {
status = PUFFS_FLATE__ERROR_NO_HUFFMAN_CODES;
goto exit;
}
v_max_cl -= 1;
}
label_1_break:;
if (v_max_cl <= 9) {
self->private_impl.f_n_huffs_bits[a_which] = v_max_cl;
} else {
self->private_impl.f_n_huffs_bits[a_which] = 9;
}
v_i = 0;
if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) ||
(v_n_symbols != ((uint32_t)(v_offsets[15])))) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
if ((a_n_codes0 + ((uint32_t)(v_symbols[0]))) >= 320) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_initial_high_bits = 512;
if (v_max_cl < 9) {
v_initial_high_bits = (((uint32_t)(1)) << v_max_cl);
}
v_prev_cl = ((uint32_t)(
self->private_impl
.f_code_lengths[a_n_codes0 + ((uint32_t)(v_symbols[0]))]));
v_prev_redirect_key = 4294967295;
v_top = 0;
v_next_top = 512;
v_code = 0;
v_key = 0;
v_value = 0;
while (true) {
if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_cl = ((uint32_t)(
self->private_impl
.f_code_lengths[a_n_codes0 + ((uint32_t)(v_symbols[v_i]))]));
if (v_cl > v_prev_cl) {
v_code <<= (v_cl - v_prev_cl);
if (v_code >= 32768) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
}
v_prev_cl = v_cl;
v_key = v_code;
if (v_cl > 9) {
v_tmp = (v_cl - 9);
v_cl = v_tmp;
v_redirect_key = ((v_key >> v_tmp) & 511);
v_key = ((v_key) & ((1 << (v_tmp)) - 1));
if (v_prev_redirect_key != v_redirect_key) {
v_prev_redirect_key = v_redirect_key;
v_remaining = (((uint32_t)(1)) << v_cl);
v_j = v_prev_cl;
while (v_j <= 15) {
if (v_remaining <= ((uint32_t)(v_counts[v_j]))) {
goto label_2_break;
}
v_remaining -= ((uint32_t)(v_counts[v_j]));
if (v_remaining > 1073741824) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_remaining <<= 1;
v_j += 1;
}
label_2_break:;
if ((v_j <= 9) || (15 < v_j)) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_tmp = (v_j - 9);
v_initial_high_bits = (((uint32_t)(1)) << v_tmp);
v_top = v_next_top;
if ((v_top + (((uint32_t)(1)) << v_tmp)) > 1234) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_next_top = (v_top + (((uint32_t)(1)) << v_tmp));
v_redirect_key =
(((uint32_t)(puffs_flate__reverse8[v_redirect_key >> 1])) |
((v_redirect_key & 1) << 8));
self->private_impl.f_huffs[a_which][v_redirect_key] =
(268435465 | (v_top << 8) | (v_tmp << 4));
}
}
if ((v_key >= 512) || (v_counts[v_prev_cl] <= 0)) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_counts[v_prev_cl] -= 1;
v_reversed_key =
(((uint32_t)(puffs_flate__reverse8[v_key >> 1])) | ((v_key & 1) << 8));
v_reversed_key >>= (9 - v_cl);
v_symbol = ((uint32_t)(v_symbols[v_i]));
if (v_symbol == 256) {
v_value = (536870912 | v_cl);
} else if ((v_symbol < 256) && (a_which == 0)) {
v_value = (2147483648 | (v_symbol << 8) | v_cl);
} else if (v_symbol >= a_base_symbol) {
v_symbol -= a_base_symbol;
if (a_which == 0) {
v_value = (puffs_flate__lcode_magic_numbers[v_symbol & 31] | v_cl);
} else {
v_value = (puffs_flate__dcode_magic_numbers[v_symbol & 31] | v_cl);
}
} else {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
v_high_bits = v_initial_high_bits;
v_delta = (((uint32_t)(1)) << v_cl);
while (v_high_bits >= v_delta) {
v_high_bits -= v_delta;
if ((v_top + ((v_high_bits | v_reversed_key) & 511)) >= 1234) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
self->private_impl
.f_huffs[a_which][v_top + ((v_high_bits | v_reversed_key) & 511)] =
v_value;
}
v_i += 1;
if (v_i >= v_n_symbols) {
goto label_3_break;
}
v_code += 1;
if (v_code >= 32768) {
status =
PUFFS_FLATE__ERROR_INTERNAL_ERROR_INCONSISTENT_HUFFMAN_DECODER_STATE;
goto exit;
}
}
label_3_break:;
exit:
return status;
}
puffs_flate__status puffs_flate__zlib_decoder__decode(
puffs_flate__zlib_decoder* self,
puffs_base__writer1 a_dst,
puffs_base__reader1 a_src) {
if (!self) {
return PUFFS_FLATE__ERROR_BAD_RECEIVER;
}
if (self->private_impl.magic != PUFFS_BASE__MAGIC) {
self->private_impl.status = PUFFS_FLATE__ERROR_INITIALIZER_NOT_CALLED;
}
if (self->private_impl.status < 0) {
return self->private_impl.status;
}
puffs_flate__status status = PUFFS_FLATE__STATUS_OK;
uint16_t v_x;
uint32_t v_checksum;
puffs_flate__status v_z;
uint8_t* b_wptr_dst = NULL;
uint8_t* b_wstart_dst = NULL;
uint8_t* b_wend_dst = NULL;
if (a_dst.buf) {
b_wptr_dst = a_dst.buf->ptr + a_dst.buf->wi;
b_wstart_dst = b_wptr_dst;
b_wend_dst = b_wptr_dst;
if (!a_dst.buf->closed) {
size_t len = a_dst.buf->len - a_dst.buf->wi;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_wend_dst += len;
}
}
uint8_t* b_rptr_src = NULL;
uint8_t* b_rstart_src = NULL;
uint8_t* b_rend_src = NULL;
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
b_rstart_src = b_rptr_src;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
uint32_t coro_susp_point = self->private_impl.c_decode[0].coro_susp_point;
if (coro_susp_point) {
v_x = self->private_impl.c_decode[0].v_x;
v_checksum = self->private_impl.c_decode[0].v_checksum;
v_z = self->private_impl.c_decode[0].v_z;
}
switch (coro_susp_point) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(0);
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
uint16_t t_1;
if (PUFFS_BASE__LIKELY(b_rend_src - b_rptr_src >= 2)) {
t_1 = puffs_base__load_u16be(b_rptr_src);
b_rptr_src += 2;
} else {
self->private_impl.c_decode[0].scratch = 0;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
while (true) {
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint32_t t_0 = self->private_impl.c_decode[0].scratch & 0xFF;
self->private_impl.c_decode[0].scratch >>= 8;
self->private_impl.c_decode[0].scratch <<= 8;
self->private_impl.c_decode[0].scratch |= ((uint64_t)(*b_rptr_src++))
<< (64 - t_0);
if (t_0 == 8) {
t_1 = self->private_impl.c_decode[0].scratch >> (64 - 16);
break;
}
t_0 += 8;
self->private_impl.c_decode[0].scratch |= ((uint64_t)(t_0));
}
}
v_x = t_1;
if (((v_x >> 8) & 15) != 8) {
status = PUFFS_FLATE__ERROR_INVALID_ZLIB_COMPRESSION_METHOD;
goto exit;
}
if ((v_x >> 12) > 7) {
status = PUFFS_FLATE__ERROR_INVALID_ZLIB_COMPRESSION_WINDOW_SIZE;
goto exit;
}
if ((v_x & 32) != 0) {
status = PUFFS_FLATE__ERROR_TODO_UNSUPPORTED_ZLIB_PRESET_DICTIONARY;
goto exit;
}
if ((v_x % 31) != 0) {
status = PUFFS_FLATE__ERROR_INVALID_ZLIB_PARITY_CHECK;
goto exit;
}
v_checksum = 0;
while (true) {
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
if (a_dst.buf) {
size_t n = b_wptr_dst - (a_dst.buf->ptr + a_dst.buf->wi);
a_dst.buf->wi += n;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
}
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
}
puffs_flate__status t_2 = puffs_flate__flate_decoder__decode(
&self->private_impl.f_flate, a_dst, a_src);
if (a_dst.buf) {
b_wptr_dst = a_dst.buf->ptr + a_dst.buf->wi;
b_wend_dst = b_wptr_dst;
if (!a_dst.buf->closed) {
size_t len = a_dst.buf->len - a_dst.buf->wi;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_wend_dst += len;
}
}
if (a_src.buf) {
b_rptr_src = a_src.buf->ptr + a_src.buf->ri;
size_t len = a_src.buf->wi - a_src.buf->ri;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len && (len > *lim->ptr_to_len)) {
len = *lim->ptr_to_len;
}
}
b_rend_src = b_rptr_src + len;
}
v_z = t_2;
v_checksum = puffs_flate__adler32__update(
&self->private_impl.f_adler, ((puffs_base__slice_u8){
.ptr = b_wstart_dst,
.len = b_wptr_dst - b_wstart_dst,
}));
if (v_z == 0) {
goto label_0_break;
}
status = v_z;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
}
label_0_break:;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
uint32_t t_4;
if (PUFFS_BASE__LIKELY(b_rend_src - b_rptr_src >= 4)) {
t_4 = puffs_base__load_u32be(b_rptr_src);
b_rptr_src += 4;
} else {
self->private_impl.c_decode[0].scratch = 0;
PUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
while (true) {
if (PUFFS_BASE__UNLIKELY(b_rptr_src == b_rend_src)) {
goto short_read_src;
}
uint32_t t_3 = self->private_impl.c_decode[0].scratch & 0xFF;
self->private_impl.c_decode[0].scratch >>= 8;
self->private_impl.c_decode[0].scratch <<= 8;
self->private_impl.c_decode[0].scratch |= ((uint64_t)(*b_rptr_src++))
<< (64 - t_3);
if (t_3 == 24) {
t_4 = self->private_impl.c_decode[0].scratch >> (64 - 32);
break;
}
t_3 += 8;
self->private_impl.c_decode[0].scratch |= ((uint64_t)(t_3));
}
}
if (v_checksum != t_4) {
status = PUFFS_FLATE__ERROR_CHECKSUM_MISMATCH;
goto exit;
}
goto ok;
ok:
self->private_impl.c_decode[0].coro_susp_point = 0;
goto exit;
}
goto suspend;
suspend:
self->private_impl.c_decode[0].coro_susp_point = coro_susp_point;
self->private_impl.c_decode[0].v_x = v_x;
self->private_impl.c_decode[0].v_checksum = v_checksum;
self->private_impl.c_decode[0].v_z = v_z;
exit:
if (a_dst.buf) {
size_t n = b_wptr_dst - (a_dst.buf->ptr + a_dst.buf->wi);
a_dst.buf->wi += n;
puffs_base__limit1* lim;
for (lim = &a_dst.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wstart_dst);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_wend_dst);
}
if (a_src.buf) {
size_t n = b_rptr_src - (a_src.buf->ptr + a_src.buf->ri);
a_src.buf->ri += n;
puffs_base__limit1* lim;
for (lim = &a_src.limit; lim; lim = lim->next) {
if (lim->ptr_to_len) {
*lim->ptr_to_len -= n;
}
}
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rstart_src);
PUFFS_BASE__IGNORE_POTENTIALLY_UNUSED_VARIABLE(b_rend_src);
}
self->private_impl.status = status;
return status;
short_read_src:
if (a_src.buf && a_src.buf->closed && !a_src.limit.ptr_to_len) {
status = PUFFS_FLATE__ERROR_UNEXPECTED_EOF;
goto exit;
}
status = PUFFS_FLATE__SUSPENSION_SHORT_READ;
goto suspend;
}
uint32_t puffs_flate__adler32__update(puffs_flate__adler32* self,
puffs_base__slice_u8 a_x) {
uint32_t v_s1;
uint32_t v_s2;
puffs_base__slice_u8 v_remaining;
v_s1 = ((self->private_impl.f_state) & ((1 << (16)) - 1));
v_s2 = ((self->private_impl.f_state) >> (32 - (16)));
while (((uint64_t)(a_x.len)) > 0) {
v_remaining = ((puffs_base__slice_u8){});
if (((uint64_t)(a_x.len)) > 5552) {
v_remaining = puffs_base__slice_u8__subslice_i(a_x, 5552);
a_x = puffs_base__slice_u8__subslice_j(a_x, 5552);
}
{
puffs_base__slice_u8 i_slice_p = a_x;
uint8_t* v_p = i_slice_p.ptr;
uint8_t* i_end0_p = i_slice_p.ptr + (i_slice_p.len / 8) * 8;
while (v_p < i_end0_p) {
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
}
uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len;
while (v_p < i_end1_p) {
v_s1 += ((uint32_t)(*v_p));
v_s2 += v_s1;
v_p++;
}
}
v_s1 %= 65521;
v_s2 %= 65521;
a_x = v_remaining;
}
self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535));
return self->private_impl.f_state;
}