|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1984, 1985 Xerox Corp. ! 3: * ! 4: * create TeX font files ! 5: * ! 6: * HISTORY ! 7: * Dec, 1985 Lee Moore, Xerox Webster Research Center ! 8: * Created. ! 9: * ! 10: */ ! 11: ! 12: #include <stdio.h> ! 13: #include <math.h> ! 14: #include "stack.h" ! 15: #include "token.h" ! 16: #include "config.h" ! 17: #include "ipmetrics.h" ! 18: #include "tex.h" ! 19: ! 20: #define TRUE 1 ! 21: #define FALSE 0 ! 22: ! 23: #define public ! 24: #define private static ! 25: ! 26: public char *malloc(); ! 27: ! 28: public char *DeviceName, ! 29: *LibraryDirectory; ! 30: ! 31: public ! 32: CleanUpTeX(configChain) ! 33: struct FontConfig *configChain; { ! 34: struct FontConfig *p; ! 35: ! 36: WriteTeXInstallFile(configChain); ! 37: WriteTeXCleanUpFile(configChain); ! 38: ! 39: for( p = configChain; p != NULL; p = p->Next ) ! 40: if( !p->SeenFlag ) ! 41: printf("couldn't find: %s/%s/%s\n", ! 42: p->FontPt1, p->FontPt2, p->FontPt3); ! 43: } ! 44: ! 45: ! 46: private ! 47: WriteTeXInstallFile(configChain) ! 48: struct FontConfig *configChain; { ! 49: int i; ! 50: FILE *installFile; ! 51: struct FontConfig *p; ! 52: ! 53: if( (installFile = fopen(INSTALLNAME, "w")) == NULL ) { ! 54: fprintf(stderr, "can't open the file 'install' for writing\n"); ! 55: return; } ! 56: ! 57: fprintf(installFile, "#! /bin/sh\n"); ! 58: fprintf(installFile, "if test ! -d %s/fonts/%s\n", LibraryDirectory, DeviceName); ! 59: fprintf(installFile, " then\n"); ! 60: fprintf(installFile, " mkdir %s/fonts/%s\n", LibraryDirectory, DeviceName); ! 61: fprintf(installFile, " fi\n"); ! 62: fprintf(installFile, "if test ! -d %s/fonts/%s/tex\n", LibraryDirectory, DeviceName); ! 63: fprintf(installFile, " then\n"); ! 64: fprintf(installFile, " mkdir %s/fonts/%s/tex\n", LibraryDirectory, DeviceName); ! 65: fprintf(installFile, " fi\n"); ! 66: ! 67: ! 68: for( p = configChain; p != NULL; p = p->Next ) ! 69: if( p->SeenFlag ) { ! 70: fprintf(installFile, "cp %s.pl %s/fonts/%s/tex\n", ! 71: p->TroffName, LibraryDirectory, DeviceName); ! 72: fprintf(installFile, "pltotf %s.pl %s.tfm\n", ! 73: p->TroffName, p->TroffName); } ! 74: ! 75: fprintf(installFile, "cd %s/fonts/%s/tex\n", LibraryDirectory, ! 76: DeviceName); ! 77: fclose(installFile); ! 78: chmod(INSTALLNAME, 0755); } ! 79: ! 80: ! 81: /* ! 82: * write a file that rm's all the files created by this program ! 83: */ ! 84: ! 85: private ! 86: WriteTeXCleanUpFile(configChain) ! 87: struct FontConfig *configChain; { ! 88: int i; ! 89: FILE *cleanupFile; ! 90: struct FontConfig *p; ! 91: ! 92: if( (cleanupFile = fopen(CLEANUPNAME, "w")) == NULL ) { ! 93: fprintf(stderr, "can't open the file 'cleanup' for writing\n"); ! 94: return; } ! 95: ! 96: fprintf(cleanupFile, "#! /bin/sh\n"); ! 97: ! 98: for( p = configChain; p != NULL; p = p->Next ) ! 99: if( p->SeenFlag ) ! 100: fprintf(cleanupFile, "rm %s.pl\n", p->TroffName); ! 101: ! 102: fprintf(cleanupFile, "rm %s\n", CLEANUPNAME); ! 103: fprintf(cleanupFile, "rm %s\n", INSTALLNAME); ! 104: fclose(cleanupFile); ! 105: chmod(CLEANUPNAME, 0755); } ! 106: ! 107: ! 108: PerTeXFont(configChain, fontDescVec) ! 109: struct FontConfig *configChain; ! 110: unsigned char *fontDescVec; { ! 111: unsigned char *charMetricsProperty, ! 112: *metricsProperty, ! 113: *width, ! 114: *charMetric; ! 115: char iSender[MAXTOKENSIZE], ! 116: iCharName[MAXTOKENSIZE], ! 117: fileType[MAXTOKENSIZE], ! 118: *fontName[40], ! 119: metricFileName[40], ! 120: iCharSet[MAXTOKENSIZE], ! 121: iCharCode[MAXTOKENSIZE]; ! 122: FILE *descFile, ! 123: *modelFile; ! 124: struct FontConfig *p; ! 125: struct TokenState *ts; ! 126: int charSet, ! 127: charNumber, ! 128: charIndex; ! 129: double xWidth; ! 130: ! 131: if( !GetFontNameProperty(fontDescVec, fontName) ) { ! 132: fprintf(stderr, "ipmetrics: can't get font name\n"); ! 133: return; ! 134: } ! 135: ! 136: if( (charMetricsProperty = GetStringProp("characterMetrics", fontDescVec)) ! 137: == NULL ) { ! 138: printf("ipmetrics: can't find 'characterMetrics' property\n"); ! 139: return; } ! 140: ! 141: for( p = configChain; p != NULL; p = p->Next ) { ! 142: if( !(strcmp(p->FontPt1, fontName[0]) == 0 && ! 143: strcmp(p->FontPt2, fontName[1]) == 0 && ! 144: strcmp(p->FontPt3, fontName[2]) == 0) ) ! 145: continue; ! 146: ! 147: sprintf(metricFileName, "%s.pl", p->TroffName); ! 148: ! 149: if( (descFile = fopen(metricFileName, "w")) == NULL ) { ! 150: printf("ipmetrics: can't open %s for writing\n", metricFileName); ! 151: return;} ! 152: ! 153: if( (modelFile = fopen(p->MapFile, "r")) == NULL ) { ! 154: printf("ipmetrics: can't open %s for reading\n", p->MapFile); ! 155: return;} ! 156: ! 157: p->SeenFlag = TRUE; ! 158: /* (void) strcpy(malloc((unsigned) 40), p->TroffName); */ ! 159: ! 160: ts = InitTokenStream(modelFile); ! 161: ! 162: fprintf(descFile, "(COMMENT %s/%s/%s for Interpress device %s\n", p->FontPt1, p->FontPt2, p->FontPt3, DeviceName); ! 163: ! 164: fprintf(descFile, " for interpress device '%s')\n", DeviceName); ! 165: fprintf(descFile, "(FAMILY %s)\n", p->TroffName); ! 166: fprintf(descFile, "(DESIGNSIZE D 10)\n"); ! 167: fprintf(descFile, "(DESIGNUNITS D 1)\n"); ! 168: ! 169: GetToken(ts, fileType, MAXTOKENSIZE); ! 170: /* file type doesn't mean much in this case... */ ! 171: ! 172: while( !EndOfFile(ts) ) { ! 173: GetToken(ts, iCharSet, MAXTOKENSIZE); ! 174: sscanf(iCharSet, "%o", &charSet); ! 175: GetToken(ts, iCharCode, MAXTOKENSIZE); ! 176: sscanf(iCharCode, "%o", &charNumber); ! 177: GetToken(ts, iSender, MAXTOKENSIZE); /* ignored... */ ! 178: GetToken(ts, iCharName, MAXTOKENSIZE); ! 179: charIndex = Make16BitChar(charSet, charNumber); ! 180: ! 181: /* skip the rest of this loop if it's not in this font */ ! 182: if( (charMetric = ! 183: GetIntegerProp(charIndex, charMetricsProperty)) == NULL ) ! 184: continue; ! 185: ! 186: if( (width = GetStringProp("widthX", charMetric)) == NULL ){ ! 187: printf("ipmetrics: can't find widthX property of %d\n", ! 188: charIndex); ! 189: continue;} ! 190: ! 191: if( gettype(width) != type_number ) { ! 192: printf("ipmetrics: width not of type number for %d\n", ! 193: charIndex); ! 194: continue;} ! 195: ! 196: if( getsubtype(width) != subtype_rational ) { ! 197: printf("ipmetrics: width not of subtype number for %d\n", ! 198: charIndex); ! 199: continue;} ! 200: ! 201: xWidth = ((float) getnumerator(width)) / ((float) getdenominator(width)); ! 202: ! 203: fprintf(descFile, "(CHARACTER O %3o", charNumber); ! 204: fprintf(descFile, " (CHARWD R %6.4f))", xWidth); ! 205: ! 206: if( charSet == 0 ) ! 207: fprintf(descFile, "\n"); ! 208: else ! 209: fprintf(descFile, "\t(COMMENT in charset 0%o)\n", charSet); ! 210: ! 211: while( !EndOfLine(ts) ) { ! 212: GetToken(ts, iCharName, MAXTOKENSIZE);} } ! 213: ! 214: CloseTokenStream(ts); ! 215: fclose(descFile); ! 216: fclose(modelFile); } ! 217: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.