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[] = "@(#)vis.c 8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17
18 #include <stdio.h>
19 #include <vis.h>
20
21 int eflags, fold, foldwidth=80, none, markeol, debug;
22
main(argc,argv)23 main(argc, argv)
24 char *argv[];
25 {
26 extern char *optarg;
27 extern int optind;
28 extern int errno;
29 FILE *fp;
30 int ch;
31
32 while ((ch = getopt(argc, argv, "nwctsobfF:ld")) != EOF)
33 switch((char)ch) {
34 case 'n':
35 none++;
36 break;
37 case 'w':
38 eflags |= VIS_WHITE;
39 break;
40 case 'c':
41 eflags |= VIS_CSTYLE;
42 break;
43 case 't':
44 eflags |= VIS_TAB;
45 break;
46 case 's':
47 eflags |= VIS_SAFE;
48 break;
49 case 'o':
50 eflags |= VIS_OCTAL;
51 break;
52 case 'b':
53 eflags |= VIS_NOSLASH;
54 break;
55 case 'F':
56 if ((foldwidth = atoi(optarg))<5) {
57 fprintf(stderr,
58 "vis: can't fold lines to less than 5 cols\n");
59 exit(1);
60 }
61 /*FALLTHROUGH*/
62 case 'f':
63 fold++; /* fold output lines to 80 cols */
64 break; /* using hidden newline */
65 case 'l':
66 markeol++; /* mark end of line with \$ */
67 break;
68 #ifdef DEBUG
69 case 'd':
70 debug++;
71 break;
72 #endif
73 case '?':
74 default:
75 fprintf(stderr,
76 "usage: vis [-nwctsobf] [-F foldwidth]\n");
77 exit(1);
78 }
79 argc -= optind;
80 argv += optind;
81
82 if (*argv)
83 while (*argv) {
84 if ((fp=fopen(*argv, "r")) != NULL)
85 process(fp, *argv);
86 else
87 fprintf(stderr, "vis: %s: %s\n", *argv,
88 (char *)strerror(errno));
89 argv++;
90 }
91 else
92 process(stdin, "<stdin>");
93 exit(0);
94 }
95
process(fp,filename)96 process(fp, filename)
97 FILE *fp;
98 char *filename;
99 {
100 static int col = 0;
101 register char *cp = "\0"+1; /* so *(cp-1) starts out != '\n' */
102 register int c, rachar;
103 register char nc;
104 char buff[5];
105
106 c = getc(fp);
107 while (c != EOF) {
108 rachar = getc(fp);
109 if (none) {
110 cp = buff;
111 *cp++ = c;
112 if (c == '\\')
113 *cp++ = '\\';
114 *cp = '\0';
115 } else if (markeol && c == '\n') {
116 cp = buff;
117 if ((eflags & VIS_NOSLASH) == 0)
118 *cp++ = '\\';
119 *cp++ = '$';
120 *cp++ = '\n';
121 *cp = '\0';
122 } else
123 (void) vis(buff, (char)c, eflags, (char)rachar);
124
125 cp = buff;
126 if (fold) {
127 #ifdef DEBUG
128 if (debug)
129 printf("<%02d,", col);
130 #endif
131 col = foldit(cp, col, foldwidth);
132 #ifdef DEBUG
133 if (debug)
134 printf("%02d>", col);
135 #endif
136 }
137 do {
138 putchar(*cp);
139 } while (*++cp);
140 c = rachar;
141 }
142 /*
143 * terminate partial line with a hidden newline
144 */
145 if (fold && *(cp-1) != '\n')
146 printf("\\\n");
147 }
148