diff options
author | Aaron Campbell <aaron@cvs.openbsd.org> | 1999-08-23 23:58:24 +0000 |
---|---|---|
committer | Aaron Campbell <aaron@cvs.openbsd.org> | 1999-08-23 23:58:24 +0000 |
commit | 869e595678db8779e0d146cb0718ae68585f601c (patch) | |
tree | cbb061c3db4512244c511b729d658eff9efacddc | |
parent | df6c2d4ed7d9e0e5f4c523b0a46c9bb16b28e52e (diff) |
fgets() -> fgetln(). When reading files like this, the notion of a `line' is
more appropriate than C strings. Now paste won't die if it encounters null
characters. If the last line in the stream does not contain a newline, we now
say "incomplete line" instead of lying about "line too long". fgetln() uses
realloc, so now we're not limited to POSIX_LINE_MAX.
-rw-r--r-- | usr.bin/paste/paste.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/usr.bin/paste/paste.c b/usr.bin/paste/paste.c index 96fc92e8fd7..ddb01be33b1 100644 --- a/usr.bin/paste/paste.c +++ b/usr.bin/paste/paste.c @@ -1,4 +1,4 @@ -/* $OpenBSD: paste.c,v 1.5 1998/11/16 06:09:12 deraadt Exp $ */ +/* $OpenBSD: paste.c,v 1.6 1999/08/23 23:58:23 aaron Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. @@ -44,15 +44,16 @@ char copyright[] = #ifndef lint /*static char sccsid[] = "from: @(#)paste.c 5.7 (Berkeley) 10/30/90";*/ -static char rcsid[] = "$OpenBSD: paste.c,v 1.5 1998/11/16 06:09:12 deraadt Exp $"; +static char rcsid[] = "$OpenBSD: paste.c,v 1.6 1999/08/23 23:58:23 aaron Exp $"; #endif /* not lint */ #include <sys/types.h> -#include <unistd.h> #include <errno.h> #include <limits.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> +#include <unistd.h> char *delim; int delimcnt; @@ -115,7 +116,7 @@ parallel(argv) register char ch, *p; LIST *head, *tmp; int opencnt, output; - char buf[_POSIX2_LINE_MAX + 1], *malloc(); + size_t len; for (cnt = 0, head = NULL; (p = *argv); ++argv, ++cnt) { if (!(lp = (LIST *)malloc((u_int)sizeof(LIST)))) { @@ -148,7 +149,7 @@ parallel(argv) putchar(ch); continue; } - if (!fgets(buf, sizeof(buf), lp->fp)) { + if (!(p = fgetln(lp->fp, &len))) { if (!--opencnt) break; lp->fp = NULL; @@ -157,13 +158,14 @@ parallel(argv) putchar(ch); continue; } - if (!(p = strchr(buf, '\n'))) { + if (*(p + len - 1) == '\n') + *(p + len - 1) = '\0'; + else { (void)fprintf(stderr, - "paste: %s: input line too long.\n", + "paste: %s: incomplete line.\n", lp->name); exit(1); } - *p = '\0'; /* * make sure that we don't print any delimiters * unless there's a non-empty file. @@ -175,7 +177,7 @@ parallel(argv) putchar(ch); } else if ((ch = delim[(lp->cnt - 1) % delimcnt])) putchar(ch); - (void)printf("%s", buf); + (void)printf("%s", p); } if (output) putchar('\n'); |