Skip to content

Commit

Permalink
base: compact returns the change in writer length
Browse files Browse the repository at this point in the history
  • Loading branch information
nigeltao committed Sep 22, 2024
1 parent dbbb853 commit abdfa0d
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 72 deletions.
37 changes: 22 additions & 15 deletions internal/cgen/base/io-public.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -151,18 +151,22 @@ 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) {
memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, new_wi);
}
buf->meta.wi = new_wi;
buf->meta.ri = 0;
return old_ri;
}

// wuffs_base__io_buffer__compact_retaining moves any written but unread bytes
Expand All @@ -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().
//
Expand All @@ -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));
Expand All @@ -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 //
Expand Down Expand Up @@ -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 //
Expand Down
38 changes: 23 additions & 15 deletions internal/cgen/base/token-public.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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
Expand All @@ -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().
//
Expand All @@ -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));
Expand All @@ -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 //
Expand Down Expand Up @@ -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 //
Expand Down
8 changes: 2 additions & 6 deletions internal/cgen/drop-in/stb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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";
Expand Down
Loading

0 comments on commit abdfa0d

Please sign in to comment.