Annotation of researchv10no/cmd/dimpress/makemap.c, revision 1.1

1.1     ! root        1: char   xxxmakei10[] ="@(#)makei10.c    1.1";
        !             2: 
        !             3: #include       <stdio.h>
        !             4: #include       "dev.h"
        !             5: 
        !             6: 
        !             7: #define        NON_FATAL       0
        !             8: #define        FATAL           1
        !             9: #define        NO                      0
        !            10: #define        YES                     1
        !            11: 
        !            12: #define        FNAME           4                                       /* longest allowed font name - at least 3 */
        !            13: #define        DNAME           11                                      /* longest accepted device name */
        !            14: #define        CLENGTH         2                                       /* max length of special char strings */
        !            15: #define        FONTDIR         100                                     /* max length of *fontdir string */
        !            16: #define        LINE_LENGTH     100                                     /* longest line in ASCII tables */
        !            17: #define        MAXWIDTH        255                                     /* maximum number of width entries */
        !            18: #define        MAXSYNS         75                                      /* no more synonyms than this */
        !            19: #define        MAXBUILD        75                                      /* largest 'build' list */
        !            20: #define        MAXFONTS        60                                      /* can map this many fonts */
        !            21: #define        NFONT           10                                      /* search at most this many fonts */
        !            22: #define        BMASK           0377                            /* mask for lower eight bits */
        !            23: 
        !            24: #define        FONTSIZE        3 * MAXWIDTH + nchtab + (128 - 32) + sizeof(struct Font)
        !            25: #define        PATHLENGTH      FONTDIR + 2 * DNAME + FNAME + 5
        !            26: #define        TARGDIR         FONTDIR + DNAME + 5
        !            27: 
        !            28: 
        !            29: 
        !            30: char   mdev[DNAME+1] = "";                             /* raster tbls assume this device */
        !            31: char   tdev[DNAME+1] = "i10";                  /* target typesetter - Imagen */
        !            32: char   *ndev;                                                  /* make ASCII tables for this device */
        !            33: 
        !            34: struct dev     dev;                                            /* *mdev DESC.out header goes here */
        !            35: struct Font    *fontbase[NFONT];                       /* each font's .out header stuff */
        !            36: 
        !            37: int            nchtab;                                                 /* number of special chars in chtab */
        !            38: short  *pstab;                                                 /* point size table - not needed */
        !            39: short  *chtab;                                                 /* char's index in chname array */
        !            40: char   *chname;                                                /* special character strings */
        !            41: char   *fontstart;                                             /* can load fonts starting here */
        !            42: char   *widthtab[NFONT];                               /* font's width table - not needed */
        !            43: char   *codetab[NFONT];                                /* *mdev's codes for characters */
        !            44: char   *fitab[NFONT];                                  /* position of characters on a font */
        !            45: 
        !            46: char   mapped[MAXFONTS][FNAME+1];              /* mapped these fonts - ASCII names */
        !            47: char   fmap[NFONT+1][FNAME+1];                 /* names of *mdev's fonts that we search */
        !            48: char   new[MAXSYNS][CLENGTH+1];                /* synonym for corresponding char in old[][] */
        !            49: char   old[MAXSYNS][CLENGTH+1];                /* old character name */
        !            50: char   bldlist[MAXBUILD+1][CLENGTH+1]; /* these chars will be built up */
        !            51: 
        !            52: int            mapcount;                                               /* mapped this many of *ndev's fonts */
        !            53: int            syncount = 0;                                   /* number of synonyms in *fontmap */
        !            54: int            bldcount = 0;                                   /* number of build chars in *fontmap */
        !            55: int            fcount;                                                 /* number of original default fonts */
        !            56: int            acount = 0;                                             /* add this many fonts to default */
        !            57: int            iname;                                                  /* internal name for 'related' fonts */
        !            58: int            nfonts;                                                 /* number of *mdev's fonts to check */
        !            59: int            fsize;                                                  /* all fonts given this much room */
        !            60: 
        !            61: char   *fontdir = "..";                                /* troff's font directory */
        !            62: char   *srcdir = "..";                                 /* ASCII font files kept here */
        !            63: char   targdir[TARGDIR] = ".";                 /* target device's font directory */
        !            64: char   *rastdev = "RASTERDEV";                 /* device name is in this file */
        !            65: char   *fontmap = "FONTMAP";                   /* font map file for device *ndev */
        !            66: 
        !            67: char   addfont[(NFONT-1)*MAXFONTS*(FNAME+1)] = "";     /* additional default fonts */
        !            68: 
        !            69: char   path[PATHLENGTH];                               /* build file pathnames up here */
        !            70: 
        !            71: FILE   *descin;                                                /* *ndev's real ASCII DESC file */
        !            72: FILE   *descout;                                               /* new ASCII DESC file for *ndev */
        !            73: FILE   *fontin;                                                /* read font data from this ASCII file */
        !            74: FILE   *fontout[NFONT+1];                              /* ASCII output files for this font */
        !            75: FILE   *fp_map;                                                /* file pointer for *fontmap file */
        !            76: FILE   *fp_error = stderr;                             /* error messages */
        !            77: 
        !            78: char   **argv;                                                 /* so everyone can use them */
        !            79: int            argc;
        !            80: 
        !            81: int            silent = NO;
        !            82: 
        !            83: 
        !            84: 
        !            85: /*****************************************************************************/
        !            86: 
        !            87: 
        !            88: main(agc, agv)
        !            89: 
        !            90: 
        !            91:        int             agc;
        !            92:        char    *agv[];
        !            93: 
        !            94: 
        !            95: {
        !            96: 
        !            97: 
        !            98:        /********************************************************************
        !            99:         *                                                                                                                                      *
        !           100:         *              This program takes troff's ASCII font and device tables for     *
        !           101:         *      one or more typesetters and converts them into a form that can  *
        !           102:         *      be used with the raster tables located in the target device's   *
        !           103:         *      font directory. These new tables are written into appropriate   *
        !           104:         *      'dev' directories located in the *targdir directory.                    *
        !           105:         *                                                                                                                                      *
        !           106:         *              The program expects to find a file called RASTERDEV in          *
        !           107:         *      *targdir. The first string in this file is the name of the              *
        !           108:         *      device whose tables were used to make the raster files - the    *
        !           109:         *      rest of the file is skipped. In addition each new device must   *
        !           110:         *      have an appropriate 'dev' directory in *targdir, and each of    *
        !           111:         *      these directories must contain a file called FONTMAP, that              *
        !           112:         *      tells the program how to map *ndev's fonts.                                             *
        !           113:         *                                                                                                                                      *
        !           114:         *              After the command line options are processed, the name of       *
        !           115:         *      the master device is read from the file *rastdev, provided the  *
        !           116:         *      string *mdev hasn't already been set. Then this device name is  *
        !           117:         *      used, in combination with *fontdir, to locate *mdev's binary    *
        !           118:         *      '.out' tables. Routine getdesc() reads the entire DESC.out              *
        !           119:         *      into memory, and then alloctes enough additional memory to hold *
        !           120:         *      NFONT binary font files. Once this initialization stuff is done *
        !           121:         *      the program enters a loop that treats the rest of the command   *
        !           122:         *      line arguments as device names. Each of these devices will have *
        !           123:         *      a new set of ASCII font tables written out to the appropriate   *
        !           124:         *      'dev' directory in *targdir.                                                                    *
        !           125:         *                                                                                                                                      *
        !           126:         *              The first step for each new device is to essentially copy       *
        !           127:         *      the first part of its real ASCII DESC file from *fontdir to the *
        !           128:         *      appropriate 'dev' directory in *targdir. Routine startdesc()    *
        !           129:         *      handles this job, but it only reads up to the default font              *
        !           130:         *      count in the real DESC file. Once it has the default font count *
        !           131:         *      startdesc() has really finished its job. It doesn't even write  *
        !           132:         *      this number out to the new DESC file, because we are probably   *
        !           133:         *      going to be adding some default fonts to the new DESC file.             *
        !           134:         *                                                                                                                                      *
        !           135:         ********************************************************************/
        !           136: 
        !           137: 
        !           138:        argv = agv;                                                     /* global so everyone can use them */
        !           139:        argc = agc;
        !           140: 
        !           141:        getoptions();
        !           142:        getmdev();                                                      /* get 'master' device name */
        !           143:        getdesc();                                                      /* get *mdev's DESC.out file */
        !           144: 
        !           145:        if ( silent == NO )
        !           146:                printf("master device = %s\n\n", mdev);
        !           147: 
        !           148:        while ( --argc > 0 )  {                         /* got another device */
        !           149:                ndev = *++argv;                                 /* make tables for this guy */
        !           150:                if ( silent == NO )
        !           151:                        printf("making tables for device %s\n", ndev);
        !           152:                startdesc();                                    /* up to default font list */
        !           153:                makefonts();                                    /* for all fonts listed in FONTMAP */
        !           154:                finishdesc();                                   /* complete *ndev's new DESC file */
        !           155:        }       /* End while */
        !           156: 
        !           157: }      /* End of main */
        !           158: 
        !           159: 
        !           160: /*****************************************************************************/
        !           161: 
        !           162: 
        !           163: getoptions()
        !           164: 
        !           165: 
        !           166: {
        !           167: 
        !           168: 
        !           169:        /********************************************************************
        !           170:         *                                                                                                                                      *
        !           171:         *              Called from the main program to handle the command line         *
        !           172:         *      options.                                                                                                                *
        !           173:         *                                                                                                                                      *
        !           174:         ********************************************************************/
        !           175: 
        !           176: 
        !           177:        while ( argc > 1  &&  argv[1][0] == '-' )  {
        !           178: 
        !           179:                switch ( argv[1][1] )  {
        !           180: 
        !           181:                        case 's':
        !           182:                                                silent = YES;
        !           183:                                                break;
        !           184: 
        !           185:                        case 'm':
        !           186:                                                strcpy(mdev, &argv[1][2]);
        !           187:                                                if ( strlen(mdev) > DNAME )
        !           188:                                                        error(FATAL, "device name %s too long", mdev);
        !           189:                                                break;
        !           190: 
        !           191:                        case 'F':
        !           192:                                                fontdir = &argv[1][2];
        !           193:                                                break;
        !           194: 
        !           195:                        case 'S':
        !           196:                                                srcdir = &argv[1][2];
        !           197:                                                break;
        !           198: 
        !           199:                        default:
        !           200:                                                error(NON_FATAL, "illegal option %c", argv[1][1]);
        !           201:                                                break;
        !           202: 
        !           203:                }       /* End switch */
        !           204: 
        !           205:                argv++;
        !           206:                argc--;
        !           207: 
        !           208:        }       /* End while */
        !           209: 
        !           210: }      /* End of getoptions */
        !           211: 
        !           212: 
        !           213: /*****************************************************************************/
        !           214: 
        !           215: 
        !           216: getmdev()
        !           217: 
        !           218: 
        !           219: {
        !           220: 
        !           221: 
        !           222:        FILE    *fd;                                            /* used for *rastdev file */
        !           223: 
        !           224: 
        !           225:        /********************************************************************
        !           226:         *                                                                                                                                      *
        !           227:         *              Called from the main program to get the name of the device      *
        !           228:         *      that was used to make the raster tables for the target device.  *
        !           229:         *      If the string *mdev has already been set, possibly by an                *
        !           230:         *      option, nothing is done. Otherwise we expect to find the name   *
        !           231:         *      as the first string in the file *targdir/*rastdev.                              *
        !           232:         *                                                                                                                                      *
        !           233:         ********************************************************************/
        !           234: 
        !           235: 
        !           236:        if ( *mdev != '\0' )  return;           /* got the name somewhere else */
        !           237: 
        !           238:        sprintf(path, "%s/%s", targdir, rastdev);
        !           239:        if ( (fd = fopen(path, "r")) == NULL )
        !           240:                error(FATAL, "can't open file %s", path);
        !           241: 
        !           242:        if ( fscanf(fd, "%14s", mdev) != 1 )
        !           243:                error(FATAL, "no device name in file %s", rastdev);
        !           244: 
        !           245:        if ( strlen(mdev) > DNAME )
        !           246:                error(FATAL, "master device name %s too long", mdev);
        !           247: 
        !           248:        fclose(fd);                                                     /* won't need this file again */
        !           249: 
        !           250: }      /* End of getmdev */
        !           251: 
        !           252: 
        !           253: /*****************************************************************************/
        !           254: 
        !           255: 
        !           256: getdesc()
        !           257: 
        !           258: 
        !           259: {
        !           260: 
        !           261: 
        !           262:        int             fin;                                            /* DESC.out's file descriptor */
        !           263:        char    *filebase;                                      /* memory block for DESC.out file */
        !           264:        char    *malloc();                                      /* memory allocation routine */
        !           265: 
        !           266: 
        !           267:        /********************************************************************
        !           268:         *                                                                                                                                      *
        !           269:         *              Called from the main program to read in the DESC.out file       *
        !           270:         *      for typesetter *mdev. Even though we only will use a small part *
        !           271:         *      of this file, the whole thing is read into memory. I also               *
        !           272:         *      decided not to use the font space that is already allocated in  *
        !           273:         *      the DESC.out file. If you want to use this space just change    *
        !           274:         *      the initialization of fontstart.                                                                *
        !           275:         *                                                                                                                                      *
        !           276:         ********************************************************************/
        !           277: 
        !           278: 
        !           279:        sprintf(path, "%s/dev%s/DESC.out", fontdir, mdev);
        !           280:        if ( (fin = open(path, 0)) < 0 )
        !           281:                error(FATAL, "can't open file %s", path);
        !           282: 
        !           283:        read(fin, &dev, sizeof(struct dev));    /* struct dev comes first */
        !           284: 
        !           285:        nchtab = dev.nchtab;                                    /* FONTSIZE needs this number */
        !           286:        fsize = FONTSIZE;                                               /* space given to each font */
        !           287: 
        !           288:        if ( (filebase = malloc(dev.filesize)) == NULL )
        !           289:                error(FATAL, "no memory available");
        !           290: 
        !           291:        read(fin, filebase, dev.filesize);              /* get rest of the DESC.out file */
        !           292:        pstab = (short *) filebase;                             /* this table is never used */
        !           293:        chtab = pstab + dev.nsizes + 1;
        !           294:        chname = (char *) (chtab + dev.nchtab);
        !           295: 
        !           296:        if ( (fontstart = malloc(NFONT * fsize)) == NULL )
        !           297:                error(FATAL, "no memory available");
        !           298: 
        !           299:        close(fin);                                                             /* won't need this guy again */
        !           300: 
        !           301: }      /* End of getdesc */
        !           302: 
        !           303: 
        !           304: /*****************************************************************************/
        !           305: 
        !           306: 
        !           307: startdesc()
        !           308: 
        !           309: 
        !           310: {
        !           311: 
        !           312: 
        !           313:        char    cmd[LINE_LENGTH];                       /* DESC file commands go here */
        !           314:        int             c;                                                      /* used as a character */
        !           315: 
        !           316: 
        !           317:        /********************************************************************
        !           318:         *                                                                                                                                      *
        !           319:         *              Called from main() to begin making *ndev's ASCII DESC file.     *
        !           320:         *      The real DESC file is read up to the default font list. Later   *
        !           321:         *      routine finishdesc() is called to complete the new DESC file.   *
        !           322:         *      I did things this way because we need to know the original              *
        !           323:         *      number of default fonts for device *ndev before we make the             *
        !           324:         *      new font tables, and we can't write the default font list out   *
        !           325:         *      to the new DESC file until we have built all the new font               *
        !           326:         *      tables for *ndev.                                                                                               *
        !           327:         *                                                                                                                                      *
        !           328:         *              Since I have claimed dev.spare2 in routine finishdesc() we      *
        !           329:         *      should probably check if the command we just read was 'spare2'. *
        !           330:         *      I'll take care of this later on.                                                                *
        !           331:         *                                                                                                                                      *
        !           332:         ********************************************************************/
        !           333: 
        !           334: 
        !           335:        sprintf(path, "%s/dev%s/DESC", srcdir, ndev);
        !           336:        if ( (descin = fopen(path, "r")) == NULL )
        !           337:                error(FATAL, "can't open file %s", path);
        !           338: 
        !           339:        sprintf(path, "%s/dev%s/DESC", targdir, ndev);
        !           340:        if ( (descout = fopen(path, "w")) == NULL )
        !           341:                error(FATAL, "can't write file %s", path);
        !           342: 
        !           343:        while ( fscanf(descin, "%s", cmd) != EOF )  {
        !           344:                fprintf(descout, "%s", cmd);
        !           345:                if ( strcmp(cmd, "fonts") == 0 )  {
        !           346:                        fscanf(descin, "%s", cmd);
        !           347:                        fcount = atoi(cmd);
        !           348:                        return;
        !           349:                } else if ( strcmp(cmd, "charset") == 0 )
        !           350:                        error(FATAL, "bad DESC file format");
        !           351:                else while ( putc(c=getc(descin), descout) != '\n'  &&  c != EOF ) ;
        !           352:        }       /* End while */
        !           353: 
        !           354:        error(FATAL, "bad DESC file");          /* shouldn't get here! */
        !           355: 
        !           356: }      /* End of startdesc */
        !           357: 
        !           358: 
        !           359: /*****************************************************************************/
        !           360: 
        !           361: 
        !           362: finishdesc()
        !           363: 
        !           364: 
        !           365: {
        !           366: 
        !           367: 
        !           368:        char    fname[FNAME+1];                         /* names of the default fonts */
        !           369:        int             i, j;                                           /* for loop indices */
        !           370:        int             c;                                                      /* used as a char with getc() */
        !           371: 
        !           372: 
        !           373:        /********************************************************************
        !           374:         *                                                                                                                                      *
        !           375:         *              Called from the main program after all the fonts for *ndev      *
        !           376:         *      have been mapped. Routine startdesc() read *descin up to the    *
        !           377:         *      first default font name, and it wrote *descout up to the count  *
        !           378:         *      part of the default font list. Most likely we will now have             *
        !           379:         *      more default fonts than we started with, so dev.spare2 can be   *
        !           380:         *      used by post-processors to get at the original number.                  *
        !           381:         *                                                                                                                                      *
        !           382:         ********************************************************************/
        !           383: 
        !           384: 
        !           385:        fprintf(descout, " %d", fcount + acount);       /* new default font count */
        !           386: 
        !           387:        for ( i = 0; i < fcount; i++ )  {                       /* check each default font */
        !           388:                fscanf(descin, "%s", fname);
        !           389:                fprintf(descout, " %s", fname);
        !           390:                for ( j = 0; j < mapcount; j++ )                /* did we map this font? */
        !           391:                        if ( strcmp(fname, &mapped[j][0]) == 0 )
        !           392:                                break;
        !           393:                if ( j >= mapcount )                                    /* didn't find it */
        !           394:                        error(NON_FATAL, "missing default font file %s", fname);
        !           395:        }       /* End for */
        !           396: 
        !           397:        fprintf(descout, "%s", addfont);                        /* finish the default font list */
        !           398:        fprintf(descout, "\nspare2 %d", fcount);        /* post-processor can use it */
        !           399: 
        !           400:        while ( (c = getc(descin)) != EOF ) putc(c, descout);
        !           401: 
        !           402:        fclose(descin);                                                         /* may have more devices */
        !           403:        fclose(descout);
        !           404: 
        !           405: }      /* End of finishdesc */
        !           406: 
        !           407: 
        !           408: /*****************************************************************************/
        !           409: 
        !           410: 
        !           411: makefonts()
        !           412: 
        !           413: 
        !           414: {
        !           415: 
        !           416: 
        !           417:        char    cmd[LINE_LENGTH];                       /* font file commands go here */
        !           418:        int             c;                                                      /* used as a character */
        !           419:        int             i;                                                      /* for loop index */
        !           420: 
        !           421: 
        !           422:        /********************************************************************
        !           423:         *                                                                                                                                      *
        !           424:         *              Called from main() to make all the ASCII font files listed      *
        !           425:         *      in *ndev's FONTMAP file. All the stuff up to the charset part   *
        !           426:         *      of each ASCII font file is essentially copied into the new              *
        !           427:         *      font file. The name field is changed to the name of the second  *
        !           428:         *      font from appropriate lines in the FONTMAP file. All 'related'  *
        !           429:         *      fonts are given the same internal number. The lower eight bits  *
        !           430:         *      of this number contains the font position where post-processors *
        !           431:         *      can expect to find related fonts to search if a character is    *
        !           432:         *      not found on the primary font. This additional search should be *
        !           433:         *      done before checking the special fonts. The ligature stuff is   *
        !           434:         *      not really needed - leave it in for now.                                                *
        !           435:         *                                                                                                                                      *
        !           436:         ********************************************************************/
        !           437: 
        !           438: 
        !           439:        mapcount = 0;                                           /* fonts mapped so far for *ndev */
        !           440: 
        !           441:        sprintf(path, "%s/dev%s/%s", targdir, ndev, fontmap);
        !           442:        if ( (fp_map = fopen(path, "r")) == NULL )
        !           443:                error(FATAL, "can't open file %s", path);
        !           444: 
        !           445:        while ( readmap() != 0 )  {                     /* not done with FONTMAP file yet */
        !           446: 
        !           447:                if ( silent == NO )
        !           448:                        printf("font %s\n", &mapped[mapcount][0]);
        !           449: 
        !           450:                for ( i = 1; i < NFONT + 1; i++ )
        !           451:                        fontout[i] = NULL;
        !           452: 
        !           453:                sprintf(path, "%s/dev%s/%s", srcdir, ndev, &mapped[mapcount][0]);
        !           454:                if ( (fontin = fopen(path, "r")) == NULL )
        !           455:                        error(FATAL, "can't open file %s", path);
        !           456: 
        !           457:                sprintf(path, "%s/dev%s/%s", targdir, ndev, &mapped[mapcount][0]);
        !           458:                if ( (fontout[0] = fopen(path, "w")) == NULL )
        !           459:                        error(FATAL, "can't open file %s", path);
        !           460: 
        !           461:                for ( i = 0; i < nfonts; i++ )          /* get the '.out' font files */
        !           462:                        loadfont(&fmap[i][0], i);
        !           463: 
        !           464:                iname = (mapcount * (BMASK + 1)) + fcount + acount + 1;
        !           465: 
        !           466:                while ( fscanf(fontin, "%s", cmd) == 1)  {
        !           467:                        fprintf(fontout[0], "%s", cmd);
        !           468:                        if ( strcmp(cmd, "name") == 0 )  {
        !           469:                                 fprintf(fontout[0], " %s\n", &fmap[0][0]);
        !           470:                                 while ( (c = getc(fontin)) != '\n'  &&  c != EOF ) ;
        !           471:                        } else if ( strcmp(cmd, "internalname") == 0 )  {
        !           472:                                 fprintf(fontout[0], " %d\n", iname);
        !           473:                                 while ( (c = getc(fontin)) != '\n'  &&  c != EOF ) ;
        !           474:                        } else if ( strcmp(cmd, "ligatures") == 0 )  {
        !           475:                                 get_ligs();
        !           476:                                 while ( (c = getc(fontin)) != '\n'  &&  c != EOF ) ;
        !           477:                        } else if ( strcmp(cmd, "charset") == 0 )
        !           478:                                 copy_chars();
        !           479:                        else while ( putc(c=getc(fontin), fontout[0]) != '\n' && c != EOF ) ;
        !           480:                }       /* End while */
        !           481: 
        !           482:                mapcount++;                                             /* finished mapping this font */
        !           483: 
        !           484:                fclose(fontin);
        !           485:                for ( i = 0; i < NFONT + 1; i++ )
        !           486:                        if ( fontout[i] != NULL )
        !           487:                                fclose(fontout[i]);
        !           488: 
        !           489:        }       /* End while */
        !           490: 
        !           491:        fclose(fp_map);
        !           492: 
        !           493: }      /* End of makefonts */
        !           494: 
        !           495: 
        !           496: /*****************************************************************************/
        !           497: 
        !           498: 
        !           499: readmap()
        !           500: 
        !           501: 
        !           502: {
        !           503: 
        !           504: 
        !           505:        char    buff[20];
        !           506:        int             c;                                                      /* used as a character */
        !           507: 
        !           508: 
        !           509:        /********************************************************************
        !           510:         *                                                                                                                                      *
        !           511:         *              This routine continues reading the FONTMAP file until it        *
        !           512:         *      has processed the next font mapping instruction. Any 'build'    *
        !           513:         *      lists that are encountered replace the last list, and will              *
        !           514:         *      therefore apply to the next font map. The first font mentioned  *
        !           515:         *      in a font map line is the name of the primary font for the              *
        !           516:         *      current mapping instruction. This is *ndev's ASCII font file    *
        !           517:         *      that we will be reading and usually writing. The rest of the    *
        !           518:         *      fonts following the 'into' are the names of *mdev's fonts that  *
        !           519:         *      are searched when we do the character lookups. These searches   *
        !           520:         *      are done using the '.out' font files, which are read in from    *
        !           521:         *      *mdev's normal font directory.                                                                  *
        !           522:         *                                                                                                                                      *
        !           523:         ********************************************************************/
        !           524: 
        !           525: 
        !           526:        if ( mapcount >= MAXFONTS )
        !           527:                error(FATAL, "too many fonts in %s file", fontmap);
        !           528: 
        !           529:        while ( fscanf(fp_map, "%19s", buff) == 1 )  {
        !           530:                if ( strcmp(buff, "synonyms") == 0 )
        !           531:                        readsyns();
        !           532:                else if ( strcmp(buff, "build") == 0 )
        !           533:                        readbuild();
        !           534:                else if ( strcmp(buff, "nobuild") == 0 )
        !           535:                        bldcount = 0;
        !           536:                else if ( strcmp(buff, "map") == 0 )
        !           537:                        return(readfonts());
        !           538:                else if ( buff[0] = '#' )
        !           539:                        while ( (c = getc(fp_map)) != '\n'  &&  c != EOF ) ;
        !           540:                else error(FATAL, "don't know command %s", buff);
        !           541:        }       /* End while */
        !           542: 
        !           543:        return(0);
        !           544: 
        !           545: }      /* End of readmap */
        !           546: 
        !           547: 
        !           548: /*****************************************************************************/
        !           549: 
        !           550: 
        !           551: readfonts()
        !           552: 
        !           553: 
        !           554: {
        !           555: 
        !           556: 
        !           557:        int             c;                                                      /* character used with getc() */
        !           558: 
        !           559: 
        !           560:        /********************************************************************
        !           561:         *                                                                                                                                      *
        !           562:         *              Called from readmap() to read the next font map line for        *
        !           563:         *      device *ndev from the file *fp_map.                                                             *
        !           564:         *                                                                                                                                      *
        !           565:         ********************************************************************/
        !           566: 
        !           567: 
        !           568:        nfonts = 0;
        !           569: 
        !           570:        if ( fscanf(fp_map, "%s into", &mapped[mapcount][0]) != 1 )
        !           571:                error(FATAL, "map file synatx error");
        !           572: 
        !           573:        if ( FNAME < 3 )                                        /* we may have trouble later on */
        !           574:                error(FATAL, "constant FNAME less than 3");
        !           575: 
        !           576:        if ( strlen(&mapped[mapcount][0]) > FNAME )
        !           577:                error(FATAL, "font name %s too long", &mapped[mapcount][0]);
        !           578: 
        !           579:        while ( nfonts < NFONT )  {
        !           580:                while ( (c = getc(fp_map)) == ' '  ||  c == '\t') ;
        !           581:                if ( c == '\n'  ||  c == EOF )
        !           582:                        break;
        !           583:                ungetc(c, fp_map);
        !           584:                fscanf(fp_map, "%s", &fmap[nfonts][0]);
        !           585:                if ( strlen(&fmap[nfonts++][0]) > FNAME )
        !           586:                        error(FATAL, "font name %s too long", &fmap[nfonts-1][0]);
        !           587:        }       /* End while */
        !           588: 
        !           589:        if ( nfonts >= NFONT )
        !           590:                while ( (c = getc(fp_map)) != '\n'  &&  c != EOF ) ;
        !           591: 
        !           592:        strcpy(&fmap[nfonts][0], "bld");
        !           593: 
        !           594:        return(nfonts);
        !           595: 
        !           596: }      /* End of readfonts */
        !           597: 
        !           598: 
        !           599: /*****************************************************************************/
        !           600: 
        !           601: 
        !           602: readbuild()
        !           603: 
        !           604: 
        !           605: {
        !           606: 
        !           607: 
        !           608:        /********************************************************************
        !           609:         *                                                                                                                                      *
        !           610:         *              Called from readmap() to read a 'build' list from *fontmap.     *
        !           611:         *      This list consists of those characters that will be built up    *
        !           612:         *      by the post-processor. They will be written out to a special    *
        !           613:         *      font file named *fmap[0].bld with a character code of 0. The    *
        !           614:         *      list is terminated by the string "end".                                                 *
        !           615:         *                                                                                                                                      *
        !           616:         ********************************************************************/
        !           617: 
        !           618: 
        !           619:        bldcount = 0;                                           /* throw the last copy list out */
        !           620: 
        !           621:        while ( bldcount < MAXBUILD )  {
        !           622:                if ( fscanf(fp_map, "%s", &bldlist[bldcount][0]) != 1 )
        !           623:                        error(FATAL, "bad build list format");
        !           624: 
        !           625:                if ( strcmp(&bldlist[bldcount][0], "end") == 0 )
        !           626:                        return;
        !           627: 
        !           628:                if ( strlen(&bldlist[bldcount][0]) > CLENGTH )
        !           629:                        error(FATAL, "copy name %s too long", &bldlist[bldcount][0]);
        !           630: 
        !           631:                bldcount++;
        !           632:        }       /* End while */
        !           633: 
        !           634:        error(FATAL, "too many build characters");
        !           635: 
        !           636: }      /* End of readbuild */
        !           637: 
        !           638: 
        !           639: /*****************************************************************************/
        !           640: 
        !           641: 
        !           642: readsyns()
        !           643: 
        !           644: 
        !           645: {
        !           646: 
        !           647: 
        !           648:        /********************************************************************
        !           649:         *                                                                                                                                      *
        !           650:         *              Called from readmap() to read a synonym list from the           *
        !           651:         *      *fontmap. The list is terminated by any pair of identical               *
        !           652:         *      character strings whose length is no more than CLENGTH.                 *
        !           653:         *      This synonym stuff is probably not needed. It was added to the  *
        !           654:         *      program early on.                                                                                               *
        !           655:         *                                                                                                                                      *
        !           656:         ********************************************************************/
        !           657: 
        !           658: 
        !           659:        syncount = 0;                                           /* throw the last list out */
        !           660: 
        !           661:        while ( syncount < MAXSYNS )  {
        !           662:                if ( fscanf(fp_map, "%s %s", &new[syncount][0], &old[syncount][0]) != 2 )
        !           663:                        error(FATAL, "bad synonym list format");
        !           664: 
        !           665:                if ( strlen(&new[syncount][0]) > CLENGTH )
        !           666:                        error(FATAL, "synonym name %s too long", &new[syncount][0]);
        !           667: 
        !           668:                if ( strlen(&old[syncount][0]) > CLENGTH )
        !           669:                        error(FATAL, "synonym name %s too long", &old[syncount][0]);
        !           670: 
        !           671:                if ( strcmp(&new[syncount][0], &old[syncount][0]) == 0 )
        !           672:                        return;
        !           673: 
        !           674:                syncount++;                                             /* its a real synonym */
        !           675:        }       /* End while */
        !           676: 
        !           677:        error(FATAL, "too many synonyms");
        !           678: 
        !           679: }      /* End of readsyns */
        !           680: 
        !           681: 
        !           682: /*****************************************************************************/
        !           683: 
        !           684: 
        !           685: get_ligs()
        !           686: 
        !           687: 
        !           688: {
        !           689: 
        !           690: 
        !           691:        char    lig;
        !           692: 
        !           693: 
        !           694:        /********************************************************************
        !           695:         *                                                                                                                                      *
        !           696:         *              Called from makefonts() to build up an appropriate ligature     *
        !           697:         *      list for the current font. This routine should not be needed    *
        !           698:         *      because the new tables will probably only be used by post-              *
        !           699:         *      processors, and they usually won't look at the font.ligfont             *
        !           700:         *      field. It is the right way to do things, so I decided to leave  *
        !           701:         *      the routine in for now - just in case.                                                  *
        !           702:         *                                                                                                                                      *
        !           703:         ********************************************************************/
        !           704: 
        !           705: 
        !           706:        lig = fontbase[0]->ligfont;
        !           707: 
        !           708:        if ( lig & LFI )
        !           709:                fprintf(fontout[0], " fi");
        !           710:        if ( lig & LFL )
        !           711:                fprintf(fontout[0], " fl");
        !           712:        if ( lig & LFF )
        !           713:                fprintf(fontout[0], " ff");
        !           714:        if ( lig & LFFI )
        !           715:                fprintf(fontout[0], " ffi");
        !           716:        if ( lig & LFFL )
        !           717:                fprintf(fontout[0], " ffl");
        !           718: 
        !           719:        fprintf(fontout[0], " 0\n");
        !           720: 
        !           721: }      /* End of get_ligs */
        !           722: 
        !           723: 
        !           724: /*****************************************************************************/
        !           725: 
        !           726: 
        !           727: copy_chars()
        !           728: 
        !           729: 
        !           730: {
        !           731: 
        !           732: 
        !           733:        char    ch[10];                                         /* standard stuff from makedev */
        !           734:        char    width[10];
        !           735:        char    kern[10];
        !           736:        char    code[10];
        !           737:        char    nch[10];                                        /* look this char up - synonym */
        !           738:        char    buff[LINE_LENGTH];                      /* next line from charset part */
        !           739:        int             index;                                          /* found character on this font */
        !           740:        int             i;                                                      /* for loop index */
        !           741: 
        !           742: 
        !           743:        /********************************************************************
        !           744:         *                                                                                                                                      *
        !           745:         *              Called from makefonts() to copy the charset portion of the      *
        !           746:         *      current font file to the appropriate place in the *tdev                 *
        !           747:         *      directory.                                                                                                              *
        !           748:         *                                                                                                                                      *
        !           749:         ********************************************************************/
        !           750: 
        !           751: 
        !           752:        index = -1;                                                     /* needed because of synonyms */
        !           753:        putc('\n', fontout[0]);                         /* comes after 'charset' command */
        !           754: 
        !           755:        while ( fgets(buff, sizeof(buff), fontin) != NULL )  {
        !           756: 
        !           757:                if ( sscanf(buff, "%s %s %s %s", ch, width, kern, code) < 2 )
        !           758:                        continue;
        !           759: 
        !           760:                if ( width[0] == '"' )  {
        !           761:                        if ( index >= 0 )
        !           762:                                fprintf(fontout[index], "%s\t%s\n", ch, width);
        !           763:                        continue;
        !           764:                }       /* End if */
        !           765: 
        !           766:                strcpy(nch, ch);
        !           767:                for ( i = 0; i < syncount; i++ )
        !           768:                        if ( strcmp(ch, &old[i][0]) == 0 )  {
        !           769:                                strcpy(nch, &new[i][0]);
        !           770:                                break;
        !           771:                        }       /* End if */
        !           772: 
        !           773:                if ( (index = lookup(code, nch)) < 0 )  {
        !           774:                        if ( silent == NO )
        !           775:                                printf("  char %s not found\n", ch);
        !           776:                        continue;
        !           777:                } else if ( fontout[index] == NULL )
        !           778:                        startfont(index);
        !           779: 
        !           780:                fprintf(fontout[index], "%s\t%s\t%s\t%s\n", ch, width, kern, code);
        !           781: 
        !           782:        }       /* End while */
        !           783: 
        !           784: }      /* End of copy_chars */
        !           785: 
        !           786: 
        !           787: /*****************************************************************************/
        !           788: 
        !           789: 
        !           790: startfont(index)
        !           791: 
        !           792: 
        !           793:        int             index;                                          /* font's name is in fmap[index] */
        !           794: 
        !           795: 
        !           796: {
        !           797: 
        !           798: 
        !           799:        char    *nfont[2*FNAME+1];                      /* name of the new font */
        !           800: 
        !           801: 
        !           802:        /********************************************************************
        !           803:         *                                                                                                                                      *
        !           804:         *              When this routine is called, we have found a character          *
        !           805:         *      from font mapped[mapcount] on fmap[index]. It is the first              *
        !           806:         *      time we needed this font so we have to create a new font file   *
        !           807:         *      with all the appropriate header stuff. This routine will never  *
        !           808:         *      be called with index equal to 0, since when a character is              *
        !           809:         *      found on fmap[0] it is written to *ndev's new ASCII font file   *
        !           810:         *      called mapped[mapcount][0]. This string is set in readfonts()   *
        !           811:         *      to the name of the first font in the current 'map' line in file *
        !           812:         *      *fp_map, and the appropriate ASCII output file has already been *
        !           813:         *      opened for writing in routine makefonts().                                              *
        !           814:         *                                                                                                                                      *
        !           815:         ********************************************************************/
        !           816: 
        !           817: 
        !           818:        strcat(strcat(strcpy(nfont, &mapped[mapcount][0]), "."), &fmap[index][0]);
        !           819: 
        !           820:        sprintf(path, "%s/dev%s/%s", targdir, ndev, nfont);
        !           821:        if ( (fontout[index] = fopen(path, "w")) == NULL )
        !           822:                error(FATAL, "can't write file %s", path);
        !           823: 
        !           824:        fprintf(fontout[index], "name %s\n", index != nfonts ? &fmap[index][0] : &fmap[0][0]);
        !           825:        fprintf(fontout[index], "internalname %d\n", iname);
        !           826:        fprintf(fontout[index], "charset\n");
        !           827: 
        !           828:        acount++;
        !           829:        strcat(strcat(addfont, " "), nfont);    /* will be a default font */
        !           830: 
        !           831: }      /* End of startfont */
        !           832: 
        !           833: 
        !           834: /*****************************************************************************/
        !           835: 
        !           836: 
        !           837: lookup(code, ch)
        !           838: 
        !           839: 
        !           840:        char    *code;                                          /* use this device code */
        !           841:        char    *ch;                                            /* for this character */
        !           842: 
        !           843: 
        !           844: {
        !           845: 
        !           846: 
        !           847:        int             buildit;                                        /* did we find it in the build list? */
        !           848:        int             c;                                                      /* ch's index */
        !           849:        int             j;                                                      /* found on this font */
        !           850:        int             i;                                                      /* chars index on font j */
        !           851: 
        !           852: 
        !           853:        /********************************************************************
        !           854:         *                                                                                                                                      *
        !           855:         *              Called from copy_chars() to lookup the device code for the      *
        !           856:         *      character ch. If *ch isn't found we return -1, otherwise we             *
        !           857:         *      return the font's index where *ch was found.                                    *
        !           858:         *                                                                                                                                      *
        !           859:         ********************************************************************/
        !           860: 
        !           861: 
        !           862:        buildit = 0;                                                    /* not in the build list */
        !           863:        for ( i = 0; i < bldcount; i++ )                /* check the build list */
        !           864:                if ( strcmp(ch, &bldlist[i][0]) == 0 )  {
        !           865:                        strcpy(code, "0");
        !           866:                        buildit = 1;
        !           867:                }       /* End if */
        !           868: 
        !           869:        if ( ch[1] == '\0' )                            /* ASCII character */
        !           870:                c = ch[0];
        !           871:        else  {                                                         /* special troff character string */
        !           872:                 for ( c = 0; c < nchtab; c++ )
        !           873:                        if ( strcmp(&chname[chtab[c]], ch) == 0 )
        !           874:                                break;
        !           875:                 if ( c >= nchtab )
        !           876:                        return(buildit == 0 ? -1 : nfonts);
        !           877:                c += 128;                                               /* special chars start at 128 */
        !           878:        }       /* End if */
        !           879: 
        !           880:        c -= 32;                                                        /* forget non-graphic characters */
        !           881:        j = 0;
        !           882: 
        !           883:        while ( j < nfonts  &&  (i = fitab[j][c] & BMASK) == 0 )
        !           884:                j++;
        !           885: 
        !           886:        if ( j >= nfonts  ||  i == 0 )          /* didn't find it on any font */
        !           887:                return(buildit == 0 ? -1 : nfonts);
        !           888: 
        !           889:        sprintf(code, "%d", codetab[j][i] & BMASK);
        !           890:        return(j);
        !           891: 
        !           892: }      /* End of lookup */
        !           893: 
        !           894: 
        !           895: /*****************************************************************************/
        !           896: 
        !           897: 
        !           898: loadfont(str, pos)
        !           899: 
        !           900: 
        !           901:        char    *str;                                           /* name of the font to load */
        !           902:        int             pos;                                            /* read font data into this position */
        !           903: 
        !           904: 
        !           905: {
        !           906: 
        !           907: 
        !           908:        char    *fontpos;                                       /* this font's position */
        !           909:        int             fin;                                            /* font's .out file descriptor */
        !           910:        int             nw;                                                     /* number of width entries for font */
        !           911: 
        !           912: 
        !           913:        /********************************************************************
        !           914:         *                                                                                                                                      *
        !           915:         *              Called from makefonts() to load the .out file for font *str     *
        !           916:         *      from the 'master' device's real font directory.                                 *
        !           917:         *                                                                                                                                      *
        !           918:         ********************************************************************/
        !           919: 
        !           920: 
        !           921:        sprintf(path, "%s/dev%s/%s.out", fontdir, mdev, str);
        !           922:        if ( (fin = open(path, 0)) < 0 )
        !           923:                error(FATAL, "can't open file %s", path);
        !           924: 
        !           925:        fontpos = fontstart + (fsize * pos);
        !           926:        read(fin, fontpos, fsize);
        !           927: 
        !           928:        fontbase[pos] = (struct Font *) fontpos;
        !           929:        nw = fontbase[pos]->nwfont & BMASK;
        !           930: 
        !           931:        widthtab[pos] = (char *) fontpos + sizeof(struct Font);
        !           932:        codetab[pos] = (char *) widthtab[pos] + 2 * nw;
        !           933:        fitab[pos] = (char *) widthtab[pos] + 3 * nw;
        !           934: 
        !           935:        close(fin);
        !           936: 
        !           937: }      /* End of loadfont */
        !           938: 
        !           939: 
        !           940: /*****************************************************************************/
        !           941: 
        !           942: 
        !           943: error(kind, str, a1, a2)
        !           944: 
        !           945: 
        !           946:        int                     kind;
        !           947:        char            *str;
        !           948:        unsigned        a1, a2;
        !           949: 
        !           950: 
        !           951: {
        !           952: 
        !           953: 
        !           954:        /********************************************************************
        !           955:         *                                                                                                                                      *
        !           956:         *              Print the error message *str, and quit if the error was         *
        !           957:         *      FATAL.                                                                                                                  *
        !           958:         *                                                                                                                                      *
        !           959:         ********************************************************************/
        !           960: 
        !           961: 
        !           962:        fprintf(fp_error, "make%s: ", tdev);
        !           963: 
        !           964:        if ( kind == NON_FATAL )
        !           965:                fprintf(fp_error, "warning - ");
        !           966: 
        !           967:        fprintf(fp_error, str, a1);
        !           968:        putc('\n', fp_error);
        !           969: 
        !           970:        if ( kind == FATAL )
        !           971:                exit(1);
        !           972: 
        !           973: }      /* End of error */
        !           974: 
        !           975: 
        !           976: /*****************************************************************************/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.