wuffs gen -version=0.2.0-rc.1
diff --git a/release/c/wuffs-v0.2.c b/release/c/wuffs-v0.2.c
index 61184aa..cb20f77 100644
--- a/release/c/wuffs-v0.2.c
+++ b/release/c/wuffs-v0.2.c
@@ -60,15 +60,15 @@
// each major.minor branch, the commit count should increase monotonically.
//
// WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// ea3dbc5f2d9552d62b41290cc583f830c5f2cfeb committed on 2019-09-14.
+// b0f18dacbd3cc446673d213acfb7a9317153a9ce committed on 2019-10-05.
#define WUFFS_VERSION ((uint64_t)0x0000000000020000)
#define WUFFS_VERSION_MAJOR ((uint64_t)0x00000000)
#define WUFFS_VERSION_MINOR ((uint64_t)0x0002)
#define WUFFS_VERSION_PATCH ((uint64_t)0x0000)
-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.47"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 1903
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20190914
-#define WUFFS_VERSION_STRING "0.2.0-alpha.47+1903.20190914"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "rc.1"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 1942
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20191005
+#define WUFFS_VERSION_STRING "0.2.0-rc.1+1942.20191005"
// Define WUFFS_CONFIG__STATIC_FUNCTIONS to make all of Wuffs' functions have
// static storage. The motivation is discussed in the "ALLOW STATIC
@@ -450,26 +450,6 @@
return ret;
}
-// Deprecated: use wuffs_base__empty_slice_u8.
-static inline wuffs_base__slice_u8 //
-wuffs_base__null_slice_u8() {
- wuffs_base__slice_u8 ret;
- ret.ptr = NULL;
- ret.len = 0;
- return ret;
-}
-
-// Deprecated: use wuffs_base__empty_table_u8.
-static inline wuffs_base__table_u8 //
-wuffs_base__null_table_u8() {
- wuffs_base__table_u8 ret;
- ret.ptr = NULL;
- ret.width = 0;
- ret.height = 0;
- ret.stride = 0;
- return ret;
-}
-
// wuffs_base__slice_u8__subslice_i returns s[i:].
//
// It returns an empty slice if i is out of bounds.
@@ -1310,13 +1290,12 @@
// additional metadata.
//
// A value with all fields zero is a valid, empty buffer.
-typedef struct wuffs_base__io_buffer__struct {
+typedef struct {
wuffs_base__slice_u8 data;
wuffs_base__io_buffer_meta meta;
#ifdef __cplusplus
inline void compact();
- inline wuffs_base__io_buffer__struct* reader(); // Deprecated.
inline uint64_t reader_available() const;
inline uint64_t reader_io_position() const;
inline uint64_t writer_available() const;
@@ -1369,30 +1348,6 @@
return ret;
}
-// Deprecated: use wuffs_base__empty_io_buffer.
-static inline wuffs_base__io_buffer //
-wuffs_base__null_io_buffer() {
- wuffs_base__io_buffer ret;
- ret.data.ptr = NULL;
- ret.data.len = 0;
- ret.meta.wi = 0;
- ret.meta.ri = 0;
- ret.meta.pos = 0;
- ret.meta.closed = false;
- return ret;
-}
-
-// Deprecated: use wuffs_base__empty_io_buffer_meta.
-static inline wuffs_base__io_buffer_meta //
-wuffs_base__null_io_buffer_meta() {
- wuffs_base__io_buffer_meta ret;
- ret.wi = 0;
- ret.ri = 0;
- ret.pos = 0;
- ret.closed = false;
- return ret;
-}
-
// wuffs_base__io_buffer__compact moves any written but unread bytes to the
// start of the buffer.
static inline void //
@@ -1436,11 +1391,6 @@
wuffs_base__io_buffer__compact(this);
}
-inline wuffs_base__io_buffer* //
-wuffs_base__io_buffer::reader() {
- return this;
-}
-
inline uint64_t //
wuffs_base__io_buffer::reader_available() const {
return wuffs_base__io_buffer__reader_available(this);
@@ -2972,6 +2922,10 @@
// ---------------- Public Function Prototypes
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct //
+wuffs_deflate__decoder__add_history(wuffs_deflate__decoder* self,
+ wuffs_base__slice_u8 a_hist);
+
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 //
wuffs_deflate__decoder__workbuf_len(const wuffs_deflate__decoder* self);
@@ -3090,6 +3044,11 @@
wuffs_version, initialize_flags);
}
+ inline wuffs_base__empty_struct //
+ add_history(wuffs_base__slice_u8 a_hist) {
+ return wuffs_deflate__decoder__add_history(this, a_hist);
+ }
+
inline wuffs_base__range_ii_u64 //
workbuf_len() const {
return wuffs_deflate__decoder__workbuf_len(this);
@@ -3501,7 +3460,7 @@
uint32_t f_frame_rect_y1;
uint32_t f_dst_x;
uint32_t f_dst_y;
- wuffs_base__range_ie_u32 f_dirty_y;
+ uint32_t f_dirty_max_excl_y;
uint64_t f_compressed_ri;
uint64_t f_compressed_wi;
wuffs_base__pixel_swizzler f_swizzler;
@@ -3870,10 +3829,12 @@
// ---------------- Status Codes
+extern const char* wuffs_zlib__warning__dictionary_required;
extern const char* wuffs_zlib__error__bad_checksum;
extern const char* wuffs_zlib__error__bad_compression_method;
extern const char* wuffs_zlib__error__bad_compression_window_size;
extern const char* wuffs_zlib__error__bad_parity_check;
+extern const char* wuffs_zlib__error__incorrect_dictionary;
// ---------------- Public Consts
@@ -3906,6 +3867,13 @@
// ---------------- Public Function Prototypes
+WUFFS_BASE__MAYBE_STATIC uint32_t //
+wuffs_zlib__decoder__dictionary_id(const wuffs_zlib__decoder* self);
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct //
+wuffs_zlib__decoder__add_dictionary(wuffs_zlib__decoder* self,
+ wuffs_base__slice_u8 a_dict);
+
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct //
wuffs_zlib__decoder__set_ignore_checksum(wuffs_zlib__decoder* self, bool a_ic);
@@ -3941,13 +3909,20 @@
uint32_t magic;
uint32_t active_coroutine;
+ bool f_bad_call_sequence;
+ bool f_header_complete;
+ bool f_got_dictionary;
+ bool f_want_dictionary;
bool f_ignore_checksum;
+ uint32_t f_dict_id_got;
+ uint32_t f_dict_id_want;
uint32_t p_decode_io_writer[1];
} private_impl;
struct {
wuffs_adler32__hasher f_checksum;
+ wuffs_adler32__hasher f_dict_id_hasher;
wuffs_deflate__decoder f_flate;
struct {
@@ -3988,6 +3963,16 @@
wuffs_version, initialize_flags);
}
+ inline uint32_t //
+ dictionary_id() const {
+ return wuffs_zlib__decoder__dictionary_id(this);
+ }
+
+ inline wuffs_base__empty_struct //
+ add_dictionary(wuffs_base__slice_u8 a_dict) {
+ return wuffs_zlib__decoder__add_dictionary(this, a_dict);
+ }
+
inline wuffs_base__empty_struct //
set_ignore_checksum(bool a_ic) {
return wuffs_zlib__decoder__set_ignore_checksum(this, a_ic);
@@ -6380,6 +6365,53 @@
// ---------------- Function Implementations
+// -------- func deflate.decoder.add_history
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct //
+wuffs_deflate__decoder__add_history(wuffs_deflate__decoder* self,
+ wuffs_base__slice_u8 a_hist) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ wuffs_base__slice_u8 v_s = {0};
+ uint64_t v_n_copied = 0;
+ uint32_t v_already_full = 0;
+
+ v_s = a_hist;
+ if (((uint64_t)(v_s.len)) >= 32768) {
+ v_s = wuffs_base__slice_u8__suffix(v_s, 32768);
+ 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);
+ 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);
+ self->private_impl.f_history_index =
+ (((uint32_t)((v_n_copied & 32767))) + 32768);
+ } else {
+ v_already_full = 0;
+ if (self->private_impl.f_history_index >= 32768) {
+ v_already_full = 32768;
+ }
+ self->private_impl.f_history_index =
+ ((self->private_impl.f_history_index & 32767) +
+ ((uint32_t)((v_n_copied & 32767))) + v_already_full);
+ }
+ }
+ return wuffs_base__make_empty_struct();
+}
+
// -------- func deflate.decoder.workbuf_len
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 //
@@ -6424,9 +6456,6 @@
uint64_t v_mark = 0;
wuffs_base__status v_status = NULL;
- wuffs_base__slice_u8 v_written = {0};
- uint64_t v_n_copied = 0;
- uint32_t v_already_full = 0;
uint8_t* iop_a_dst = NULL;
uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
@@ -6471,37 +6500,9 @@
}
goto ok;
}
- v_written = wuffs_base__io__since(
- v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst);
- if (((uint64_t)(v_written.len)) >= 32768) {
- v_written = wuffs_base__slice_u8__suffix(v_written, 32768);
- wuffs_base__slice_u8__copy_from_slice(
- wuffs_base__make_slice_u8(self->private_data.f_history, 32768),
- v_written);
- 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_written);
- if (v_n_copied < ((uint64_t)(v_written.len))) {
- v_written = wuffs_base__slice_u8__subslice_i(v_written, 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_written);
- self->private_impl.f_history_index =
- (((uint32_t)((v_n_copied & 32767))) + 32768);
- } else {
- v_already_full = 0;
- if (self->private_impl.f_history_index >= 32768) {
- v_already_full = 32768;
- }
- self->private_impl.f_history_index =
- ((self->private_impl.f_history_index & 32767) +
- ((uint32_t)((v_n_copied & 32767))) + v_already_full);
- }
- }
+ wuffs_deflate__decoder__add_history(
+ self, wuffs_base__io__since(
+ v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
status = v_status;
WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
}
@@ -7161,6 +7162,16 @@
v_i += 1;
}
if (v_remaining != 0) {
+ if ((a_which == 1) && (v_counts[1] == 1) &&
+ (self->private_data.f_code_lengths[a_n_codes0] == 1) &&
+ ((((uint32_t)(v_counts[0])) + a_n_codes0 + 1) == a_n_codes1)) {
+ self->private_impl.f_n_huffs_bits[1] = 1;
+ self->private_data.f_huffs[1][0] =
+ (wuffs_deflate__dcode_magic_numbers[0] | 1);
+ self->private_data.f_huffs[1][1] =
+ (wuffs_deflate__dcode_magic_numbers[31] | 1);
+ return NULL;
+ }
return wuffs_deflate__error__bad_huffman_code_under_subscribed;
}
v_i = 1;
@@ -8571,7 +8582,7 @@
static const uint8_t //
wuffs_gif__interlace_count[5] //
WUFFS_BASE__POTENTIALLY_UNUSED = {
- 0, 0, 1, 3, 7,
+ 0, 1, 2, 4, 8,
};
static const uint8_t //
@@ -9069,10 +9080,12 @@
return wuffs_base__utility__make_rect_ie_u32(
wuffs_base__u32__min(self->private_impl.f_frame_rect_x0,
self->private_impl.f_width),
- wuffs_base__range_ie_u32__get_min_incl(&self->private_impl.f_dirty_y),
+ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0,
+ self->private_impl.f_height),
wuffs_base__u32__min(self->private_impl.f_frame_rect_x1,
self->private_impl.f_width),
- wuffs_base__range_ie_u32__get_max_excl(&self->private_impl.f_dirty_y));
+ wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y,
+ self->private_impl.f_height));
}
// -------- func gif.decoder.workbuf_len
@@ -9169,8 +9182,7 @@
WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
self->private_impl.f_ignore_metadata = true;
- (memset(&self->private_impl.f_dirty_y, 0, sizeof(wuffs_base__range_ie_u32)),
- wuffs_base__make_empty_struct());
+ 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) {
@@ -11049,6 +11061,7 @@
wuffs_base__slice_u8 a_src) {
wuffs_base__slice_u8 v_dst = {0};
wuffs_base__slice_u8 v_src = {0};
+ uint64_t v_width_in_bytes = 0;
uint64_t v_n = 0;
uint64_t v_src_ri = 0;
uint32_t v_bytes_per_pixel = 0;
@@ -11056,7 +11069,8 @@
wuffs_base__table_u8 v_tab = {0};
uint64_t v_i = 0;
uint64_t v_j = 0;
- uint32_t v_replicate_count = 0;
+ uint32_t v_replicate_y0 = 0;
+ uint32_t v_replicate_y1 = 0;
wuffs_base__slice_u8 v_replicate_dst = {0};
wuffs_base__slice_u8 v_replicate_src = {0};
@@ -11070,6 +11084,8 @@
} else {
return wuffs_base__error__unsupported_option;
}
+ v_width_in_bytes = (((uint64_t)(self->private_impl.f_width)) *
+ ((uint64_t)(v_bytes_per_pixel)));
v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0);
label_0_continue:;
while (v_src_ri < ((uint64_t)(a_src.len))) {
@@ -11081,6 +11097,11 @@
return wuffs_base__error__too_much_data;
}
v_dst = wuffs_base__table_u8__row(v_tab, self->private_impl.f_dst_y);
+ if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
+ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0);
+ } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) {
+ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes);
+ }
v_i = (((uint64_t)(self->private_impl.f_dst_x)) *
((uint64_t)(v_bytes_per_pixel)));
if (v_i < ((uint64_t)(v_dst.len))) {
@@ -11098,11 +11119,9 @@
wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n);
wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x,
((uint32_t)((v_n & 4294967295))));
- self->private_impl.f_dirty_y = wuffs_base__range_ie_u32__unite(
- &self->private_impl.f_dirty_y,
- wuffs_base__utility__make_range_ie_u32(
- self->private_impl.f_dst_y,
- wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1)));
+ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(
+ self->private_impl.f_dirty_max_excl_y,
+ wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1));
}
if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
@@ -11113,18 +11132,24 @@
if ((self->private_impl.f_num_decoded_frames_value == 0) &&
!self->private_impl.f_gc_has_transparent_index &&
(self->private_impl.f_interlace > 1)) {
- v_replicate_count = ((uint32_t)(
- wuffs_gif__interlace_count[self->private_impl.f_interlace]));
v_replicate_src =
wuffs_base__table_u8__row(v_tab, self->private_impl.f_dst_y);
- while (v_replicate_count > 0) {
- v_replicate_dst = wuffs_base__table_u8__row(
- v_tab, wuffs_base__u32__sat_add(self->private_impl.f_dst_y,
- v_replicate_count));
+ v_replicate_y0 =
+ wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1);
+ v_replicate_y1 = wuffs_base__u32__sat_add(
+ self->private_impl.f_dst_y,
+ ((uint32_t)(
+ wuffs_gif__interlace_count[self->private_impl.f_interlace])));
+ v_replicate_y1 = wuffs_base__u32__min(
+ v_replicate_y1, self->private_impl.f_frame_rect_y1);
+ while (v_replicate_y0 < v_replicate_y1) {
+ v_replicate_dst = wuffs_base__table_u8__row(v_tab, v_replicate_y0);
wuffs_base__slice_u8__copy_from_slice(v_replicate_dst,
v_replicate_src);
- v_replicate_count -= 1;
+ v_replicate_y0 += 1;
}
+ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(
+ self->private_impl.f_dirty_max_excl_y, v_replicate_y1);
}
wuffs_base__u32__sat_add_indirect(
&self->private_impl.f_dst_y,
@@ -11674,14 +11699,16 @@
// ---------------- Status Codes Implementations
+const char* wuffs_zlib__warning__dictionary_required =
+ "@zlib: dictionary required";
const char* wuffs_zlib__error__bad_checksum = "#zlib: bad checksum";
const char* wuffs_zlib__error__bad_compression_method =
"#zlib: bad compression method";
const char* wuffs_zlib__error__bad_compression_window_size =
"#zlib: bad compression window size";
const char* wuffs_zlib__error__bad_parity_check = "#zlib: bad parity check";
-const char* wuffs_zlib__error__todo_unsupported_preset_dictionary =
- "#zlib: TODO: unsupported preset dictionary";
+const char* wuffs_zlib__error__incorrect_dictionary =
+ "#zlib: incorrect dictionary";
// ---------------- Private Consts
@@ -11741,6 +11768,15 @@
}
}
{
+ wuffs_base__status z = wuffs_adler32__hasher__initialize(
+ &self->private_data.f_dict_id_hasher,
+ sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION,
+ initialize_flags);
+ if (z) {
+ return z;
+ }
+ }
+ {
wuffs_base__status z = wuffs_deflate__decoder__initialize(
&self->private_data.f_flate, sizeof(self->private_data.f_flate),
WUFFS_VERSION, initialize_flags);
@@ -11759,6 +11795,44 @@
// ---------------- Function Implementations
+// -------- func zlib.decoder.dictionary_id
+
+WUFFS_BASE__MAYBE_STATIC uint32_t //
+wuffs_zlib__decoder__dictionary_id(const wuffs_zlib__decoder* self) {
+ if (!self) {
+ return 0;
+ }
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+ return 0;
+ }
+
+ return self->private_impl.f_dict_id_want;
+}
+
+// -------- func zlib.decoder.add_dictionary
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct //
+wuffs_zlib__decoder__add_dictionary(wuffs_zlib__decoder* self,
+ wuffs_base__slice_u8 a_dict) {
+ if (!self) {
+ return wuffs_base__make_empty_struct();
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_empty_struct();
+ }
+
+ if (self->private_impl.f_header_complete) {
+ self->private_impl.f_bad_call_sequence = true;
+ } else {
+ self->private_impl.f_dict_id_got = wuffs_adler32__hasher__update(
+ &self->private_data.f_dict_id_hasher, a_dict);
+ wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict);
+ }
+ self->private_impl.f_got_dictionary = true;
+ return wuffs_base__make_empty_struct();
+}
+
// -------- func zlib.decoder.set_ignore_checksum
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct //
@@ -11853,51 +11927,101 @@
switch (coro_susp_point) {
WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
- {
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
- uint16_t t_0;
- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
- t_0 = wuffs_base__load_u16be(iop_a_src);
- iop_a_src += 2;
- } else {
- self->private_data.s_decode_io_writer[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
- while (true) {
- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
- status = wuffs_base__suspension__short_read;
- goto suspend;
+ if (self->private_impl.f_bad_call_sequence) {
+ status = wuffs_base__error__bad_call_sequence;
+ goto exit;
+ } else if (!self->private_impl.f_want_dictionary) {
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+ uint16_t t_0;
+ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
+ t_0 = wuffs_base__load_u16be(iop_a_src);
+ iop_a_src += 2;
+ } else {
+ self->private_data.s_decode_io_writer[0].scratch = 0;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+ while (true) {
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__suspension__short_read;
+ goto suspend;
+ }
+ uint64_t* scratch =
+ &self->private_data.s_decode_io_writer[0].scratch;
+ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF));
+ *scratch >>= 8;
+ *scratch <<= 8;
+ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
+ if (num_bits_0 == 8) {
+ t_0 = ((uint16_t)(*scratch >> 48));
+ break;
+ }
+ num_bits_0 += 8;
+ *scratch |= ((uint64_t)(num_bits_0));
}
- uint64_t* scratch = &self->private_data.s_decode_io_writer[0].scratch;
- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF));
- *scratch >>= 8;
- *scratch <<= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
- if (num_bits_0 == 8) {
- t_0 = ((uint16_t)(*scratch >> 48));
- break;
- }
- num_bits_0 += 8;
- *scratch |= ((uint64_t)(num_bits_0));
}
+ v_x = t_0;
}
- v_x = t_0;
+ if (((v_x >> 8) & 15) != 8) {
+ status = wuffs_zlib__error__bad_compression_method;
+ goto exit;
+ }
+ if ((v_x >> 12) > 7) {
+ status = wuffs_zlib__error__bad_compression_window_size;
+ goto exit;
+ }
+ if ((v_x % 31) != 0) {
+ status = wuffs_zlib__error__bad_parity_check;
+ goto exit;
+ }
+ self->private_impl.f_want_dictionary = ((v_x & 32) != 0);
+ if (self->private_impl.f_want_dictionary) {
+ self->private_impl.f_dict_id_got = 1;
+ {
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+ uint32_t t_1;
+ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+ t_1 = wuffs_base__load_u32be(iop_a_src);
+ iop_a_src += 4;
+ } else {
+ self->private_data.s_decode_io_writer[0].scratch = 0;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+ while (true) {
+ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+ status = wuffs_base__suspension__short_read;
+ goto suspend;
+ }
+ uint64_t* scratch =
+ &self->private_data.s_decode_io_writer[0].scratch;
+ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF));
+ *scratch >>= 8;
+ *scratch <<= 8;
+ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
+ if (num_bits_1 == 24) {
+ t_1 = ((uint32_t)(*scratch >> 32));
+ break;
+ }
+ num_bits_1 += 8;
+ *scratch |= ((uint64_t)(num_bits_1));
+ }
+ }
+ self->private_impl.f_dict_id_want = t_1;
+ }
+ status = wuffs_zlib__warning__dictionary_required;
+ goto ok;
+ } else if (self->private_impl.f_got_dictionary) {
+ status = wuffs_zlib__error__incorrect_dictionary;
+ goto exit;
+ }
+ } else if (self->private_impl.f_dict_id_got !=
+ self->private_impl.f_dict_id_want) {
+ if (self->private_impl.f_got_dictionary) {
+ status = wuffs_zlib__error__incorrect_dictionary;
+ goto exit;
+ }
+ status = wuffs_zlib__warning__dictionary_required;
+ goto ok;
}
- if (((v_x >> 8) & 15) != 8) {
- status = wuffs_zlib__error__bad_compression_method;
- goto exit;
- }
- if ((v_x >> 12) > 7) {
- status = wuffs_zlib__error__bad_compression_window_size;
- goto exit;
- }
- if ((v_x & 32) != 0) {
- status = wuffs_zlib__error__todo_unsupported_preset_dictionary;
- goto exit;
- }
- if ((v_x % 31) != 0) {
- status = wuffs_zlib__error__bad_parity_check;
- goto exit;
- }
+ self->private_impl.f_header_complete = true;
while (true) {
v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
{
@@ -11907,7 +12031,7 @@
if (a_src) {
a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
}
- wuffs_base__status t_1 = wuffs_deflate__decoder__decode_io_writer(
+ wuffs_base__status t_2 = wuffs_deflate__decoder__decode_io_writer(
&self->private_data.f_flate, a_dst, a_src, a_workbuf);
if (a_dst) {
iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
@@ -11915,7 +12039,7 @@
if (a_src) {
iop_a_src = a_src->data.ptr + a_src->meta.ri;
}
- v_status = t_1;
+ v_status = t_2;
}
if (!self->private_impl.f_ignore_checksum) {
v_checksum_got = wuffs_adler32__hasher__update(
@@ -11927,37 +12051,37 @@
goto label_0_break;
}
status = v_status;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
}
label_0_break:;
{
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
- uint32_t t_2;
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+ uint32_t t_3;
if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
- t_2 = wuffs_base__load_u32be(iop_a_src);
+ t_3 = wuffs_base__load_u32be(iop_a_src);
iop_a_src += 4;
} else {
self->private_data.s_decode_io_writer[0].scratch = 0;
- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
while (true) {
if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
status = wuffs_base__suspension__short_read;
goto suspend;
}
uint64_t* scratch = &self->private_data.s_decode_io_writer[0].scratch;
- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFF));
+ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF));
*scratch >>= 8;
*scratch <<= 8;
- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
- if (num_bits_2 == 24) {
- t_2 = ((uint32_t)(*scratch >> 32));
+ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
+ if (num_bits_3 == 24) {
+ t_3 = ((uint32_t)(*scratch >> 32));
break;
}
- num_bits_2 += 8;
- *scratch |= ((uint64_t)(num_bits_2));
+ num_bits_3 += 8;
+ *scratch |= ((uint64_t)(num_bits_3));
}
}
- v_checksum_want = t_2;
+ v_checksum_want = t_3;
}
if (!self->private_impl.f_ignore_checksum &&
(v_checksum_got != v_checksum_want)) {