Annotation of researchv10no/cmd/dimpress/makemap.c, revision 1.1.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.