|
|
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.