Replace our (un)vis(1) commands with implementations from NetBSD to

match our import of the (un)vis(3) APIs.

This adds support for multibyte encoding and the -h and -m flags which
support HTTP and MIME encoding respectively.

PR:		bin/175418
Obtained from:	NetBSD
This commit is contained in:
Brooks Davis 2013-03-15 00:05:50 +00:00
commit f1f8908049
12 changed files with 482 additions and 291 deletions

6
contrib/unvis/Makefile Normal file
View File

@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.3 1994/12/06 07:36:07 jtc Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= unvis
.include <bsd.prog.mk>

View File

@ -1,3 +1,5 @@
.\" $NetBSD: unvis.1,v 1.10 2012/12/15 02:08:13 uwe Exp $
.\"
.\" Copyright (c) 1989, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@ -9,7 +11,7 @@
.\" 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.
.\" 4. Neither the name of the University nor the names of its contributors
.\" 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.
.\"
@ -26,9 +28,8 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)unvis.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
.Dd June 6, 1993
.Dd November 27, 2010
.Dt UNVIS 1
.Os
.Sh NAME
@ -36,14 +37,38 @@
.Nd "revert a visual representation of data back to original form"
.Sh SYNOPSIS
.Nm
.Op Ar
.Op Fl e
.Op Fl Hh | Fl m
.Op Ar file ...
.Sh DESCRIPTION
The
.Nm
utility is the inverse function of
is the inverse function of
.Xr vis 1 .
It reverts
a visual representation of data back to its original form on standard output.
.Pp
The options are as follows:
.Bl -tag -width Ds
.It Fl e
Don't decode \e escaped sequences.
.It Fl H
Decode entity references and numeric character references from RFC 1866.
.Pq Dv VIS_HTTP1866
.It Fl h
Decode using the URI encoding from RFC 1808.
.Pq Dv VIS_HTTP1808
.It Fl m
Decode using mime style.
.Pq Dv VIS_MIMESTYLE
.El
.Pp
Mixing
.Fl h
or
.Fl H
with
.Fl m
is not supported.
.Sh SEE ALSO
.Xr vis 1 ,
.Xr unvis 3 ,
@ -51,5 +76,5 @@ a visual representation of data back to its original form on standard output.
.Sh HISTORY
The
.Nm
command appeared in
command appears in
.Bx 4.4 .

View File

@ -1,3 +1,5 @@
/* $NetBSD: unvis.c,v 1.13 2010/11/27 19:46:25 christos Exp $ */
/*-
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
@ -10,7 +12,7 @@
* 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.
* 4. Neither the name of the University nor the names of its contributors
* 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.
*
@ -27,18 +29,17 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
#ifndef lint
static const char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
__COPYRIGHT("@(#) Copyright (c) 1989, 1993\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$FreeBSD$";
__RCSID("$NetBSD: unvis.c,v 1.13 2010/11/27 19:46:25 christos Exp $");
#endif /* not lint */
#include <err.h>
@ -47,46 +48,64 @@ static const char rcsid[] =
#include <unistd.h>
#include <vis.h>
void process(FILE *, const char *);
static void usage(void);
static void process(FILE *, const char *, int);
int
main(int argc, char *argv[])
{
FILE *fp;
int ch;
int ch, eflags = 0;
while ((ch = getopt(argc, argv, "")) != -1)
setprogname(argv[0]);
while ((ch = getopt(argc, argv, "eHhm")) != -1)
switch((char)ch) {
case 'e':
eflags |= VIS_NOESCAPE;
break;
case 'H':
eflags |= VIS_HTTP1866;
break;
case 'h':
eflags |= VIS_HTTP1808;
break;
case 'm':
eflags |= VIS_MIMESTYLE;
break;
case '?':
default:
usage();
(void)fprintf(stderr,
"Usage: %s [-e] [-Hh | -m] [file...]\n",
getprogname());
return EXIT_FAILURE;
}
argc -= optind;
argv += optind;
switch (eflags & (VIS_HTTP1808|VIS_HTTP1866|VIS_MIMESTYLE)) {
case VIS_HTTP1808|VIS_MIMESTYLE:
case VIS_HTTP1866|VIS_MIMESTYLE:
case VIS_HTTP1808|VIS_HTTP1866|VIS_MIMESTYLE:
errx(EXIT_FAILURE, "Can't mix -m with -h and/or -H");
/*NOTREACHED*/
default:
break;
}
if (*argv)
while (*argv) {
if ((fp = fopen(*argv, "r")) != NULL)
process(fp, *argv);
process(fp, *argv, eflags);
else
warn("%s", *argv);
argv++;
}
else
process(stdin, "<stdin>");
exit(0);
process(stdin, "<stdin>", eflags);
return EXIT_SUCCESS;
}
static void
usage(void)
{
fprintf(stderr, "usage: unvis [file ...]\n");
exit(1);
}
void
process(FILE *fp, const char *filename)
process(FILE *fp, const char *filename, int eflags)
{
int offset = 0, c, ret;
int state = 0;
@ -95,12 +114,12 @@ process(FILE *fp, const char *filename)
while ((c = getc(fp)) != EOF) {
offset++;
again:
switch(ret = unvis(&outc, (char)c, &state, 0)) {
switch(ret = unvis(&outc, (char)c, &state, eflags)) {
case UNVIS_VALID:
putchar(outc);
(void)putchar(outc);
break;
case UNVIS_VALIDPUSH:
putchar(outc);
(void)putchar(outc);
goto again;
case UNVIS_SYNBAD:
warnx("%s: offset: %d: can't decode", filename, offset);
@ -111,8 +130,9 @@ process(FILE *fp, const char *filename)
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);
if (unvis(&outc, (char)0, &state, eflags | UNVIS_END) == UNVIS_VALID)
(void)putchar(outc);
}

7
contrib/vis/Makefile Normal file
View File

@ -0,0 +1,7 @@
# $NetBSD: Makefile,v 1.3 1994/11/17 07:55:57 jtc Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= vis
SRCS= vis.c foldit.c
.include <bsd.prog.mk>

39
contrib/vis/extern.h Normal file
View File

@ -0,0 +1,39 @@
/* $NetBSD: extern.h,v 1.1 2009/02/10 23:06:31 christos Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
int foldit(const char *, int, int, int);

View File

@ -1,3 +1,5 @@
/* $NetBSD: foldit.c,v 1.7 2009/02/10 23:06:31 christos Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -10,7 +12,7 @@
* 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.
* 4. Neither the name of the University nor the names of its contributors
* 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.
*
@ -28,21 +30,21 @@
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#ifndef lint
static const char sccsid[] = "@(#)foldit.c 8.1 (Berkeley) 6/6/93";
#if 0
static char sccsid[] = "@(#)foldit.c 8.1 (Berkeley) 6/6/93";
#endif
__RCSID("$NetBSD: foldit.c,v 1.7 2009/02/10 23:06:31 christos Exp $");
#endif /* not lint */
#include <stdio.h>
#include <vis.h>
#include "extern.h"
int
foldit(char *chunk, int col, int max)
foldit(const char *chunk, int col, int max, int flags)
{
char *cp;
const char *cp;
/*
* Keep track of column position. Insert hidden newline
@ -66,7 +68,7 @@ foldit(char *chunk, int col, int max)
col++;
}
if (col > (max - 2)) {
printf("\\\n");
printf(flags & VIS_MIMESTYLE ? "=\n" : "\\\n");
col = 0;
goto again;
}

View File

@ -1,3 +1,5 @@
.\" $NetBSD: vis.1,v 1.17 2013/02/14 14:00:00 christos Exp $
.\"
.\" Copyright (c) 1989, 1991, 1993, 1994
.\" The Regents of the University of California. All rights reserved.
.\"
@ -9,7 +11,7 @@
.\" 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.
.\" 4. Neither the name of the University nor the names of its contributors
.\" 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.
.\"
@ -26,9 +28,8 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)vis.1 8.4 (Berkeley) 4/19/94
.\" $FreeBSD$
.\"
.Dd June 25, 2004
.Dd February 13, 2013
.Dt VIS 1
.Os
.Sh NAME
@ -36,13 +37,13 @@
.Nd display non-printable characters in a visual format
.Sh SYNOPSIS
.Nm
.Op Fl cbflnostw
.Op Fl bcfhlmnostw
.Op Fl e Ar extra
.Op Fl F Ar foldwidth
.Op Ar
.Op Ar file ...
.Sh DESCRIPTION
The
.Nm
utility is a filter for converting non-printable characters
is a filter for converting non-printable characters
into a visual representation.
It differs from
.Ql cat -v
@ -55,7 +56,7 @@ various visual formats is given in
.Xr vis 3 .
.Pp
The options are as follows:
.Bl -tag -width indent
.Bl -tag -width Ds
.It Fl b
Turns off prepending of backslash before up-arrow control sequences
and meta characters, and disables the doubling of backslashes.
@ -64,32 +65,43 @@ produces output which is neither invertible or precise, but does
represent a minimum of change to the input.
It is similar to
.Dq Li cat -v .
.Pq Dv VIS_NOSLASH
.It Fl c
Request a format which displays a small subset of the
non-printable characters using C-style backslash sequences.
.It Fl F
.Pq Dv VIS_CSTYLE
.It Fl e Ar extra
Also encode characters in
.Ar extra ,
per
.Xr svis 3 .
.It Fl F Ar foldwidth
Causes
.Nm
to fold output lines to
.Ar foldwidth
columns (default 80), like
to fold output lines to foldwidth columns (default 80), like
.Xr fold 1 ,
except
that a hidden newline sequence is used (which is removed
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 do not work with partial lines.
typically don't work with partial lines.
.It Fl f
Same as
.Fl F .
.It Fl h
Encode using the URI encoding from RFC 1808.
.Pq Dv VIS_HTTPSTYLE
.It Fl l
Mark newlines with the visible sequence
.Ql \e$ ,
followed by the newline.
.It Fl m
Encode using the MIME Quoted-Printable encoding from RFC 2045.
.Pq Dv VIS_MIMESTYLE
.It Fl n
Turns off any encoding, except for the fact that backslashes are
still doubled and hidden newline sequences inserted if
@ -105,34 +117,53 @@ becomes like
an invertible version of the
.Xr fold 1
utility.
That is, the output
can be unfolded by running the output through
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.
.Pq Dv VIS_OCTAL
.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.
.Pq Dv VIS_SAFE
.It Fl t
Tabs are also encoded.
.Pq Dv VIS_TAB
.It Fl w
White space (space-tab-newline) is also encoded.
.Pq Dv VIS_WHITE
.El
.Sh MULTIBYTE CHARACTER SUPPORT
.Nm
supports multibyte character input.
The encoding conversion is influenced by the setting of the
.Ev LC_CTYPE
environment variable which defines the set of characters that can be
copied without encoding.
.Pp
When 8-bit data is present in the input,
.Ev LC_CTYPE
must be set to the correct locale or to the C locale.
If the locales of the data and the conversion are mismatched, multibyte
character recognition may fail and encoding will be performed byte-by-byte
instead.
.Sh ENVIRONMENT
.Bl -tag -width ".Ev LC_CTYPE"
.It Ev LC_CTYPE
Specify the locale of the input data.
Set to C if the input data locale is unknown.
.Sh SEE ALSO
.Xr unvis 1 ,
.Xr svis 3 ,
.Xr vis 3
.Sh HISTORY
The
.Nm
command appeared in
command appears in
.Bx 4.4 .
.Sh BUGS
Due to limitations in the underlying
.Xr vis 3
function, the
.Nm
utility
does not recognize multibyte characters, and thus may consider them to be
non-printable when they are in fact printable (and vice versa).
Myltibyte character support was added in
.Nx 6.1
and
.Fx 9.2 .

276
contrib/vis/vis.c Normal file
View File

@ -0,0 +1,276 @@
/* $NetBSD: vis.c,v 1.22 2013/02/20 17:04:45 christos 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 <sys/cdefs.h>
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1989, 1993\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)vis.c 8.1 (Berkeley) 6/6/93";
#endif
__RCSID("$NetBSD: vis.c,v 1.22 2013/02/20 17:04:45 christos Exp $");
#endif /* not lint */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <wchar.h>
#include <limits.h>
#include <unistd.h>
#include <err.h>
#include <vis.h>
#include "extern.h"
static int eflags, fold, foldwidth = 80, none, markeol;
#ifdef DEBUG
int debug;
#endif
static const char *extra = "";
static void process(FILE *);
int
main(int argc, char *argv[])
{
FILE *fp;
int ch;
int rval;
while ((ch = getopt(argc, argv, "bcde:F:fhlmnostw")) != -1)
switch((char)ch) {
case 'b':
eflags |= VIS_NOSLASH;
break;
case 'c':
eflags |= VIS_CSTYLE;
break;
#ifdef DEBUG
case 'd':
debug++;
break;
#endif
case 'e':
extra = optarg;
break;
case 'F':
if ((foldwidth = atoi(optarg)) < 5) {
errx(1, "can't fold lines to less than 5 cols");
/* NOTREACHED */
}
markeol++;
break;
case 'f':
fold++; /* fold output lines to 80 cols */
break; /* using hidden newline */
case 'h':
eflags |= VIS_HTTPSTYLE;
break;
case 'l':
markeol++; /* mark end of line with \$ */
break;
case 'm':
eflags |= VIS_MIMESTYLE;
if (foldwidth == 80)
foldwidth = 76;
break;
case 'n':
none++;
break;
case 'o':
eflags |= VIS_OCTAL;
break;
case 's':
eflags |= VIS_SAFE;
break;
case 't':
eflags |= VIS_TAB;
break;
case 'w':
eflags |= VIS_WHITE;
break;
case '?':
default:
(void)fprintf(stderr,
"Usage: %s [-bcfhlmnostw] [-e extra]"
" [-F foldwidth] [file ...]\n", getprogname());
return 1;
}
if ((eflags & (VIS_HTTPSTYLE|VIS_MIMESTYLE)) ==
(VIS_HTTPSTYLE|VIS_MIMESTYLE))
errx(1, "Can't specify -m and -h at the same time");
argc -= optind;
argv += optind;
rval = 0;
if (*argv)
while (*argv) {
if ((fp = fopen(*argv, "r")) != NULL) {
process(fp);
(void)fclose(fp);
} else {
warn("%s", *argv);
rval = 1;
}
argv++;
}
else
process(stdin);
return rval;
}
static void
process(FILE *fp)
{
static int col = 0;
static char nul[] = "\0";
char *cp = nul + 1; /* so *(cp-1) starts out != '\n' */
wint_t c, c1, rachar;
char mbibuff[2 * MB_LEN_MAX + 1]; /* max space for 2 wchars */
char buff[4 * MB_LEN_MAX + 1]; /* max encoding length for one char */
int mbilen, cerr = 0, raerr = 0;
/*
* The input stream is considered to be multibyte characters.
* The input loop will read this data inputing one character,
* possibly multiple bytes, at a time and converting each to
* a wide character wchar_t.
*
* The vis(3) functions, however, require single either bytes
* or a multibyte string as their arguments. So we convert
* our input wchar_t and the following look-ahead wchar_t to
* a multibyte string for processing by vis(3).
*/
/* Read one multibyte character, store as wchar_t */
c = getwc(fp);
if (c == WEOF && errno == EILSEQ) {
/* Error in multibyte data. Read one byte. */
c = (wint_t)getc(fp);
cerr = 1;
}
while (c != WEOF) {
/* Clear multibyte input buffer. */
memset(mbibuff, 0, sizeof(mbibuff));
/* Read-ahead next multibyte character. */
if (!cerr)
rachar = getwc(fp);
if (cerr || (rachar == WEOF && errno == EILSEQ)) {
/* Error in multibyte data. Read one byte. */
rachar = (wint_t)getc(fp);
raerr = 1;
}
if (none) {
/* Handle -n flag. */
cp = buff;
*cp++ = c;
if (c == '\\')
*cp++ = '\\';
*cp = '\0';
} else if (markeol && c == '\n') {
/* Handle -l flag. */
cp = buff;
if ((eflags & VIS_NOSLASH) == 0)
*cp++ = '\\';
*cp++ = '$';
*cp++ = '\n';
*cp = '\0';
} else {
/*
* Convert character using vis(3) library.
* At this point we will process one character.
* But we must pass the vis(3) library this
* character plus the next one because the next
* one is used as a look-ahead to decide how to
* encode this one under certain circumstances.
*
* Since our characters may be multibyte, e.g.,
* in the UTF-8 locale, we cannot use vis() and
* svis() which require byte input, so we must
* create a multibyte string and use strvisx().
*/
/* Treat EOF as a NUL char. */
c1 = rachar;
if (c1 == WEOF)
c1 = L'\0';
/*
* If we hit a multibyte conversion error above,
* insert byte directly into string buff because
* wctomb() will fail. Else convert wchar_t to
* multibyte using wctomb().
*/
if (cerr) {
*mbibuff = (char)c;
mbilen = 1;
} else
mbilen = wctomb(mbibuff, c);
/* Same for look-ahead character. */
if (raerr)
mbibuff[mbilen] = (char)c1;
else
wctomb(mbibuff + mbilen, c1);
/* Perform encoding on just first character. */
(void) strsenvisx(buff, 4 * MB_LEN_MAX, mbibuff,
1, eflags, extra, &cerr);
}
cp = buff;
if (fold) {
#ifdef DEBUG
if (debug)
(void)printf("<%02d,", col);
#endif
col = foldit(cp, col, foldwidth, eflags);
#ifdef DEBUG
if (debug)
(void)printf("%02d>", col);
#endif
}
do {
(void)putchar(*cp);
} while (*++cp);
c = rachar;
cerr = raerr;
}
/*
* terminate partial line with a hidden newline
*/
if (fold && *(cp - 1) != '\n')
(void)printf(eflags & VIS_MIMESTYLE ? "=\n" : "\\\n");
}

View File

@ -3,4 +3,6 @@
PROG= unvis
.PATH: ${.CURDIR}/../../contrib/unvis
.include <bsd.prog.mk>

View File

@ -1,6 +1,10 @@
# @(#)Makefile 8.1 (Berkeley) 6/6/93
# $FreeBSD$
PROG= vis
SRCS= vis.c foldit.c
.PATH: ${.CURDIR}/../../contrib/vis
CFLAGS+= -I${.CURDIR}/../../contrib/vis
.include <bsd.prog.mk>

View File

@ -1,32 +0,0 @@
/*-
* 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.
* 4. 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.
*
* $FreeBSD$
*/
extern int foldit(char *, int, int);

View File

@ -1,189 +0,0 @@
/*-
* 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.
* 4. 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 <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#ifndef lint
static const char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif
#ifndef lint
static const char sccsid[] = "@(#)vis.c 8.1 (Berkeley) 6/6/93";
#endif
#include <err.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <vis.h>
#include "extern.h"
static int eflags, fold, foldwidth = 80, none, markeol;
#ifdef DEBUG
static int debug;
#endif
static void process(FILE *);
static void usage(void);
int
main(int argc, char *argv[])
{
FILE *fp;
int ch;
(void) setlocale(LC_CTYPE, "");
while ((ch = getopt(argc, argv, "nwctsobfF:ld")) != -1)
switch((char)ch) {
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");
/*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);
}
static void
usage(void)
{
#ifdef DEBUG
fprintf(stderr, "usage: vis [-cbflnostwd] [-F foldwidth] [file ...]\n");
#else
fprintf(stderr, "usage: vis [-cbflnostw] [-F foldwidth] [file ...]\n");
#endif
exit(1);
}
static void
process(FILE *fp)
{
static int col = 0;
static char dummy[] = "\0";
char *cp = dummy+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");
}