summaryrefslogtreecommitdiffhomepage
path: root/archival/libunarchive/seek_by_char.c
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2003-11-14 08:26:25 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2003-11-14 08:26:25 +0000
commitd09bcecda80d601a467f73d75a42991b0a6dca68 (patch)
tree487386c7cc0c62abbff34938e8bb6f2110c7d770 /archival/libunarchive/seek_by_char.c
parent5f28455c6efe9c86d96d216a5bdc7f6db3e85780 (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.c27
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);
}