diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2003-11-14 08:26:25 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2003-11-14 08:26:25 +0000 |
commit | d09bcecda80d601a467f73d75a42991b0a6dca68 (patch) | |
tree | 487386c7cc0c62abbff34938e8bb6f2110c7d770 /archival/libunarchive/seek_by_char.c | |
parent | 5f28455c6efe9c86d96d216a5bdc7f6db3e85780 (diff) |
Read in blocks rather than one char at a time, greatly improves speed
Diffstat (limited to 'archival/libunarchive/seek_by_char.c')
-rw-r--r-- | archival/libunarchive/seek_by_char.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/archival/libunarchive/seek_by_char.c b/archival/libunarchive/seek_by_char.c index f33935cb5..77da4ef2e 100644 --- a/archival/libunarchive/seek_by_char.c +++ b/archival/libunarchive/seek_by_char.c @@ -14,12 +14,31 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <stdlib.h> + #include "unarchive.h" +#include "busybox.h" -extern void seek_by_char(const archive_handle_t *archive_handle, const unsigned int amount) +/* If we are reading through a pipe(), or from stdin then we cant lseek, + * we must read and discard the data to skip over it. + * + * TODO: rename to seek_by_read + */ +extern void seek_by_char(const archive_handle_t *archive_handle, const unsigned int jump_size) { - unsigned int i; - for (i = 0; i < amount; i++) { - archive_xread_char(archive_handle); + unsigned int remaining = jump_size; + unsigned int read_amount; + RESERVE_CONFIG_BUFFER(buf, BUFSIZ); + + while (remaining > 0) { + if (remaining > BUFSIZ) { + read_amount = BUFSIZ; + } else { + read_amount = remaining; + } + read_amount = archive_xread(archive_handle, buf, read_amount); + remaining -= read_amount; } + + RELEASE_CONFIG_BUFFER(buf); } |