1*f1f89080SBrooks Davis /* $NetBSD: unvis.c,v 1.13 2010/11/27 19:46:25 christos Exp $ */
2*f1f89080SBrooks Davis
3*f1f89080SBrooks Davis /*-
4*f1f89080SBrooks Davis * Copyright (c) 1989, 1993
5*f1f89080SBrooks Davis * The Regents of the University of California. All rights reserved.
6*f1f89080SBrooks Davis *
7*f1f89080SBrooks Davis * Redistribution and use in source and binary forms, with or without
8*f1f89080SBrooks Davis * modification, are permitted provided that the following conditions
9*f1f89080SBrooks Davis * are met:
10*f1f89080SBrooks Davis * 1. Redistributions of source code must retain the above copyright
11*f1f89080SBrooks Davis * notice, this list of conditions and the following disclaimer.
12*f1f89080SBrooks Davis * 2. Redistributions in binary form must reproduce the above copyright
13*f1f89080SBrooks Davis * notice, this list of conditions and the following disclaimer in the
14*f1f89080SBrooks Davis * documentation and/or other materials provided with the distribution.
15*f1f89080SBrooks Davis * 3. Neither the name of the University nor the names of its contributors
16*f1f89080SBrooks Davis * may be used to endorse or promote products derived from this software
17*f1f89080SBrooks Davis * without specific prior written permission.
18*f1f89080SBrooks Davis *
19*f1f89080SBrooks Davis * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*f1f89080SBrooks Davis * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*f1f89080SBrooks Davis * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*f1f89080SBrooks Davis * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*f1f89080SBrooks Davis * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*f1f89080SBrooks Davis * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*f1f89080SBrooks Davis * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*f1f89080SBrooks Davis * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*f1f89080SBrooks Davis * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*f1f89080SBrooks Davis * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*f1f89080SBrooks Davis * SUCH DAMAGE.
30*f1f89080SBrooks Davis */
31*f1f89080SBrooks Davis
32*f1f89080SBrooks Davis #include <sys/cdefs.h>
33*f1f89080SBrooks Davis #ifndef lint
34*f1f89080SBrooks Davis __COPYRIGHT("@(#) Copyright (c) 1989, 1993\
35*f1f89080SBrooks Davis The Regents of the University of California. All rights reserved.");
36*f1f89080SBrooks Davis #endif /* not lint */
37*f1f89080SBrooks Davis
38*f1f89080SBrooks Davis #ifndef lint
39*f1f89080SBrooks Davis #if 0
40*f1f89080SBrooks Davis static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/6/93";
41*f1f89080SBrooks Davis #endif
42*f1f89080SBrooks Davis __RCSID("$NetBSD: unvis.c,v 1.13 2010/11/27 19:46:25 christos Exp $");
43*f1f89080SBrooks Davis #endif /* not lint */
44*f1f89080SBrooks Davis
45*f1f89080SBrooks Davis #include <err.h>
46*f1f89080SBrooks Davis #include <stdio.h>
47*f1f89080SBrooks Davis #include <stdlib.h>
48*f1f89080SBrooks Davis #include <unistd.h>
49*f1f89080SBrooks Davis #include <vis.h>
50*f1f89080SBrooks Davis
51*f1f89080SBrooks Davis static void process(FILE *, const char *, int);
52*f1f89080SBrooks Davis
53*f1f89080SBrooks Davis int
main(int argc,char * argv[])54*f1f89080SBrooks Davis main(int argc, char *argv[])
55*f1f89080SBrooks Davis {
56*f1f89080SBrooks Davis FILE *fp;
57*f1f89080SBrooks Davis int ch, eflags = 0;
58*f1f89080SBrooks Davis
59*f1f89080SBrooks Davis setprogname(argv[0]);
60*f1f89080SBrooks Davis while ((ch = getopt(argc, argv, "eHhm")) != -1)
61*f1f89080SBrooks Davis switch((char)ch) {
62*f1f89080SBrooks Davis case 'e':
63*f1f89080SBrooks Davis eflags |= VIS_NOESCAPE;
64*f1f89080SBrooks Davis break;
65*f1f89080SBrooks Davis case 'H':
66*f1f89080SBrooks Davis eflags |= VIS_HTTP1866;
67*f1f89080SBrooks Davis break;
68*f1f89080SBrooks Davis case 'h':
69*f1f89080SBrooks Davis eflags |= VIS_HTTP1808;
70*f1f89080SBrooks Davis break;
71*f1f89080SBrooks Davis case 'm':
72*f1f89080SBrooks Davis eflags |= VIS_MIMESTYLE;
73*f1f89080SBrooks Davis break;
74*f1f89080SBrooks Davis case '?':
75*f1f89080SBrooks Davis default:
76*f1f89080SBrooks Davis (void)fprintf(stderr,
77*f1f89080SBrooks Davis "Usage: %s [-e] [-Hh | -m] [file...]\n",
78*f1f89080SBrooks Davis getprogname());
79*f1f89080SBrooks Davis return EXIT_FAILURE;
80*f1f89080SBrooks Davis }
81*f1f89080SBrooks Davis argc -= optind;
82*f1f89080SBrooks Davis argv += optind;
83*f1f89080SBrooks Davis
84*f1f89080SBrooks Davis switch (eflags & (VIS_HTTP1808|VIS_HTTP1866|VIS_MIMESTYLE)) {
85*f1f89080SBrooks Davis case VIS_HTTP1808|VIS_MIMESTYLE:
86*f1f89080SBrooks Davis case VIS_HTTP1866|VIS_MIMESTYLE:
87*f1f89080SBrooks Davis case VIS_HTTP1808|VIS_HTTP1866|VIS_MIMESTYLE:
88*f1f89080SBrooks Davis errx(EXIT_FAILURE, "Can't mix -m with -h and/or -H");
89*f1f89080SBrooks Davis /*NOTREACHED*/
90*f1f89080SBrooks Davis default:
91*f1f89080SBrooks Davis break;
92*f1f89080SBrooks Davis }
93*f1f89080SBrooks Davis
94*f1f89080SBrooks Davis if (*argv)
95*f1f89080SBrooks Davis while (*argv) {
96*f1f89080SBrooks Davis if ((fp = fopen(*argv, "r")) != NULL)
97*f1f89080SBrooks Davis process(fp, *argv, eflags);
98*f1f89080SBrooks Davis else
99*f1f89080SBrooks Davis warn("%s", *argv);
100*f1f89080SBrooks Davis argv++;
101*f1f89080SBrooks Davis }
102*f1f89080SBrooks Davis else
103*f1f89080SBrooks Davis process(stdin, "<stdin>", eflags);
104*f1f89080SBrooks Davis return EXIT_SUCCESS;
105*f1f89080SBrooks Davis }
106*f1f89080SBrooks Davis
107*f1f89080SBrooks Davis static void
process(FILE * fp,const char * filename,int eflags)108*f1f89080SBrooks Davis process(FILE *fp, const char *filename, int eflags)
109*f1f89080SBrooks Davis {
110*f1f89080SBrooks Davis int offset = 0, c, ret;
111*f1f89080SBrooks Davis int state = 0;
112*f1f89080SBrooks Davis char outc;
113*f1f89080SBrooks Davis
114*f1f89080SBrooks Davis while ((c = getc(fp)) != EOF) {
115*f1f89080SBrooks Davis offset++;
116*f1f89080SBrooks Davis again:
117*f1f89080SBrooks Davis switch(ret = unvis(&outc, (char)c, &state, eflags)) {
118*f1f89080SBrooks Davis case UNVIS_VALID:
119*f1f89080SBrooks Davis (void)putchar(outc);
120*f1f89080SBrooks Davis break;
121*f1f89080SBrooks Davis case UNVIS_VALIDPUSH:
122*f1f89080SBrooks Davis (void)putchar(outc);
123*f1f89080SBrooks Davis goto again;
124*f1f89080SBrooks Davis case UNVIS_SYNBAD:
125*f1f89080SBrooks Davis warnx("%s: offset: %d: can't decode", filename, offset);
126*f1f89080SBrooks Davis state = 0;
127*f1f89080SBrooks Davis break;
128*f1f89080SBrooks Davis case 0:
129*f1f89080SBrooks Davis case UNVIS_NOCHAR:
130*f1f89080SBrooks Davis break;
131*f1f89080SBrooks Davis default:
132*f1f89080SBrooks Davis errx(1, "bad return value (%d), can't happen", ret);
133*f1f89080SBrooks Davis /* NOTREACHED */
134*f1f89080SBrooks Davis }
135*f1f89080SBrooks Davis }
136*f1f89080SBrooks Davis if (unvis(&outc, (char)0, &state, eflags | UNVIS_END) == UNVIS_VALID)
137*f1f89080SBrooks Davis (void)putchar(outc);
138*f1f89080SBrooks Davis }
139