|
|
1.1 root 1: #include <ctype.h>
2: #include <stdio.h>
3: #include <sys/types.h>
4: #include <sys/stat.h>
5:
6: /*
7: * Vfontedpr.
8: *
9: * Bill Joy, Apr. 1979.
10: */
11: char *ctime();
12: int incomm;
13: int instr;
14: int nokeyw;
15: int index;
16: int margin;
17:
18: main(argc, argv)
19: int argc;
20: char *argv[];
21: {
22: int lineno;
23: char *fname = "";
24: struct stat stbuf;
25: char buf[BUFSIZ];
26: int needbp = 0;
27:
28: argc--, argv++;
29: do {
30: char *cp;
31:
32: if (argc > 0) {
33: if (!strcmp(argv[0], "-h")) {
34: if (argc == 1) {
35: printf("'ds =H\n");
36: argc = 0;
37: goto rest;
38: }
39: printf("'ds =H %s\n", argv[1]);
40: argc -= 2;
41: argv += 2;
42: if (argc > 0)
43: continue;
44: goto rest;
45: }
46: if (!strcmp(argv[0], "-x")) {
47: index++;
48: argv[0] = "-n";
49: }
50: if (!strcmp(argv[0], "-n")) {
51: nokeyw++;
52: argc--, argv++;
53: continue;
54: }
55: if (freopen(argv[0], "r", stdin) == NULL) {
56: perror(argv[0]);
57: exit(1);
58: }
59: if (index)
60: printf("'ta 4i 4.25i 5.5iR\n'in .5i\n");
61: fname = argv[0];
62: argc--, argv++;
63: }
64: rest:
65: incomm = 0;
66: instr = 0;
67: printf(".ds =F %s\n", fname);
68: fstat(fileno(stdin), &stbuf);
69: cp = ctime(&stbuf.st_mtime);
70: cp[16] = '\0';
71: cp[24] = '\0';
72: printf(".ds =M %s %s\n", cp+4, cp+20);
73: if (needbp) {
74: needbp = 0;
75: printf(".()\n");
76: printf(".bp\n");
77: }
78: while (fgets(buf, sizeof buf, stdin) != NULL) {
79: if (buf[0] == '\f') {
80: printf(".bp\n");
81: continue;
82: }
83: putScp(buf);
84: if (buf[strlen(buf) - 2] != '\\')
85: instr = 0;
86: margin = 0;
87: }
88: needbp = 1;
89: } while (argc > 0);
90: exit(0);
91: }
92:
93: #define ps(x) printf("%s", x)
94: #define isidchr(c) (isalnum(c) || (c) == '_')
95:
96: putScp(os)
97: char *os;
98: {
99: register char *s = os;
100: register int i;
101: int xfld = 0;
102:
103: if (nokeyw)
104: goto skip;
105: if ((*s == '_' || isalpha(*s)) && s[strlen(s) - 2] == ')') {
106: register char *t = s + 1;
107:
108: while (isidchr(*t))
109: t++;
110: ps("'FN ");
111: while (s < t)
112: putchar(*s++);
113: ps("\n");
114: } else if (!strcmp(s, "}\n"))
115: ps("'-F\n");
116: skip:
117: while (*s) {
118: if (index) {
119: if (*s == ' ' || *s == '\t') {
120: if (xfld == 0)
121: printf("&");
122: printf("\t");
123: xfld = 1;
124: while (*s == ' ' || *s == '\t')
125: s++;
126: continue;
127: }
128: }
129: if (!nokeyw && !incomm && *s == '"') {
130: if (instr) {
131: if (s[-1] != '\\')
132: instr = 0;
133: } else
134: if (s[-1] != '\'')
135: instr = 1;
136: }
137: if (incomm && s - os >= 2 && !strncmp("*/", s - 2, 2)) {
138: incomm = 0;
139: ps("\\c\n'-C\n");
140: } else if (!nokeyw && !incomm && !strncmp("/*", s, 2)) {
141: incomm = 1;
142: if (s != os)
143: ps("\\c");
144: ps("\\c\n'+C\n");
145: margin = width(os, s);
146: ps("\\*(/*");
147: s += 2;
148: continue;
149: }
150: if (*s == '\t') {
151: while (*s == '\t')
152: s++;
153: i = tabs(os, s) - margin / 8;
154: printf("\\h'|%dn'", i * 10 + 1 - margin % 8);
155: continue;
156: }
157: /*
158: if (*s == '-' && s[1] == '>') {
159: s += 2;
160: ps("\\(->");
161: continue;
162: }
163: */
164: if (!nokeyw && !instr && (*s == '#' || isalpha(*s)) && (s == os || !isidchr(s[-1]))) {
165: i = iskw(s);
166: if (i > 0) {
167: ps("\\*(+K");
168: do
169: putcp(*s++);
170: while (--i > 0);
171: ps("\\*(-K");
172: continue;
173: }
174: }
175: putcp(*s++);
176: }
177: }
178:
179: tabs(s, os)
180: char *s, *os;
181: {
182:
183: return (width(s, os) / 8);
184: }
185:
186: width(s, os)
187: register char *s, *os;
188: {
189: register int i = 0;
190:
191: while (s < os) {
192: if (*s == '\t') {
193: i = (i + 8) &~ 7;
194: s++;
195: continue;
196: }
197: if (*s < ' ')
198: i += 2;
199: else
200: i++;
201: s++;
202: }
203: return (i);
204: }
205:
206: putcp(c)
207: register int c;
208: {
209:
210: switch(c) {
211:
212: case '{':
213: ps("\\*(+K{\\*(-K");
214: break;
215:
216: case '}':
217: ps("\\*(+K}\\*(-K");
218: break;
219:
220: case '\\':
221: ps("\\e");
222: break;
223:
224: case '_':
225: ps("\\*_");
226: break;
227:
228: case '-':
229: ps("\\*-");
230: break;
231:
232: case '`':
233: ps("\\`");
234: break;
235:
236: case '\'':
237: ps("\\'");
238: break;
239:
240: case '.':
241: ps("\\&.");
242: break;
243:
244: default:
245: if (c < 040)
246: putchar('^'), c |= '@';
247: case '\t':
248: case '\n':
249: putchar(c);
250: }
251: }
252:
253: char *ckw[] = {
254: "asm",
255: "auto",
256: "break",
257: "case",
258: "char",
259: "continue",
260: "default",
261: "do",
262: "double",
263: "else",
264: "enum",
265: "extern",
266: "float",
267: "for",
268: "fortran",
269: "goto",
270: "if",
271: "int",
272: "long",
273: "register",
274: "return",
275: "short",
276: "sizeof",
277: "static",
278: "struct",
279: "switch",
280: "typedef",
281: "union",
282: "unsigned",
283: "while",
284: "#define",
285: "#else",
286: "#endif",
287: "#if",
288: "#ifdef",
289: "#ifndef",
290: "#include",
291: "#undef",
292: 0,
293: };
294:
295: iskw(s)
296: register char *s;
297: {
298: register char **ss = ckw;
299: register int i = 1;
300: register char *cp = s;
301:
302: while (++cp, isidchr(*cp))
303: i++;
304: while (cp = *ss++)
305: if (*s == *cp && !strncmp(s, cp, i) && !isidchr(cp[i]))
306: return (i);
307: return (0);
308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.