Use fgetln(3) to handle lines of unlimited length instead of a

getc/putc loop.

Suggested by: dd
This commit is contained in:
Tim J. Robbins 2002-05-24 08:56:49 +00:00
parent 996076bbc7
commit d42862594a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=97233

View File

@ -115,10 +115,11 @@ int
parallel(char **argv)
{
LIST *lp;
int cnt, ich;
char ch, *p;
int cnt;
char ch, *buf, *p;
LIST *head, *tmp;
int opencnt, output;
size_t len;
for (cnt = 0, head = NULL; (p = *argv); ++argv, ++cnt) {
if ((lp = malloc(sizeof(LIST))) == NULL)
@ -146,7 +147,7 @@ parallel(char **argv)
putchar(ch);
continue;
}
if ((ich = getc(lp->fp)) == EOF) {
if ((buf = fgetln(lp->fp, &len)) == NULL) {
if (!--opencnt)
break;
lp->fp = NULL;
@ -166,11 +167,9 @@ parallel(char **argv)
putchar(ch);
} else if ((ch = delim[(lp->cnt - 1) % delimcnt]))
putchar(ch);
if (ich == '\n')
continue;
do {
putchar(ich);
} while ((ich = getc(lp->fp)) != EOF && ich != '\n');
if (buf[len - 1] == '\n')
len--;
fwrite(buf, 1, len, stdout);
}
if (output)
putchar('\n');
@ -183,8 +182,9 @@ int
sequential(char **argv)
{
FILE *fp;
int ch, cnt, failed, needdelim;
char *p;
int cnt, failed, needdelim;
char *buf, *p;
size_t len;
failed = 0;
for (; (p = *argv); ++argv) {
@ -196,7 +196,7 @@ sequential(char **argv)
continue;
}
cnt = needdelim = 0;
while ((ch = getc(fp)) != EOF) {
while ((buf = fgetln(fp, &len)) != NULL) {
if (needdelim) {
needdelim = 0;
if (delim[cnt] != '\0')
@ -204,10 +204,10 @@ sequential(char **argv)
if (++cnt == delimcnt)
cnt = 0;
}
if (ch != '\n')
putchar(ch);
else
needdelim = 1;
if (buf[len - 1] == '\n')
len--;
fwrite(buf, 1, len, stdout);
needdelim = 1;
}
if (needdelim)
putchar('\n');