diff options
Diffstat (limited to 'gnu/usr.bin/awk/iop.c')
-rw-r--r-- | gnu/usr.bin/awk/iop.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/gnu/usr.bin/awk/iop.c b/gnu/usr.bin/awk/iop.c index 0d7af1213db6..897daefbeb7c 100644 --- a/gnu/usr.bin/awk/iop.c +++ b/gnu/usr.bin/awk/iop.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991, 1992 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Progamming Language. @@ -62,7 +62,7 @@ int fd; else if (fstat(fd, &stb) < 0) return 8*512; /* conservative in case of DECnet access */ else - return 24*512; + return 32*512; #else /* @@ -146,17 +146,16 @@ int *errcode; register char *bp = iop->off; char *bufend; char *start = iop->off; /* beginning of record */ - int saw_newline; char rs; - int eat_whitespace; + int saw_newline = 0, eat_whitespace = 0; /* used iff grRS==0 */ - if (iop->cnt == EOF) /* previous read hit EOF */ + if (iop->cnt == EOF) { /* previous read hit EOF */ + *out = NULL; return EOF; + } if (grRS == 0) { /* special case: grRS == "" */ rs = '\n'; - eat_whitespace = 0; - saw_newline = 0; } else rs = (char) grRS; @@ -181,9 +180,6 @@ int *errcode; char *oldsplit = iop->buf + iop->secsiz; long len; /* record length so far */ - if ((iop->flag & IOP_IS_INTERNAL) != 0) - cant_happen(); - len = bp - start; if (len > iop->secsiz) { /* expand secondary buffer */ @@ -245,7 +241,8 @@ int *errcode; extern int default_FS; if (default_FS && (bp == start || eat_whitespace)) { - while (bp < iop->end && isspace(*bp)) + while (bp < iop->end + && (*bp == ' ' || *bp == '\t' || *bp == '\n')) bp++; if (bp == iop->end) { eat_whitespace = 1; @@ -275,8 +272,10 @@ int *errcode; iop->cnt = bp - start; } if (iop->cnt == EOF - && (((iop->flag & IOP_IS_INTERNAL) != 0) || start == bp)) + && (((iop->flag & IOP_IS_INTERNAL) != 0) || start == bp)) { + *out = NULL; return EOF; + } iop->off = bp; bp--; @@ -284,6 +283,10 @@ int *errcode; bp++; *bp = '\0'; if (grRS == 0) { + /* there could be more newlines left, clean 'em out now */ + while (*(iop->off) == rs && iop->off <= iop->end) + (iop->off)++; + if (*--bp == rs) *bp = '\0'; else |