BSD 4_3_Tahoe development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Mon, 15 Sep 1986 11:31:50 +0000 (03:31 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Mon, 15 Sep 1986 11:31:50 +0000 (03:31 -0800)
Work on file usr/src/new/dipress/src/bin/ipmetrics/tex.c

Synthesized-from: CSRG/cd2/4.3tahoe

usr/src/new/dipress/src/bin/ipmetrics/tex.c [new file with mode: 0644]

diff --git a/usr/src/new/dipress/src/bin/ipmetrics/tex.c b/usr/src/new/dipress/src/bin/ipmetrics/tex.c
new file mode 100644 (file)
index 0000000..dc58010
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 1984, 1985, 1986 Xerox Corp.
+ *
+ *  create TeX font files
+ *
+ * HISTORY
+ * 11-Feb-86  Lee Moore (lee) at Xerox Webster Research Center
+ *     Added the creation of an extra text file which contains information
+ *     on how to access characters in other character-sets than zero (0).
+ *
+ * 15-Dec-85  Lee Moore (lee) at Xerox Webster Research Center
+ *     Created.
+ *
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "stack.h"
+#include "token.h"
+#include "config.h"
+#include "ipmetrics.h"
+#include "tex.h"
+
+#define TRUE   1
+#define FALSE  0
+
+#define public
+#define private        static
+
+public char *malloc();
+
+public char *DeviceName,
+           *LibraryDirectory;
+
+public
+CleanUpTeX(configChain)
+    struct FontConfig *configChain; {
+       struct FontConfig *p;
+
+       WriteTeXInstallFile(configChain);
+       WriteTeXCleanUpFile(configChain);
+
+       for( p = configChain; p != NULL; p = p->Next )
+               if( !p->SeenFlag )
+                       printf("couldn't find: %s/%s/%s\n",
+                               p->FontPt1, p->FontPt2, p->FontPt3);
+}
+
+
+private
+WriteTeXInstallFile(configChain)
+    struct FontConfig *configChain; {
+       FILE *installFile;
+       struct FontConfig *p;
+
+       if( (installFile = fopen(INSTALLNAME, "w")) == NULL ) {
+           fprintf(stderr, "can't open the file 'install' for writing\n");
+           return; }
+
+       fprintf(installFile, "#! /bin/sh\n");
+       fprintf(installFile, "if test ! -d %s/fonts/%s\n", LibraryDirectory, DeviceName);
+       fprintf(installFile, "  then\n");
+       fprintf(installFile, "    mkdir %s/fonts/%s\n", LibraryDirectory, DeviceName);
+       fprintf(installFile, "  fi\n");
+       fprintf(installFile, "if test ! -d %s/fonts/%s/tex\n", LibraryDirectory, DeviceName);
+       fprintf(installFile, "  then\n");
+       fprintf(installFile, "    mkdir %s/fonts/%s/tex\n", LibraryDirectory, DeviceName);
+       fprintf(installFile, "  fi\n");
+
+
+       for( p = configChain; p != NULL; p = p->Next )
+               if( p->SeenFlag ) {
+                       fprintf(installFile, "cp %s.pl %s/fonts/%s/tex\n",
+                               p->TargetName, LibraryDirectory, DeviceName);
+                       fprintf(installFile, "pltotf %s.pl %s.tfm\n",
+                               p->TargetName, p->TargetName); }
+
+       fprintf(installFile, "cd %s/fonts/%s/tex\n", LibraryDirectory,
+                       DeviceName);
+       (void) fclose(installFile);
+       (void) chmod(INSTALLNAME, 0755); }
+
+
+/*
+ * write a file that rm's all the files created by this program
+ */
+
+private
+WriteTeXCleanUpFile(configChain)
+    struct FontConfig *configChain; {
+       FILE *cleanupFile;
+       struct FontConfig *p;
+
+       if( (cleanupFile = fopen(CLEANUPNAME, "w")) == NULL ) {
+           fprintf(stderr, "can't open the file 'cleanup' for writing\n");
+           return; }
+
+       fprintf(cleanupFile, "#! /bin/sh\n");
+
+       for( p = configChain; p != NULL; p = p->Next )
+               if( p->SeenFlag ) {
+                       fprintf(cleanupFile, "rm %s.pl\n", p->TargetName);
+                       fprintf(cleanupFile, "rm %s.xc\n", p->TargetName); }
+
+       fprintf(cleanupFile, "rm %s\n", CLEANUPNAME);
+       fprintf(cleanupFile, "rm %s\n", INSTALLNAME);
+       (void) fclose(cleanupFile);
+       (void) chmod(CLEANUPNAME, 0755); }
+
+
+PerTeXFont(configChain, fontDescVec)
+struct FontConfig *configChain;
+unsigned char *fontDescVec; {
+       unsigned char *charMetricsProperty,
+                     *width,
+                     *charMetric;
+       char iType[MAXTOKENSIZE],
+            iCharName[MAXTOKENSIZE],
+            fileType[MAXTOKENSIZE],
+           *fontName[40],
+            metricFileName[40],
+            XCInfoFileName[40],
+            iCharSet[MAXTOKENSIZE],
+            iCharCode[MAXTOKENSIZE];
+       unsigned short TeXtoXCMap[256];
+       FILE *descFile,
+            *modelFile,
+            *XCInfoFile;
+       struct FontConfig *p;
+       struct TokenState *ts;
+       int charSet,
+           charNumber,
+           charIndex,
+           i;
+       double xWidth;
+
+       if( !GetFontNameProperty(fontDescVec, fontName) ) {
+               fprintf(stderr, "ipmetrics: can't get font name\n");
+               return;
+       }
+
+       if( (charMetricsProperty = GetStringProp("characterMetrics", fontDescVec))
+                       == NULL ) {
+               printf("ipmetrics: can't find 'characterMetrics' property\n");
+               return; }
+
+       for( p = configChain; p != NULL; p = p->Next ) {
+               if( !(strcmp(p->FontPt1,  fontName[0]) == 0 &&
+                           strcmp(p->FontPt2,  fontName[1]) == 0 &&
+                           strcmp(p->FontPt3,  fontName[2]) == 0) )
+                       continue;
+
+               (void) sprintf(metricFileName, "%s.pl", p->TargetName);
+
+               if( (descFile = fopen(metricFileName, "w")) == NULL ) {
+                       printf("ipmetrics: can't open %s for writing\n", metricFileName);
+                       return;}
+       
+               (void) sprintf(XCInfoFileName, "%s.xc", p->TargetName);
+
+               if( (XCInfoFile = fopen(XCInfoFileName, "w")) == NULL ) {
+                       printf("ipmetrics: can't open %s for writing\n", XCInfoFileName);
+                       return;}
+
+               for( i = 0; i < 256; i++ )
+                   TeXtoXCMap[i] = 0;
+       
+               if( (modelFile = fopen(p->MapFile, "r")) == NULL ) {
+                       printf("ipmetrics: can't open %s for reading\n", p->MapFile);
+                       return;}
+
+               p->SeenFlag = TRUE;
+/*             (void) strcpy(malloc((unsigned) 40), p->TargetName);    */
+       
+               ts = InitTokenStream(modelFile);
+
+               fprintf(descFile, "(COMMENT %s/%s/%s for Interpress device %s\n", p->FontPt1, p->FontPt2, p->FontPt3, DeviceName);
+
+               fprintf(descFile, " for interpress device '%s')\n", DeviceName);
+               fprintf(descFile, "(CODINGSCHEME XC1-1-1)\n");
+               fprintf(descFile, "(FAMILY %s)\n", p->TargetName);
+               fprintf(descFile, "(DESIGNSIZE D 10)\n");
+               fprintf(descFile, "(DESIGNUNITS D 1)\n");
+
+               GetToken(ts, fileType, MAXTOKENSIZE);
+               /* file type doesn't mean much in this case... */
+
+               while( !EndOfFile(ts) ) {
+                       GetToken(ts, iCharSet, MAXTOKENSIZE);
+                       (void) sscanf(iCharSet, "%o", &charSet);
+                       GetToken(ts, iCharCode, MAXTOKENSIZE);
+                       (void) sscanf(iCharCode, "%o", &charNumber);
+                       GetToken(ts, iType, MAXTOKENSIZE);
+                       GetToken(ts, iCharName, MAXTOKENSIZE);
+                       charIndex = Make16BitChar(charSet, charNumber);
+
+                       /* skip the rest of this loop if it's not in this font */
+                       if( (charMetric =
+                           GetIntegerProp(charIndex, charMetricsProperty)) == NULL )
+                               continue;
+
+                       fprintf(descFile, "(CHARACTER %s %s", iType, iCharName);
+                       TeXtoXCMap[PLtoBinary(iType, iCharName)] = charIndex;
+
+                       if( (width = GetStringProp("widthX", charMetric)) == NULL ){
+                               printf("ipmetrics: can't find widthX property of %d\n",
+                                       charIndex);
+                               continue;}
+
+                       if( gettype(width) != type_number ) {
+                               printf("ipmetrics: width not of type number for %d\n",
+                                       charIndex);
+                               continue;}
+       
+                       if( getsubtype(width) != subtype_rational ) {
+                               printf("ipmetrics: width not of subtype number for %d\n",
+                                       charIndex);
+                               continue;}
+       
+                       xWidth = ((float) getnumerator(width)) / ((float) getdenominator(width));
+       
+                       fprintf(descFile, " (CHARWD R %6.4f)", xWidth);
+
+                       if( charSet == 0 )
+                               fprintf(descFile, ")\n");
+                       else
+                               fprintf(descFile, ")\t(COMMENT in charset 0%o)\n", charSet);
+
+                       while( !EndOfLine(ts) ) {
+                               /* we currently don't support aliases */
+                               GetToken(ts, iCharName, MAXTOKENSIZE);} }
+
+               fprintf(XCInfoFile, "# mapping into extended characters\n");
+
+               for( i = 0; i < 256; i++ )
+                       fprintf(XCInfoFile, "0%o\n", TeXtoXCMap[i]);
+
+               CloseTokenStream(ts);
+               (void) fclose(descFile);
+               (void) fclose(XCInfoFile);
+               (void) fclose(modelFile); }
+}
+
+static
+PLtoBinary(typeStr, valueStr)
+    char *typeStr, *valueStr; {
+       int result;
+
+       if( strcmp(typeStr, "O") == 0 ) {
+               (void) sscanf(valueStr, "%o", &result);
+               return result;}
+       else if( strcmp(typeStr, "C") == 0 )
+               return *valueStr;
+
+       fprintf(stderr, "unknown type %s\n", typeStr);
+       return *valueStr;
+}