4.4BSD snapshot (revision 8.1); add 1993 to copyright
[unix-history] / usr / src / usr.bin / unvis / unvis.c
CommitLineData
11176d9b 1/*-
0836b5cf
KB
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
ecb16b9f 4 *
11176d9b 5 * %sccs.include.redist.c%
ecb16b9f
MT
6 */
7
8#ifndef lint
0836b5cf
KB
9static char copyright[] =
10"@(#) Copyright (c) 1989, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
ecb16b9f
MT
12#endif /* not lint */
13
14#ifndef lint
0836b5cf 15static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) %G%";
ecb16b9f
MT
16#endif /* not lint */
17
18#include <stdio.h>
19#include <vis.h>
20
21char *Program;
22#define usage() fprintf(stderr, "usage: %s %s\n", Program, USAGE)
23#define USAGE "[file...]"
24
25main(argc, argv)
26 char *argv[];
27{
28 FILE *fp;
29 extern char *optarg;
30 extern int optind;
31 int ch;
32
33 Program = argv[0];
34 while ((ch = getopt(argc, argv, "")) != EOF)
35 switch((char)ch) {
36 case '?':
37 default:
38 usage();
39 exit(1);
40 }
41 argc -= optind;
42 argv += optind;
43
44 if (*argv)
45 while (*argv) {
46 if ((fp=fopen(*argv, "r")) != NULL)
47 process(fp, *argv);
48 else
49 syserror("%s", *argv);
50 argv++;
51 }
52 else
53 process(stdin, "<stdin>");
54 exit(0);
55}
56
57process(fp, filename)
58 FILE *fp;
59 char *filename;
60{
61 register int offset = 0, c, ret;
62 int state = 0;
63 char outc;
64
65 while ((c = getc(fp)) != EOF) {
66 offset++;
67 again:
68 switch(ret = unvis(&outc, (char)c, &state, 0)) {
69 case UNVIS_VALID:
70 putchar(outc);
71 break;
72 case UNVIS_VALIDPUSH:
73 putchar(outc);
74 goto again;
75 case UNVIS_SYNBAD:
76 error("%s: offset: %d: can't decode", filename, offset);
77 state = 0;
78 break;
79 case 0:
80 case UNVIS_NOCHAR:
81 break;
82 default:
83 error("bad return value (%d), can't happen", ret);
84 exit(1);
85 }
86 }
87 if (unvis(&outc, (char)0, &state, UNVIS_END) == UNVIS_VALID)
88 putchar(outc);
89}
90
91#include <varargs.h>
92
93error(va_alist)
94 va_dcl
95{
96 char *fmt;
97 va_list ap;
98 extern errno;
99
100 fprintf(stderr, "%s: ", Program);
101 va_start(ap);
102 fmt = va_arg(ap, char *);
103 (void) vfprintf(stderr, fmt, ap);
104 va_end(ap);
105 fprintf(stderr, "\n");
106}
107
108syserror(va_alist)
109 va_dcl
110{
111 char *fmt;
112 va_list ap;
113 extern errno;
114
115 fprintf(stderr, "%s: ", Program);
116 va_start(ap);
117 fmt = va_arg(ap, char *);
118 (void) vfprintf(stderr, fmt, ap);
119 va_end(ap);
120 fprintf(stderr, ": %s\n", strerror(errno));
121}