aboutsummaryrefslogtreecommitdiff
path: root/lib/io/src/xfrm/istream.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-06-04 20:26:14 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-06-05 09:16:39 +0200
commit1370963723917eed6c93e28c9970a2b27be57ea4 (patch)
tree14c6e45fc1a4ccd1721823d65edd8a892135e23d /lib/io/src/xfrm/istream.c
parent8af4ee6f415fe316894e4423235dfc4ee70d8cbb (diff)
libio: remove buffer_offset from istream_t
Instead, make the buffer const, let the user adjust the pointer and size. The offset can then be inferred in precache. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/io/src/xfrm/istream.c')
-rw-r--r--lib/io/src/xfrm/istream.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/lib/io/src/xfrm/istream.c b/lib/io/src/xfrm/istream.c
index b301209..152563f 100644
--- a/lib/io/src/xfrm/istream.c
+++ b/lib/io/src/xfrm/istream.c
@@ -20,28 +20,25 @@ static int xfrm_precache(istream_t *base)
istream_xfrm_t *xfrm = (istream_xfrm_t *)base;
int ret;
- if (base->buffer_offset >= base->buffer_used) {
- base->buffer_offset = 0;
- base->buffer_used = 0;
- } else if (base->buffer_offset > 0) {
- memmove(base->buffer,
- base->buffer + base->buffer_offset,
- base->buffer_used - base->buffer_offset);
-
- base->buffer_used -= base->buffer_offset;
- base->buffer_offset = 0;
- }
-
if (base->eof)
return 0;
+ assert(base->buffer >= xfrm->uncompressed);
+ assert(base->buffer <= (xfrm->uncompressed + BUFSZ));
+ assert(base->buffer_used <= BUFSZ);
+ assert((size_t)(base->buffer - xfrm->uncompressed) <=
+ (BUFSZ - base->buffer_used));
+
+ if (base->buffer_used > 0)
+ memmove(xfrm->uncompressed, base->buffer, base->buffer_used);
+
+ base->buffer = xfrm->uncompressed;
+
ret = istream_precache(xfrm->wrapped);
if (ret != 0)
return ret;
for (;;) {
- const sqfs_u32 in_sz = xfrm->wrapped->buffer_used;
- const sqfs_u32 out_sz = sizeof(xfrm->uncompressed);
sqfs_u32 in_off = 0, out_off = base->buffer_used;
int mode = XFRM_STREAM_FLUSH_NONE;
@@ -49,9 +46,10 @@ static int xfrm_precache(istream_t *base)
mode = XFRM_STREAM_FLUSH_FULL;
ret = xfrm->xfrm->process_data(xfrm->xfrm,
- xfrm->wrapped->buffer, in_sz,
- base->buffer + out_off,
- out_sz - out_off,
+ xfrm->wrapped->buffer,
+ xfrm->wrapped->buffer_used,
+ xfrm->uncompressed + out_off,
+ BUFSZ - out_off,
&in_off, &out_off, mode);
if (ret == XFRM_STREAM_ERROR) {
@@ -61,9 +59,10 @@ static int xfrm_precache(istream_t *base)
}
base->buffer_used = out_off;
- xfrm->wrapped->buffer_offset = in_off;
+ xfrm->wrapped->buffer += in_off;
+ xfrm->wrapped->buffer_used -= in_off;
- if (ret == XFRM_STREAM_BUFFER_FULL || out_off >= out_sz)
+ if (ret == XFRM_STREAM_BUFFER_FULL || out_off >= BUFSZ)
break;
ret = istream_precache(xfrm->wrapped);