Read in blocks rather than one char at a time, greatly improves speed
authorGlenn L McGrath <bug1@ihug.co.nz>
Fri, 14 Nov 2003 08:26:25 +0000 (08:26 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Fri, 14 Nov 2003 08:26:25 +0000 (08:26 -0000)
archival/libunarchive/seek_by_char.c

index f33935cb52a9b95b1e48abfaa5206c385827484e..77da4ef2eede4e1fe5faa4df39164bec15f002b6 100644 (file)
  *  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);
 }