Skip to content

Commit 8f59efa

Browse files
committed
read in chunks for lseek()able files.
1 parent ab68f32 commit 8f59efa

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

configure.ac

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ AC_PROG_GCC_TRADITIONAL
9494
AC_FUNC_MMAP
9595

9696
AC_FUNC_WAIT3
97-
AC_CHECK_FUNCS(strerror strtol lstat setrlimit sigrelse sighold sigaction \
98-
sysconf setsid sigsetjmp)
97+
AC_CHECK_FUNCS(strerror strtol lseek lstat setrlimit sigrelse sighold \
98+
sigaction sysconf setsid sigsetjmp)
9999

100100
AC_CACHE_CHECK(for an abused getenv, es_cv_abused_getenv,
101101
AC_RUN_IFELSE([AC_LANG_SOURCE([[

prim-io.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,29 @@ PRIM(read) {
405405
freebuffer(buffer);
406406
buffer = openbuffer(0);
407407

408-
while ((c = read1(fd)) != EOF && c != '\n')
409-
buffer = bufputc(buffer, c);
408+
#if HAVE_LSEEK
409+
if (lseek(fd, 0, SEEK_CUR) < 0) {
410+
#endif
411+
while ((c = read1(fd)) != EOF && c != '\n')
412+
buffer = bufputc(buffer, c);
413+
#if HAVE_LSEEK
414+
} else {
415+
int n;
416+
char *p;
417+
char s[BUFSIZE];
418+
c = EOF;
419+
while ((n = eread(fd, s, BUFSIZE)) > 0) {
420+
c = 0;
421+
if ((p = strchr(s, '\n')) == NULL)
422+
buffer = bufncat(buffer, s, n);
423+
else {
424+
buffer = bufncat(buffer, s, (p - s));
425+
lseek(fd, 1 + ((p - s) - n), SEEK_CUR);
426+
break;
427+
}
428+
}
429+
}
430+
#endif
410431

411432
if (c == EOF && buffer->current == 0) {
412433
freebuffer(buffer);

0 commit comments

Comments
 (0)