summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2014-07-31 20:19:44 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2014-07-31 20:19:44 +0200
commit4918b88317f39c2aeca7b3b066863254f9dcc976 (patch)
treedafb5b3dcd0210fec07f36ec9260f1f5e9482a52
parent3468aac047f42af7165edc6bbeb9b9349478e7c2 (diff)
downloadoutils-4918b88317f39c2aeca7b3b066863254f9dcc976.tar.gz
outils-4918b88317f39c2aeca7b3b066863254f9dcc976.tar.xz
outils-4918b88317f39c2aeca7b3b066863254f9dcc976.zip
import vis and unvis
-rw-r--r--src/usr.bin/unvis/Makefile5
-rwxr-xr-xsrc/usr.bin/unvis/unvisbin0 -> 11224 bytes
-rw-r--r--src/usr.bin/unvis/unvis.156
-rw-r--r--src/usr.bin/unvis/unvis.c101
-rw-r--r--src/usr.bin/vis/Makefile6
-rw-r--r--src/usr.bin/vis/foldit.c71
-rwxr-xr-xsrc/usr.bin/vis/visbin0 -> 13050 bytes
-rw-r--r--src/usr.bin/vis/vis.1138
-rw-r--r--src/usr.bin/vis/vis.c178
9 files changed, 555 insertions, 0 deletions
diff --git a/src/usr.bin/unvis/Makefile b/src/usr.bin/unvis/Makefile
new file mode 100644
index 0000000..9b6e0f9
--- /dev/null
+++ b/src/usr.bin/unvis/Makefile
@@ -0,0 +1,5 @@
+#	$OpenBSD: Makefile,v 1.3 1997/09/21 11:51:36 deraadt Exp $
+
+PROG=	unvis
+
+.include <bsd.prog.mk>
diff --git a/src/usr.bin/unvis/unvis b/src/usr.bin/unvis/unvis
new file mode 100755
index 0000000..6b52842
--- /dev/null
+++ b/src/usr.bin/unvis/unvis
Binary files differdiff --git a/src/usr.bin/unvis/unvis.1 b/src/usr.bin/unvis/unvis.1
new file mode 100644
index 0000000..c112dbf
--- /dev/null
+++ b/src/usr.bin/unvis/unvis.1
@@ -0,0 +1,56 @@
+.\"	$OpenBSD: unvis.1,v 1.8 2013/08/12 14:19:53 jmc Exp $
+.\"	$NetBSD: unvis.1,v 1.3 1994/12/06 07:36:08 jtc Exp $
+.\"
+.\" Copyright (c) 1989, 1990, 1993
+.\"	The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)unvis.1	8.1 (Berkeley) 6/6/93
+.\"
+.Dd $Mdocdate: August 12 2013 $
+.Dt UNVIS 1
+.Os
+.Sh NAME
+.Nm unvis
+.Nd revert a visual representation of data back to original form
+.Sh SYNOPSIS
+.Nm unvis
+.Op Ar
+.Sh DESCRIPTION
+.Nm unvis
+is the inverse function of
+.Xr vis 1 .
+It reverts
+a visual representation of data back to its original form on standard output.
+.Sh SEE ALSO
+.Xr vis 1 ,
+.Xr unvis 3 ,
+.Xr vis 3
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.4 .
diff --git a/src/usr.bin/unvis/unvis.c b/src/usr.bin/unvis/unvis.c
new file mode 100644
index 0000000..c5cd008
--- /dev/null
+++ b/src/usr.bin/unvis/unvis.c
@@ -0,0 +1,101 @@
+/*	$OpenBSD: unvis.c,v 1.12 2014/01/22 09:45:21 jsg Exp $	*/
+
+/*-
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <vis.h>
+
+void process(FILE *fp, const char *filename);
+
+int
+main(int argc, char *argv[])
+{
+	FILE *fp;
+	int ch;
+
+	while ((ch = getopt(argc, argv, "")) != -1)
+		switch(ch) {
+		case '?':
+		default:
+			(void) fprintf(stderr, "usage: unvis [file ...]\n");
+			exit(1);
+		}
+	argc -= optind;
+	argv += optind;
+
+	if (*argv)
+		while (*argv) {
+			if ((fp=fopen(*argv, "r")) != NULL) {
+				process(fp, *argv);
+				fclose(fp);
+			} else
+				warn("%s", *argv);
+			argv++;
+		}
+	else
+		process(stdin, "<stdin>");
+	exit(0);
+}
+
+void
+process(FILE *fp, const char *filename)
+{
+	int offset = 0, c, ret;
+	int state = 0;
+	char outc;
+
+	while ((c = getc(fp)) != EOF) {
+		offset++;
+	again:
+		switch(ret = unvis(&outc, (char)c, &state, 0)) {
+		case UNVIS_VALID:
+			putchar(outc);
+			break;
+		case UNVIS_VALIDPUSH:
+			putchar(outc);
+			goto again;
+		case UNVIS_SYNBAD:
+			warnx("%s: offset: %d: can't decode", filename, offset);
+			state = 0;
+			break;
+		case 0:
+		case UNVIS_NOCHAR:
+			break;
+		default:
+			errx(1, "bad return value (%d), can't happen", ret);
+			/* NOTREACHED */
+		}
+	}
+	if (unvis(&outc, (char)0, &state, UNVIS_END) == UNVIS_VALID)
+		putchar(outc);
+}
diff --git a/src/usr.bin/vis/Makefile b/src/usr.bin/vis/Makefile
new file mode 100644
index 0000000..2823603
--- /dev/null
+++ b/src/usr.bin/vis/Makefile
@@ -0,0 +1,6 @@
+#	$OpenBSD: Makefile,v 1.3 1997/09/21 11:51:50 deraadt Exp $
+
+PROG=	vis
+SRCS=	vis.c foldit.c
+
+.include <bsd.prog.mk>
diff --git a/src/usr.bin/vis/foldit.c b/src/usr.bin/vis/foldit.c
new file mode 100644
index 0000000..f9abd99
--- /dev/null
+++ b/src/usr.bin/vis/foldit.c
@@ -0,0 +1,71 @@
+/*	$OpenBSD: foldit.c,v 1.7 2013/11/12 22:51:18 deraadt Exp $	*/
+/*	$NetBSD: foldit.c,v 1.4 1994/12/20 16:13:02 jtc Exp $	*/
+
+/*-
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+
+int	foldit(char *chunk, int col, int max);
+
+int
+foldit(char *chunk, int col, int max)
+{
+	char *cp;
+
+	/*
+	 * Keep track of column position. Insert hidden newline
+	 * if this chunk puts us over the limit.
+	 */
+again:
+	cp = chunk;
+	while (*cp) {
+		switch(*cp) {
+		case '\n':
+		case '\r':
+			col = 0;
+			break;
+		case '\t':
+			col = (col + 8) & ~07;
+			break;
+		case '\b':
+			col = col ? col - 1 : 0;
+			break;
+		default:
+			col++;
+		}
+		if (col > (max - 2)) {
+			printf("\\\n");
+			col = 0;
+			goto again;
+		} 
+		cp++;
+	}
+	return (col);
+}
diff --git a/src/usr.bin/vis/vis b/src/usr.bin/vis/vis
new file mode 100755
index 0000000..3f741da
--- /dev/null
+++ b/src/usr.bin/vis/vis
Binary files differdiff --git a/src/usr.bin/vis/vis.1 b/src/usr.bin/vis/vis.1
new file mode 100644
index 0000000..1083d47
--- /dev/null
+++ b/src/usr.bin/vis/vis.1
@@ -0,0 +1,138 @@
+.\"	$OpenBSD: vis.1,v 1.15 2010/08/24 23:49:06 djm Exp $
+.\"	$NetBSD: vis.1,v 1.5 1994/11/17 07:56:00 jtc Exp $
+.\"
+.\" Copyright (c) 1989, 1991, 1993, 1994
+.\"	The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)vis.1	8.4 (Berkeley) 4/19/94
+.\"
+.Dd $Mdocdate: August 24 2010 $
+.Dt VIS 1
+.Os
+.Sh NAME
+.Nm vis
+.Nd display non-printable characters in a visual format
+.Sh SYNOPSIS
+.Nm vis
+.Op Fl abcflnostw
+.Op Fl F Ar foldwidth
+.Op Ar
+.Sh DESCRIPTION
+.Nm
+is a filter for converting non-printable characters
+into a visual representation.
+It differs from
+.Ic cat -v
+in that
+the form can be unique and invertible.
+By default, all non-printing
+characters except space, tab, and newline are encoded,
+as are any meta-characters
+.Pq eighth bit set .
+A detailed description of the
+various visual formats is given in
+.Xr vis 3 .
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl a
+Encode all characters, whether originally visible or not.
+.It Fl b
+Turns off prepending of backslash before up-arrow control sequences
+and meta-characters, and disables the doubling of backslashes.
+This produces output which is neither invertible nor precise, but does
+represent a minimum of change to the input.
+It is similar to
+.Ic cat -v .
+.It Fl c
+Request a format which displays a small subset of the
+non-printable characters using C-style backslash sequences.
+.It Fl F Ar foldwidth
+Causes
+.Nm
+to fold output lines to
+.Ar foldwidth
+columns, like
+.Xr fold 1 ,
+except
+that a hidden newline sequence is used, (which is removed
+when inverting the file back to its original form with
+.Xr unvis 1 ) .
+If the last character in the encoded file does not end in a newline,
+a hidden newline sequence is appended to the output.
+This makes
+the output usable with various editors and other utilities which
+typically don't work with partial lines.
+.It Fl f
+Like
+.Fl F ,
+except output is always folded to 80 columns.
+.It Fl l
+Mark newlines with the visible sequence
+.Ql \e$ ,
+followed by the newline.
+.It Fl n
+Turns off any encoding, except for the fact that backslashes are
+still doubled and hidden newline sequences inserted if
+.Fl f
+or
+.Fl F
+is selected.
+When combined with the
+.Fl f
+flag,
+.Nm
+becomes like
+an invertible version of the
+.Xr fold 1
+utility.
+That is, the output
+can be unfolded by running the output through
+.Xr unvis 1 .
+.It Fl o
+Request a format which displays non-printable characters as
+an octal number, \eddd.
+.It Fl s
+Only characters considered unsafe to send to a terminal are encoded.
+This flag allows backspace, bell, and carriage return in addition
+to the default space, tab, and newline.
+Meta-characters that are considered graphic characters by
+.Xr isgraph 3
+are not encoded.
+.It Fl t
+Tabs are also encoded.
+.It Fl w
+White space (space-tab-newline) is also encoded.
+.El
+.Sh SEE ALSO
+.Xr unvis 1 ,
+.Xr vis 3
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.4 .
diff --git a/src/usr.bin/vis/vis.c b/src/usr.bin/vis/vis.c
new file mode 100644
index 0000000..0ccba27
--- /dev/null
+++ b/src/usr.bin/vis/vis.c
@@ -0,0 +1,178 @@
+/*	$OpenBSD: vis.c,v 1.15 2013/11/27 13:32:02 okan Exp $	*/
+/*	$NetBSD: vis.c,v 1.4 1994/12/20 16:13:03 jtc Exp $	*/
+
+/*-
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <err.h>
+#include <vis.h>
+
+int eflags, fold, foldwidth=80, none, markeol;
+
+#ifdef DEBUG
+int debug;
+#endif
+
+int foldit(char *, int, int);
+void process(FILE *);
+__dead void usage(void);
+
+int
+main(int argc, char *argv[])
+{
+	FILE *fp;
+	int ch;
+
+	while ((ch = getopt(argc, argv, "anwctsobfF:ld")) != -1)
+		switch(ch) {
+		case 'a':
+			eflags |= VIS_ALL;
+			break;
+		case 'n':
+			none++;
+			break;
+		case 'w':
+			eflags |= VIS_WHITE;
+			break;
+		case 'c':
+			eflags |= VIS_CSTYLE;
+			break;
+		case 't':
+			eflags |= VIS_TAB;
+			break;
+		case 's':
+			eflags |= VIS_SAFE;
+			break;
+		case 'o':
+			eflags |= VIS_OCTAL;
+			break;
+		case 'b':
+			eflags |= VIS_NOSLASH;
+			break;
+		case 'F':
+			if ((foldwidth = atoi(optarg))<5) {
+				errx(1, "can't fold lines to less than 5 cols");
+				/* NOTREACHED */
+			}
+			/*FALLTHROUGH*/
+		case 'f':
+			fold++;		/* fold output lines to 80 cols */
+			break;		/* using hidden newline */
+		case 'l':
+			markeol++;	/* mark end of line with \$ */
+			break;
+#ifdef DEBUG
+		case 'd':
+			debug++;
+			break;
+#endif
+		case '?':
+		default:
+			usage();
+		}
+	argc -= optind;
+	argv += optind;
+
+	if (*argv)
+		while (*argv) {
+			if ((fp=fopen(*argv, "r")) != NULL)
+				process(fp);
+			else
+				warn("%s", *argv);
+			argv++;
+		}
+	else
+		process(stdin);
+	exit(0);
+}
+	
+void
+process(FILE *fp)
+{
+	static int col = 0;
+	char *cp = "\0"+1;	/* so *(cp-1) starts out != '\n' */
+	int c, rachar; 
+	char buff[5];
+	
+	c = getc(fp);
+	while (c != EOF) {
+		rachar = getc(fp);
+		if (none) {
+			cp = buff;
+			*cp++ = c;
+			if (c == '\\')
+				*cp++ = '\\';
+			*cp = '\0';
+		} else if (markeol && c == '\n') {
+			cp = buff;
+			if ((eflags & VIS_NOSLASH) == 0)
+				*cp++ = '\\';
+			*cp++ = '$';
+			*cp++ = '\n';
+			*cp = '\0';
+		} else 
+			(void) vis(buff, (char)c, eflags, (char)rachar);
+
+		cp = buff;
+		if (fold) {
+#ifdef DEBUG
+			if (debug)
+				printf("<%02d,", col);
+#endif
+			col = foldit(cp, col, foldwidth);
+#ifdef DEBUG
+			if (debug)
+				printf("%02d>", col);
+#endif
+		}
+		do {
+			putchar(*cp);
+		} while (*++cp);
+		c = rachar;
+	}
+	/*
+	 * terminate partial line with a hidden newline
+	 */
+	if (fold && *(cp-1) != '\n')
+		printf("\\\n");
+}
+
+__dead void
+usage(void)
+{
+	extern char *__progname;
+
+	fprintf(stderr, "usage: %s [-abcflnostw] [-F foldwidth] [file ...]\n",
+	    __progname);
+	exit(1);
+}