diff options
Diffstat (limited to 'lib/io/src/istream.c')
-rw-r--r-- | lib/io/src/istream.c | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/lib/io/src/istream.c b/lib/io/src/istream.c index 0739fd6..6171f2c 100644 --- a/lib/io/src/istream.c +++ b/lib/io/src/istream.c @@ -10,30 +10,32 @@ sqfs_s32 istream_read(istream_t *strm, void *data, size_t size) { sqfs_s32 total = 0; - size_t diff; if (size > 0x7FFFFFFF) size = 0x7FFFFFFF; while (size > 0) { - if (strm->buffer_used == 0) { - if (istream_precache(strm)) - return -1; + const sqfs_u8 *ptr; + size_t diff; + int ret; - if (strm->buffer_used == 0) - break; - } + ret = istream_get_buffered_data(strm, &ptr, &diff); + if (ret > 0) + break; + if (ret < 0) + return ret; - diff = strm->buffer_used; if (diff > size) diff = size; - memcpy(data, strm->buffer, diff); + memcpy(data, ptr, diff); data = (char *)data + diff; - strm->buffer += diff; - strm->buffer_used -= diff; size -= diff; total += diff; + + ret = istream_advance_buffer(strm, diff); + if (ret) + return -1; } return total; @@ -41,27 +43,27 @@ sqfs_s32 istream_read(istream_t *strm, void *data, size_t size) int istream_skip(istream_t *strm, sqfs_u64 size) { - size_t diff; - while (size > 0) { - if (strm->buffer_used == 0) { - if (istream_precache(strm)) - return -1; - - if (strm->buffer_used == 0) { - fprintf(stderr, "%s: unexpected end-of-file\n", - strm->get_filename(strm)); - return -1; - } + const sqfs_u8 *ptr; + size_t diff; + int ret; + + ret = istream_get_buffered_data(strm, &ptr, &diff); + if (ret < 0) + return ret; + if (ret > 0) { + fprintf(stderr, "%s: unexpected end-of-file\n", + strm->get_filename(strm)); + return -1; } - diff = strm->buffer_used; if ((sqfs_u64)diff > size) diff = size; - strm->buffer += diff; - strm->buffer_used -= diff; size -= diff; + + if (istream_advance_buffer(strm, diff)) + return -1; } return 0; @@ -70,31 +72,31 @@ int istream_skip(istream_t *strm, sqfs_u64 size) sqfs_s32 istream_splice(istream_t *in, ostream_t *out, sqfs_u32 size) { sqfs_s32 total = 0; - size_t diff; if (size > 0x7FFFFFFF) size = 0x7FFFFFFF; while (size > 0) { - if (in->buffer_used == 0) { - if (istream_precache(in)) - return -1; + const sqfs_u8 *ptr; + size_t diff; + int ret; - if (in->buffer_used == 0) - break; - } + ret = istream_get_buffered_data(in, &ptr, &diff); + if (ret < 0) + return ret; + if (ret > 0) + break; - diff = in->buffer_used; if (diff > size) diff = size; - if (ostream_append(out, in->buffer, diff)) + if (ostream_append(out, ptr, diff)) + return -1; + if (istream_advance_buffer(in, diff)) return -1; - in->buffer += diff; - in->buffer_used -= diff; - size -= diff; total += diff; + size -= diff; } return total; |