diff options
author | Nigel Tao <nigeltao@golang.org> | 2022-06-03 14:17:20 +1000 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2022-06-03 14:17:53 +1000 |
commit | 123a5c6ede3c052aaf9bbef59afb9410baa2b40a (patch) | |
tree | 092c8e151e4bc0365f0ffdae3bbfd4c3984f179f | |
parent | cc74cb4d30f48c3f5e312e48a8ed87e009f62d9b (diff) | |
download | wuffs-mirror-release-c-123a5c6ede3c052aaf9bbef59afb9410baa2b40a.tar.gz |
Run script/sync.sh: 0.3.0-beta.15+3345.20220603
-rw-r--r-- | release/c/wuffs-v0.3.c | 2825 | ||||
-rw-r--r-- | sync.txt | 8 |
2 files changed, 2381 insertions, 452 deletions
diff --git a/release/c/wuffs-v0.3.c b/release/c/wuffs-v0.3.c index 11db258..7521324 100644 --- a/release/c/wuffs-v0.3.c +++ b/release/c/wuffs-v0.3.c @@ -85,15 +85,15 @@ extern "C" { // each major.minor branch, the commit count should increase monotonically. // // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision -// adfd2965cc104f3de6cccaed5095721d042c1251 committed on 2022-01-18. +// 3ff4bf46746fff230d4704f8c5a35a1665ddbd56 committed on 2022-06-03. #define WUFFS_VERSION 0x000030000 #define WUFFS_VERSION_MAJOR 0 #define WUFFS_VERSION_MINOR 3 #define WUFFS_VERSION_PATCH 0 -#define WUFFS_VERSION_PRE_RELEASE_LABEL "beta.14" -#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3273 -#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20220118 -#define WUFFS_VERSION_STRING "0.3.0-beta.14+3273.20220118" +#define WUFFS_VERSION_PRE_RELEASE_LABEL "beta.15" +#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3345 +#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20220603 +#define WUFFS_VERSION_STRING "0.3.0-beta.15+3345.20220603" // ---------------- Configuration @@ -1461,6 +1461,38 @@ wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) { } static inline wuffs_base__slice_u8 // +wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u8 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u16 // +wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u16 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u32 // +wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u32 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u64 // +wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u64 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u8 // wuffs_base__empty_slice_u8() { wuffs_base__slice_u8 ret; ret.ptr = NULL; @@ -6635,7 +6667,6 @@ struct wuffs_bmp__decoder__struct { uint64_t scratch; } s_decode_image_config[1]; struct { - wuffs_base__status v_status; uint64_t scratch; } s_decode_frame[1]; struct { @@ -6791,6 +6822,272 @@ struct wuffs_bmp__decoder__struct { // ---------------- Status Codes +extern const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[]; +extern const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[]; +extern const char wuffs_bzip2__error__bad_block_header[]; +extern const char wuffs_bzip2__error__bad_block_length[]; +extern const char wuffs_bzip2__error__bad_checksum[]; +extern const char wuffs_bzip2__error__bad_header[]; +extern const char wuffs_bzip2__error__bad_number_of_huffman_codes[]; +extern const char wuffs_bzip2__error__bad_number_of_sections[]; +extern const char wuffs_bzip2__error__unsupported_huffman_code[]; +extern const char wuffs_bzip2__error__unsupported_block_randomization[]; + +// ---------------- Public Consts + +#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_bzip2__decoder__struct wuffs_bzip2__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_bzip2__decoder__initialize( + wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_bzip2__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr<T, decltype(&free)>. + +wuffs_bzip2__decoder* +wuffs_bzip2__decoder__alloc(); + +static inline wuffs_base__io_transformer* +wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)(wuffs_bzip2__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__io_transformer* +wuffs_bzip2__decoder__upcast_as__wuffs_base__io_transformer( + wuffs_bzip2__decoder* p) { + return (wuffs_base__io_transformer*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bzip2__decoder__set_quirk_enabled( + wuffs_bzip2__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_bzip2__decoder__workbuf_len( + const wuffs_bzip2__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bzip2__decoder__transform_io( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_bzip2__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + + uint32_t f_bits; + uint32_t f_n_bits; + uint32_t f_max_incl_block_size; + uint32_t f_block_size; + bool f_decode_huffman_finished; + uint8_t f_decode_huffman_which; + uint32_t f_decode_huffman_ticks; + uint32_t f_decode_huffman_section; + uint32_t f_decode_huffman_run_shift; + uint32_t f_flush_pointer; + uint32_t f_flush_repeat_count; + uint8_t f_flush_prev; + bool f_ignore_checksum; + uint32_t f_final_checksum_have; + uint32_t f_block_checksum_have; + uint32_t f_block_checksum_want; + uint32_t f_original_pointer; + uint32_t f_num_symbols; + uint32_t f_num_huffman_codes; + uint32_t f_num_sections; + uint32_t f_code_lengths_bitmask; + + uint32_t p_transform_io[1]; + uint32_t p_prepare_block[1]; + uint32_t p_read_code_lengths[1]; + uint32_t p_flush_slow[1]; + uint32_t p_decode_huffman_slow[1]; + } private_impl; + + struct { + uint32_t f_scratch; + uint32_t f_letter_counts[256]; + uint8_t f_presence[256]; + uint8_t f_mtft[256]; + uint8_t f_huffman_selectors[32768]; + uint16_t f_huffman_trees[6][1024][2]; + uint16_t f_huffman_tables[6][256]; + uint32_t f_bwt[1048576]; + + struct { + uint32_t v_i; + uint64_t v_tag; + uint32_t v_final_checksum_want; + } s_transform_io[1]; + struct { + uint32_t v_i; + uint32_t v_selector; + } s_prepare_block[1]; + struct { + uint32_t v_i; + uint32_t v_code_length; + } s_read_code_lengths[1]; + struct { + uint32_t v_flush_pointer; + uint32_t v_flush_repeat_count; + uint8_t v_flush_prev; + uint32_t v_block_checksum_have; + uint32_t v_block_size; + uint8_t v_curr; + uint64_t scratch; + } s_flush_slow[1]; + struct { + uint32_t v_node_index; + } s_decode_huffman_slow[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr<wuffs_bzip2__decoder, decltype(&free)>; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_bzip2__decoder__alloc(), &free); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( + wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_bzip2__decoder__struct() = delete; + wuffs_bzip2__decoder__struct(const wuffs_bzip2__decoder__struct&) = delete; + wuffs_bzip2__decoder__struct& operator=( + const wuffs_bzip2__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_bzip2__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__io_transformer* + upcast_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_bzip2__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_bzip2__decoder__workbuf_len(this); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_bzip2__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_bzip2__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +// ---------------- Status Codes + extern const char wuffs_cbor__error__bad_input[]; extern const char wuffs_cbor__error__unsupported_recursion_depth[]; @@ -6922,7 +7219,6 @@ struct wuffs_cbor__decoder__struct { struct { uint64_t v_string_length; uint32_t v_depth; - uint32_t v_token_length; bool v_tagged; uint8_t v_indefinite_string_major_type; } s_decode_tokens[1]; @@ -7355,7 +7651,6 @@ struct wuffs_deflate__decoder__struct { uint32_t v_n_clen; uint32_t v_i; uint32_t v_mask; - uint32_t v_table_entry; uint32_t v_n_extra_bits; uint8_t v_rep_symbol; uint32_t v_rep_count; @@ -7363,7 +7658,6 @@ struct wuffs_deflate__decoder__struct { struct { 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; @@ -7371,7 +7665,6 @@ struct wuffs_deflate__decoder__struct { uint32_t v_redir_mask; uint32_t v_length; uint32_t v_dist_minus_1; - uint32_t v_hlen; uint64_t scratch; } s_decode_huffman_slow[1]; } private_data; @@ -7879,16 +8172,14 @@ struct wuffs_gif__decoder__struct { uint32_t f_width; uint32_t f_height; uint8_t f_call_sequence; - bool f_ignore_metadata; bool f_report_metadata_iccp; bool f_report_metadata_xmp; uint32_t f_metadata_fourcc; uint64_t f_metadata_io_position; bool f_quirks[7]; bool f_delayed_num_decoded_frames; - bool f_end_of_data; - bool f_restarted; bool f_previous_lzw_decode_ended_abruptly; + bool f_seen_header; bool f_has_global_palette; uint8_t f_interlace; bool f_seen_num_animation_loops_value; @@ -7979,7 +8270,6 @@ struct wuffs_gif__decoder__struct { struct { uint64_t v_block_size; bool v_need_block_size; - wuffs_base__status v_lzw_status; uint64_t scratch; } s_decode_id_part2[1]; } private_data; @@ -8520,9 +8810,6 @@ struct wuffs_json__decoder__struct { uint32_t v_expect; uint32_t v_expect_after_value; } s_decode_tokens[1]; - struct { - uint32_t v_neg; - } s_decode_inf_nan[1]; } private_data; #ifdef __cplusplus @@ -9180,12 +9467,13 @@ extern const char wuffs_png__error__bad_filter[]; extern const char wuffs_png__error__bad_header[]; extern const char wuffs_png__error__bad_text_chunk_not_latin_1[]; extern const char wuffs_png__error__missing_palette[]; +extern const char wuffs_png__error__unsupported_cgbi_extension[]; extern const char wuffs_png__error__unsupported_png_compression_method[]; extern const char wuffs_png__error__unsupported_png_file[]; // ---------------- Public Consts -#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 +#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015 #define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8 @@ -9360,6 +9648,7 @@ struct wuffs_png__decoder__struct { bool f_seen_gama; bool f_seen_iccp; bool f_seen_idat; + bool f_seen_ihdr; bool f_seen_plte; bool f_seen_srgb; bool f_seen_trns; @@ -16060,8 +16349,9 @@ wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, // strings). The strings may contain NUL bytes, so the "const char* magic" // value starts with the length-minus-1 of the 'magic number'. // - // Keep it sorted by magic[1], then magic[0] descending and finally by - // magic[2:]. When multiple entries match, the longest one wins. + // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer + // matches) and finally by magic[2:]. When multiple entries match, the + // longest one wins. // // The fourcc field might be negated, in which case there's further // specialization (see ยง below). @@ -16070,6 +16360,9 @@ wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, const char* magic; } table[] = { {-0x30302020, "\x01\x00\x00"}, // '00 'be + {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ + {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD + {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 {+0x424D5020, "\x01\x42\x4D"}, // BMP {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) @@ -16077,6 +16370,7 @@ wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI + {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG {+0x4A504547, "\x01\xFF\xD8"}, // JPEG }; @@ -23213,7 +23507,7 @@ wuffs_bmp__decoder__decode_image_config( self->private_impl.f_frame_config_io_position, (self->private_impl.f_channel_masks[3] == 0)); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 32; ok: self->private_impl.p_decode_image_config[0] = 0; @@ -23280,7 +23574,8 @@ wuffs_bmp__decoder__decode_frame_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -23292,13 +23587,13 @@ wuffs_bmp__decoder__decode_frame_config( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 3) { + } else if (self->private_impl.f_call_sequence == 40) { if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { status = wuffs_base__make_status(wuffs_base__error__bad_restart); goto exit; } - } else if (self->private_impl.f_call_sequence == 4) { - self->private_impl.f_call_sequence = 255; + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; } else { @@ -23321,7 +23616,7 @@ wuffs_bmp__decoder__decode_frame_config( false, 4278190080); } - self->private_impl.f_call_sequence = 4; + self->private_impl.f_call_sequence = 64; ok: self->private_impl.p_decode_frame_config[0] = 0; @@ -23390,13 +23685,11 @@ wuffs_bmp__decoder__decode_frame( } uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; - if (coro_susp_point) { - v_status = self->private_data.s_decode_frame[0].v_status; - } switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 4) { + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -23408,7 +23701,6 @@ wuffs_bmp__decoder__decode_frame( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 4) { } else { status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; @@ -23433,7 +23725,7 @@ wuffs_bmp__decoder__decode_frame( } v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, wuffs_base__pixel_buffer__pixel_format(a_dst), - wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8((self->private_data.f_scratch) + 1024, 1024)), + wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), a_blend); @@ -23508,7 +23800,7 @@ wuffs_bmp__decoder__decode_frame( iop_a_src += self->private_data.s_decode_frame[0].scratch; self->private_impl.f_pending_pad = 0; } - self->private_impl.f_call_sequence = 255; + self->private_impl.f_call_sequence = 96; ok: self->private_impl.p_decode_frame[0] = 0; @@ -23519,7 +23811,6 @@ wuffs_bmp__decoder__decode_frame( suspend: self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; - self->private_data.s_decode_frame[0].v_status = v_status; goto exit; exit: @@ -23571,7 +23862,7 @@ wuffs_bmp__decoder__swizzle_none( } v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); - v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8((self->private_data.f_scratch) + 1024, 1024)); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); label__outer__continue:; while (true) { @@ -23678,7 +23969,7 @@ wuffs_bmp__decoder__swizzle_rle( } v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); - v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8((self->private_data.f_scratch) + 1024, 1024)); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); v_rle_state = self->private_impl.f_rle_state; label__outer__continue:; @@ -23733,7 +24024,7 @@ wuffs_bmp__decoder__swizzle_rle( v_p0 += 2; } } - wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(wuffs_base__make_slice_u8(self->private_data.f_scratch, 2048), self->private_impl.f_rle_length)); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); v_rle_state = 0; goto label__middle__continue; @@ -23789,7 +24080,7 @@ wuffs_bmp__decoder__swizzle_rle( v_chunk_count -= 1; } v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); - wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(wuffs_base__make_slice_u8(self->private_data.f_scratch, 2048), v_p0)); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); } @@ -23940,7 +24231,7 @@ wuffs_bmp__decoder__swizzle_bitfields( } v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); - v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8((self->private_data.f_scratch) + 1024, 1024)); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); label__outer__continue:; while (true) { @@ -24013,7 +24304,7 @@ wuffs_bmp__decoder__swizzle_bitfields( if (v_i >= ((uint64_t)(v_dst.len))) { goto label__inner__continue; } - v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(wuffs_base__make_slice_u8(self->private_data.f_scratch, 2048), (8 * v_p0))); + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8 * v_p0))); if (v_n == 0) { status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); goto ok; @@ -24076,7 +24367,7 @@ wuffs_bmp__decoder__swizzle_low_bit_depth( } v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); - v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8((self->private_data.f_scratch) + 1024, 1024)); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); label__loop__continue:; while (true) { @@ -24182,7 +24473,7 @@ wuffs_bmp__decoder__swizzle_low_bit_depth( } } v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); - v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(wuffs_base__make_slice_u8(self->private_data.f_scratch, 2048), v_p0)); + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); if (v_n == 0) { status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); goto ok; @@ -24252,7 +24543,7 @@ wuffs_bmp__decoder__num_decoded_frame_configs( return 0; } - if (self->private_impl.f_call_sequence > 3) { + if (self->private_impl.f_call_sequence > 32) { return 1; } return 0; @@ -24271,7 +24562,7 @@ wuffs_bmp__decoder__num_decoded_frames( return 0; } - if (self->private_impl.f_call_sequence > 4) { + if (self->private_impl.f_call_sequence > 64) { return 1; } return 0; @@ -24294,13 +24585,13 @@ wuffs_bmp__decoder__restart_frame( : wuffs_base__error__initialize_not_called); } - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence < 32) { return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); } if (a_index != 0) { return wuffs_base__make_status(wuffs_base__error__bad_argument); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 40; self->private_impl.f_frame_config_io_position = a_io_position; return wuffs_base__make_status(NULL); } @@ -24566,6 +24857,1550 @@ wuffs_bmp__decoder__process_masks( #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + +// ---------------- Status Codes Implementations + +const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; +const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; +const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; +const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; +const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; +const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; +const char wuffs_bzip2__error__bad_number_of_huffman_codes[] = "#bzip2: bad number of Huffman codes"; +const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; +const char wuffs_bzip2__error__unsupported_huffman_code[] = "#bzip2: unsupported Huffman code"; +const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; +const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; + +// ---------------- Private Consts + +static const uint8_t +WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 1, 2, 3, 4, 5, 5, 5, +}; + +static const uint32_t +WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, + 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, + 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, + 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, + 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, + 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, + 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, + 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, + 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, + 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, + 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, + 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, + 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, + 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, + 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, + 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, + 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, + 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, + 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, + 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, + 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, + 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, + 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, + 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, + 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, + 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, + 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, + 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, + 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, + 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, + 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, + 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188, +}; + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_bzip2__decoder__prepare_block( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bzip2__decoder__read_code_lengths( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bzip2__decoder__build_huffman_tree( + wuffs_bzip2__decoder* self, + uint32_t a_which); + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__build_huffman_table( + wuffs_bzip2__decoder* self, + uint32_t a_which); + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__invert_bwt( + wuffs_bzip2__decoder* self); + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__flush_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst); + +static wuffs_base__status +wuffs_bzip2__decoder__flush_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst); + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +// ---------------- VTables + +const wuffs_base__io_transformer__func_ptrs +wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_bzip2__decoder__set_quirk_enabled), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_bzip2__decoder__initialize( + wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = + (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); +} + +wuffs_bzip2__decoder* +wuffs_bzip2__decoder__alloc() { + wuffs_bzip2__decoder* x = + (wuffs_bzip2__decoder*)(calloc(sizeof(wuffs_bzip2__decoder), 1)); + if (!x) { + return NULL; + } + if (wuffs_bzip2__decoder__initialize( + x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_bzip2__decoder() { + return sizeof(wuffs_bzip2__decoder); +} + +// ---------------- Function Implementations + +// -------- func bzip2.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bzip2__decoder__set_quirk_enabled( + wuffs_bzip2__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_quirk == 1) { + self->private_impl.f_ignore_checksum = a_enabled; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_bzip2__decoder__workbuf_len( + const wuffs_bzip2__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +// -------- func bzip2.decoder.transform_io + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bzip2__decoder__transform_io( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint64_t v_tag = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint32_t v_final_checksum_want = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; + if (coro_susp_point) { + v_i = self->private_data.s_transform_io[0].v_i; + v_tag = self->private_data.s_transform_io[0].v_tag; + v_final_checksum_want = self->private_data.s_transform_io[0].v_final_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + if (v_c != 66) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + if (v_c != 90) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + if (v_c != 104) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_c = t_3; + } + if ((v_c < 49) || (57 < v_c)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + self->private_impl.f_max_incl_block_size = (((uint32_t)((v_c - 48))) * 100000); + while (true) { + v_tag = 0; + v_i = 0; + while (v_i < 48) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_c = t_4; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_tag <<= 1; + v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31))); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if (v_tag == 25779555029136) { + goto label__0__break; + } else if (v_tag != 54156738319193) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + status = wuffs_bzip2__decoder__prepare_block(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_block_size = 0; + self->private_impl.f_decode_huffman_finished = false; + self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[0] & 7)]; + self->private_impl.f_decode_huffman_ticks = 50; + self->private_impl.f_decode_huffman_section = 0; + self->private_impl.f_decode_huffman_run_shift = 0; + while ( ! self->private_impl.f_decode_huffman_finished) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } else if (self->private_impl.f_decode_huffman_finished) { + goto label__1__break; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + label__1__break:; + wuffs_bzip2__decoder__invert_bwt(self); + self->private_impl.f_block_checksum_have = 4294967295; + if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12); + self->private_impl.f_flush_repeat_count = 0; + self->private_impl.f_flush_prev = 0; + while (self->private_impl.f_block_size > 0) { + wuffs_bzip2__decoder__flush_fast(self, a_dst); + if (self->private_impl.f_block_size <= 0) { + goto label__2__break; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + status = wuffs_bzip2__decoder__flush_slow(self, a_dst); + if (status.repr) { + goto suspend; + } + } + label__2__break:; + self->private_impl.f_block_checksum_have ^= 4294967295; + if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); + goto exit; + } + self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1)))); + } + label__0__break:; + v_final_checksum_want = 0; + v_i = 0; + while (v_i < 32) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_c = t_5; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_final_checksum_want <<= 1; + v_final_checksum_want |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); + goto exit; + } + + goto ok; + ok: + self->private_impl.p_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + self->private_data.s_transform_io[0].v_i = v_i; + self->private_data.s_transform_io[0].v_tag = v_tag; + self->private_data.s_transform_io[0].v_final_checksum_want = v_final_checksum_want; + + goto exit; + exit: + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func bzip2.decoder.prepare_block + +static wuffs_base__status +wuffs_bzip2__decoder__prepare_block( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_selector = 0; + uint32_t v_sel_ff = 0; + uint8_t v_movee = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_prepare_block[0]; + if (coro_susp_point) { + v_i = self->private_data.s_prepare_block[0].v_i; + v_selector = self->private_data.s_prepare_block[0].v_selector; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_block_checksum_want = 0; + v_i = 0; + while (v_i < 32) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_impl.f_block_checksum_want <<= 1; + self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) != 0) { + status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); + goto exit; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + self->private_impl.f_original_pointer = 0; + v_i = 0; + while (v_i < 24) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_impl.f_original_pointer <<= 1; + self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + v_i = 0; + while (v_i < 256) { + self->private_data.f_presence[v_i] = 0; + v_i += 1; + } + v_i = 0; + while (v_i < 256) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_c = t_3; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) != 0) { + self->private_data.f_presence[v_i] = 1; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 16; + } + self->private_data.f_scratch = 0; + v_i = 0; + label__0__continue:; + while (v_i < 256) { + if (self->private_data.f_presence[v_i] == 0) { + v_i += 16; + goto label__0__continue; + } + while (true) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_c = t_4; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_data.f_scratch += (self->private_impl.f_bits >> 31); + self->private_data.f_presence[(v_i & 255)] = ((uint8_t)((self->private_impl.f_bits >> 31))); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + if ((v_i & 15) == 0) { + goto label__1__break; + } + } + label__1__break:; + } + if ((self->private_data.f_scratch < 1) || (256 < self->private_data.f_scratch)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2); + self->private_data.f_scratch = 0; + v_i = 0; + while (v_i < 3) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_c = t_5; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_data.f_scratch <<= 1; + self->private_data.f_scratch |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if ((self->private_data.f_scratch < 2) || (6 < self->private_data.f_scratch)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; + self->private_data.f_scratch = 0; + v_i = 0; + while (v_i < 15) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_6 = *iop_a_src++; + v_c = t_6; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_data.f_scratch <<= 1; + self->private_data.f_scratch |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if ((self->private_data.f_scratch < 1) || (18001 < self->private_data.f_scratch)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + self->private_impl.f_num_sections = self->private_data.f_scratch; + v_i = 0; + while (v_i < self->private_impl.f_num_huffman_codes) { + self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_num_sections) { + v_selector = 0; + while (true) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_7 = *iop_a_src++; + v_c = t_7; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) == 0) { + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + goto label__2__break; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_selector += 1; + if (v_selector >= self->private_impl.f_num_huffman_codes) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + } + label__2__break:; + if (v_selector == 0) { + self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0]; + } else { + v_sel_ff = (v_selector & 255); + v_movee = self->private_data.f_mtft[v_sel_ff]; + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1 + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); + self->private_data.f_mtft[0] = v_movee; + self->private_data.f_huffman_selectors[v_i] = v_movee; + } + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_num_huffman_codes) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } + wuffs_bzip2__decoder__build_huffman_table(self, v_i); + v_i += 1; + } + v_i = 0; + v_j = 0; + while (v_i < 256) { + if (self->private_data.f_presence[v_i] != 0) { + self->private_data.f_mtft[(v_j & 255)] = ((uint8_t)(v_i)); + v_j += 1; + } + v_i += 1; + } + v_i = 0; + while (v_i < 256) { + self->private_data.f_letter_counts[v_i] = 0; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_prepare_block[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_prepare_block[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_prepare_block[0].v_i = v_i; + self->private_data.s_prepare_block[0].v_selector = v_selector; + + goto exit; + exit: + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.read_code_lengths + +static wuffs_base__status +wuffs_bzip2__decoder__read_code_lengths( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint32_t v_code_length = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_read_code_lengths[0]; + if (coro_susp_point) { + v_i = self->private_data.s_read_code_lengths[0].v_i; + v_code_length = self->private_data.s_read_code_lengths[0].v_code_length; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_code_lengths_bitmask = 0; + v_i = 0; + while (v_i < 5) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_code_length <<= 1; + v_code_length |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_num_symbols) { + while (true) { + if ((v_code_length < 1) || (20 < v_code_length)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) == 0) { + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + goto label__0__break; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) == 0) { + v_code_length += 1; + } else { + v_code_length -= 1; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + } + label__0__break:; + self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1)) << (v_code_length & 31)); + self->private_data.f_bwt[v_i] = v_code_length; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_read_code_lengths[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_read_code_lengths[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_read_code_lengths[0].v_i = v_i; + self->private_data.s_read_code_lengths[0].v_code_length = v_code_length; + + goto exit; + exit: + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.build_huffman_tree + +static wuffs_base__status +wuffs_bzip2__decoder__build_huffman_tree( + wuffs_bzip2__decoder* self, + uint32_t a_which) { + uint32_t v_code_length = 0; + uint32_t v_symbol_index = 0; + uint32_t v_num_nodes = 0; + uint32_t v_stack_height = 0; + uint32_t v_stack_values[21] = {0}; + uint32_t v_node_index = 0; + uint16_t v_leaf_value = 0; + + self->private_data.f_huffman_trees[a_which][0][0] = 0; + self->private_data.f_huffman_trees[a_which][0][1] = 0; + v_num_nodes = 1; + v_stack_height = 1; + v_stack_values[0] = 0; + v_code_length = 1; + label__0__continue:; + while (v_code_length <= 20) { + if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1)) << v_code_length)) == 0) { + v_code_length += 1; + goto label__0__continue; + } + v_symbol_index = 0; + label__1__continue:; + while (v_symbol_index < self->private_impl.f_num_symbols) { + if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { + v_symbol_index += 1; + goto label__1__continue; + } + while (true) { + if (v_stack_height <= 0) { + return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); + } else if (v_stack_height >= v_code_length) { + goto label__2__break; + } + v_node_index = v_stack_values[(v_stack_height - 1)]; + if (self->private_data.f_huffman_trees[a_which][v_node_index][0] == 0) { + self->private_data.f_huffman_trees[a_which][v_node_index][0] = ((uint16_t)(v_num_nodes)); + } else { + self->private_data.f_huffman_trees[a_which][v_node_index][1] = ((uint16_t)(v_num_nodes)); + } + if (v_num_nodes >= 1023) { + return wuffs_base__make_status(wuffs_bzip2__error__unsupported_huffman_code); + } + v_stack_values[v_stack_height] = v_num_nodes; + self->private_data.f_huffman_trees[a_which][v_num_nodes][0] = 0; + self->private_data.f_huffman_trees[a_which][v_num_nodes][1] = 0; + v_num_nodes += 1; + v_stack_height += 1; + } + label__2__break:; + v_node_index = v_stack_values[(v_stack_height - 1)]; + if (v_symbol_index < 2) { + v_leaf_value = ((uint16_t)((1280 + v_symbol_index))); + } else if ((v_symbol_index + 1) < self->private_impl.f_num_symbols) { + v_leaf_value = ((uint16_t)((1023 + v_symbol_index))); + } else { + v_leaf_value = 2047; + } + if (self->private_data.f_huffman_trees[a_which][v_node_index][0] == 0) { + self->private_data.f_huffman_trees[a_which][v_node_index][0] = v_leaf_value; + } else { + self->private_data.f_huffman_trees[a_which][v_node_index][1] = v_leaf_value; + v_stack_height -= 1; + while (v_stack_height > 0) { + v_node_index = v_stack_values[(v_stack_height - 1)]; + if (self->private_data.f_huffman_trees[a_which][v_node_index][1] == 0) { + goto label__3__break; + } + v_stack_height -= 1; + } + label__3__break:; + } + v_symbol_index += 1; + } + v_code_length += 1; + } + if (v_stack_height != 0) { + return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); + } + return wuffs_base__make_status(NULL); +} + +// -------- func bzip2.decoder.build_huffman_table + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__build_huffman_table( + wuffs_bzip2__decoder* self, + uint32_t a_which) { + uint32_t v_i = 0; + uint32_t v_bits = 0; + uint16_t v_n_bits = 0; + uint16_t v_child = 0; + + while (v_i < 256) { + v_bits = (v_i << 24); + v_n_bits = 0; + v_child = 0; + while ((v_child < 1024) && (v_n_bits < 8)) { + v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31)]; + v_bits <<= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_n_bits += 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)((v_child | (v_n_bits << 12)))); + v_i += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.invert_bwt + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__invert_bwt( + wuffs_bzip2__decoder* self) { + uint32_t v_i = 0; + uint32_t v_letter = 0; + uint32_t v_sum = 0; + uint32_t v_old_sum = 0; + + v_sum = 0; + v_i = 0; + while (v_i < 256) { + v_old_sum = v_sum; + v_sum += self->private_data.f_letter_counts[v_i]; + self->private_data.f_letter_counts[v_i] = v_old_sum; + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_block_size) { + v_letter = (self->private_data.f_bwt[v_i] & 255); + self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575)] |= (v_i << 12); + self->private_data.f_letter_counts[v_letter] += 1; + v_i += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.flush_fast + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__flush_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst) { + uint32_t v_flush_pointer = 0; + uint32_t v_flush_repeat_count = 0; + uint8_t v_flush_prev = 0; + uint32_t v_block_checksum_have = 0; + uint32_t v_block_size = 0; + uint32_t v_entry = 0; + uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + + v_flush_pointer = self->private_impl.f_flush_pointer; + v_flush_repeat_count = self->private_impl.f_flush_repeat_count; + v_flush_prev = self->private_impl.f_flush_prev; + v_block_checksum_have = self->private_impl.f_block_checksum_have; + v_block_size = self->private_impl.f_block_size; + while ((v_block_size > 0) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255)) { + if (v_flush_repeat_count < 4) { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + if (v_curr == v_flush_prev) { + v_flush_repeat_count += 1; + } else { + v_flush_repeat_count = 1; + } + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8))); + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); + v_flush_prev = v_curr; + v_block_size -= 1; + } else { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + v_flush_repeat_count = ((uint32_t)(v_curr)); + while (v_flush_repeat_count > 0) { + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8))); + if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); + } + v_flush_repeat_count -= 1; + } + v_flush_repeat_count = 0; + v_flush_prev = v_curr; + v_block_size -= 1; + } + } + self->private_impl.f_flush_pointer = v_flush_pointer; + self->private_impl.f_flush_repeat_count = v_flush_repeat_count; + self->private_impl.f_flush_prev = v_flush_prev; + self->private_impl.f_block_checksum_have = v_block_checksum_have; + if (v_block_size <= 900000) { + self->private_impl.f_block_size = v_block_size; + } + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.flush_slow + +static wuffs_base__status +wuffs_bzip2__decoder__flush_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_flush_pointer = 0; + uint32_t v_flush_repeat_count = 0; + uint8_t v_flush_prev = 0; + uint32_t v_block_checksum_have = 0; + uint32_t v_block_size = 0; + uint32_t v_entry = 0; + uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + + uint32_t coro_susp_point = self->private_impl.p_flush_slow[0]; + if (coro_susp_point) { + v_flush_pointer = self->private_data.s_flush_slow[0].v_flush_pointer; + v_flush_repeat_count = self->private_data.s_flush_slow[0].v_flush_repeat_count; + v_flush_prev = self->private_data.s_flush_slow[0].v_flush_prev; + v_block_checksum_have = self->private_data.s_flush_slow[0].v_block_checksum_have; + v_block_size = self->private_data.s_flush_slow[0].v_block_size; + v_curr = self->private_data.s_flush_slow[0].v_curr; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + v_flush_pointer = self->private_impl.f_flush_pointer; + v_flush_repeat_count = self->private_impl.f_flush_repeat_count; + v_flush_prev = self->private_impl.f_flush_prev; + v_block_checksum_have = self->private_impl.f_block_checksum_have; + v_block_size = self->private_impl.f_block_size; + while ((v_block_size > 0) && ! (self->private_impl.p_flush_slow[0] != 0)) { + if (v_flush_repeat_count < 4) { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + if (v_curr == v_flush_prev) { + v_flush_repeat_count += 1; + } else { + v_flush_repeat_count = 1; + } + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8))); + self->private_data.s_flush_slow[0].scratch = v_curr; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (iop_a_dst == io2_a_dst) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + goto suspend; + } + *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); + v_flush_prev = v_curr; + v_block_size -= 1; + } else { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + v_flush_repeat_count = ((uint32_t)(v_curr)); + while (v_flush_repeat_count > 0) { + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8))); + self->private_data.s_flush_slow[0].scratch = v_flush_prev; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (iop_a_dst == io2_a_dst) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + goto suspend; + } + *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); + v_flush_repeat_count -= 1; + } + v_flush_repeat_count = 0; + v_flush_prev = v_curr; + v_block_size -= 1; + } + } + self->private_impl.f_flush_pointer = v_flush_pointer; + self->private_impl.f_flush_repeat_count = v_flush_repeat_count; + self->private_impl.f_flush_prev = v_flush_prev; + self->private_impl.f_block_checksum_have = v_block_checksum_have; + if (v_block_size <= 900000) { + self->private_impl.f_block_size = v_block_size; + } + + goto ok; + ok: + self->private_impl.p_flush_slow[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_flush_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_flush_slow[0].v_flush_pointer = v_flush_pointer; + self->private_data.s_flush_slow[0].v_flush_repeat_count = v_flush_repeat_count; + self->private_data.s_flush_slow[0].v_flush_prev = v_flush_prev; + self->private_data.s_flush_slow[0].v_block_checksum_have = v_block_checksum_have; + self->private_data.s_flush_slow[0].v_block_size = v_block_size; + self->private_data.s_flush_slow[0].v_curr = v_curr; + + goto exit; + exit: + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.decode_huffman_fast + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_block_size = 0; + uint8_t v_which = 0; + uint32_t v_ticks = 0; + uint32_t v_section = 0; + uint32_t v_run_shift = 0; + uint16_t v_table_entry = 0; + uint16_t v_child = 0; + uint32_t v_child_ff = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_output = 0; + uint32_t v_run = 0; + uint32_t v_mtft0 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; + v_block_size = self->private_impl.f_block_size; + v_which = self->private_impl.f_decode_huffman_which; + v_ticks = self->private_impl.f_decode_huffman_ticks; + v_section = self->private_impl.f_decode_huffman_section; + v_run_shift = self->private_impl.f_decode_huffman_run_shift; + label__outer__continue:; + while (((uint64_t)(io2_a_src - iop_a_src)) >= 4) { + if (v_ticks > 0) { + v_ticks -= 1; + } else { + v_ticks = 49; + v_section += 1; + v_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(v_section & 32767)] & 7)]; + } + v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); + iop_a_src += ((31 - v_n_bits) >> 3); + v_n_bits |= 24; + v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24)]; + v_bits <<= (v_table_entry >> 12); + v_n_bits -= ((uint32_t)((v_table_entry >> 12))); + v_child = (v_table_entry & 2047); + while (v_child < 1024) { + v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31)]; + v_bits <<= 1; + if (v_n_bits <= 0) { + status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_n_bits -= 1; + } + if (v_child < 1280) { + v_child_ff = ((uint32_t)((v_child & 255))); + v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1 + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); + self->private_data.f_mtft[0] = ((uint8_t)(v_output)); + self->private_data.f_letter_counts[v_output] += 1; + self->private_data.f_bwt[v_block_size] = v_output; + if (v_block_size >= self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_block_size += 1; + v_run_shift = 0; + goto label__outer__continue; + } else if (v_child > 1281) { + self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; + } + if (v_run_shift >= 23) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_run = (((uint32_t)((v_child - 1279))) << v_run_shift); + v_run_shift += 1; + v_i = v_block_size; + v_j = (v_run + v_block_size); + if (v_j > self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_block_size = v_j; + v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0])); + self->private_data.f_letter_counts[v_mtft0] += v_run; + while (v_i < v_j) { + self->private_data.f_bwt[v_i] = v_mtft0; + v_i += 1; + } + } + label__outer__break:; + self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; + self->private_impl.f_block_size = v_block_size; + self->private_impl.f_decode_huffman_which = v_which; + self->private_impl.f_decode_huffman_ticks = v_ticks; + self->private_impl.f_decode_huffman_section = v_section; + self->private_impl.f_decode_huffman_run_shift = v_run_shift; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.decode_huffman_slow + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_node_index = 0; + uint16_t v_child = 0; + uint32_t v_child_ff = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_output = 0; + uint32_t v_run = 0; + uint32_t v_mtft0 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; + if (coro_susp_point) { + v_node_index = self->private_data.s_decode_huffman_slow[0].v_node_index; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { + if (self->private_impl.f_decode_huffman_ticks > 0) { + self->private_impl.f_decode_huffman_ticks -= 1; + } else { + self->private_impl.f_decode_huffman_ticks = 49; + self->private_impl.f_decode_huffman_section += 1; + self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767)] & 7)]; + } + v_node_index = 0; + label__0__continue:; + while (true) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31)]; + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + if (v_child < 1024) { + v_node_index = ((uint32_t)(v_child)); + goto label__0__continue; + } else if (v_child < 1280) { + v_child_ff = ((uint32_t)((v_child & 255))); + v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1 + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); + self->private_data.f_mtft[0] = ((uint8_t)(v_output)); + self->private_data.f_letter_counts[v_output] += 1; + self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; + if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + self->private_impl.f_block_size += 1; + self->private_impl.f_decode_huffman_run_shift = 0; + goto label__0__break; + } else if (v_child > 1281) { + self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; + } + if (self->private_impl.f_decode_huffman_run_shift >= 23) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_run = (((uint32_t)((v_child - 1279))) << self->private_impl.f_decode_huffman_run_shift); + self->private_impl.f_decode_huffman_run_shift += 1; + v_i = self->private_impl.f_block_size; + v_j = (v_run + self->private_impl.f_block_size); + if (v_j > self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + self->private_impl.f_block_size = v_j; + v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0])); + self->private_data.f_letter_counts[v_mtft0] += v_run; + while (v_i < v_j) { + self->private_data.f_bwt[v_i] = v_mtft0; + v_i += 1; + } + goto label__0__break; + } + label__0__break:; + } + label__outer__break:; + + goto ok; + ok: + self->private_impl.p_decode_huffman_slow[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_huffman_slow[0].v_node_index = v_node_index; + + goto exit; + exit: + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) // ---------------- Status Codes Implementations @@ -24778,7 +26613,6 @@ wuffs_cbor__decoder__decode_tokens( if (coro_susp_point) { v_string_length = self->private_data.s_decode_tokens[0].v_string_length; v_depth = self->private_data.s_decode_tokens[0].v_depth; - v_token_length = self->private_data.s_decode_tokens[0].v_token_length; v_tagged = self->private_data.s_decode_tokens[0].v_tagged; v_indefinite_string_major_type = self->private_data.s_decode_tokens[0].v_indefinite_string_major_type; } @@ -24867,8 +26701,6 @@ wuffs_cbor__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); - v_c_major = 0; - v_c_minor = 0; goto label__outer__continue; } status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); @@ -25289,7 +27121,6 @@ wuffs_cbor__decoder__decode_tokens( self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; self->private_data.s_decode_tokens[0].v_string_length = v_string_length; self->private_data.s_decode_tokens[0].v_depth = v_depth; - self->private_data.s_decode_tokens[0].v_token_length = v_token_length; self->private_data.s_decode_tokens[0].v_tagged = v_tagged; self->private_data.s_decode_tokens[0].v_indefinite_string_major_type = v_indefinite_string_major_type; @@ -26713,7 +28544,7 @@ wuffs_deflate__decoder__add_history( wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); self->private_impl.f_history_index = 32768; } else { - v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_i(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), (self->private_impl.f_history_index & 32767)), v_s); + v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767), 32768), v_s); if (v_n_copied < ((uint64_t)(v_s.len))) { v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); @@ -26726,7 +28557,7 @@ wuffs_deflate__decoder__add_history( self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767) + ((uint32_t)((v_n_copied & 32767))) + v_already_full); } } - wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8((self->private_data.f_history) + 32768, 257), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); return wuffs_base__make_empty_struct(); } @@ -27230,7 +29061,6 @@ wuffs_deflate__decoder__init_dynamic_huffman( v_n_clen = self->private_data.s_init_dynamic_huffman[0].v_n_clen; v_i = self->private_data.s_init_dynamic_huffman[0].v_i; v_mask = self->private_data.s_init_dynamic_huffman[0].v_mask; - v_table_entry = self->private_data.s_init_dynamic_huffman[0].v_table_entry; v_n_extra_bits = self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits; v_rep_symbol = self->private_data.s_init_dynamic_huffman[0].v_rep_symbol; v_rep_count = self->private_data.s_init_dynamic_huffman[0].v_rep_count; @@ -27430,7 +29260,6 @@ wuffs_deflate__decoder__init_dynamic_huffman( self->private_data.s_init_dynamic_huffman[0].v_n_clen = v_n_clen; self->private_data.s_init_dynamic_huffman[0].v_i = v_i; self->private_data.s_init_dynamic_huffman[0].v_mask = v_mask; - self->private_data.s_init_dynamic_huffman[0].v_table_entry = v_table_entry; self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits; self->private_data.s_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol; self->private_data.s_init_dynamic_huffman[0].v_rep_count = v_rep_count; @@ -27859,7 +29688,7 @@ wuffs_deflate__decoder__decode_huffman_bmi2( goto exit; } wuffs_base__io_writer__limited_copy_u32_from_slice( - &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__slice_u8__subslice_i(wuffs_base__make_slice_u8(self->private_data.f_history, 33025), ((self->private_impl.f_history_index - v_hdist) & 32767))); + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); if (v_length == 0) { goto label__loop__continue; } @@ -28124,7 +29953,7 @@ wuffs_deflate__decoder__decode_huffman_fast32( goto exit; } wuffs_base__io_writer__limited_copy_u32_from_slice( - &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__slice_u8__subslice_i(wuffs_base__make_slice_u8(self->private_data.f_history, 33025), ((self->private_impl.f_history_index - v_hdist) & 32767))); + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); if (v_length == 0) { goto label__loop__continue; } @@ -28336,7 +30165,7 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( goto exit; } wuffs_base__io_writer__limited_copy_u32_from_slice( - &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__slice_u8__subslice_i(wuffs_base__make_slice_u8(self->private_data.f_history, 33025), ((self->private_impl.f_history_index - v_hdist) & 32767))); + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); if (v_length == 0) { goto label__loop__continue; } @@ -28448,7 +30277,6 @@ wuffs_deflate__decoder__decode_huffman_slow( if (coro_susp_point) { v_bits = self->private_data.s_decode_huffman_slow[0].v_bits; v_n_bits = self->private_data.s_decode_huffman_slow[0].v_n_bits; - v_table_entry = self->private_data.s_decode_huffman_slow[0].v_table_entry; v_table_entry_n_bits = self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits; v_lmask = self->private_data.s_decode_huffman_slow[0].v_lmask; v_dmask = self->private_data.s_decode_huffman_slow[0].v_dmask; @@ -28456,7 +30284,6 @@ wuffs_deflate__decoder__decode_huffman_slow( v_redir_mask = self->private_data.s_decode_huffman_slow[0].v_redir_mask; v_length = self->private_data.s_decode_huffman_slow[0].v_length; v_dist_minus_1 = self->private_data.s_decode_huffman_slow[0].v_dist_minus_1; - v_hlen = self->private_data.s_decode_huffman_slow[0].v_hlen; } switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; @@ -28668,7 +30495,7 @@ wuffs_deflate__decoder__decode_huffman_slow( goto exit; } v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_slice( - &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__slice_u8__subslice_i(wuffs_base__make_slice_u8(self->private_data.f_history, 33025), ((self->private_impl.f_history_index - v_hdist) & 32767))); + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); if (v_n_copied < v_hlen) { v_length -= v_n_copied; status = wuffs_base__make_status(wuffs_base__suspension__short_write); @@ -28708,7 +30535,6 @@ wuffs_deflate__decoder__decode_huffman_slow( self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; self->private_data.s_decode_huffman_slow[0].v_bits = v_bits; self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits; - self->private_data.s_decode_huffman_slow[0].v_table_entry = v_table_entry; self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits = v_table_entry_n_bits; self->private_data.s_decode_huffman_slow[0].v_lmask = v_lmask; self->private_data.s_decode_huffman_slow[0].v_dmask = v_dmask; @@ -28716,7 +30542,6 @@ wuffs_deflate__decoder__decode_huffman_slow( self->private_data.s_decode_huffman_slow[0].v_redir_mask = v_redir_mask; self->private_data.s_decode_huffman_slow[0].v_length = v_length; self->private_data.s_decode_huffman_slow[0].v_dist_minus_1 = v_dist_minus_1; - self->private_data.s_decode_huffman_slow[0].v_hlen = v_hlen; goto exit; exit: @@ -29195,8 +31020,7 @@ wuffs_lzw__decoder__write_to( status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); goto exit; } - v_s = wuffs_base__slice_u8__subslice_ij(wuffs_base__make_slice_u8(self->private_data.f_output, - 8199), + v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, self->private_impl.f_output_ri, self->private_impl.f_output_wi); v_n = wuffs_base__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); @@ -29244,8 +31068,7 @@ wuffs_lzw__decoder__flush( wuffs_base__slice_u8 v_s = {0}; if (self->private_impl.f_output_ri <= self->private_impl.f_output_wi) { - v_s = wuffs_base__slice_u8__subslice_ij(wuffs_base__make_slice_u8(self->private_data.f_output, - 8199), + v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, self->private_impl.f_output_ri, self->private_impl.f_output_wi); } @@ -29557,7 +31380,10 @@ wuffs_gif__decoder__decode_image_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence == 0) { + if (self->private_impl.f_call_sequence != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if ( ! self->private_impl.f_seen_header) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); status = wuffs_gif__decoder__decode_header(self, a_src); if (status.repr) { @@ -29568,9 +31394,7 @@ wuffs_gif__decoder__decode_image_config( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence != 2) { - status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); - goto exit; + self->private_impl.f_seen_header = true; } WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); @@ -29600,7 +31424,9 @@ wuffs_gif__decoder__decode_image_config( self->private_impl.f_frame_config_io_position, v_ffio); } - self->private_impl.f_call_sequence = 3; + if (self->private_impl.f_call_sequence == 0) { + self->private_impl.f_call_sequence = 32; + } goto ok; ok: @@ -29689,7 +31515,7 @@ wuffs_gif__decoder__tell_me_more( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence != 1) { + if ((self->private_impl.f_call_sequence & 16) == 0) { status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); goto exit; } @@ -29760,7 +31586,7 @@ wuffs_gif__decoder__tell_me_more( self->private_impl.f_metadata_io_position, self->private_impl.f_metadata_io_position); } - self->private_impl.f_call_sequence = 2; + self->private_impl.f_call_sequence &= 239; self->private_impl.f_metadata_fourcc = 0; self->private_impl.f_metadata_io_position = 0; status = wuffs_base__make_status(NULL); @@ -29895,16 +31721,17 @@ wuffs_gif__decoder__restart_frame( : wuffs_base__error__initialize_not_called); } - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence < 32) { return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } else if (a_io_position == 0) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); } self->private_impl.f_delayed_num_decoded_frames = false; - self->private_impl.f_end_of_data = false; - self->private_impl.f_restarted = true; self->private_impl.f_frame_config_io_position = a_io_position; self->private_impl.f_num_decoded_frame_configs_value = a_index; self->private_impl.f_num_decoded_frames_value = a_index; wuffs_gif__decoder__reset_gc(self); + self->private_impl.f_call_sequence = 40; return wuffs_base__make_status(NULL); } @@ -29957,52 +31784,65 @@ wuffs_gif__decoder__decode_frame_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - self->private_impl.f_ignore_metadata = true; self->private_impl.f_dirty_max_excl_y = 0; - if ( ! self->private_impl.f_end_of_data) { - if (self->private_impl.f_call_sequence == 0) { - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); - status = wuffs_gif__decoder__decode_image_config(self, NULL, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; - } - } else if (self->private_impl.f_call_sequence != 3) { - if (self->private_impl.f_call_sequence == 4) { - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); - status = wuffs_gif__decoder__skip_frame(self, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; - } - } - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); - status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; - } + if ((self->private_impl.f_call_sequence & 16) != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - } - if (self->private_impl.f_end_of_data) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_gif__decoder__decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_gif__decoder__skip_frame(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_call_sequence >= 96) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + } else { status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; } + if ((self->private_impl.f_num_decoded_frame_configs_value > 0) || (self->private_impl.f_call_sequence == 40)) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_call_sequence >= 96) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + } v_background_color = self->private_impl.f_black_color_u32_argb_premul; if ( ! self->private_impl.f_gc_has_transparent_index) { v_background_color = self->private_impl.f_background_color_u32_argb_premul; @@ -30034,7 +31874,7 @@ wuffs_gif__decoder__decode_frame_config( v_background_color); } wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1); - self->private_impl.f_call_sequence = 4; + self->private_impl.f_call_sequence = 64; ok: self->private_impl.p_decode_frame_config[0] = 0; @@ -30135,6 +31975,7 @@ wuffs_gif__decoder__skip_frame( wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); } wuffs_gif__decoder__reset_gc(self); + self->private_impl.f_call_sequence = 32; goto ok; ok: @@ -30190,13 +32031,16 @@ wuffs_gif__decoder__decode_frame( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - self->private_impl.f_ignore_metadata = true; - if (self->private_impl.f_call_sequence != 4) { + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); status = wuffs_gif__decoder__decode_frame_config(self, NULL, a_src); if (status.repr) { goto suspend; } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; } if (self->private_impl.f_quirks[5] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); @@ -30214,8 +32058,8 @@ wuffs_gif__decoder__decode_frame( } wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); wuffs_gif__decoder__reset_gc(self); + self->private_impl.f_call_sequence = 32; - goto ok; ok: self->private_impl.p_decode_frame[0] = 0; goto exit; @@ -30239,7 +32083,6 @@ wuffs_gif__decoder__decode_frame( static wuffs_base__empty_struct wuffs_gif__decoder__reset_gc( wuffs_gif__decoder* self) { - self->private_impl.f_call_sequence = 5; self->private_impl.f_gc_has_transparent_index = false; self->private_impl.f_gc_transparent_index = 0; self->private_impl.f_gc_disposal = 0; @@ -30272,15 +32115,8 @@ wuffs_gif__decoder__decode_up_to_id_part1( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if ( ! self->private_impl.f_restarted) { - if (self->private_impl.f_call_sequence != 2) { - self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); - } - } else if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { - status = wuffs_base__make_status(wuffs_base__error__bad_restart); - goto exit; - } else { - self->private_impl.f_restarted = false; + if ((self->private_impl.f_frame_config_io_position == 0) || (self->private_impl.f_num_decoded_frame_configs_value > 0)) { + self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); } while (true) { { @@ -30326,7 +32162,7 @@ wuffs_gif__decoder__decode_up_to_id_part1( self->private_impl.f_delayed_num_decoded_frames = false; wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); } - self->private_impl.f_end_of_data = true; + self->private_impl.f_call_sequence = 96; goto label__0__break; } } @@ -30958,17 +32794,17 @@ wuffs_gif__decoder__decode_ae( if ((0 < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535)) { self->private_impl.f_num_animation_loops_value += 1; } - } else if (self->private_impl.f_ignore_metadata) { + } else if (self->private_impl.f_call_sequence >= 32) { } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { self->private_impl.f_metadata_fourcc = 1229144912; self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); - self->private_impl.f_call_sequence = 1; + self->private_impl.f_call_sequence = 16; status = wuffs_base__make_status(wuffs_base__note__metadata_reported); goto ok; } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { self->private_impl.f_metadata_fourcc = 1481461792; self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); - self->private_impl.f_call_sequence = 1; + self->private_impl.f_call_sequence = 16; status = wuffs_base__make_status(wuffs_base__note__metadata_reported); goto ok; } @@ -31283,7 +33119,7 @@ wuffs_gif__decoder__decode_id_part0( self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; - if ((self->private_impl.f_call_sequence == 0) && ! self->private_impl.f_quirks[4]) { + if ((self->private_impl.f_num_decoded_frame_configs_value == 0) && ! self->private_impl.f_quirks[4]) { self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); } @@ -31520,7 +33356,6 @@ wuffs_gif__decoder__decode_id_part2( if (coro_susp_point) { v_block_size = self->private_data.s_decode_id_part2[0].v_block_size; v_need_block_size = self->private_data.s_decode_id_part2[0].v_need_block_size; - v_lzw_status = self->private_data.s_decode_id_part2[0].v_lzw_status; } switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; @@ -31557,7 +33392,7 @@ wuffs_gif__decoder__decode_id_part2( goto label__0__break; } v_n_copied = wuffs_base__io_reader__limited_copy_u32_to_slice( - &iop_a_src, io2_a_src,((uint32_t)((v_n_compressed & 4294967295))), wuffs_base__slice_u8__subslice_i(wuffs_base__make_slice_u8(self->private_data.f_compressed, 4096), self->private_impl.f_compressed_wi)); + &iop_a_src, io2_a_src,((uint32_t)((v_n_compressed & 4294967295))), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); wuffs_base__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); if (v_block_size > 0) { @@ -31589,8 +33424,7 @@ wuffs_gif__decoder__decode_id_part2( &io0_v_r, &io1_v_r, &io2_v_r, - wuffs_base__slice_u8__subslice_ij(wuffs_base__make_slice_u8(self->private_data.f_compressed, - 4096), + wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_ri, self->private_impl.f_compressed_wi), 0); @@ -31698,7 +33532,6 @@ wuffs_gif__decoder__decode_id_part2( self->private_impl.p_decode_id_part2[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; self->private_data.s_decode_id_part2[0].v_block_size = v_block_size; self->private_data.s_decode_id_part2[0].v_need_block_size = v_need_block_size; - self->private_data.s_decode_id_part2[0].v_lzw_status = v_lzw_status; goto exit; exit: @@ -32890,7 +34723,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); - v_whitespace_length = 0; goto label__outer__continue; } v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); @@ -32952,7 +34784,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); - v_string_length = 0; goto label__string_loop_outer__continue; } while (((uint64_t)(io2_a_src - iop_a_src)) > 4) { @@ -33016,8 +34847,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8))); @@ -33046,8 +34875,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16); @@ -33090,9 +34917,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); - v_string_length = 0; - v_uni4_value = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4) >> 16); @@ -33148,8 +34972,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2); @@ -33203,8 +35025,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); @@ -33254,8 +35074,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); @@ -33299,8 +35117,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); @@ -33346,8 +35162,6 @@ wuffs_json__decoder__decode_tokens( } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); - v_string_length = 0; - v_char = 0; goto label__string_loop_outer__continue; } v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); @@ -34137,102 +35951,102 @@ wuffs_json__decoder__decode_comment( v_length = 2; label__comment_block__continue:; while (true) { - if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { - status = wuffs_base__make_status(wuffs_base__suspension__short_write); + if (((uint64_t)(io2_a_src - iop_a_src)) <= 1) { + if (v_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + } v_length = 0; goto label__comment_block__continue; } - while (true) { - if (((uint64_t)(io2_a_src - iop_a_src)) <= 1) { - if (v_length > 0) { - *iop_a_dst++ = wuffs_base__make_token( - (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | - (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | - (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - } - if (a_src && a_src->meta.closed) { - status = wuffs_base__make_status(wuffs_json__error__bad_input); - goto exit; - } - status = wuffs_base__make_status(wuffs_base__suspension__short_read); - WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); - v_length = 0; - goto label__comment_block__continue; - } - v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); - if (v_c2 == 12074) { - iop_a_src += 2; - *iop_a_dst++ = wuffs_base__make_token( - (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | - (((uint64_t)((v_length + 2))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - self->private_impl.f_comment_type = 1; - status = wuffs_base__make_status(NULL); - goto ok; - } - iop_a_src += 1; - if (v_length >= 65533) { - *iop_a_dst++ = wuffs_base__make_token( - (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | - (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | - (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - v_length = 0; - goto label__comment_block__continue; + v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + if (v_c2 == 12074) { + iop_a_src += 2; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)((v_length + 2))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + self->private_impl.f_comment_type = 1; + status = wuffs_base__make_status(NULL); + goto ok; + } + iop_a_src += 1; + if (v_length >= 65533) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); } - v_length += 1; + v_length = 0; + goto label__comment_block__continue; } + v_length += 1; } } else if ((v_c2 == 12079) && self->private_impl.f_quirks[12]) { iop_a_src += 2; v_length = 2; label__comment_line__continue:; while (true) { - if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { - status = wuffs_base__make_status(wuffs_base__suspension__short_write); - WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); - v_length = 0; - goto label__comment_line__continue; - } - while (true) { - if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { - if (a_src && a_src->meta.closed) { - *iop_a_dst++ = wuffs_base__make_token( - (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | - (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - self->private_impl.f_comment_type = 2; - status = wuffs_base__make_status(NULL); - goto ok; - } else if (v_length > 0) { - *iop_a_dst++ = wuffs_base__make_token( - (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | - (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | - (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - } - status = wuffs_base__make_status(wuffs_base__suspension__short_read); - WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); - v_length = 0; - goto label__comment_line__continue; - } - v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); - if (v_c == 10) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { *iop_a_dst++ = wuffs_base__make_token( (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); self->private_impl.f_comment_type = 2; status = wuffs_base__make_status(NULL); goto ok; - } - iop_a_src += 1; - if (v_length >= 65533) { + } else if (v_length > 0) { *iop_a_dst++ = wuffs_base__make_token( (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | - (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - v_length = 0; - goto label__comment_line__continue; + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); } - v_length += 1; + v_length = 0; + goto label__comment_line__continue; } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (v_c == 10) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + self->private_impl.f_comment_type = 2; + status = wuffs_base__make_status(NULL); + goto ok; + } + iop_a_src += 1; + if (v_length >= 65533) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + } + v_length = 0; + goto label__comment_line__continue; + } + v_length += 1; } } @@ -34294,9 +36108,6 @@ wuffs_json__decoder__decode_inf_nan( } uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan[0]; - if (coro_susp_point) { - v_neg = self->private_data.s_decode_inf_nan[0].v_neg; - } switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; @@ -34404,7 +36215,6 @@ wuffs_json__decoder__decode_inf_nan( goto suspend; suspend: self->private_impl.p_decode_inf_nan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; - self->private_data.s_decode_inf_nan[0].v_neg = v_neg; goto exit; exit: @@ -34468,23 +36278,21 @@ wuffs_json__decoder__decode_trailer( if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { status = wuffs_base__make_status(wuffs_base__suspension__short_write); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); - v_whitespace_length = 0; goto label__outer__continue; } + v_whitespace_length = 0; while (true) { if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { if (v_whitespace_length > 0) { *iop_a_dst++ = wuffs_base__make_token( (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - v_whitespace_length = 0; } if (a_src && a_src->meta.closed) { goto label__outer__break; } status = wuffs_base__make_status(wuffs_base__suspension__short_read); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); - v_whitespace_length = 0; goto label__outer__continue; } v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); @@ -34493,7 +36301,6 @@ wuffs_json__decoder__decode_trailer( *iop_a_dst++ = wuffs_base__make_token( (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - v_whitespace_length = 0; } if (self->private_impl.f_trailer_stop > 0) { status = wuffs_base__make_status(wuffs_json__error__bad_input); @@ -34516,8 +36323,6 @@ wuffs_json__decoder__decode_trailer( if (status.repr) { goto suspend; } - v_c = 0; - v_whitespace_length = 0; if (self->private_impl.f_comment_type > 0) { goto label__outer__continue; } @@ -34529,7 +36334,6 @@ wuffs_json__decoder__decode_trailer( *iop_a_dst++ = wuffs_base__make_token( (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | (((uint64_t)((v_whitespace_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); - v_whitespace_length = 0; if (v_c == self->private_impl.f_trailer_stop) { status = wuffs_base__make_status(NULL); goto ok; @@ -34904,7 +36708,7 @@ wuffs_nie__decoder__decode_image_config( 16, false); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 32; goto ok; ok: @@ -34972,7 +36776,8 @@ wuffs_nie__decoder__decode_frame_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -34984,13 +36789,13 @@ wuffs_nie__decoder__decode_frame_config( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 3) { + } else if (self->private_impl.f_call_sequence == 40) { if (16 != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { status = wuffs_base__make_status(wuffs_base__error__bad_restart); goto exit; } - } else if (self->private_impl.f_call_sequence == 4) { - self->private_impl.f_call_sequence = 255; + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; } else { @@ -35013,7 +36818,7 @@ wuffs_nie__decoder__decode_frame_config( false, 0); } - self->private_impl.f_call_sequence = 4; + self->private_impl.f_call_sequence = 64; ok: self->private_impl.p_decode_frame_config[0] = 0; @@ -35074,13 +36879,13 @@ wuffs_nie__decoder__decode_frame( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 4) { + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); status = wuffs_nie__decoder__decode_frame_config(self, NULL, a_src); if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 4) { } else { status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; @@ -35121,7 +36926,7 @@ wuffs_nie__decoder__decode_frame( WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); } label__0__break:; - self->private_impl.f_call_sequence = 255; + self->private_impl.f_call_sequence = 96; ok: self->private_impl.p_decode_frame[0] = 0; @@ -35271,7 +37076,7 @@ wuffs_nie__decoder__num_decoded_frame_configs( return 0; } - if (self->private_impl.f_call_sequence > 3) { + if (self->private_impl.f_call_sequence > 32) { return 1; } return 0; @@ -35290,7 +37095,7 @@ wuffs_nie__decoder__num_decoded_frames( return 0; } - if (self->private_impl.f_call_sequence > 4) { + if (self->private_impl.f_call_sequence > 64) { return 1; } return 0; @@ -35313,13 +37118,13 @@ wuffs_nie__decoder__restart_frame( : wuffs_base__error__initialize_not_called); } - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence < 32) { return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); } if ((a_index != 0) || (a_io_position != 16)) { return wuffs_base__make_status(wuffs_base__error__bad_argument); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 40; return wuffs_base__make_status(NULL); } @@ -35864,6 +37669,7 @@ const char wuffs_png__error__bad_filter[] = "#png: bad filter"; const char wuffs_png__error__bad_header[] = "#png: bad header"; const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; const char wuffs_png__error__missing_palette[] = "#png: missing palette"; +const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; @@ -36109,7 +37915,8 @@ wuffs_png__decoder__choose_filter_implementations( static wuffs_base__status wuffs_png__decoder__decode_other_chunk( wuffs_png__decoder* self, - wuffs_base__io_buffer* a_src); + wuffs_base__io_buffer* a_src, + bool a_framy); static wuffs_base__status wuffs_png__decoder__decode_actl( @@ -37785,16 +39592,10 @@ wuffs_png__decoder__decode_image_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence == 2) { - if (self->private_impl.f_metadata_fourcc != 0) { - self->private_impl.f_call_sequence = 1; - status = wuffs_base__make_status(wuffs_base__note__metadata_reported); - goto ok; - } - } else if (self->private_impl.f_call_sequence != 0) { + if (self->private_impl.f_call_sequence != 0) { status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); goto exit; - } else { + } else if ( ! self->private_impl.f_seen_ihdr) { { WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); uint64_t t_0; @@ -37858,6 +39659,10 @@ wuffs_png__decoder__decode_image_config( v_magic = t_1; } if (v_magic != 5927942488114331648) { + if (v_magic == 5278895250759221248) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); + goto exit; + } status = wuffs_base__make_status(wuffs_png__error__bad_header); goto exit; } @@ -37923,6 +39728,11 @@ wuffs_png__decoder__decode_image_config( status = wuffs_base__make_status(wuffs_png__error__bad_checksum); goto exit; } + self->private_impl.f_seen_ihdr = true; + } else if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 16; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; } while (true) { while (((uint64_t)(io2_a_src - iop_a_src)) < 8) { @@ -37963,7 +39773,7 @@ wuffs_png__decoder__decode_image_config( if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src); + wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); v_status = t_4; if (a_src) { iop_a_src = a_src->data.ptr + a_src->meta.ri; @@ -37980,7 +39790,7 @@ wuffs_png__decoder__decode_image_config( } label__2__break:; if (self->private_impl.f_metadata_fourcc != 0) { - self->private_impl.f_call_sequence = 1; + self->private_impl.f_call_sequence = 16; status = wuffs_base__make_status(wuffs_base__note__metadata_reported); goto ok; } @@ -38045,7 +39855,7 @@ wuffs_png__decoder__decode_image_config( self->private_impl.f_first_disposal = 0; self->private_impl.f_first_overwrite_instead_of_blend = false; } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 32; ok: self->private_impl.p_decode_image_config[0] = 0; @@ -38425,7 +40235,8 @@ wuffs_png__decoder__choose_filter_implementations( static wuffs_base__status wuffs_png__decoder__decode_other_chunk( wuffs_png__decoder* self, - wuffs_base__io_buffer* a_src) { + wuffs_base__io_buffer* a_src, + bool a_framy) { wuffs_base__status status = wuffs_base__make_status(NULL); const uint8_t* iop_a_src = NULL; @@ -38443,7 +40254,7 @@ wuffs_png__decoder__decode_other_chunk( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_chunk_type == 1163152464) { + if ((self->private_impl.f_chunk_type == 1163152464) && ! a_framy) { if (self->private_impl.f_seen_plte) { status = wuffs_base__make_status(wuffs_png__error__bad_chunk); goto exit; @@ -38470,43 +40281,8 @@ wuffs_png__decoder__decode_other_chunk( status = wuffs_base__make_status(wuffs_png__error__bad_chunk); goto exit; } - } else if (self->private_impl.f_chunk_type == 1280598881) { - if (self->private_impl.f_seen_actl) { - status = wuffs_base__make_status(wuffs_png__error__bad_chunk); - goto exit; - } - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); - status = wuffs_png__decoder__decode_actl(self, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; - } - self->private_impl.f_seen_actl = true; - } else if (self->private_impl.f_chunk_type == 1297238115) { - if (self->private_impl.f_report_metadata_chrm) { - if (self->private_impl.f_seen_chrm) { - status = wuffs_base__make_status(wuffs_png__error__bad_chunk); - goto exit; - } - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); - status = wuffs_png__decoder__decode_chrm(self, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; - } - self->private_impl.f_seen_chrm = true; - } - } else if (self->private_impl.f_chunk_type == 1716082789) { + } + if (self->private_impl.f_chunk_type == 1716082789) { if (self->private_impl.f_report_metadata_exif) { if (self->private_impl.f_seen_exif) { status = wuffs_base__make_status(wuffs_png__error__bad_chunk); @@ -38515,7 +40291,7 @@ wuffs_png__decoder__decode_other_chunk( if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); status = wuffs_png__decoder__decode_exif(self, a_src); if (a_src) { iop_a_src = a_src->data.ptr + a_src->meta.ri; @@ -38525,104 +40301,142 @@ wuffs_png__decoder__decode_other_chunk( } self->private_impl.f_seen_exif = true; } - } else if (self->private_impl.f_chunk_type == 1280598886) { - if (self->private_impl.f_seen_fctl) { - status = wuffs_base__make_status(wuffs_png__error__bad_chunk); - goto exit; - } - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); - status = wuffs_png__decoder__decode_fctl(self, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; + } else if ((self->private_impl.f_chunk_type == 1951945833) || (self->private_impl.f_chunk_type == 1951942004) || (self->private_impl.f_chunk_type == 1951945850)) { + if (self->private_impl.f_report_metadata_kvp) { + self->private_impl.f_metadata_flavor = 4; + self->private_impl.f_metadata_fourcc = 1263947851; + self->private_impl.f_metadata_x = 0; + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; } - self->private_impl.f_seen_fctl = true; - } else if (self->private_impl.f_chunk_type == 1095582055) { - if (self->private_impl.f_report_metadata_gama) { - if (self->private_impl.f_seen_gama) { + } else if ( ! a_framy) { + if (self->private_impl.f_chunk_type == 1280598881) { + if (self->private_impl.f_seen_actl) { status = wuffs_base__make_status(wuffs_png__error__bad_chunk); goto exit; } if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); - status = wuffs_png__decoder__decode_gama(self, a_src); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_png__decoder__decode_actl(self, a_src); if (a_src) { iop_a_src = a_src->data.ptr + a_src->meta.ri; } if (status.repr) { goto suspend; } - self->private_impl.f_seen_gama = true; - } - } else if (self->private_impl.f_chunk_type == 1346585449) { - if (self->private_impl.f_report_metadata_iccp) { - if (self->private_impl.f_seen_iccp) { + self->private_impl.f_seen_actl = true; + } else if (self->private_impl.f_chunk_type == 1297238115) { + if (self->private_impl.f_report_metadata_chrm) { + if (self->private_impl.f_seen_chrm) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + status = wuffs_png__decoder__decode_chrm(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_chrm = true; + } + } else if (self->private_impl.f_chunk_type == 1280598886) { + if (self->private_impl.f_seen_fctl) { status = wuffs_base__make_status(wuffs_png__error__bad_chunk); goto exit; } if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); - status = wuffs_png__decoder__decode_iccp(self, a_src); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + status = wuffs_png__decoder__decode_fctl(self, a_src); if (a_src) { iop_a_src = a_src->data.ptr + a_src->meta.ri; } if (status.repr) { goto suspend; } - self->private_impl.f_seen_iccp = true; - } - } else if (self->private_impl.f_chunk_type == 1111970419) { - if (self->private_impl.f_report_metadata_srgb) { - if (self->private_impl.f_seen_srgb) { + self->private_impl.f_seen_fctl = true; + } else if (self->private_impl.f_chunk_type == 1095582055) { + if (self->private_impl.f_report_metadata_gama) { + if (self->private_impl.f_seen_gama) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + status = wuffs_png__decoder__decode_gama(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_gama = true; + } + } else if (self->private_impl.f_chunk_type == 1346585449) { + if (self->private_impl.f_report_metadata_iccp) { + if (self->private_impl.f_seen_iccp) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + status = wuffs_png__decoder__decode_iccp(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_iccp = true; + } + } else if (self->private_impl.f_chunk_type == 1111970419) { + if (self->private_impl.f_report_metadata_srgb) { + if (self->private_impl.f_seen_srgb) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + status = wuffs_png__decoder__decode_srgb(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_srgb = true; + } + } else if (self->private_impl.f_chunk_type == 1397641844) { + if (self->private_impl.f_seen_trns || (self->private_impl.f_color_type > 3) || ((self->private_impl.f_color_type == 3) && ! self->private_impl.f_seen_plte)) { status = wuffs_base__make_status(wuffs_png__error__bad_chunk); goto exit; } if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); - status = wuffs_png__decoder__decode_srgb(self, a_src); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + status = wuffs_png__decoder__decode_trns(self, a_src); if (a_src) { iop_a_src = a_src->data.ptr + a_src->meta.ri; } if (status.repr) { goto suspend; } - self->private_impl.f_seen_srgb = true; - } - } else if (self->private_impl.f_chunk_type == 1397641844) { - if (self->private_impl.f_seen_trns || (self->private_impl.f_color_type > 3) || ((self->private_impl.f_color_type == 3) && ! self->private_impl.f_seen_plte)) { - status = wuffs_base__make_status(wuffs_png__error__bad_chunk); - goto exit; - } - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); - status = wuffs_png__decoder__decode_trns(self, a_src); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; - } - self->private_impl.f_seen_trns = true; - } else if ((self->private_impl.f_chunk_type == 1951945833) || (self->private_impl.f_chunk_type == 1951942004) || (self->private_impl.f_chunk_type == 1951945850)) { - if (self->private_impl.f_report_metadata_kvp) { - self->private_impl.f_metadata_flavor = 4; - self->private_impl.f_metadata_fourcc = 1263947851; - self->private_impl.f_metadata_x = 0; - self->private_impl.f_metadata_y = 0; - self->private_impl.f_metadata_z = 0; + self->private_impl.f_seen_trns = true; } } if (self->private_impl.f_metadata_fourcc == 0) { @@ -39991,6 +41805,8 @@ wuffs_png__decoder__decode_frame_config( self->private_impl.active_coroutine = 0; wuffs_base__status status = wuffs_base__make_status(NULL); + uint32_t v_checksum_have = 0; + const uint8_t* iop_a_src = NULL; const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; @@ -40006,10 +41822,11 @@ wuffs_png__decoder__decode_frame_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence == 255) { - status = wuffs_base__make_status(wuffs_base__note__end_of_data); - goto ok; - } else if (self->private_impl.f_call_sequence < 3) { + if ((self->private_impl.f_call_sequence & 16) != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -40021,12 +41838,12 @@ wuffs_png__decoder__decode_frame_config( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 3) { + } else if (self->private_impl.f_call_sequence == 40) { if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { status = wuffs_base__make_status(wuffs_base__error__bad_restart); goto exit; } - } else if (self->private_impl.f_call_sequence == 4) { + } else if (self->private_impl.f_call_sequence == 64) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -40038,10 +41855,14 @@ wuffs_png__decoder__decode_frame_config( if (status.repr) { goto suspend; } - if (self->private_impl.f_call_sequence == 255) { - status = wuffs_base__make_status(wuffs_base__note__end_of_data); - goto ok; - } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 48; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; } if (self->private_impl.f_num_decoded_frame_configs_value == 0) { self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; @@ -40112,7 +41933,48 @@ wuffs_png__decoder__decode_frame_config( } self->private_impl.f_chunk_type = t_1; } - if (self->private_impl.f_chunk_type == 1413571686) { + if (self->private_impl.f_chunk_type == 1145980233) { + if (self->private_impl.f_chunk_length != 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_frame_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_frame_config[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; + if (num_bits_2 == 24) { + t_2 = ((uint32_t)(*scratch)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } + v_checksum_have = t_2; + } + if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606)) { + status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } + self->private_impl.f_call_sequence = 96; + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else if (self->private_impl.f_chunk_type == 1413571686) { status = wuffs_base__make_status(wuffs_png__error__bad_chunk); goto exit; } else if (self->private_impl.f_chunk_type == 1280598886) { @@ -40120,7 +41982,7 @@ wuffs_png__decoder__decode_frame_config( if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); status = wuffs_png__decoder__decode_fctl(self, a_src); if (a_src) { iop_a_src = a_src->data.ptr + a_src->meta.ri; @@ -40129,7 +41991,7 @@ wuffs_png__decoder__decode_frame_config( goto suspend; } self->private_data.s_decode_frame_config[0].scratch = 4; - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); if (self->private_data.s_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { self->private_data.s_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); iop_a_src = io2_a_src; @@ -40139,8 +42001,24 @@ wuffs_png__decoder__decode_frame_config( iop_a_src += self->private_data.s_decode_frame_config[0].scratch; goto label__0__break; } - self->private_data.s_decode_frame_config[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4); - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 48; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + self->private_data.s_decode_frame_config[0].scratch = 4; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); if (self->private_data.s_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { self->private_data.s_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); iop_a_src = io2_a_src; @@ -40169,7 +42047,7 @@ wuffs_png__decoder__decode_frame_config( 0); } wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1); - self->private_impl.f_call_sequence = 4; + self->private_impl.f_call_sequence = 64; ok: self->private_impl.p_decode_frame_config[0] = 0; @@ -40325,11 +42203,7 @@ wuffs_png__decoder__skip_frame( } label__0__break:; wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); - if (self->private_impl.f_num_decoded_frames_value < self->private_impl.f_num_animation_frames_value) { - self->private_impl.f_call_sequence = 5; - } else { - self->private_impl.f_call_sequence = 255; - } + self->private_impl.f_call_sequence = 32; ok: self->private_impl.p_skip_frame[0] = 0; @@ -40400,10 +42274,13 @@ wuffs_png__decoder__decode_frame( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence == 255) { + if ((self->private_impl.f_call_sequence & 16) != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_call_sequence >= 96) { status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; - } else if (self->private_impl.f_call_sequence != 4) { + } else if (self->private_impl.f_call_sequence != 64) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -40540,17 +42417,34 @@ wuffs_png__decoder__decode_frame( if ((v_pass_width > 0) && (v_pass_height > 0)) { self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1 + self->private_impl.f_pass_bytes_per_row)); - if (a_src) { - a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); - } - WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); - status = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); - if (a_src) { - iop_a_src = a_src->data.ptr + a_src->meta.ri; - } - if (status.repr) { - goto suspend; + while (true) { + { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); + v_status = t_1; + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__1__break; + } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { + if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { + wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); + } + if (v_status.repr == wuffs_base__suspension__short_read) { + while (true) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + } + } + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); } + label__1__break:; v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); if ( ! wuffs_base__status__is_ok(&v_status)) { status = v_status; @@ -40565,7 +42459,7 @@ wuffs_png__decoder__decode_frame( self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; } if ((self->private_impl.f_interlace_pass == 0) || (self->private_impl.f_interlace_pass >= 7)) { - goto label__1__break; + goto label__2__break; } #if defined(__GNUC__) #pragma GCC diagnostic push @@ -40576,13 +42470,9 @@ wuffs_png__decoder__decode_frame( #pragma GCC diagnostic pop #endif } - label__1__break:; + label__2__break:; wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); - if (self->private_impl.f_num_decoded_frames_value < self->private_impl.f_num_animation_frames_value) { - self->private_impl.f_call_sequence = 5; - } else { - self->private_impl.f_call_sequence = 255; - } + self->private_impl.f_call_sequence = 32; ok: self->private_impl.p_decode_frame[0] = 0; @@ -41030,12 +42920,12 @@ wuffs_png__decoder__restart_frame( : wuffs_base__error__initialize_not_called); } - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence < 32) { return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0) && (a_io_position != self->private_impl.f_first_config_io_position))) { return wuffs_base__make_status(wuffs_base__error__bad_argument); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 40; if (self->private_impl.f_interlace_pass >= 1) { self->private_impl.f_interlace_pass = 1; } @@ -41148,7 +43038,7 @@ wuffs_png__decoder__tell_me_more( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence != 1) { + if ((self->private_impl.f_call_sequence & 16) == 0) { status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); goto exit; } @@ -41362,7 +43252,6 @@ wuffs_png__decoder__tell_me_more( if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { status = wuffs_base__make_status(wuffs_base__suspension__short_write); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); - v_c2 = 0; goto label__loop__continue; } self->private_impl.f_ztxt_ri += 1; @@ -41371,7 +43260,6 @@ wuffs_png__decoder__tell_me_more( if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1) { status = wuffs_base__make_status(wuffs_base__suspension__short_write); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); - v_c2 = 0; goto label__loop__continue; } self->private_impl.f_ztxt_ri += 1; @@ -41443,7 +43331,6 @@ wuffs_png__decoder__tell_me_more( if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { status = wuffs_base__make_status(wuffs_base__suspension__short_write); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); - v_c2 = 0; goto label__loop__continue; } self->private_impl.f_chunk_length -= 1; @@ -41453,7 +43340,6 @@ wuffs_png__decoder__tell_me_more( if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1) { status = wuffs_base__make_status(wuffs_base__suspension__short_write); WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); - v_c2 = 0; goto label__loop__continue; } self->private_impl.f_chunk_length -= 1; @@ -41547,7 +43433,7 @@ wuffs_png__decoder__tell_me_more( } self->private_impl.f_metadata_is_zlib_compressed = true; } - self->private_impl.f_call_sequence = 2; + self->private_impl.f_call_sequence &= 239; status = wuffs_base__make_status(NULL); goto ok; } @@ -41572,7 +43458,7 @@ wuffs_png__decoder__tell_me_more( self->private_impl.f_metadata_x = 0; self->private_impl.f_metadata_y = 0; self->private_impl.f_metadata_z = 0; - self->private_impl.f_call_sequence = 2; + self->private_impl.f_call_sequence &= 239; status = wuffs_base__make_status(NULL); goto ok; @@ -42563,7 +44449,7 @@ wuffs_tga__decoder__decode_image_config( self->private_impl.f_frame_config_io_position, self->private_impl.f_opaque); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 32; goto ok; ok: @@ -42632,7 +44518,8 @@ wuffs_tga__decoder__decode_frame_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -42644,13 +44531,13 @@ wuffs_tga__decoder__decode_frame_config( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 3) { + } else if (self->private_impl.f_call_sequence == 40) { if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { status = wuffs_base__make_status(wuffs_base__error__bad_restart); goto exit; } - } else if (self->private_impl.f_call_sequence == 4) { - self->private_impl.f_call_sequence = 255; + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; } else { @@ -42673,7 +44560,7 @@ wuffs_tga__decoder__decode_frame_config( false, 4278190080); } - self->private_impl.f_call_sequence = 4; + self->private_impl.f_call_sequence = 64; ok: self->private_impl.p_decode_frame_config[0] = 0; @@ -42774,7 +44661,8 @@ wuffs_tga__decoder__decode_frame( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 4) { + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -42786,7 +44674,6 @@ wuffs_tga__decoder__decode_frame( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 4) { } else { status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; @@ -42867,7 +44754,7 @@ wuffs_tga__decoder__decode_frame( } } else if (v_run_length > 0) { v_run_length -= 1; - wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(wuffs_base__make_slice_u8(self->private_data.f_scratch, 4), self->private_impl.f_scratch_bytes_per_pixel)); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); } @@ -42957,7 +44844,7 @@ wuffs_tga__decoder__decode_frame( v_lit_length -= 1; } else if (v_run_length > 0) { v_run_length -= 1; - wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(wuffs_base__make_slice_u8(self->private_data.f_scratch, 4), self->private_impl.f_scratch_bytes_per_pixel)); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); } @@ -43013,7 +44900,7 @@ wuffs_tga__decoder__decode_frame( goto label__resume__break; } label__resume__break:; - self->private_impl.f_call_sequence = 255; + self->private_impl.f_call_sequence = 96; ok: self->private_impl.p_decode_frame[0] = 0; @@ -43094,7 +44981,7 @@ wuffs_tga__decoder__num_decoded_frame_configs( return 0; } - if (self->private_impl.f_call_sequence > 3) { + if (self->private_impl.f_call_sequence > 32) { return 1; } return 0; @@ -43113,7 +45000,7 @@ wuffs_tga__decoder__num_decoded_frames( return 0; } - if (self->private_impl.f_call_sequence > 4) { + if (self->private_impl.f_call_sequence > 64) { return 1; } return 0; @@ -43136,13 +45023,13 @@ wuffs_tga__decoder__restart_frame( : wuffs_base__error__initialize_not_called); } - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence < 32) { return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); } if (a_index != 0) { return wuffs_base__make_status(wuffs_base__error__bad_argument); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 40; self->private_impl.f_frame_config_io_position = a_io_position; return wuffs_base__make_status(NULL); } @@ -43462,7 +45349,7 @@ wuffs_wbmp__decoder__decode_image_config( self->private_impl.f_frame_config_io_position, true); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 32; goto ok; ok: @@ -43532,7 +45419,8 @@ wuffs_wbmp__decoder__decode_frame_config( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -43544,13 +45432,13 @@ wuffs_wbmp__decoder__decode_frame_config( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 3) { + } else if (self->private_impl.f_call_sequence == 40) { if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { status = wuffs_base__make_status(wuffs_base__error__bad_restart); goto exit; } - } else if (self->private_impl.f_call_sequence == 4) { - self->private_impl.f_call_sequence = 255; + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; } else { @@ -43573,7 +45461,7 @@ wuffs_wbmp__decoder__decode_frame_config( false, 4278190080); } - self->private_impl.f_call_sequence = 4; + self->private_impl.f_call_sequence = 64; ok: self->private_impl.p_decode_frame_config[0] = 0; @@ -43662,7 +45550,8 @@ wuffs_wbmp__decoder__decode_frame( switch (coro_susp_point) { WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; - if (self->private_impl.f_call_sequence < 4) { + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { if (a_src) { a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); } @@ -43674,7 +45563,6 @@ wuffs_wbmp__decoder__decode_frame( if (status.repr) { goto suspend; } - } else if (self->private_impl.f_call_sequence == 4) { } else { status = wuffs_base__make_status(wuffs_base__note__end_of_data); goto ok; @@ -43737,7 +45625,7 @@ wuffs_wbmp__decoder__decode_frame( v_dst_y += 1; } } - self->private_impl.f_call_sequence = 255; + self->private_impl.f_call_sequence = 96; ok: self->private_impl.p_decode_frame[0] = 0; @@ -43815,7 +45703,7 @@ wuffs_wbmp__decoder__num_decoded_frame_configs( return 0; } - if (self->private_impl.f_call_sequence > 3) { + if (self->private_impl.f_call_sequence > 32) { return 1; } return 0; @@ -43834,7 +45722,7 @@ wuffs_wbmp__decoder__num_decoded_frames( return 0; } - if (self->private_impl.f_call_sequence > 4) { + if (self->private_impl.f_call_sequence > 64) { return 1; } return 0; @@ -43857,13 +45745,13 @@ wuffs_wbmp__decoder__restart_frame( : wuffs_base__error__initialize_not_called); } - if (self->private_impl.f_call_sequence < 3) { + if (self->private_impl.f_call_sequence < 32) { return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); } if (a_index != 0) { return wuffs_base__make_status(wuffs_base__error__bad_argument); } - self->private_impl.f_call_sequence = 3; + self->private_impl.f_call_sequence = 40; self->private_impl.f_frame_config_io_position = a_io_position; return wuffs_base__make_status(NULL); } @@ -44915,6 +46803,7 @@ DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder, wuffs_base__image_config image_config = wuffs_base__null_image_config(); sync_io::DynIOBuffer raw_metadata_buf(max_incl_metadata_length); uint64_t start_pos = io_buf.reader_position(); + bool interested_in_metadata_after_the_frame = false; bool redirected = false; int32_t fourcc = 0; redirect: @@ -44989,6 +46878,7 @@ redirect: image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__CHRM, true); } if (flags & DecodeImageArgFlags::REPORT_METADATA_EXIF) { + interested_in_metadata_after_the_frame = true; image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__EXIF, true); } if (flags & DecodeImageArgFlags::REPORT_METADATA_GAMA) { @@ -44998,12 +46888,14 @@ redirect: image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__ICCP, true); } if (flags & DecodeImageArgFlags::REPORT_METADATA_KVP) { + interested_in_metadata_after_the_frame = true; image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__KVP, true); } if (flags & DecodeImageArgFlags::REPORT_METADATA_SRGB) { image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__SRGB, true); } if (flags & DecodeImageArgFlags::REPORT_METADATA_XMP) { + interested_in_metadata_after_the_frame = true; image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__XMP, true); } } @@ -45038,7 +46930,9 @@ redirect: } } } while (false); - raw_metadata_buf.drop(); + if (!interested_in_metadata_after_the_frame) { + raw_metadata_buf.drop(); + } // Select the pixel format. uint32_t w = image_config.pixcfg.width(); @@ -45099,6 +46993,12 @@ redirect: image_decoder->decode_frame_config(&frame_config, &io_buf); if (id_dfc_status.repr == nullptr) { break; + } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) { + std::string error_message = DecodeImageHandleMetadata( + image_decoder, callbacks, input, io_buf, raw_metadata_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) { return DecodeImageResult(id_dfc_status.message()); } else if (io_buf.meta.closed) { @@ -45140,6 +47040,35 @@ redirect: } } } + + // Decode any metadata after the frame. + if (interested_in_metadata_after_the_frame) { + while (true) { + wuffs_base__status id_dfc_status = + image_decoder->decode_frame_config(NULL, &io_buf); + if (id_dfc_status.repr == wuffs_base__note__end_of_data) { + break; + } else if (id_dfc_status.repr == nullptr) { + continue; + } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) { + std::string error_message = DecodeImageHandleMetadata( + image_decoder, callbacks, input, io_buf, raw_metadata_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) { + return DecodeImageResult(id_dfc_status.message()); + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } + } + } + return DecodeImageResult(std::move(alloc_pixbuf_result.mem_owner), pixel_buffer, std::move(message)); } @@ -1,8 +1,8 @@ -script/sync.sh ran on 2022-01-19 -Sibling directory (../wuffs) git revision is 418847fe941d60c9f947dc5c6150bc1303737c5b +script/sync.sh ran on 2022-06-03 +Sibling directory (../wuffs) git revision is 5392d503e39951174ba5f4bbe3090d674a9ccc18 Manifest (sha256sum values, filenames, versions): bb28889a02c5d89edf6544ded21495462d1f998f8ffa5d095f53ca5db29e2937 release/c/README.md 3b6a0c78f663bb495d1972fbb2a87c717d70fbac5ea8cc1a50cb9afaa4b03f92 release/c/wuffs-v0.2.c #define WUFFS_VERSION_STRING "0.2.0+2078.20191219" -91cf4bf590cf1be96ab5937db969775eda3e5170c1080148fd8815e3250127f0 release/c/wuffs-v0.3.c - #define WUFFS_VERSION_STRING "0.3.0-beta.14+3273.20220118" +e7aee4535b3de050a9576558a703f5c1f665e9012d0d7a252da118f83fa8b1f1 release/c/wuffs-v0.3.c + #define WUFFS_VERSION_STRING "0.3.0-beta.15+3345.20220603" |