|
|
1.1 root 1: /*
2: *
3: * Copyright (c) 1984, 1985, 1986 Xerox Corp.
4: *
5: * Owner: Lee Moore
6: *
7: * Description:
8: * This program reads an Interpress file, executes it and produces a
9: * set of Troff printer description files.
10: *
11: * The metrics file will be read from the file "name.ip",
12: * where name is read from the command line. The ".ip"
13: * extension will not be added if it is already present in the
14: * name.
15: *
16: * HISTORY
17: * 18-Aug-86 Lee Moore (lee) at Xerox Webster Research Center
18: * Moved typesetter specific routine calls to the file "conf.c".
19: *
20: * 15-Apr-86 Lee Moore (lee) at Xerox Webster Research Center
21: * Added table of contents mode (toc).
22: *
23: * 04-Feb-86 lee at Xerox, WRC
24: * Added the ability to execute several masters instead of just one.
25: *
26: * 06-Jan-86 Lee Moore(lee) at Xerox, WRC
27: * Converted for use with ipmetrics.
28: */
29:
30: #include <stdio.h>
31: #include <strings.h>
32: #include "stack.h"
33: #include "token.h"
34: #include "config.h"
35: #include "ipmetrics.h"
36: #include "conf.h"
37:
38: #define TRUE 1
39: #define FALSE 0
40:
41: #define SAME 0
42:
43: extern struct CompositionSwitch CompositionSwitch[];
44:
45: extern char *getstring();
46: extern char *malloc();
47:
48: extern unsigned char **getvector();
49:
50: struct FontConfig *ReadConfigFile();
51:
52: char *LibraryDirectory = "../lib",
53: LibraryDirStorage[1024];
54:
55:
56: #define err0 "ipmetrics: No input ip file name!\n"
57: #define err1 "ipmetrics: ip file could not be found, %s!\n"
58:
59: FILE *fpin;
60: int fdout;
61: char DeviceName1[MAXTOKENSIZE];
62: char *DeviceName = DeviceName1;
63:
64:
65: main(argc, argv)
66: int argc;
67: char *argv[];
68: {
69: int system;
70: struct FontConfig *configChain;
71: unsigned char *fontVec;
72: struct CompositionSwitch *csp;
73:
74: DebugLevel = 0;
75: system = getargs(argc, argv);
76:
77: csp = &CompositionSwitch[system];
78:
79: if( csp->cs_readConfigFile )
80: configChain = ReadConfigFile();
81:
82: fprintf(stderr, "output initialization...\n");
83: (* csp->cs_initializationProc)(configChain);
84:
85: /* call the metrics vector processing routine for each font vector */
86: while (!stackempty()) {
87: fontVec = pop(0, 0);
88: (* csp->cs_fontProc)(configChain, fontVec);
89: free((char *) fontVec); } /* should do a recursive free? */
90:
91: fprintf(stderr, "cleaning-up...\n");
92: (* csp->cs_cleanUpProc)(configChain);
93: fprintf(stderr, "done.\n");
94: exit(0);
95: }
96:
97:
98:
99: /*
100: * process the command line arguments
101: */
102:
103: getargs(argc, argv)
104: int argc;
105: char *argv[];
106: {
107: char *filename;
108: extern int optind;
109: extern char *optarg;
110: int system,
111: c;
112: char systemName[30];
113: struct CompositionSwitch *csp;
114:
115: (void) strcpy(systemName, "troff");
116:
117: while ((c = getopt(argc, argv, "c:d:")) != EOF)
118: switch (c) {
119: case 'd':
120: (void) strncpy(LibraryDirStorage, optarg, sizeof(LibraryDirStorage));
121: LibraryDirectory = LibraryDirStorage;
122: break;
123:
124: case 'c':
125: (void) strncpy(systemName, optarg, sizeof(systemName));
126: break;
127:
128: default:
129: printf("ipmetrics: option '%c' not allowed\n");
130: }
131:
132: /* look-up system name */
133: for(csp = CompositionSwitch, system = 0; csp->cs_systemName != NULL; csp++, system++)
134: if( strncmp(csp->cs_systemName, systemName, sizeof(systemName)) == SAME)
135: break;
136:
137: if( csp->cs_systemName == NULL) {
138: printf("unknown system: %s\n", systemName);
139: exit(1); }
140:
141: if (argc == optind) { /* at least one argument */
142: error(err0);
143: exit(1);
144: }
145: printf("executing...\n");
146:
147: for( ; optind < argc ; optind++ ) {
148: /* Open input IP file. */
149: fdout = 1;
150: filename = (char *) malloc((unsigned) strlen(argv[optind])+1+strlen(".ip"));
151: (void) strcpy(filename, argv[optind]);
152:
153: if (strcmp(".ip", rindex(filename, '.')) != 0)
154: (void) strcat(filename, ".ip");
155:
156: fpin = fopen(filename, "r");
157:
158: if (fpin == NULL) {
159: fprintf(stderr, err1, filename);
160: exit(2);
161: }
162:
163: printf("\t%s\n", filename); (void) fflush(stdout);
164: parse(fpin);
165: }
166:
167: return system;
168: }
169:
170:
171:
172: /*
173: * read the font configuration file
174: */
175: struct FontConfig *
176: ReadConfigFile() {
177: char token[MAXTOKENSIZE];
178: struct TokenState *ts;
179: struct FontConfig **last,
180: *p,
181: *configChain;
182:
183: printf("reading configuration file\n");
184: last = &configChain;
185: ts = InitTokenStream(stdin);
186: GetToken(ts, token, MAXTOKENSIZE);
187:
188: if( strcmp(token, "device") != 0 ) {
189: fprintf(stderr, "first token is %s, not 'device'\n", token);
190: exit(1); }
191:
192: GetToken(ts, DeviceName, MAXTOKENSIZE);
193: printf("\tdevice is %s\n", DeviceName);
194:
195: while( !EndOfFile(ts) ) {
196: p = (struct FontConfig *)
197: malloc((unsigned) sizeof(struct FontConfig));
198:
199: GetToken(ts, p->FontPt1, MAXTOKENSIZE);
200:
201: if( EndOfLine(ts) ) {
202: fprintf(stderr,
203: "lines ends prematurely; last token was `%s'\n",
204: p->FontPt1);
205: exit(2);}
206:
207: GetToken(ts, p->FontPt2, MAXTOKENSIZE);
208:
209: if( EndOfLine(ts) ) {
210: fprintf(stderr,
211: "lines ends prematurely; last token was `%s'\n",
212: p->FontPt2);
213: exit(2);}
214:
215: GetToken(ts, p->FontPt3, MAXTOKENSIZE);
216:
217: if( EndOfLine(ts) ) {
218: fprintf(stderr,
219: "lines ends prematurely; last token was `%s'\n",
220: p->FontPt3);
221: exit(2);}
222:
223: GetToken(ts, p->TargetName, MAXTOKENSIZE);
224:
225: if( !EndOfLine(ts) )
226: GetToken(ts, p->MapFile, MAXTOKENSIZE);
227: else
228: p->MapFile[0] = '\0';
229:
230: p->Next = NULL;
231: *last = p;
232: last = &p->Next;
233: }
234:
235: return configChain;
236: }
237:
238:
239:
240:
241: /*
242: * get the font name from a font vector
243: */
244:
245: GetFontNameProperty(fontDescVec, CName)
246: unsigned char *fontDescVec;
247: char *CName[3]; {
248: unsigned char *nameProperty,
249: **nameVec;
250: int i;
251:
252: if( (nameProperty = GetStringProp("name", fontDescVec)) == NULL ) {
253: printf("ipmetrics: can't find 'name' property\n");
254: return FALSE;
255: }
256:
257: nameVec = getvector(nameProperty);
258:
259: /* loop for each part of the three part name */
260: for( i = 0; i < 3; i++ ) {
261: if( gettype(nameVec[i]) != type_string ) {
262: printf("name vector not of type string\n");
263: free((char *) nameVec);
264: return FALSE;
265: }
266:
267: if( getsubtype(nameVec[i]) != subtype_identifier ) {
268: printf("name subtype not an identifier\n");
269: free((char *) nameVec);
270: return FALSE;
271: }
272:
273: CName[i] = getstring(nameVec[i], subtype_identifier);
274: }
275:
276: free((char *) nameVec);
277: return TRUE;
278: }
279:
280:
281: /*
282: * get a property off the property-vector whose type is "string"
283: */
284:
285: unsigned char *
286: GetStringProp(propName, list)
287: char *propName;
288: unsigned char *list; {
289: int i,
290: vecLength;
291: char *candidate;
292: unsigned char **listArray,
293: *result;
294:
295: if( gettype(list) != type_vector ) {
296: printf("ipmetric: non-vector found in stack!\n");
297: return NULL;}
298:
299: if( getsubtype(list) != subtype_general ) {
300: printf("ipmetric: vector sub-type is not 'general'\n");
301: return NULL; }
302:
303: if( (vecLength = getdepth(list)) & 01 ) {
304: printf("ipmetrics: property vector is of odd length\n");
305: return NULL;}
306:
307: listArray = getvector(list);
308:
309: /* cdr down the list */
310: for( i = 0; i < vecLength; i += 2 ) {
311: if( ! checktype(listArray[i], type_string, subtype_identifier) ) {
312: printf("ipmetrics: property of incorrect type\n");
313: free((char *) listArray);
314: return NULL;}
315:
316: candidate = getstring(listArray[i], subtype_identifier);
317:
318: if( strcmp(propName, candidate) == 0 ) {
319: result = listArray[i+1];
320: free((char *) listArray);
321: return result;
322: }
323: }
324:
325: free((char *) listArray);
326: return NULL;
327: }
328:
329:
330: /*
331: * get a property from the property-vector that is type "integer"
332: */
333:
334: unsigned char *
335: GetIntegerProp(property, list)
336: int property;
337: unsigned char *list; {
338: int i,
339: vecLength;
340: int candidate;
341: unsigned char **listArray,
342: *result;
343:
344: if( gettype(list) != type_vector ) {
345: printf("ipmetric: non-vector found in stack!\n");
346: return NULL;}
347:
348: if( getsubtype(list) != subtype_general ) {
349: printf("ipmetric: vector sub-type is not 'general'\n");
350: return NULL; }
351:
352: if( (vecLength = getdepth(list)) & 01 ) {
353: printf("ipmetrics: property vector is of odd length\n");
354: return NULL;}
355:
356: listArray = getvector(list);
357:
358: for( i = 0; i < vecLength; i += 2 ) {
359: if( ! checktype(listArray[i], type_number, subtype_integer) ) {
360: printf("ipmetrics: property of incorrect type\n");
361: free((char *) listArray);
362: return NULL;}
363:
364: candidate = getint(listArray[i]);
365:
366: if( property == candidate ) {
367: result = listArray[i+1];
368: free((char *) listArray);
369: return result;
370: }
371: }
372:
373: free((char *) listArray);
374: return NULL;
375: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.