|
|
1.1 ! root 1: /* ! 2: * ! 3: * Copyright (c) 1984, 1985 Xerox Corp. ! 4: * ! 5: * Module: ipmetrics ! 6: * Owner: Moore ! 7: * args: ! 8: * name (name of the input metrics file) ! 9: * ! 10: * Description: ! 11: * This program reads an Interpress file, executes it and produces a ! 12: * set of Troff printer description files. ! 13: * ! 14: * The metrics file will be read from the file "name.ip", ! 15: * where name is read from the command line. The ".ip" ! 16: * extension will not be added if it is already present in the ! 17: * name. ! 18: * ! 19: * HISTORY ! 20: * 04-Feb-86 lee at Xerox, WRC ! 21: * Added the ability to execute several masters instead of just one. ! 22: * ! 23: * 06-Jan-86 Lee Moore(lee) at Xerox, WRC ! 24: * Converted for use with ipmetrics. ! 25: * ! 26: * ! 27: * K. Knox, 28-Mar-85 15:04:13, Created first version. ! 28: * ! 29: */ ! 30: ! 31: #include <stdio.h> ! 32: #include <strings.h> ! 33: #include "stack.h" ! 34: #include "token.h" ! 35: #include "config.h" ! 36: #include "ipmetrics.h" ! 37: ! 38: #define TRUE 1 ! 39: #define FALSE 0 ! 40: ! 41: enum TypesettingSystems { none, Troff, TeX}; ! 42: ! 43: extern char *getstring(); ! 44: extern unsigned char *malloc(); ! 45: ! 46: extern unsigned char **getvector(); ! 47: ! 48: struct FontConfig *ReadConfigFile(); ! 49: enum TypesettingSystems getargs(); ! 50: ! 51: char *LibraryDirectory = "../lib", ! 52: LibraryDirStorage[1024]; ! 53: ! 54: ! 55: #define err0 "ipmetrics: No input ip file name!\n" ! 56: #define err1 "ipmetrics: ip file could not be found, %s!\n" ! 57: ! 58: FILE *fpin; ! 59: int fdout; ! 60: char DeviceName1[MAXTOKENSIZE]; ! 61: char *DeviceName = DeviceName1; ! 62: ! 63: ! 64: main(argc, argv) ! 65: int argc; ! 66: char *argv[]; ! 67: { ! 68: enum TypesettingSystems system; ! 69: struct FontConfig *configChain; ! 70: ! 71: system = getargs(argc, argv); ! 72: printf("reading description file... "); fflush(stdout); ! 73: configChain = ReadConfigFile(); ! 74: printf("writing font files... "); fflush(stdout); ! 75: InitFontFiles(system, configChain); ! 76: WriteEachFont(system, configChain); ! 77: CleanUpFontFiles(system, configChain); ! 78: printf("done.\n"); ! 79: exit(0); ! 80: } ! 81: ! 82: InitFontFiles(system, configChain) ! 83: enum TypesettingSystems system; ! 84: struct FontConfig *configChain; { ! 85: switch( system ) { ! 86: case Troff: ! 87: InitTroff(); ! 88: break; ! 89: ! 90: case TeX: ! 91: break; ! 92: ! 93: default: ! 94: printf("ipmetrics: internal error\n"); ! 95: } ! 96: } ! 97: ! 98: CleanUpFontFiles(system, configChain) ! 99: enum TypesettingSystems system; ! 100: struct FontConfig *configChain; { ! 101: switch( system ) { ! 102: case Troff: ! 103: CleanUpTroff(configChain); ! 104: break; ! 105: ! 106: case TeX: ! 107: CleanUpTeX(configChain); ! 108: break; ! 109: ! 110: default: ! 111: printf("ipmetrics: internal error\n"); ! 112: } ! 113: } ! 114: ! 115: ! 116: enum TypesettingSystems ! 117: getargs(argc, argv) ! 118: int argc; ! 119: char *argv[]; ! 120: { ! 121: char *filename, ! 122: c; ! 123: extern int optind; ! 124: extern char *optarg; ! 125: enum TypesettingSystems system = Troff; ! 126: ! 127: while ((c = getopt(argc, argv, "d:tT")) != EOF) ! 128: switch (c) { ! 129: case 'd': ! 130: strncpy(LibraryDirStorage, optarg, sizeof(LibraryDirStorage)); ! 131: LibraryDirectory = LibraryDirStorage; ! 132: break; ! 133: ! 134: case 't': ! 135: system = Troff; ! 136: break; ! 137: ! 138: case 'T': ! 139: system = TeX; ! 140: break; ! 141: ! 142: default: ! 143: printf("ipmetrics: option '%c' not allowed\n"); ! 144: } ! 145: ! 146: if (argc == optind) { /* at least one argument */ ! 147: error(err0); ! 148: exit(1); ! 149: } ! 150: ! 151: for( ; optind < argc ; optind++ ) { ! 152: /* Open input IP file. */ ! 153: fdout = 1; ! 154: filename = (char *) malloc((unsigned) strlen(argv[optind])+1+strlen(".ip")); ! 155: strcpy(filename, argv[optind]); ! 156: ! 157: if (strcmp(".ip", rindex(filename, '.')) != 0) ! 158: strcat(filename, ".ip"); ! 159: ! 160: fpin = fopen(filename, "r"); ! 161: ! 162: if (fpin == NULL) ! 163: error(err1, filename); ! 164: ! 165: printf("executing %s... ", filename); fflush(stdout); ! 166: parse(fpin); ! 167: } ! 168: ! 169: return system; ! 170: } ! 171: ! 172: /* ! 173: * read the font configuration file ! 174: */ ! 175: struct FontConfig * ! 176: ReadConfigFile() { ! 177: int n; ! 178: char token[MAXTOKENSIZE]; ! 179: struct TokenState *ts; ! 180: struct FontConfig **last, ! 181: *p, ! 182: *configChain; ! 183: ! 184: last = &configChain; ! 185: ts = InitTokenStream(stdin); ! 186: GetToken(ts, token, MAXTOKENSIZE); ! 187: ! 188: if( strcmp(token, "device") != 0 ) { ! 189: fprintf(stderr, "first token in %s, not 'device'\n", token); ! 190: exit(1); } ! 191: ! 192: GetToken(ts, DeviceName, MAXTOKENSIZE); ! 193: printf(" device is %s\n", DeviceName); ! 194: ! 195: while( !EndOfFile(ts) ) { ! 196: p = (struct FontConfig *) malloc((unsigned) sizeof(struct FontConfig)); ! 197: ! 198: GetToken(ts, p->FontPt1, MAXTOKENSIZE); ! 199: GetToken(ts, p->FontPt2, MAXTOKENSIZE); ! 200: GetToken(ts, p->FontPt3, MAXTOKENSIZE); ! 201: GetToken(ts, p->TroffName, MAXTOKENSIZE); ! 202: ! 203: if( !EndOfLine(ts) ) ! 204: GetToken(ts, p->MapFile, MAXTOKENSIZE); ! 205: else ! 206: p->MapFile[0] = '\0'; ! 207: ! 208: p->Next = NULL; ! 209: *last = p; ! 210: last = &p->Next; ! 211: } ! 212: ! 213: return configChain; ! 214: } ! 215: ! 216: WriteEachFont(system, configChain) ! 217: enum TypesettingSystems system; ! 218: struct FontConfig *configChain; ! 219: { ! 220: unsigned char *fontVec; ! 221: int tableIndex; ! 222: ! 223: tableIndex = 0; ! 224: ! 225: while (!stackempty()) { ! 226: fontVec = pop(0, 0); ! 227: ! 228: switch( system ) { ! 229: case Troff: ! 230: PerTroffFont(configChain, fontVec); ! 231: tableIndex++; /* necessary? */ ! 232: break; ! 233: ! 234: case TeX: ! 235: PerTeXFont(configChain, fontVec); ! 236: break; ! 237: ! 238: default: ! 239: printf("ipmetrics: internal error\n"); ! 240: } ! 241: ! 242: free((char *) fontVec); } ! 243: } ! 244: ! 245: ! 246: GetFontNameProperty(fontDescVec, CName) ! 247: unsigned char *fontDescVec; ! 248: char *CName[3]; { ! 249: unsigned char *nameProperty, ! 250: **nameVec; ! 251: int i; ! 252: ! 253: if( (nameProperty = GetStringProp("name", fontDescVec)) == NULL ) { ! 254: printf("ipmetrics: can't find 'name' property\n"); ! 255: return FALSE; ! 256: } ! 257: ! 258: nameVec = getvector(nameProperty); ! 259: ! 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: unsigned char * ! 282: GetStringProp(propName, list) ! 283: char *propName; ! 284: unsigned char *list; { ! 285: int i, ! 286: vecLength; ! 287: char *candidate; ! 288: unsigned char **listArray; ! 289: ! 290: if( gettype(list) != type_vector ) { ! 291: printf("ipmetric: non-vector found in stack!\n"); ! 292: return NULL;} ! 293: ! 294: if( getsubtype(list) != subtype_general ) { ! 295: printf("ipmetric: vector sub-type is not 'general'\n"); ! 296: return NULL; } ! 297: ! 298: if( (vecLength = getdepth(list)) & 01 ) { ! 299: printf("ipmetrics: property vector is of odd length\n"); ! 300: return NULL;} ! 301: ! 302: listArray = getvector(list); ! 303: ! 304: for( i = 0; i < vecLength; i += 2 ) { ! 305: if( ! checktype(listArray[i], type_string, subtype_identifier) ) { ! 306: printf("ipmetrics: property of incorrect type\n"); ! 307: return NULL;} ! 308: ! 309: candidate = getstring(listArray[i], subtype_identifier); ! 310: ! 311: if( strcmp(propName, candidate) == 0 ) ! 312: return listArray[i+1]; ! 313: } ! 314: free((char *) listArray); ! 315: return NULL; ! 316: } ! 317: ! 318: ! 319: unsigned char * ! 320: GetIntegerProp(property, list) ! 321: int property; ! 322: unsigned char *list; { ! 323: int i, ! 324: vecLength; ! 325: int candidate; ! 326: unsigned char **listArray; ! 327: ! 328: if( gettype(list) != type_vector ) { ! 329: printf("ipmetric: non-vector found in stack!\n"); ! 330: return NULL;} ! 331: ! 332: if( getsubtype(list) != subtype_general ) { ! 333: printf("ipmetric: vector sub-type is not 'general'\n"); ! 334: return NULL; } ! 335: ! 336: if( (vecLength = getdepth(list)) & 01 ) { ! 337: printf("ipmetrics: property vector is of odd length\n"); ! 338: return NULL;} ! 339: ! 340: listArray = getvector(list); ! 341: ! 342: for( i = 0; i < vecLength; i += 2 ) { ! 343: if( ! checktype(listArray[i], type_number, subtype_integer) ) { ! 344: printf("ipmetrics: property of incorrect type\n"); ! 345: return NULL;} ! 346: ! 347: candidate = getint(listArray[i], subtype_identifier); ! 348: ! 349: if( property == candidate ) ! 350: return listArray[i+1]; ! 351: } ! 352: ! 353: free((char *) listArray); ! 354: return NULL; ! 355: } ! 356: ! 357: ! 358: ! 359: printitem(ptr, element) ! 360: unsigned char *ptr; ! 361: int element; ! 362: { ! 363: printf("Element: %d\n", element); ! 364: printf("Length: %d\n", getlength(ptr)); ! 365: switch (gettype(ptr)) ! 366: { ! 367: case type_number: printnumber(ptr); break; ! 368: case type_string: printstring(ptr); break; ! 369: case type_vector: printvector(ptr); break; ! 370: case type_operator: printoperator(ptr); break; ! 371: case type_pixelarray: printpixelarray(ptr); break; ! 372: case type_transformation: printtransformation(ptr); break; ! 373: case type_integers: printintegers(ptr); break; ! 374: default: printf("Type: unknown\n"); break; ! 375: } ! 376: } ! 377: ! 378: printnumber(ptr) ! 379: unsigned char *ptr; ! 380: { ! 381: printf("Type: number\n"); ! 382: switch (getsubtype(ptr)) ! 383: { ! 384: case subtype_integer: printinteger(ptr); break; ! 385: case subtype_rational: printrational(ptr); break; ! 386: default: printf("Subtype: unknown\n"); break; ! 387: } ! 388: } ! 389: ! 390: printinteger(ptr) ! 391: unsigned char *ptr; ! 392: { ! 393: printf("Subtype: integer\n"); ! 394: printf("Value: %d\n", getint(ptr)); ! 395: } ! 396: ! 397: printrational(ptr) ! 398: unsigned char *ptr; ! 399: { ! 400: printf("Subtype: rational\n"); ! 401: printf("Value: %f/%f\n", getnumerator(ptr), getdenominator(ptr)); ! 402: } ! 403: ! 404: printstring(ptr) ! 405: unsigned char *ptr; ! 406: { ! 407: printf("Type: string\n"); ! 408: switch (getsubtype(ptr)) ! 409: { ! 410: case subtype_identifier: printidentifier(ptr); break; ! 411: case subtype_string: printsubstring(ptr); break; ! 412: default: printf("Subtype: unknown\n"); break; ! 413: } ! 414: } ! 415: ! 416: printidentifier(ptr) ! 417: unsigned char *ptr; ! 418: { ! 419: printf("Subtype: identifier\n"); ! 420: printf("Identifier: %s\n", getstring(ptr, subtype_identifier)); ! 421: } ! 422: ! 423: printsubstring(ptr) ! 424: unsigned char *ptr; ! 425: { ! 426: printf("Subtype: string\n"); ! 427: printf("String: %s\n", getstring(ptr, subtype_string)); ! 428: } ! 429: ! 430: printvector(ptr) ! 431: unsigned char *ptr; ! 432: { ! 433: printf("Type: vector\n"); ! 434: switch (getsubtype(ptr)) ! 435: { ! 436: case subtype_general: printvec(ptr, "general"); break; ! 437: case subtype_integers: printvec(ptr, "integers"); break; ! 438: case subtype_samples: printvec(ptr, "samples"); break; ! 439: default: printf("Subtype: unknown\n"); break; ! 440: } ! 441: } ! 442: ! 443: printvec(ptr, string) ! 444: unsigned char *ptr; ! 445: char *string; ! 446: { ! 447: int n, depth; ! 448: unsigned char **array; ! 449: ! 450: depth = getdepth(ptr); ! 451: printf("Subtype: %s\n", string); ! 452: printf("Depth: %d\n", depth); ! 453: array = getvector(ptr); ! 454: ! 455: for (n=0; n < depth; n++) printitem(array[n], n); ! 456: ! 457: free((char *) array); ! 458: } ! 459: ! 460: printoperator(ptr) ! 461: unsigned char *ptr; ! 462: { ! 463: printf("Type: operator\n"); ! 464: switch (getsubtype(ptr)) ! 465: { ! 466: case subtype_decompressop: printop(ptr, "decompressop"); break; ! 467: case subtype_colorop: printop(ptr, "colorop"); break; ! 468: case subtype_colormodelop: printop(ptr, "colormodelop"); break; ! 469: default: printf("Subtype: unknown\n"); break; ! 470: } ! 471: } ! 472: ! 473: printop(ptr, string) ! 474: unsigned char *ptr; ! 475: char *string; ! 476: { ! 477: int n, depth; ! 478: unsigned char **array; ! 479: ! 480: depth = getdepth(ptr); ! 481: printf("Subtype: %s\n", string); ! 482: printf("Depth: %d\n", depth); ! 483: array = getoperator(ptr); ! 484: ! 485: for (n=0; n < depth; n++) printitem(array[n], n); ! 486: ! 487: free((char *) array); ! 488: } ! 489: ! 490: printpixelarray(ptr) ! 491: unsigned char *ptr; ! 492: { ! 493: } ! 494: ! 495: printtransformation(ptr) ! 496: unsigned char *ptr; ! 497: { ! 498: double *array; ! 499: ! 500: array = gettransformation(ptr); ! 501: printf("Type: transformation\n"); ! 502: printf("A: %f\n", array[0]); ! 503: printf("B: %f\n", array[1]); ! 504: printf("C: %f\n", array[2]); ! 505: printf("D: %f\n", array[3]); ! 506: printf("E: %f\n", array[4]); ! 507: printf("F: %f\n", array[5]); ! 508: free((char *) array); ! 509: } ! 510: ! 511: printintegers(ptr) ! 512: unsigned char *ptr; ! 513: { ! 514: printf("Type: integers\n"); ! 515: printf("Bytes/Integer: %d\n", getbytesPerInteger(ptr)); ! 516: printf("Bytepos: %ld\n", getbytepos(ptr)); ! 517: printf("ByteLength: %ld\n", getbytelength(ptr)); ! 518: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.