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:
commit
f1f8908049
6
contrib/unvis/Makefile
Normal file
6
contrib/unvis/Makefile
Normal 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>
|
@ -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 .
|
@ -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
7
contrib/vis/Makefile
Normal 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
39
contrib/vis/extern.h
Normal 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);
|
@ -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;
|
||||
}
|
@ -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
276
contrib/vis/vis.c
Normal 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");
|
||||
}
|
@ -3,4 +3,6 @@
|
||||
|
||||
PROG= unvis
|
||||
|
||||
.PATH: ${.CURDIR}/../../contrib/unvis
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -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>
|
||||
|
@ -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);
|
@ -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");
|
||||
}
|
Loading…
Reference in New Issue
Block a user