1: /***************************************************************************
2: * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE *
3: * is provided to you without charge, and with no warranty. You may give *
4: * away copies of JOVE, including sources, provided that this notice is *
5: * included in all the files. *
6: ***************************************************************************/
7:
8: #define TXT_TO_C 1 /* must be a number for MAC compiler */
9:
10: #include "funcdefs.c"
11:
12: #ifdef MAC
13: #include "vars.c"
14: #endif
15:
16: #undef putchar /* From jove.h via funcdefs.c, conflicts with STDIO */
17: #undef putc
18: #undef getc
19: #undef EOF
20: #undef FILE
21: #undef BUFSIZ
22: #undef NULL
23: #include <stdio.h>
24:
25: matchcmd(choices, what)
26: register struct cmd choices[];
27: register char *what;
28: {
29: register int len;
30: int i,
31: found = 0,
32: save,
33: exactmatch = -1;
34:
35: len = strlen(what);
36: for (i = 0; choices[i].Name != 0; i++) {
37: if (*what != *choices[i].Name)
38: continue;
39: #ifdef MAC /* see "left-margin" and "left-margin-here" */
40: if (strcmp(what, choices[i].Name) == 0)
41: #else
42: if (strncmp(what, choices[i].Name, len) == 0)
43: #endif
44: return i;
45: }
46: return -1;
47: }
48:
49: #ifdef MAC
50: matchvar(choices, what)
51: register struct variable choices[];
52: register char *what;
53: {
54: register int len;
55: int i,
56: found = 0,
57: save,
58: exactmatch = -1;
59:
60: len = strlen(what);
61: for (i = 0; choices[i].Name != 0; i++) {
62: if (*what != *choices[i].Name)
63: continue;
64: if (strcmp(what, choices[i].Name) == 0)
65: return i;
66: }
67: return -1;
68: }
69: #endif
70:
71: char *
72: PPchar(c)
73: int c;
74: {
75: static char str[16];
76: char *cp = str;
77:
78: if (c & 0200) {
79: c &= ~0200;
80: strcpy(cp, "M-");
81: cp += 2;
82: }
83: if (c == '\033')
84: strcpy(cp, "ESC");
85: #ifdef IBMPC
86: else if (c == '\377')
87: strcpy(cp, "M");
88: #endif /* IBMPC */
89: else if (c < ' ')
90: (void) sprintf(cp, "C-%c", c + '@');
91: else if (c == '\177')
92: strcpy(cp, "^?");
93: else
94: (void) sprintf(cp, "%c", c);
95: return str;
96: }
97:
98:
99: extract(into, from)
100: char *into,
101: *from;
102: {
103: from += 2; /* Past tab and first double quote. */
104: while ((*into = *from++) != '"')
105: into += 1;
106: *into = 0;
107: }
108:
109:
110: void
111:
112: #ifdef MAC
113: _main() /* for Mac, so we can use redirection */
114: #else
115: main()
116: #endif
117: {
118: FILE *ifile,
119: *of;
120: char line[100],
121: #ifdef MAC
122: *which,
123: #endif
124: comname[70];
125: int comnum,
126: ch,
127: #ifdef MAC
128: inmenu = 0,
129: #endif
130: savech = -1,
131: errors = 0;
132:
133: ifile = stdin;
134: of = stdout;
135: if (ifile == NULL || of == NULL) {
136: printf("Cannot read input or write output.\n");
137: exit(1);
138: }
139: while (fgets(line, sizeof line, ifile) != NULL) {
140: if (strncmp(line, "#if", 3) == 0) {
141: savech = ch;
142: fprintf(of, line);
143: continue;
144: } else if (strncmp(line, "#else", 5) == 0) {
145: if (savech == -1)
146: fprintf(stderr, "WARNING: ifdef/endif mismatch!\n");
147: else
148: ch = savech;
149: fprintf(of, line);
150: continue;
151: } else if (strncmp(line, "#endif", 6) == 0) {
152: savech = -1;
153: fprintf(of, line);
154: continue;
155: #ifdef MAC
156: } else if (strncmp(line, "#MENU", 5) == 0) {
157: inmenu = 1;
158: continue;
159: #endif
160: } else if (strncmp(line, "\t\"", 2) != 0) {
161: fprintf(of, line);
162: ch = 0;
163: continue;
164: }
165: extract(comname, line);
166: if (strcmp(comname, "unbound") == 0)
167: comnum = 12345;
168: else {
169: #ifdef MAC
170: which = "commands";
171: #endif
172: comnum = matchcmd(commands, comname);
173: #ifdef MAC
174: if (comnum < 0 && inmenu) {
175: comnum = matchvar(variables, comname);
176: which = "variables";
177: }
178: #endif
179: if (comnum < 0) {
180: #ifdef MAC
181: fprintf(stderr, "Warning: cannot find item \"%s\".\n", comname);
182: #else
183: fprintf(stderr, "Warning: cannot find command \"%s\".\n", comname);
184: #endif
185: errors += 1;
186: comnum = 12345;
187: }
188: }
189: #ifdef MAC
190: if(inmenu) {
191: if (comnum == 12345)
192: fprintf(of, " (data_obj *) 0,\n");
193: else
194: fprintf(of, " (data_obj *) &%s[%d],\n",which, comnum);
195: }
196: else {
197: #endif
198: if (comnum == 12345)
199: fprintf(of, " (data_obj *) 0, /* %s */\n", PPchar(ch++));
200: else
201: fprintf(of, " (data_obj *) &commands[%d], /* %s */\n", comnum, PPchar(ch++));
202: }
203: #ifdef MAC
204: }
205: #endif
206: fclose(of);
207: fclose(ifile);
208: exit(errors);
209: }