1 /*-
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1989, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17
18 #include <stdio.h>
19 #include <vis.h>
20
21 char *Program;
22 #define usage() fprintf(stderr, "usage: %s %s\n", Program, USAGE)
23 #define USAGE "[file...]"
24
main(argc,argv)25 main(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
process(fp,filename)57 process(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
error(va_alist)93 error(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
syserror(va_alist)108 syserror(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 }
122