xref: /freebsd/contrib/unvis/unvis.c (revision f1f89080)
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