Read in blocks rather than one char at a time, greatly improves speed
No binary (build failed)
—
(log yok)
| @@ -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); |
| } | |