Annotation of researchv10no/cmd/troff/devi10/makefonts.c, revision 1.1

1.1     ! root        1: 
        !             2: /*
        !             3:  *
        !             4:  *  This program was written with tabs set to every fourth column,
        !             5:  *  so things will look funny unless you have your tabs set the same way.
        !             6:  *  I haven't really finished the program, but it works and I doubt I'll
        !             7:  *  do anything else with it.
        !             8:  *
        !             9:  */
        !            10: 
        !            11: 
        !            12: #include <stdio.h>
        !            13: #include <ctype.h>
        !            14: 
        !            15: /*
        !            16: #include "glyph.h"
        !            17: */
        !            18: #include "dev.h"
        !            19: 
        !            20: 
        !            21: #define        NON_FATAL       0
        !            22: #define        FATAL           1
        !            23: 
        !            24: #define        FALSE           0
        !            25: #define        TRUE            1
        !            26: 
        !            27: #define        NOT_SET         -1                                      /* variable has not been initialized */
        !            28: 
        !            29: #define        RES                     0                                       /* used in new_value() switch stmt */
        !            30: #define        UNIT            1
        !            31: #define        HOR                     2
        !            32: #define        VERT            3
        !            33: #define        WIDTH           4
        !            34: #define        LENGTH          5
        !            35: 
        !            36: #define        BMASK           0377                            /* mask for characters */
        !            37: 
        !            38: #define        CNAME           2                                       /* max length of special characters */
        !            39: #define        DNAME           10                                      /* max length of device name */
        !            40: #define        FNAME           10                                      /* max length of font name */
        !            41: #define        PNAME           50                                      /* longest allowed pathname */
        !            42: 
        !            43: #define        MAX_BUFF        30                                      /* input strings are put here */
        !            44: #define        LINE_LENGTH     100                                     /* longest allowed line */
        !            45: #define        MAX_CHARS       255                                     /* most allowed chars per font */
        !            46: 
        !            47: #define        SIZE_LENGTH     150                                     /* space allowed for new point sizes */
        !            48: #define        FONT_LENGTH     150                                     /* space for new default font list */
        !            49: 
        !            50: 
        !            51: 
        !            52: int            use_rast = FALSE;                               /* get widths from raster tables? */
        !            53: 
        !            54: char   path[PNAME+1];                                  /* path names built up here */
        !            55: 
        !            56: char   *srcdir = "/usr/lib/font";              /* ASCII font files are kept here */
        !            57: char   *fontdir = "/usr/lib/font";             /* binary font and device files */
        !            58: char   *bitdir = "/usr/lib/font";              /* raster tables are located here */
        !            59: char   *changes = "FONTCHANGES";               /* interpret this file */
        !            60: 
        !            61: char   mdev[DNAME+1] = "";                             /* use this device's source files */
        !            62: char   tdev[DNAME+1] = "";                             /* target device - for raster tables */
        !            63: char   cur_font[FNAME+1] = "";                 /* font we are currently working on */
        !            64: 
        !            65: int            unitwidth = NOT_SET;                    /* widths hold for this point size */
        !            66: int            res = NOT_SET;                                  /* and this target device resolution */
        !            67: int            hor = NOT_SET;                                  /* minimum horizontal step */
        !            68: int            vert = NOT_SET;                                 /* minimum vertical step */
        !            69: char   fonts[FONT_LENGTH] = {0};               /* new default font list */
        !            70: char   sizes[SIZE_LENGTH] = {0};               /* and point size list */
        !            71: 
        !            72: float  incr;                                                   /* add this to width after expansion */
        !            73: float  scale = NOT_SET;                                /* scale factor for width changes */
        !            74: float  dflt_chng = NOT_SET;                    /* default width change */
        !            75: float  font_chng = NOT_SET;                    /* width change for current font */
        !            76: float  dflt_incr = .5;                                 /* add to width after expansion */
        !            77: 
        !            78: int            dcount;                                                 /* index into following arrays */
        !            79: char   names[MAX_CHARS][CNAME+1];              /* special character strings go here */
        !            80: float  deltas[MAX_CHARS];                              /* corresponding width changes */
        !            81: float  incrs[MAX_CHARS];                               /* character increments */
        !            82: 
        !            83: struct dev     dev;                                            /* *mdev's DESC.out header goes here */
        !            84: 
        !            85: int            nchtab;                                                 /* number of special chars in chtab */
        !            86: short  *pstab;                                                 /* point size table - not needed */
        !            87: short  *chtab;                                                 /* char's index in chname array */
        !            88: char   *chname;                                                /* special character strings */
        !            89: 
        !            90: 
        !            91: FILE   *fp_change;                                             /* file pointer for *changes */
        !            92: FILE   *fp_rast;                                               /* raster table used for widths */
        !            93: FILE   *fp_in;                                                 /* input file for current font */
        !            94: FILE   *fp_out;                                                /* output file for current font */
        !            95: 
        !            96: char   **argv;                                                 /* let everyone use them */
        !            97: int            argc;
        !            98: 
        !            99: 
        !           100: 
        !           101: 
        !           102: /*****************************************************************************/
        !           103: 
        !           104: 
        !           105: main(agc, agv)
        !           106: 
        !           107: 
        !           108:        int             agc;
        !           109:        char    *agv[];
        !           110: 
        !           111: 
        !           112: {
        !           113: 
        !           114: 
        !           115:        /********************************************************************
        !           116:         *                                                                                                                                      *
        !           117:         *              This program reads the file *changes in the current                     *
        !           118:         *      directory which contains instructions on how to expand or               *
        !           119:         *      contract the character widths for each of the fonts mentioned   *
        !           120:         *      in the file. These changes will hopefully make the output for   *
        !           121:         *      *tdev more readable. Admittedly there's quite a bit of overkill *
        !           122:         *      in this program, but I'm not going to change it.                                *
        !           123:         *                                                                                                                                      *
        !           124:         *              There are several different methods that can be used to         *
        !           125:         *      make the desired width changes. Probably the simplest is to             *
        !           126:         *      adjust the device resolution in the new DESC file up or down    *
        !           127:         *      an appropriate ammount and leave the widths in the font tables  *
        !           128:         *      unchanged. This approach results in a uniform width change for  *
        !           129:         *      all the characters on every available font. This type of change *
        !           130:         *      can be obtained by specifying a default width change without    *
        !           131:         *      defining a new device resolution.                                                               *
        !           132:         *                                                                                                                                      *
        !           133:         *              Since a uniform expansion may not always be appropriate         *
        !           134:         *      you can also specify a width change for each for the new fonts. *
        !           135:         *      This type of expansion will replace any default font change             *
        !           136:         *      that may have been specified.                                                                   *
        !           137:         *                                                                                                                                      *
        !           138:         ********************************************************************/
        !           139: 
        !           140: 
        !           141: 
        !           142:        argv = agv;                                                     /* global so everyone can use them */
        !           143:        argc = agc;
        !           144: 
        !           145:        get_options();                                          /* process any command line options */
        !           146:        startchanges();                                         /* start reading the *changes file */
        !           147:        checkvalues();                                          /* make sure everything's defined */
        !           148:        getdesc();                                                      /* read *mdev's DESC.out file */
        !           149:        makedesc();                                                     /* make *tdev's new DESC file */
        !           150:        finishchanges();                                        /* read rest of the *changes file */
        !           151: 
        !           152: }      /* End of main */
        !           153: 
        !           154: 
        !           155: /******************************************************************************/
        !           156: 
        !           157: 
        !           158: get_options()
        !           159: 
        !           160: 
        !           161: {
        !           162: 
        !           163: 
        !           164:        /********************************************************************
        !           165:         *                                                                                                                                      *
        !           166:         *              Called from the main program to read and process any            *
        !           167:         *      command line options.                                                                                   *
        !           168:         *                                                                                                                                      *
        !           169:         ********************************************************************/
        !           170: 
        !           171: 
        !           172:        while ( argc > 1  &&  argv[1][0] == '-' )  {
        !           173: 
        !           174:                switch ( argv[1][1] )  {
        !           175: 
        !           176:                        case 'S':                                       /* font source directory */
        !           177:                                                srcdir = &argv[1][2];
        !           178:                                                break;
        !           179: 
        !           180:                        case 'F':                                       /* binary font directory */
        !           181:                                                fontdir = &argv[1][2];
        !           182:                                                break;
        !           183: 
        !           184:                        case 'R':                                       /* raster table directory */
        !           185:                                                bitdir = &argv[1][2];
        !           186:                                                break;
        !           187: 
        !           188:                        case 'm':                                       /* get master device name */
        !           189:                                                if ( strlen(&argv[1][2]) > DNAME )
        !           190:                                                        error(FATAL, "device name %s too long", &argv[1][2]);
        !           191:                                                strcpy(mdev, &argv[1][2]);
        !           192:                                                break;
        !           193: 
        !           194:                        case 't':                                       /* set target device name */
        !           195:                                                if ( strlen(&argv[1][2]) > DNAME )
        !           196:                                                        error(FATAL, "device name %s too long", &argv[1][2]);
        !           197:                                                strcpy(tdev, &argv[1][2]);
        !           198:                                                break;
        !           199: 
        !           200:                        default:
        !           201:                                                error(FATAL, "illegal option %c", argv[1][1]);
        !           202: 
        !           203:                }       /* End switch */
        !           204: 
        !           205:                argv++;                                                 /* next argument */
        !           206:                argc--;
        !           207: 
        !           208:        }       /* End while */
        !           209: 
        !           210: }      /* End of get_options */
        !           211: 
        !           212: 
        !           213: /*****************************************************************************/
        !           214: 
        !           215: 
        !           216: startchanges()
        !           217: 
        !           218: 
        !           219: {
        !           220: 
        !           221: 
        !           222:        char    buff[MAX_BUFF];                         /* input buffer */
        !           223:        int             ch;                                                     /* used to skip comments */
        !           224: 
        !           225: 
        !           226:        /********************************************************************
        !           227:         *                                                                                                                                      *
        !           228:         *              Called from the main program to read the font change file       *
        !           229:         *      *changes. If there's still one command line argument left when  *
        !           230:         *      we get here, we will use it as the name of the input file,              *
        !           231:         *      otherwise the default file *changes is used.                                    *
        !           232:         *                                                                                                                                      *
        !           233:         ********************************************************************/
        !           234: 
        !           235: 
        !           236:        if ( argc > 1 )
        !           237:                changes = &argv[1][0];
        !           238: 
        !           239:        if ( (fp_change = fopen(changes, "r")) == NULL )
        !           240:                error(FATAL, "can't open file %s", changes);
        !           241: 
        !           242:        while ( fscanf(fp_change, "%s", buff) != EOF )  {
        !           243: 
        !           244:                if ( strcmp(buff, "font") == 0 )
        !           245:                        return;
        !           246:                else if ( strcmp(buff, "master") == 0 )
        !           247:                        get_mdev();
        !           248:                else if ( strcmp(buff, "target") == 0 )
        !           249:                        get_tdev();
        !           250:                else if ( strcmp(buff, "unitwidth") == 0 )
        !           251:                        get_int(fp_change, &unitwidth);
        !           252:                else if ( strcmp(buff, "res") == 0 )
        !           253:                        get_int(fp_change, &res);
        !           254:                else if ( strcmp(buff, "hor") == 0 )
        !           255:                        get_int(fp_change, &hor);
        !           256:                else if ( strcmp(buff, "vert") == 0 )
        !           257:                        get_int(fp_change, &vert);
        !           258:                else if ( strcmp(buff, "sizes") == 0 )
        !           259:                        get_sizes();
        !           260:                else if ( strcmp(buff, "fonts") == 0 )
        !           261:                        get_fonts();
        !           262:                else if ( strcmp(buff, "default") == 0 )  {
        !           263:                        fscanf(fp_change, "%s", buff);
        !           264:                        if ( strcmp(buff, "change") != 0 )
        !           265:                                error(FATAL, "syntax error - bad default change statement");
        !           266:                        get_float(fp_change, &dflt_chng);
        !           267:                } else if ( strcmp(buff, "round") == 0 )  {
        !           268:                        fscanf(fp_change, "%s", buff);
        !           269:                        if ( strcmp(buff, "up") == 0 )
        !           270:                                dflt_incr = 1.0;
        !           271:                        else if ( strcmp(buff, "down") == 0 )
        !           272:                                dflt_incr = 0.0;
        !           273:                        else error(FATAL, "syntax error - bad round statement");
        !           274:                } else if ( strcmp(buff, "use") == 0 )  {
        !           275:                        fscanf(fp_change, "%s", buff);
        !           276:                        if ( strcmp(buff, "raster") != 0 )
        !           277:                                error(FATAL, "syntax error - bad use statement");
        !           278:                        fscanf(fp_change, "%s", buff);
        !           279:                        if ( strcmp(buff, "tables") == 0 )
        !           280:                                error(FATAL, "syntax error - bad use statement");
        !           281:                        use_rast = TRUE;
        !           282:                } else if ( buff[0] == '#' )
        !           283:                        while ( (ch = getc(fp_change)) != EOF  &&  ch != '\n' ) ;
        !           284:                else error(FATAL, "don't know command %s", buff);
        !           285: 
        !           286:        }       /* End while */
        !           287: 
        !           288:        error(FATAL, "no font commands in file %s", changes);
        !           289: 
        !           290: }      /* End of startchanges */
        !           291: 
        !           292: 
        !           293: /*****************************************************************************/
        !           294: 
        !           295: 
        !           296: checkvalues()
        !           297: 
        !           298: 
        !           299: {
        !           300: 
        !           301: 
        !           302: 
        !           303:        /********************************************************************
        !           304:         *                                                                                                                                      *
        !           305:         *              Called from the main program to make sure all the required      *
        !           306:         *      parameters have been properly defined.                                                  *
        !           307:         *                                                                                                                                      *
        !           308:         ********************************************************************/
        !           309: 
        !           310: 
        !           311:        if ( *mdev == '\0' )
        !           312:                error(FATAL, "missing master device name");
        !           313: 
        !           314:        if ( use_rast == TRUE )
        !           315:                if ( *tdev == '\0' )
        !           316:                        error(FATAL, "missing target device name");
        !           317:                else if ( res == NOT_SET )
        !           318:                        error(FATAL, "missing target device resolution");
        !           319: 
        !           320: }      /* End of checkvalues */
        !           321: 
        !           322: 
        !           323: /*****************************************************************************/
        !           324: 
        !           325: 
        !           326: get_mdev()
        !           327: 
        !           328: 
        !           329: {
        !           330: 
        !           331: 
        !           332:        char    buff[MAX_BUFF];                         /* put the device name here */
        !           333: 
        !           334: 
        !           335:        /********************************************************************
        !           336:         *                                                                                                                                      *
        !           337:         *              Read the name of the master device from *fp_change, and         *
        !           338:         *      save the name in array mdev[]. If *mdev has already been set,   *
        !           339:         *      possibly by an option, it won't be changed again.                               *
        !           340:         *                                                                                                                                      *
        !           341:         ********************************************************************/
        !           342: 
        !           343: 
        !           344:        if ( fscanf(fp_change, " device %s", buff) != 1 )
        !           345:                error(FATAL, "missing master device name");
        !           346: 
        !           347:        if ( strlen(buff) > DNAME )
        !           348:                error(FATAL, "master device name %s too long", buff);
        !           349: 
        !           350:        if ( *mdev == '\0' )
        !           351:                strcpy(mdev, buff);
        !           352: 
        !           353: }      /* End of get_mdev */
        !           354: 
        !           355: 
        !           356: /*****************************************************************************/
        !           357: 
        !           358: 
        !           359: get_tdev()
        !           360: 
        !           361: 
        !           362: {
        !           363: 
        !           364: 
        !           365:        char    buff[MAX_BUFF];                         /* target device name put here */
        !           366: 
        !           367: 
        !           368:        /********************************************************************
        !           369:         *                                                                                                                                      *
        !           370:         *              Called from startchanges() to read the name of the target       *
        !           371:         *      typesetter from *fp_change, and store the result in the array   *
        !           372:         *      tdev[]. If the device has already been specified nothing is             *
        !           373:         *      done.                                                                                                                   *
        !           374:         *                                                                                                                                      *
        !           375:         ********************************************************************/
        !           376: 
        !           377: 
        !           378:        if ( fscanf(fp_change, " device %s", buff) != 1 )
        !           379:                error(FATAL, "missing target device name");
        !           380: 
        !           381:        if ( strlen(buff) > DNAME )
        !           382:                error(FATAL, "target device name %s too long", buff);
        !           383: 
        !           384:        if ( *tdev != '\0' )
        !           385:                strcpy(tdev, buff);
        !           386: 
        !           387: }      /* End of get_tdev */
        !           388: 
        !           389: 
        !           390: /*****************************************************************************/
        !           391: 
        !           392: 
        !           393: get_int(fp, num)
        !           394: 
        !           395: 
        !           396:        FILE    *fp;                                            /* read an integer from this file */
        !           397:        int             *num;                                           /* and store it here */
        !           398: 
        !           399: 
        !           400: {
        !           401: 
        !           402: 
        !           403:        /********************************************************************
        !           404:         *                                                                                                                                      *
        !           405:         *              Called to read an integer from the input file and store the     *
        !           406:         *      result in num - this routine and get_float() really should be   *
        !           407:         *      macros.                                                                                                                 *
        !           408:         *                                                                                                                                      *
        !           409:         ********************************************************************/
        !           410: 
        !           411: 
        !           412:        if ( fscanf(fp, "%d", num) != 1 )
        !           413:                error(FATAL, "syntax error - integer not found");
        !           414: 
        !           415: }      /* End of get_int */
        !           416: 
        !           417: 
        !           418: /*****************************************************************************/
        !           419: 
        !           420: 
        !           421: get_float(fp, num)
        !           422: 
        !           423: 
        !           424:        FILE    *fp;                                            /* read a float from this file */
        !           425:        float   *num;                                           /* and store it here */
        !           426: 
        !           427: 
        !           428: {
        !           429: 
        !           430: 
        !           431:        /********************************************************************
        !           432:         *                                                                                                                                      *
        !           433:         *              Called to read a floating point number from *fp_change and      *
        !           434:         *      store the result in num.                                                                                *
        !           435:         *                                                                                                                                      *
        !           436:         ********************************************************************/
        !           437: 
        !           438: 
        !           439:        if ( fscanf(fp, "%f", num) != 1 )
        !           440:                error(FATAL, "syntax error - floating point number not found");
        !           441: 
        !           442: }      /* End of get_float */
        !           443: 
        !           444: 
        !           445: /*****************************************************************************/
        !           446: 
        !           447: 
        !           448: get_sizes()
        !           449: 
        !           450: 
        !           451: {
        !           452: 
        !           453: 
        !           454:        int             i;                                                      /* index into sizes[] array */
        !           455: 
        !           456: 
        !           457:        /********************************************************************
        !           458:         *                                                                                                                                      *
        !           459:         *              Called from startchanges() to read the new default point        *
        !           460:         *      size list for the DESC file. The format expected for the size   *
        !           461:         *      list in the *fp_change file is the same as in the ASCII DESC    *
        !           462:         *      file.                                                                                                                   *
        !           463:         *                                                                                                                                      *
        !           464:         ********************************************************************/
        !           465: 
        !           466: 
        !           467:        i = 0;
        !           468: 
        !           469:        while ( i < SIZE_LENGTH )  {
        !           470: 
        !           471:                while ( isspace(sizes[i++] = getc(fp_change)) ) ;
        !           472: 
        !           473:                if ( !isdigit(sizes[i-1]) )
        !           474:                        error(FATAL, "syntax error - bad point size list");
        !           475: 
        !           476:                if ( sizes[i-1] == '0'  &&  (isspace(sizes[i++] = getc(fp_change))) )  {
        !           477:                        sizes[i-1] = '\0';
        !           478:                        return;
        !           479:                }       /* End if */
        !           480: 
        !           481:                while ( isdigit(sizes[i++] = getc(fp_change)) ) ;
        !           482: 
        !           483:        }       /* End while */
        !           484: 
        !           485:        error(FATAL, "point size list too long");       /* shouldn't get here */
        !           486: 
        !           487: }      /* End of get_sizes */
        !           488: 
        !           489: 
        !           490: /*****************************************************************************/
        !           491: 
        !           492: 
        !           493: get_fonts()
        !           494: 
        !           495: 
        !           496: {
        !           497: 
        !           498: 
        !           499:        int             count;                                          /* number of default fonts */
        !           500:        int             i;                                                      /* index used for fonts[] array */
        !           501: 
        !           502: 
        !           503:        /********************************************************************
        !           504:         *                                                                                                                                      *
        !           505:         *              Called from startchanges() to read a new default font list      *
        !           506:         *      for the new DESC file. Again the format expected for the font   *
        !           507:         *      list is the same as in the ASCII DESC file.                                             *
        !           508:         *                                                                                                                                      *
        !           509:         ********************************************************************/
        !           510: 
        !           511: 
        !           512:        count = -1;                                                     /* real value is the first string */
        !           513:        i = 0;                                                          /* next character goes here */
        !           514: 
        !           515:        do {
        !           516: 
        !           517:                while ( isspace(fonts[i++] = getc(fp_changes)) ) ;
        !           518: 
        !           519:                while ( !isspace(fonts[i++] = getc(fp_changes)) ) ;
        !           520: 
        !           521:                if ( count < 0 )                                /* string is the default font count */
        !           522:                        count = atoi(fonts);
        !           523: 
        !           524:        } while ( count-- > 0 );
        !           525: 
        !           526:        fonts[i-1] = '\0';
        !           527: 
        !           528: }      /* End of get_fonts */
        !           529: 
        !           530: 
        !           531: /*****************************************************************************/
        !           532: 
        !           533: 
        !           534: getdesc()
        !           535: 
        !           536: 
        !           537: {
        !           538: 
        !           539: 
        !           540:        int             fin;                                            /* DESC.out's file descriptor */
        !           541:        char    *filebase;                                      /* memory block for DESC.out file */
        !           542:        char    *malloc();                                      /* memory allocation routine */
        !           543: 
        !           544: 
        !           545:        /********************************************************************
        !           546:         *                                                                                                                                      *
        !           547:         *              Called from the main program to read the DESC.out file for      *
        !           548:         *      *mdev. Most of the file is only needed if we are going to do    *
        !           549:         *      the width lookups in the raster tables, but anyway we'll read   *
        !           550:         *      the whole thing in.                                                                                             *
        !           551:         *                                                                                                                                      *
        !           552:         ********************************************************************/
        !           553: 
        !           554: 
        !           555:        sprintf(path, "%s/dev%s/DESC.out", fontdir, mdev);
        !           556:        if ( (fin = open(path, 0)) < 0 )
        !           557:                error(FATAL, "can't open file %s", path);
        !           558: 
        !           559:        read(fin, &dev, sizeof(struct dev));    /* struct dev comes first */
        !           560: 
        !           561:        nchtab = dev.nchtab;
        !           562: 
        !           563:        if ( (filebase = malloc(dev.filesize)) == NULL )
        !           564:                error(FATAL, "no memory available");
        !           565: 
        !           566:        read(fin, filebase, dev.filesize);              /* get rest of the DESC.out file */
        !           567:        pstab = (short *) filebase;                             /* this table is never used */
        !           568:        chtab = pstab + dev.nsizes + 1;
        !           569:        chname = (char *) (chtab + dev.nchtab);
        !           570: 
        !           571:        close(fin);                                                             /* won't need this guy again */
        !           572: 
        !           573: }      /* End of getdesc */
        !           574: 
        !           575: 
        !           576: /*****************************************************************************/
        !           577: 
        !           578: 
        !           579: makedesc()
        !           580: 
        !           581: 
        !           582: {
        !           583: 
        !           584: 
        !           585:        char    buff[MAX_BUFF];                         /* input strings are put here */
        !           586:        int             ch;                                                     /* used in skipping over comments */
        !           587:        int             temp;                                           /* used to skip font and point sizes */
        !           588: 
        !           589: 
        !           590:        /********************************************************************
        !           591:         *                                                                                                                                      *
        !           592:         *              Called from the main program to make the new ASCII DESC         *
        !           593:         *      file for *tdev.                                                                                                 *
        !           594:         *                                                                                                                                      *
        !           595:         ********************************************************************/
        !           596: 
        !           597: 
        !           598:        sprintf(path, "%s/dev%s/DESC", srcdir, mdev);
        !           599:        if ( (fp_in = fopen(path, "r")) == NULL )
        !           600:                error(FATAL, "can't read file %s", path);
        !           601: 
        !           602:        if ( (fp_out = fopen("DESC", "w")) == NULL )
        !           603:                error(FATAL, "can't write new DESC file");
        !           604: 
        !           605:        while ( fscanf(fp_in, "%s", buff) != EOF )  {
        !           606: 
        !           607:                fprintf(fp_out, "%s", buff);
        !           608:                if ( strcmp(buff, "res") == 0 )
        !           609:                        new_value(RES);
        !           610:                else if ( strcmp(buff, "hor") == 0 )
        !           611:                        new_value(HOR);
        !           612:                else if ( strcmp(buff, "vert") == 0 )
        !           613:                        new_value(VERT);
        !           614:                else if ( strcmp(buff, "unitwidth") == 0 )
        !           615:                        new_value(UNIT);
        !           616:                else if ( strcmp(buff, "paperwidth") == 0 )
        !           617:                        new_value(WIDTH);
        !           618:                else if ( strcmp(buff, "paperlength") == 0 )
        !           619:                        new_value(LENGTH);
        !           620:                else if ( strcmp(buff, "fonts") == 0  &&  fonts[0] )  {
        !           621:                        fprintf(fp_out, "%s\n", fonts);
        !           622:                        get_int(fp_in, &temp);
        !           623:                        while ( temp-- > 0 )
        !           624:                                fscanf(fp_in, "%s", buff);
        !           625:                } else if ( strcmp(buff, "sizes") == 0  &&  sizes[0] )  {
        !           626:                        fprintf(fp_out, "%s\n", sizes);
        !           627:                        do {
        !           628:                                get_int(fp_in, &temp);
        !           629:                        } while ( temp != 0 );
        !           630:                } else if ( strcmp(buff, "charset") == 0 )
        !           631:                        while ( (ch = getc(fp_in)) != EOF ) putc(ch, fp_out);
        !           632:                else copy_line();
        !           633: 
        !           634:        }       /* End while */
        !           635: 
        !           636:        fclose(fp_in);
        !           637:        fclose(fp_out);
        !           638: 
        !           639: }      /* End of makedesc */
        !           640: 
        !           641: 
        !           642: /*****************************************************************************/
        !           643: 
        !           644: 
        !           645: new_value(value)
        !           646: 
        !           647: 
        !           648:        int             value;                                          /* used in the switch statement */
        !           649: 
        !           650: 
        !           651: {
        !           652: 
        !           653: 
        !           654:        int             temp;                                           /* next number read from *fp_in */
        !           655: 
        !           656: 
        !           657:        /********************************************************************
        !           658:         *                                                                                                                                      *
        !           659:         *              Called from makedesc() to write a new value out to the DESC     *
        !           660:         *      file for the parameter specified by value.                                              *
        !           661:         *                                                                                                                                      *
        !           662:         ********************************************************************/
        !           663: 
        !           664: 
        !           665:        get_int(fp_in, &temp);
        !           666: 
        !           667:        switch ( value )  {
        !           668: 
        !           669:                case RES:
        !           670:                                        if ( res == NOT_SET )
        !           671:                                                if ( dflt_chng == NOT_SET )  {
        !           672:                                                        res = temp;
        !           673:                                                        dflt_chng = 0.0;
        !           674:                                                } else res = temp / (1 + dflt_chng);
        !           675:                                        temp = res;
        !           676:                                        break;
        !           677: 
        !           678:                case UNIT:
        !           679:                                        if ( unitwidth == NOT_SET )
        !           680:                                                unitwidth = temp;
        !           681:                                        temp = unitwidth;
        !           682:                                        break;
        !           683: 
        !           684:                case HOR:
        !           685:                                        if ( hor == NOT_SET )
        !           686:                                                hor = temp;
        !           687:                                        temp = hor;
        !           688:                                        break;
        !           689: 
        !           690:                case VERT:
        !           691:                                        if ( vert == NOT_SET )
        !           692:                                                vert = temp;
        !           693:                                        temp = vert;
        !           694:                                        break;
        !           695: 
        !           696:                case WIDTH:
        !           697:                case LENGTH:
        !           698:                                        temp = (temp * res) / dev.res;
        !           699:                                        break;
        !           700: 
        !           701:        }       /* End switch */
        !           702: 
        !           703:        fprintf(fp_out, " %d\n", temp);
        !           704: 
        !           705: }      /* End of new_value */
        !           706: 
        !           707: 
        !           708: /*****************************************************************************/
        !           709: 
        !           710: 
        !           711: finishchanges()
        !           712: 
        !           713: 
        !           714: {
        !           715: 
        !           716: 
        !           717:        char    buff[MAX_BUFF];
        !           718:        int             ch;
        !           719:        int             i;
        !           720: 
        !           721: 
        !           722:        /********************************************************************
        !           723:         *                                                                                                                                      *
        !           724:         *              Called from startchanges() to process all the new font          *
        !           725:         *      commands.                                                                                                               *
        !           726:         *                                                                                                                                      *
        !           727:         ********************************************************************/
        !           728: 
        !           729: 
        !           730:        nextfont();                                                     /* do initialization for next font */
        !           731: 
        !           732:        while ( fscanf(fp_change, "%s", buff ) != EOF )  {
        !           733: 
        !           734:                if ( strcmp(buff, "font") == 0 )  {
        !           735:                        makefont();
        !           736:                        nextfont();
        !           737:                } else if ( strcmp(buff, "increment") == 0 )  {
        !           738:                        if ( fscanf(fp_change, "%s by ", buff) != 1 )
        !           739:                                error(FATAL, "syntax error - bad file format");
        !           740:                        if ( strlen(buff) > CNAME )
        !           741:                                error(FATAL, "special char %s too long", buff);
        !           742:                        i = lookup(buff);
        !           743:                        get_float(fp_change, &incrs[i]);
        !           744:                        if ( i == dcount )  {
        !           745:                                deltas[dcount] = NOT_SET;
        !           746:                                strcpy(&names[dcount++][0], buff);
        !           747:                        }       /* End if */
        !           748:                } else if ( strcmp(buff, "change") == 0 )  {
        !           749:                        if ( fscanf(fp_change, "%s by ", buff) != 1 )
        !           750:                                error(FATAL, "syntax error - bad file format");
        !           751:                        if ( strcmp(buff, "widths") == 0 )
        !           752:                                get_float(fp_change, &font_chng);
        !           753:                        else {
        !           754:                                if ( strlen(buff) > CNAME )
        !           755:                                        error(FATAL, "special char %s too long", buff);
        !           756:                                i = lookup(buff);
        !           757:                                get_float(fp_change, &deltas[i]);
        !           758:                                if ( i == dcount )  {
        !           759:                                        incrs[dcount] = 0;
        !           760:                                        strcpy(&names[dcount++][0], buff);
        !           761:                                }       /* End if */
        !           762:                        }       /* End else */
        !           763:                } else if ( buff[0] == '#' )
        !           764:                        while ( (ch = getc(fp_change)) != '\n' && ch != EOF ) ;
        !           765: 
        !           766:        }       /* End while */
        !           767: 
        !           768:        makefont();
        !           769: 
        !           770: }      /* End of finishchanges */
        !           771: 
        !           772: 
        !           773: /*****************************************************************************/
        !           774: 
        !           775: 
        !           776: nextfont()
        !           777: 
        !           778: 
        !           779: {
        !           780: 
        !           781: 
        !           782:        /********************************************************************
        !           783:         *                                                                                                                                      *
        !           784:         *              Called from finishchanges() to get the name of the next         *
        !           785:         *      font and do any other initialization that may be required.              *
        !           786:         *                                                                                                                                      *
        !           787:         ********************************************************************/
        !           788: 
        !           789: 
        !           790:        fscanf(fp_change, "%s", cur_font);              /* name of the next font */
        !           791: 
        !           792:        font_chng = NOT_SET;
        !           793:        incr = dflt_incr;
        !           794:        dcount = 0;
        !           795: 
        !           796:        if ( scale == NOT_SET )
        !           797:                if ( use_rast == TRUE )
        !           798:                        scale = 1.0;
        !           799:                else scale = ( float )(res * unitwidth) / (dev.res * dev.unitwidth);
        !           800: 
        !           801: }      /* End of nextfont */
        !           802: 
        !           803: 
        !           804: /*****************************************************************************/
        !           805: 
        !           806: 
        !           807: makefont()
        !           808: 
        !           809: 
        !           810: {
        !           811: 
        !           812: 
        !           813:        char    buff[MAX_BUFF];                         /* temp buffer for *fp_change reads */
        !           814: 
        !           815: 
        !           816:        /********************************************************************
        !           817:         *                                                                                                                                      *
        !           818:         *              This routine makes all the new ASCII font files.                        *
        !           819:         *                                                                                                                                      *
        !           820:         ********************************************************************/
        !           821: 
        !           822: 
        !           823:        sprintf(path, "%s/dev%s/%s", srcdir, mdev, cur_font);
        !           824:        if ( (fp_in = fopen(path, "r")) == NULL )
        !           825:                error(FATAL, "can't open font file %s", path);
        !           826: 
        !           827:        if ( (fp_out = fopen(cur_font, "w")) == NULL )
        !           828:                error(FATAL, "can't open output font file %s", cur_font);
        !           829: 
        !           830:        while ( fscanf(fp_in, "%s", buff) != EOF )  {
        !           831: 
        !           832:                fprintf(fp_out, "%s", buff);    /* echo what we just read in */
        !           833:                if ( strcmp(buff, "charset") == 0 )
        !           834:                        copy_chars();
        !           835:                else copy_line();
        !           836: 
        !           837:        }       /* End while */
        !           838: 
        !           839:        fclose(fp_in);                                          /* done with these files for now */
        !           840:        fclose(fp_out);
        !           841: 
        !           842: }      /* End of makefont */
        !           843: 
        !           844: 
        !           845: /*****************************************************************************/
        !           846: 
        !           847: 
        !           848: copy_chars()
        !           849: 
        !           850: 
        !           851: {
        !           852: 
        !           853: 
        !           854:        char    ch[10];                                         /* standard stuff from makedev */
        !           855:        char    width[10];
        !           856:        char    kern[10];
        !           857:        char    code[10];
        !           858:        char    buff[LINE_LENGTH];                      /* next line from charset part */
        !           859: 
        !           860: 
        !           861:        /********************************************************************
        !           862:         *                                                                                                                                      *
        !           863:         *              Called from makefont() to copy the charset portion of the       *
        !           864:         *      current font file to the output file. The width entry for each  *
        !           865:         *      character will be adjusted by routine newwidth().                               *
        !           866:         *                                                                                                                                      *
        !           867:         ********************************************************************/
        !           868: 
        !           869: 
        !           870:        putc('\n', fp_out);
        !           871: 
        !           872:        while ( fgets(buff, sizeof(buff), fp_in) != NULL )  {
        !           873: 
        !           874:                if ( sscanf(buff, "%s %s %s %s", ch, width, kern, code) < 2 )
        !           875:                        continue;
        !           876: 
        !           877:                if ( width[0] == '"' )  {               /* it's a synonym */
        !           878:                        fprintf(fp_out, "%s", buff);
        !           879:                        continue;
        !           880:                }       /* End if */
        !           881: 
        !           882:                newwidth(ch, width);                    /* calculate *ch's new width */
        !           883: 
        !           884:                fprintf(fp_out, "%s\t%s\t%s\t%s\n", ch, width, kern, code);
        !           885: 
        !           886:        }       /* End while */
        !           887: 
        !           888: }      /* End of copy_chars */
        !           889: 
        !           890: 
        !           891: /*****************************************************************************/
        !           892: 
        !           893: 
        !           894: copy_line()
        !           895: 
        !           896: 
        !           897: {
        !           898: 
        !           899: 
        !           900:        int             ch;
        !           901: 
        !           902: 
        !           903:        /********************************************************************
        !           904:         *                                                                                                                                      *
        !           905:         *              Called from makefont() to copy the current line from fp_in      *
        !           906:         *      to fp_out.                                                                                                              *
        !           907:         *                                                                                                                                      *
        !           908:         ********************************************************************/
        !           909: 
        !           910: 
        !           911:        while ( (ch = putc(getc(fp_in), fp_out)) != '\n' && ch != EOF ) ;
        !           912: 
        !           913: }      /* End of copy_line */
        !           914: 
        !           915: 
        !           916: /*****************************************************************************/
        !           917: 
        !           918: 
        !           919: newwidth(ch, width)
        !           920: 
        !           921: 
        !           922:        char    *ch;                                            /* get the width for this character */
        !           923:        char    *width;                                         /* and store it here */
        !           924: 
        !           925: 
        !           926: {
        !           927: 
        !           928: 
        !           929:        int             newwidth;                                       /* character's new width */
        !           930:        float   cwidth;                                         /* char's current width */
        !           931:        float   delta;                                          /* width change for the character */
        !           932: 
        !           933:        float   getdelta();
        !           934:        float   atof();
        !           935: 
        !           936: 
        !           937:        /********************************************************************
        !           938:         *                                                                                                                                      *
        !           939:         *              Called from copy_chars() to get the new width for character     *
        !           940:         *      ch, and store the ASCII representation for it in array width[]. *
        !           941:         *      If we are supposed to be getting the character widths from the  *
        !           942:         *      raster tables we call getwidth() to do the work, otherwise we   *
        !           943:         *      use the value obtained from the ASCII font file.                                *
        !           944:         *                                                                                                                                      *
        !           945:         ********************************************************************/
        !           946: 
        !           947: 
        !           948:        if ( use_rast == TRUE )
        !           949:                cwidth = getwidth(ch);
        !           950:        else cwidth = atof(width);
        !           951: 
        !           952:        delta = getdelta(ch);
        !           953: 
        !           954:        if ( (newwidth = cwidth * (1 + delta) * scale + incr) < 0 || newwidth > BMASK )
        !           955:                error(FATAL, "bad width %d for char %s", newwidth, ch);
        !           956: 
        !           957:        sprintf(width, "%d", newwidth);
        !           958: 
        !           959: }      /* End of newwidth */
        !           960: 
        !           961: 
        !           962: /*****************************************************************************/
        !           963: 
        !           964: 
        !           965: getwidth(ch)
        !           966: 
        !           967: 
        !           968:        char    *ch;                                            /* get raster width for this char */
        !           969: 
        !           970: 
        !           971: {
        !           972: 
        !           973: 
        !           974:        /********************************************************************
        !           975:         *                                                                                                                                      *
        !           976:         *              Called from newwidth() to get the raster table width for        *
        !           977:         *      character ch form the raster table for the current font and in  *
        !           978:         *      size unitwidth.                                                                                                 *
        !           979:         *                                                                                                                                      *
        !           980:         ********************************************************************/
        !           981: 
        !           982: 
        !           983:        return(1);
        !           984: 
        !           985: }      /* End of getwidth */
        !           986: 
        !           987: 
        !           988: /*****************************************************************************/
        !           989: 
        !           990: 
        !           991: float getdelta(ch)
        !           992: 
        !           993: 
        !           994:        char    *ch;                                            /* get change for this char */
        !           995: 
        !           996: 
        !           997: {
        !           998: 
        !           999: 
        !          1000:        int             i;
        !          1001:        float   change;
        !          1002: 
        !          1003: 
        !          1004:        /********************************************************************
        !          1005:         *                                                                                                                                      *
        !          1006:         *              This routine gets the appropriate change in width that we       *
        !          1007:         *      should use for character ch in the new font table.                              *
        !          1008:         *                                                                                                                                      *
        !          1009:         ********************************************************************/
        !          1010: 
        !          1011: 
        !          1012:        change = font_chng == NOT_SET ? dflt_chng : font_chng;
        !          1013:        incr = dflt_incr;
        !          1014: 
        !          1015:        if ( (i = lookup(ch)) < dcount )  {
        !          1016:                change = ( deltas[i] == NOT_SET ) ? change : deltas[i];
        !          1017:                incr += incrs[i];
        !          1018:        }       /* End if */
        !          1019: 
        !          1020:        return(change);
        !          1021: 
        !          1022: }      /* End of getdelta */
        !          1023: 
        !          1024: 
        !          1025: /*****************************************************************************/
        !          1026: 
        !          1027: 
        !          1028: lookup(ch)
        !          1029: 
        !          1030: 
        !          1031:        char    *ch;                                            /* look this character string up */
        !          1032: 
        !          1033: 
        !          1034: {
        !          1035: 
        !          1036: 
        !          1037:        int             i;
        !          1038: 
        !          1039: 
        !          1040:        /********************************************************************
        !          1041:         *                                                                                                                                      *
        !          1042:         *              Called from finishchanges() to find the character string        *
        !          1043:         *      *ch in array names[]. If it isn't found dcount is returnd.              *
        !          1044:         *                                                                                                                                      *
        !          1045:         ********************************************************************/
        !          1046: 
        !          1047: 
        !          1048:        for ( i = 0; i < dcount; i++ )
        !          1049:                if ( strcmp(ch, &names[i][0]) == 0 )
        !          1050:                        break;
        !          1051: 
        !          1052:        return(i);
        !          1053: 
        !          1054: }      /* End of lookup */
        !          1055: 
        !          1056: 
        !          1057: /*****************************************************************************/
        !          1058: 
        !          1059: 
        !          1060: error(kind, mesg, arg1, arg2)
        !          1061: 
        !          1062: 
        !          1063:        int             kind;                                           /* FATAL or NON_FATAL error */
        !          1064:        char    *mesg;                                          /* error message to be printed */
        !          1065: 
        !          1066: 
        !          1067: {
        !          1068: 
        !          1069: 
        !          1070:        /********************************************************************
        !          1071:         *                                                                                                                                      *
        !          1072:         *              Write out the error message *mesg, and quit the program if      *
        !          1073:         *      kind is FATAL.                                                                                                  *
        !          1074:         *                                                                                                                                      *
        !          1075:         ********************************************************************/
        !          1076: 
        !          1077: 
        !          1078:        fprintf(stderr, "makefonts: ");
        !          1079:        fprintf(stderr, mesg, arg1, arg2);
        !          1080:        fprintf(stderr, "\n");
        !          1081: 
        !          1082:        if ( kind == FATAL )
        !          1083:                exit(1);
        !          1084: 
        !          1085: }      /* End of error */
        !          1086: 
        !          1087: 
        !          1088: /*****************************************************************************/
        !          1089: 
        !          1090: 

unix.superglobalmegacorp.com

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