diff --git a/internal/cgen/base/io-public.h b/internal/cgen/base/io-public.h index c879f3bf..5f6ae617 100644 --- a/internal/cgen/base/io-public.h +++ b/internal/cgen/base/io-public.h @@ -31,8 +31,8 @@ typedef struct wuffs_base__io_buffer__struct { #ifdef __cplusplus inline bool is_valid() const; - inline void compact(); - inline void compact_retaining(uint64_t history_retain_length); + inline size_t compact(); + inline size_t compact_retaining(uint64_t history_retain_length); inline size_t reader_length() const; inline uint8_t* reader_pointer() const; inline uint64_t reader_position() const; @@ -151,11 +151,14 @@ wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) { // wuffs_base__io_buffer__compact moves any written but unread bytes to the // start of the buffer. -static inline void // +// +// It returns the increase in the writer length: how much meta.wi fell by. +static inline size_t // wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } + size_t old_ri = buf->meta.ri; buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri); size_t new_wi = buf->meta.wi - buf->meta.ri; if (new_wi != 0) { @@ -163,6 +166,7 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { } buf->meta.wi = new_wi; buf->meta.ri = 0; + return old_ri; } // wuffs_base__io_buffer__compact_retaining moves any written but unread bytes @@ -171,6 +175,8 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { // It is therefore a no-op if history_retain_length is UINT64_MAX. A // postcondition is that buf->meta.ri == H. // +// It returns the increase in the writer length: how much meta.wi fell by. +// // wuffs_base__io_buffer__compact_retaining(0) is equivalent to // wuffs_base__io_buffer__compact(). // @@ -184,16 +190,16 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { // // Then, depending on history_retain_length, the resultant buf would be: // -// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 -// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 -// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 -// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 -// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 -static inline void // +// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 return = 3 +// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 return = 2 +// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 return = 1 +// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +static inline size_t // wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf, uint64_t history_retain_length) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } size_t old_ri = buf->meta.ri; size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length)); @@ -205,6 +211,7 @@ wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf, } buf->meta.wi = new_wi; buf->meta.ri = new_ri; + return memmove_start; } static inline size_t // @@ -260,14 +267,14 @@ wuffs_base__io_buffer::is_valid() const { return wuffs_base__io_buffer__is_valid(this); } -inline void // +inline size_t // wuffs_base__io_buffer::compact() { - wuffs_base__io_buffer__compact(this); + return wuffs_base__io_buffer__compact(this); } -inline void // +inline size_t // wuffs_base__io_buffer::compact_retaining(uint64_t history_retain_length) { - wuffs_base__io_buffer__compact_retaining(this, history_retain_length); + return wuffs_base__io_buffer__compact_retaining(this, history_retain_length); } inline size_t // diff --git a/internal/cgen/base/token-public.h b/internal/cgen/base/token-public.h index f4d65510..1ed6f885 100644 --- a/internal/cgen/base/token-public.h +++ b/internal/cgen/base/token-public.h @@ -340,8 +340,8 @@ typedef struct wuffs_base__token_buffer__struct { #ifdef __cplusplus inline bool is_valid() const; - inline void compact(); - inline void compact_retaining(uint64_t history_retain_length); + inline size_t compact(); + inline size_t compact_retaining(uint64_t history_retain_length); inline uint64_t reader_length() const; inline wuffs_base__token* reader_pointer() const; inline wuffs_base__slice_token reader_slice() const; @@ -436,11 +436,14 @@ wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) { // wuffs_base__token_buffer__compact moves any written but unread tokens to the // start of the buffer. -static inline void // +// +// It returns the increase in the writer length: how much meta.wi fell by. +static inline size_t // wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } + size_t old_ri = buf->meta.ri; buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri); size_t new_wi = buf->meta.wi - buf->meta.ri; if (new_wi != 0) { @@ -449,6 +452,7 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { } buf->meta.wi = new_wi; buf->meta.ri = 0; + return old_ri; } // wuffs_base__token_buffer__compact_retaining moves any written but unread @@ -457,6 +461,8 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { // history_retain_length). It is therefore a no-op if history_retain_length is // UINT64_MAX. A postcondition is that buf->meta.ri == H. // +// It returns the increase in the writer length: how much meta.wi fell by. +// // wuffs_base__token_buffer__compact_retaining(0) is equivalent to // wuffs_base__token_buffer__compact(). // @@ -470,16 +476,16 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { // // Then, depending on history_retain_length, the resultant buf would be: // -// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 -// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 -// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 -// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 -// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 -static inline void // +// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 return = 3 +// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 return = 2 +// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 return = 1 +// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +static inline size_t // wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf, uint64_t history_retain_length) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } size_t old_ri = buf->meta.ri; size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length)); @@ -492,6 +498,7 @@ wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf, } buf->meta.wi = new_wi; buf->meta.ri = new_ri; + return memmove_start; } static inline uint64_t // @@ -547,14 +554,15 @@ wuffs_base__token_buffer::is_valid() const { return wuffs_base__token_buffer__is_valid(this); } -inline void // +inline size_t // wuffs_base__token_buffer::compact() { - wuffs_base__token_buffer__compact(this); + return wuffs_base__token_buffer__compact(this); } -inline void // +inline size_t // wuffs_base__token_buffer::compact_retaining(uint64_t history_retain_length) { - wuffs_base__token_buffer__compact_retaining(this, history_retain_length); + return wuffs_base__token_buffer__compact_retaining(this, + history_retain_length); } inline uint64_t // diff --git a/internal/cgen/drop-in/stb.c b/internal/cgen/drop-in/stb.c index 9742eeb7..96487bfd 100644 --- a/internal/cgen/drop-in/stb.c +++ b/internal/cgen/drop-in/stb.c @@ -169,9 +169,7 @@ wuffs_drop_in__stb__load1( // return NULL; } - size_t wl = wuffs_base__io_buffer__writer_length(srcbuf); - wuffs_base__io_buffer__compact(srcbuf); - if (wl >= wuffs_base__io_buffer__writer_length(srcbuf)) { + if (wuffs_base__io_buffer__compact(srcbuf) <= 0) { wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small"; return NULL; } @@ -238,9 +236,7 @@ wuffs_drop_in__stb__load1( // return NULL; } - size_t wl = wuffs_base__io_buffer__writer_length(srcbuf); - wuffs_base__io_buffer__compact(srcbuf); - if (wl >= wuffs_base__io_buffer__writer_length(srcbuf)) { + if (wuffs_base__io_buffer__compact(srcbuf) <= 0) { free(workbuf_ptr); free(pixbuf_ptr); wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small"; diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c index 1eae7f94..e2c3b7a2 100644 --- a/release/c/wuffs-unsupported-snapshot.c +++ b/release/c/wuffs-unsupported-snapshot.c @@ -3116,8 +3116,8 @@ typedef struct wuffs_base__io_buffer__struct { #ifdef __cplusplus inline bool is_valid() const; - inline void compact(); - inline void compact_retaining(uint64_t history_retain_length); + inline size_t compact(); + inline size_t compact_retaining(uint64_t history_retain_length); inline size_t reader_length() const; inline uint8_t* reader_pointer() const; inline uint64_t reader_position() const; @@ -3236,11 +3236,14 @@ wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) { // wuffs_base__io_buffer__compact moves any written but unread bytes to the // start of the buffer. -static inline void // +// +// It returns the increase in the writer length: how much meta.wi fell by. +static inline size_t // wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } + size_t old_ri = buf->meta.ri; buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri); size_t new_wi = buf->meta.wi - buf->meta.ri; if (new_wi != 0) { @@ -3248,6 +3251,7 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { } buf->meta.wi = new_wi; buf->meta.ri = 0; + return old_ri; } // wuffs_base__io_buffer__compact_retaining moves any written but unread bytes @@ -3256,6 +3260,8 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { // It is therefore a no-op if history_retain_length is UINT64_MAX. A // postcondition is that buf->meta.ri == H. // +// It returns the increase in the writer length: how much meta.wi fell by. +// // wuffs_base__io_buffer__compact_retaining(0) is equivalent to // wuffs_base__io_buffer__compact(). // @@ -3269,16 +3275,16 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { // // Then, depending on history_retain_length, the resultant buf would be: // -// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 -// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 -// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 -// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 -// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 -static inline void // +// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 return = 3 +// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 return = 2 +// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 return = 1 +// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +static inline size_t // wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf, uint64_t history_retain_length) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } size_t old_ri = buf->meta.ri; size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length)); @@ -3290,6 +3296,7 @@ wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf, } buf->meta.wi = new_wi; buf->meta.ri = new_ri; + return memmove_start; } static inline size_t // @@ -3345,14 +3352,14 @@ wuffs_base__io_buffer::is_valid() const { return wuffs_base__io_buffer__is_valid(this); } -inline void // +inline size_t // wuffs_base__io_buffer::compact() { - wuffs_base__io_buffer__compact(this); + return wuffs_base__io_buffer__compact(this); } -inline void // +inline size_t // wuffs_base__io_buffer::compact_retaining(uint64_t history_retain_length) { - wuffs_base__io_buffer__compact_retaining(this, history_retain_length); + return wuffs_base__io_buffer__compact_retaining(this, history_retain_length); } inline size_t // @@ -3729,8 +3736,8 @@ typedef struct wuffs_base__token_buffer__struct { #ifdef __cplusplus inline bool is_valid() const; - inline void compact(); - inline void compact_retaining(uint64_t history_retain_length); + inline size_t compact(); + inline size_t compact_retaining(uint64_t history_retain_length); inline uint64_t reader_length() const; inline wuffs_base__token* reader_pointer() const; inline wuffs_base__slice_token reader_slice() const; @@ -3825,11 +3832,14 @@ wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) { // wuffs_base__token_buffer__compact moves any written but unread tokens to the // start of the buffer. -static inline void // +// +// It returns the increase in the writer length: how much meta.wi fell by. +static inline size_t // wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } + size_t old_ri = buf->meta.ri; buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri); size_t new_wi = buf->meta.wi - buf->meta.ri; if (new_wi != 0) { @@ -3838,6 +3848,7 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { } buf->meta.wi = new_wi; buf->meta.ri = 0; + return old_ri; } // wuffs_base__token_buffer__compact_retaining moves any written but unread @@ -3846,6 +3857,8 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { // history_retain_length). It is therefore a no-op if history_retain_length is // UINT64_MAX. A postcondition is that buf->meta.ri == H. // +// It returns the increase in the writer length: how much meta.wi fell by. +// // wuffs_base__token_buffer__compact_retaining(0) is equivalent to // wuffs_base__token_buffer__compact(). // @@ -3859,16 +3872,16 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { // // Then, depending on history_retain_length, the resultant buf would be: // -// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 -// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 -// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 -// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 -// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 -static inline void // +// HRL = 0 defgh????? ri = 0 wi = 5 pos = 903 return = 3 +// HRL = 1 cdefgh???? ri = 1 wi = 6 pos = 902 return = 2 +// HRL = 2 bcdefgh??? ri = 2 wi = 7 pos = 901 return = 1 +// HRL = 3 abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +// HRL = 4+ abcdefgh?? ri = 3 wi = 8 pos = 900 return = 0 +static inline size_t // wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf, uint64_t history_retain_length) { if (!buf || (buf->meta.ri == 0)) { - return; + return 0; } size_t old_ri = buf->meta.ri; size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length)); @@ -3881,6 +3894,7 @@ wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf, } buf->meta.wi = new_wi; buf->meta.ri = new_ri; + return memmove_start; } static inline uint64_t // @@ -3936,14 +3950,15 @@ wuffs_base__token_buffer::is_valid() const { return wuffs_base__token_buffer__is_valid(this); } -inline void // +inline size_t // wuffs_base__token_buffer::compact() { - wuffs_base__token_buffer__compact(this); + return wuffs_base__token_buffer__compact(this); } -inline void // +inline size_t // wuffs_base__token_buffer::compact_retaining(uint64_t history_retain_length) { - wuffs_base__token_buffer__compact_retaining(this, history_retain_length); + return wuffs_base__token_buffer__compact_retaining(this, + history_retain_length); } inline uint64_t // @@ -87662,9 +87677,7 @@ wuffs_drop_in__stb__load1( // return NULL; } - size_t wl = wuffs_base__io_buffer__writer_length(srcbuf); - wuffs_base__io_buffer__compact(srcbuf); - if (wl >= wuffs_base__io_buffer__writer_length(srcbuf)) { + if (wuffs_base__io_buffer__compact(srcbuf) <= 0) { wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small"; return NULL; } @@ -87731,9 +87744,7 @@ wuffs_drop_in__stb__load1( // return NULL; } - size_t wl = wuffs_base__io_buffer__writer_length(srcbuf); - wuffs_base__io_buffer__compact(srcbuf); - if (wl >= wuffs_base__io_buffer__writer_length(srcbuf)) { + if (wuffs_base__io_buffer__compact(srcbuf) <= 0) { free(workbuf_ptr); free(pixbuf_ptr); wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";