Annotation of researchv10no/cmd/post.src/postgif/Opostgif.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include <stdio.h>
                      3: #include <string.h>
                      4: #include <signal.h>
                      5: #include <ctype.h>
                      6: #include <fcntl.h>
                      7: 
                      8: #include "comments.h"
                      9: #include "gen.h"
                     10: #include "path.h"
                     11: #include "ext.h"
                     12: 
                     13: #define dbprt  if (debug) fprintf
                     14: 
                     15: char   *optnames = "a:c:fglm:n:o:p:x:y:C:DG:IL:P:";
                     16: char    *prologue = POSTGIF;           /* default PostScript prologue */
                     17: char    *formfile = FORMFILE;           /* stuff for multiple pages per sheet */
                     18: int     formsperpage = 1;               /* page images on each piece of paper */
                     19: int    copies = 1;                     /* and this many copies of each sheet */
                     20: int     page = 0;                       /* last page we worked on */
                     21: int     printed = 0;                    /* and the number of pages printed */
                     22: 
                     23: extern char *malloc();
                     24: extern void free();
                     25: extern double atof(), pow();
                     26: 
                     27: unsigned char ibuf[BUFSIZ];
                     28: unsigned char *cmap, *gcmap, *lcmap;
                     29: unsigned char *gmap, *ggmap, *lgmap;
                     30: unsigned char *pmap;
                     31: double gamma;
                     32: float cr = 0.3, cg = 0.59, cb = 0.11;
                     33: int maplength, gmaplength, lmaplength;
                     34: int scrwidth, scrheight;
                     35: int gcolormap, lcolormap;
                     36: int bitperpixel, background;
                     37: int imageleft, imagetop;
                     38: int imagewidth, imageheight;
                     39: int interlaced, lbitperpixel;
                     40: int gray = 0;
                     41: int gammaflag = 0;
                     42: int negative = 0;
                     43: int terminate = 0;
                     44: int codesize, clearcode, endcode, curstblsize, pmindex, byteinibuf, bitsleft;
                     45: int prefix[4096], suffix[4096], cstbl[4096];
                     46: int bburx = -32767, bbury = -32767;
                     47: FILE *fp_in = NULL;
                     48: FILE *fp_out = stdout;
                     49: 
                     50: char *
                     51: allocate(size)
                     52:     int size;
                     53: {
                     54:     char *p;
                     55: 
                     56:     if ((p = malloc(size)) == NULL) error(FATAL, "not enough memory");
                     57:     return(p);
                     58: }
                     59: 
                     60: void
                     61: puthex(c, fp)
                     62:     unsigned char c;
                     63:     FILE *fp;
                     64: {
                     65:     static char hextbl[16] = {
                     66:        '0', '1', '2', '3', '4', '5', '6', '7',
                     67:        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
                     68:     };
                     69: 
                     70:     putc(hextbl[(c >> 4) & 017], fp);
                     71:     putc(hextbl[c & 017], fp);
                     72: }
                     73: 
                     74: void
                     75: setcolormap(bp)
                     76:     int bp;
                     77: {
                     78:     int i, entries = 1, scale = 1;
                     79:     unsigned char *p, *q;
                     80: 
                     81:     for (i = 0; i < bp; i++) entries *= 2;
                     82:     for (i = 0; i < 8 - bp; i++) scale *= 2;
                     83:     gcmap = (unsigned char *) allocate(entries*3);
                     84:     ggmap = (unsigned char *) allocate(entries);
                     85:     gmaplength = entries;
                     86:     for (i = 0, p = gcmap, q = ggmap; i < 256; i += scale, p += 3, q++) {
                     87:        if (negative) {
                     88:            *p = 255 - i; p[1] = *p; p[2] = *p;
                     89:            *q = *p;
                     90:        }
                     91:        else {
                     92:            *p = i; p[1] = i; p[2] = i;
                     93:            *q = i;
                     94:        }
                     95:     }
                     96:     if (gammaflag)
                     97:        for (i = 0, p = gcmap; i < 256; i += scale, p += 3) {
                     98:            *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
                     99:            p[1] = *p; p[2] = *p;
                    100:        }
                    101: dbprt(stderr,"default color map:\n");
                    102: for (i = 0; i < entries*3; i += 3)
                    103: dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
                    104: }
                    105: 
                    106: void
                    107: readgcolormap(bp)
                    108:     int bp;
                    109: {
                    110:     int i, entries = 1;
                    111:     unsigned char *p, *q;
                    112: 
                    113:     for (i = 0; i < bp; i++) entries *= 2;
                    114:     gcmap = (unsigned char *) allocate(entries*3);
                    115:     ggmap = (unsigned char *) allocate(entries);
                    116:     gmaplength = entries;
                    117:     fread(gcmap, sizeof(*gcmap), entries*3, fp_in);
                    118:     if (negative)
                    119:        for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = 255 - *p;
                    120:     for (i = 0, p = gcmap, q = ggmap; i < entries; i++, p += 3, q++)
                    121:        *q = cr*p[0] + cg*p[1] + cb*p[2] + 0.5;
                    122:     if (gammaflag)
                    123:        for (i = 0, p = gcmap; i < entries*3; i++, p++)
                    124:            *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
                    125: dbprt(stderr,"global color map:\n");
                    126: for (i = 0; i < entries*3; i += 3)
                    127: dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
                    128: }
                    129: 
                    130: void
                    131: readlcolormap(bp)
                    132:     int bp;
                    133: {
                    134:     int i, entries = 1;
                    135:     unsigned char *p, *q;
                    136: 
                    137:     for (i = 0; i < bp; i++) entries *= 2;
                    138:     lcmap = (unsigned char *) allocate(entries*3);
                    139:     lgmap = (unsigned char *) allocate(entries);
                    140:     lmaplength = entries;
                    141:     fread(lcmap, sizeof(*lcmap), entries*3, fp_in);
                    142:     if (negative)
                    143:        for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = 255 - *p;
                    144:     for (i = 0, p = lcmap, q = lgmap; i < entries; i++, p += 3, q++)
                    145:        *q = cr*p[0] + cg*p[1] + cb*p[2] + 0.5;
                    146:     if (gammaflag)
                    147:        for (i = 0, p = lcmap; i < entries*3; i++, p++)
                    148:            *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
                    149: dbprt(stderr,"local color map:\n");
                    150: for (i = 0; i < entries*3; i += 3)
                    151: dbprt(stderr, "%d, %d, %d\n", lcmap[i], lcmap[i+1], lcmap[i+2]);
                    152: }
                    153: 
                    154: void
                    155: initstbl()
                    156: {
                    157:     int i, entries = 1, *p, *s;
                    158: 
                    159:     for (i = 0; i < codesize; i++) entries *= 2;
                    160:     clearcode = entries;
                    161:     endcode = clearcode + 1;
                    162:     for (i = 0, p = prefix, s = suffix; i <= endcode; i++, p++, s++) {
                    163:        *p = endcode;
                    164:        *s = i;
                    165:     }
                    166:     curstblsize = endcode + 1;
                    167:     pmindex = 0;
                    168:     byteinibuf = 0;
                    169:     bitsleft = 0;
                    170: }
                    171: 
                    172: int
                    173: nextbyte()
                    174: {
                    175:     static ibufindex;
                    176: 
                    177:     if (byteinibuf) {
                    178:        byteinibuf--;
                    179:        ibufindex++;
                    180:     }
                    181:     else {
                    182:        fread(ibuf, sizeof(*ibuf), 1, fp_in);
                    183:        byteinibuf = ibuf[0];
                    184: dbprt(stderr, "byte count: %d\n", byteinibuf);
                    185:        if (byteinibuf) fread(ibuf, sizeof(*ibuf), byteinibuf, fp_in);
                    186:        else error(FATAL, "encounter zero byte count block before end code");
                    187:        ibufindex = 0;
                    188:        byteinibuf--;
                    189:        ibufindex++;
                    190:     }
                    191:     return(ibuf[ibufindex-1]);
                    192: }
                    193: 
                    194: int masktbl[25] = {
                    195:     0, 01, 03, 07, 017, 037, 077, 0177, 0377, 0777, 01777, 03777, 07777,
                    196:     017777, 037777, 077777, 0177777, 0377777, 0777777, 01777777, 03777777,
                    197:     07777777, 017777777, 037777777, 077777777
                    198: };
                    199: 
                    200: int
                    201: getcode()
                    202: {
                    203:     int cs, c;
                    204:     static int oldc;
                    205: 
                    206:     if (curstblsize < 4096) cs = cstbl[curstblsize];
                    207:     else cs = 12;
                    208:     while (bitsleft < cs) {
                    209:        oldc = (oldc & masktbl[bitsleft]) | ((nextbyte() & 0377) << bitsleft);
                    210:        bitsleft += 8;
                    211:     }
                    212:     c = oldc & masktbl[cs];
                    213:     oldc = oldc >> cs;
                    214:     bitsleft -= cs;
                    215: /* dbprt(stderr, "code: %d %d %d\n", curstblsize, cs, c); */
                    216:     return(c);
                    217: }
                    218: 
                    219: void
                    220: putcode(c)
                    221:     int c;
                    222: {
                    223:     if (prefix[c] != endcode) {
                    224:        putcode(prefix[c]);
                    225:        pmap[pmindex] = suffix[c];
                    226:        pmindex++;
                    227:     }
                    228:     else {
                    229:        pmap[pmindex] = suffix[c];
                    230:        pmindex++;
                    231:     }
                    232: }
                    233: 
                    234: int
                    235: firstof(c)
                    236:     int c;
                    237: {
                    238:     while (prefix[c] != endcode) c = prefix[c];
                    239:     return(suffix[c]);
                    240: }
                    241: 
                    242: void
                    243: writeimage()
                    244: {
                    245:     int i, j, k;
                    246: 
                    247: dbprt(stderr, "pmindex: %d\n", pmindex);
                    248:     fputs("save\n", fp_out);
                    249:     fprintf(fp_out, "/codestr %d string def\n", imagewidth);
                    250:     if (!gray) {
                    251:        fprintf(fp_out, "/colortbl currentfile %d string readhexstring\n",
                    252:            maplength*3);
                    253:         for (i = 0; i < maplength; i++) puthex(cmap[i], fp_out);
                    254:         fputs("\n", fp_out);
                    255:         for (i = maplength ; i < maplength*2; i++) puthex(cmap[i], fp_out);
                    256:         fputs("\n", fp_out);
                    257:         for (i = maplength*2 ; i < maplength*3; i++) puthex(cmap[i], fp_out);
                    258:         fputs("\npop def\n", fp_out);
                    259:        fprintf(fp_out, "/graytbl currentfile %d string readhexstring\n",
                    260:            maplength);
                    261:         for (i = 0; i < maplength; i++) puthex(gmap[i], fp_out);
                    262:         fputs("\npop def\n", fp_out);
                    263:     }
                    264:     fprintf(fp_out, "%s %d %d %d %d gifimage\n",
                    265:        gray ? "true" : "false", imagewidth, imageheight,
                    266:        scrwidth - imageleft - imagewidth, scrheight - imagetop - imageheight);
                    267:     if (gray) {
                    268:        if (interlaced) {
                    269:            int *iltbl;
                    270: 
                    271:            iltbl = (int *) allocate(imageheight*sizeof(int));
                    272:            j = 0;
                    273:            for (i = 0; i < imageheight; i += 8) {
                    274:                iltbl[i] = j;
                    275:                j += imagewidth;
                    276:            }
                    277: dbprt(stderr, "pass1: %d\n", j);
                    278:            for (i = 4; i < imageheight; i += 8) {
                    279:                iltbl[i] = j;
                    280:                j += imagewidth;
                    281:            }
                    282: dbprt(stderr, "pass2: %d\n", j);
                    283:            for (i = 2; i < imageheight; i += 4) {
                    284:                iltbl[i] = j;
                    285:                j += imagewidth;
                    286:            }
                    287: dbprt(stderr, "pass3: %d\n", j);
                    288:            for (i = 1; i < imageheight; i += 2) {
                    289:                iltbl[i] = j;
                    290:                j += imagewidth;
                    291:            }
                    292: dbprt(stderr, "pass4: %d\n", j);
                    293: 
                    294:            for (i = 0; i < imageheight; i++) {
                    295:                k = iltbl[i];
                    296:                for (j = 0; j < imagewidth; j++, k++)
                    297:                    puthex(gmap[pmap[k]], fp_out);
                    298:                fputs("\n", fp_out);
                    299:            }
                    300:        }
                    301:        else {
                    302:            for (i = 0, k = 0; i < imageheight; i++) {
                    303:                for (j = 0; j < imagewidth; j++, k++)
                    304:                    puthex(gmap[pmap[k]], fp_out);
                    305:                fputs("\n", fp_out);
                    306:            }
                    307:        }
                    308:     }
                    309:     else {
                    310:        if (interlaced) {
                    311:            int *iltbl;
                    312: 
                    313:            iltbl = (int *) allocate(imageheight*sizeof(int));
                    314:            j = 0;
                    315:            for (i = 0; i < imageheight; i += 8) {
                    316:                iltbl[i] = j;
                    317:                j += imagewidth;
                    318:            }
                    319: dbprt(stderr, "pass1: %d\n", j);
                    320:            for (i = 4; i < imageheight; i += 8) {
                    321:                iltbl[i] = j;
                    322:                j += imagewidth;
                    323:            }
                    324: dbprt(stderr, "pass2: %d\n", j);
                    325:            for (i = 2; i < imageheight; i += 4) {
                    326:                iltbl[i] = j;
                    327:                j += imagewidth;
                    328:            }
                    329: dbprt(stderr, "pass3: %d\n", j);
                    330:            for (i = 1; i < imageheight; i += 2) {
                    331:                iltbl[i] = j;
                    332:                j += imagewidth;
                    333:            }
                    334: dbprt(stderr, "pass4: %d\n", j);
                    335: 
                    336:            for (i = 0; i < imageheight; i++) {
                    337:                k = iltbl[i];
                    338:                for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
                    339:                fputs("\n", fp_out);
                    340:            }
                    341:        }
                    342:        else {
                    343:            for (i = 0, k = 0; i < imageheight; i++) {
                    344:                for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
                    345:                fputs("\n", fp_out);
                    346:            }
                    347:        }
                    348:     }
                    349:     fputs("restore\n", fp_out);
                    350: }
                    351: 
                    352: void
                    353: readimage()
                    354: {
                    355:     int bytecount, zerobytecount = 0;
                    356:     int code, oldcode;
                    357: 
                    358:     fread(ibuf, sizeof(*ibuf), 9, fp_in);
                    359:     imageleft = ibuf[0] + 256*ibuf[1];
                    360:     imagetop = ibuf[2] + 256*ibuf[3];
                    361:     imagewidth = ibuf[4] + 256*ibuf[5];
                    362:     imageheight = ibuf[6] + 256*ibuf[7];
                    363:     lcolormap = ibuf[8] & 0200;
                    364:     interlaced = ibuf[8] & 0100;
                    365:     lbitperpixel = (ibuf[8] & 07) + 1;
                    366: dbprt(stderr, "imageleft: %d\n", imageleft);
                    367: dbprt(stderr, "imagetop: %d\n", imagetop);
                    368: dbprt(stderr, "imagewidth: %d\n", imagewidth);
                    369: dbprt(stderr, "imgaeheight: %d\n", imageheight);
                    370: dbprt(stderr, "lcolormap: %d\n", lcolormap ? 1 : 0);
                    371: dbprt(stderr, "interlaced: %d\n", interlaced ? 1 : 0);
                    372: dbprt(stderr, "lbitperpixel: %d\n", lbitperpixel);
                    373:     if (lcolormap) {
                    374:        readlcolormap(lbitperpixel);
                    375:        cmap = lcmap;
                    376:        gmap = lgmap;
                    377:        maplength = lmaplength;
                    378:     }
                    379: 
                    380: dbprt(stderr, "start reading raster data\n");
                    381:     fread(ibuf, sizeof(*ibuf), 1, fp_in);
                    382:     codesize = ibuf[0];
                    383: dbprt(stderr, "codesize: %d\n", codesize);
                    384:     pmap = (unsigned char *) allocate(imagewidth*imageheight);
                    385:     initstbl();
                    386:     while ((code = getcode()) != endcode) {
                    387:        if (code == clearcode) {
                    388:            curstblsize = endcode + 1;
                    389:            code = getcode();
                    390:            putcode(code);
                    391:            oldcode = code;
                    392:        }
                    393:        else if (code < curstblsize) {
                    394:            putcode(code);
                    395:            prefix[curstblsize] = oldcode;
                    396:            suffix[curstblsize] = firstof(code);
                    397:            curstblsize++;
                    398:            oldcode = code;
                    399:        }
                    400:        else {
                    401:           if (code != curstblsize) error(FATAL, "code out of order");
                    402:           prefix[curstblsize] = oldcode;
                    403:           suffix[curstblsize] = firstof(oldcode);
                    404:           curstblsize++;
                    405:           putcode(curstblsize-1);
                    406:           oldcode = code;
                    407:        }
                    408:     }
                    409: dbprt(stderr, "finish reading raster data\n");
                    410: 
                    411:     /* read the rest of the raster data */
                    412:     do {
                    413:        fread(ibuf, sizeof(*ibuf), 1, fp_in);
                    414:        bytecount = ibuf[0];
                    415: dbprt(stderr, "byte count: %d\n", bytecount);
                    416:        if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
                    417:        else zerobytecount = 1;
                    418:     } while (!zerobytecount);
                    419: 
                    420:     writeimage();
                    421: 
                    422:     if (lcolormap) {
                    423:        cmap = gcmap;
                    424:        gmap = ggmap;
                    425:        maplength = gmaplength;
                    426:        free(lcmap);
                    427:        free(lgmap);
                    428:     }
                    429: }
                    430: 
                    431: void
                    432: readextensionblock()
                    433: {
                    434:     int functioncode, bytecount, zerobytecount = 0;
                    435: 
                    436:     fread(ibuf, sizeof(*ibuf), 1, fp_in);
                    437:     functioncode = ibuf[0];
                    438: dbprt(stderr, "function code: %d\n", functioncode);
                    439:     do {
                    440:        fread(ibuf, sizeof(*ibuf), 1, fp_in);
                    441:        bytecount = ibuf[0];
                    442: dbprt(stderr, "byte count: %d\n", bytecount);
                    443:        if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
                    444:        else zerobytecount = 1;
                    445:     } while (!zerobytecount);
                    446: }
                    447: 
                    448: void
                    449: writebgscr()
                    450: {
                    451:     fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
                    452:     fputs("/saveobj save def\n", fp_out);
                    453:     fprintf(fp_out, "%s: %d %d %d %d\n",
                    454:        "%%PageBoundingBox", 0, 0, scrwidth, scrheight);
                    455:     if (scrwidth > bburx) bburx = scrwidth;
                    456:     if (scrheight > bbury) bbury = scrheight;
                    457:     fprintf(fp_out, "%d %d gifscreen\n", scrwidth, scrheight);
                    458: }
                    459: 
                    460: void
                    461: writeendscr()
                    462: {
                    463:     if ( fp_out == stdout ) printed++;
                    464:     fputs("showpage\n", fp_out);
                    465:     fputs("saveobj restore\n", fp_out);
                    466:     fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);
                    467: }
                    468: 
                    469: void
                    470: redirect(pg)
                    471:     int                pg;                     /* next page we're printing */
                    472: {
                    473:     static FILE        *fp_null = NULL;        /* if output is turned off */
                    474: 
                    475:     if ( pg >= 0 && in_olist(pg) == ON )
                    476:        fp_out = stdout;
                    477:     else if ( (fp_out = fp_null) == NULL )
                    478:        fp_out = fp_null = fopen("/dev/null", "w");
                    479: 
                    480: }
                    481: 
                    482: void
                    483: readgif()
                    484: {
                    485:     int i, j, k;
                    486: 
                    487:     for (i = 0, j = 1, k = 0; i < 13; i++) {
                    488:        for (; k < j; k++) cstbl[k] = i;
                    489:        j *= 2;
                    490:     }
                    491: 
                    492:     fread(ibuf, sizeof(*ibuf), 6, fp_in);
                    493: dbprt(stderr, "%.6s\n", ibuf);
                    494:     if (strncmp(ibuf, "GIF87a", 6) != 0) {
                    495:        fread(ibuf, sizeof(*ibuf), 122, fp_in);
                    496:        fread(ibuf, sizeof(*ibuf), 6, fp_in);
                    497: dbprt(stderr, "%.6s\n", ibuf);
                    498:        if (strncmp(ibuf, "GIF87a", 6) != 0)
                    499:                 error(FATAL, "wrong GIF signature");
                    500:     }
                    501:     fread(ibuf, sizeof(*ibuf), 7, fp_in);
                    502:     scrwidth = ibuf[0] + 256*ibuf[1];
                    503:     scrheight = ibuf[2] + 256*ibuf[3];
                    504:     gcolormap = ibuf[4] & 0200;
                    505:     bitperpixel = (ibuf[4] & 07) + 1;
                    506:     background = ibuf[5];
                    507: dbprt(stderr, "scrwidth: %d\n", scrwidth);
                    508: dbprt(stderr, "scrheight: %d\n", scrheight);
                    509: dbprt(stderr, "gcolormap: %d\n", gcolormap ? 1 : 0);
                    510: dbprt(stderr, "bitperpixel: %d\n", bitperpixel);
                    511: dbprt(stderr, "background: %d\n", background);
                    512:     if (ibuf[6] != 0) error(FATAL, "wrong screen descriptor");
                    513:     if (gcolormap) readgcolormap(bitperpixel);
                    514:     else setcolormap(bitperpixel);
                    515: 
                    516:     redirect(++page);
                    517:     writebgscr();
                    518: 
                    519:     cmap = gcmap;
                    520:     gmap = ggmap;
                    521:     maplength = gmaplength;
                    522: 
                    523:     do {
                    524:        fread(ibuf, sizeof(*ibuf), 1, fp_in);
                    525:        if (ibuf[0] == ',') readimage();
                    526:        else if (ibuf[0] == ';') terminate = 1;
                    527:        else if (ibuf[0] == '!') readextensionblock();
                    528:        else
                    529:        error(FATAL, "wrong image separator character or wrong GIF terminator");
                    530:     } while (!terminate);
                    531: 
                    532:     writeendscr();
                    533: 
                    534:     free(gcmap);
                    535:     free(ggmap);
                    536: }
                    537: 
                    538: void
                    539: init_signals()
                    540: {
                    541:     int         interrupt();            /* signal handler */
                    542: 
                    543:     if ( signal(SIGINT, interrupt) == SIG_IGN )  {
                    544:         signal(SIGINT, SIG_IGN);
                    545:         signal(SIGQUIT, SIG_IGN);
                    546:         signal(SIGHUP, SIG_IGN);
                    547:     }
                    548:     else {
                    549:         signal(SIGHUP, interrupt);
                    550:         signal(SIGQUIT, interrupt);
                    551:     }
                    552: 
                    553:     signal(SIGTERM, interrupt);
                    554: }
                    555: 
                    556: void
                    557: header()
                    558: {
                    559:     int         ch;                     /* return value from getopt() */
                    560:     int         old_optind = optind;    /* for restoring optind - should be 1 */
                    561: 
                    562:     while ( (ch = getopt(argc, argv, optnames)) != EOF )
                    563:         if ( ch == 'L' )
                    564:             prologue = optarg;
                    565:         else if ( ch == '?' )
                    566:             error(FATAL, "");
                    567: 
                    568:     optind = old_optind;                /* get ready for option scanning */
                    569: 
                    570:     fprintf(stdout, "%s", CONFORMING);
                    571:     fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
                    572:     fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND);
                    573:     fprintf(stdout, "%s %s\n", PAGES, ATEND);
                    574:     fprintf(stdout, "%s", ENDCOMMENTS);
                    575: 
                    576:     if ( cat(prologue) == FALSE )
                    577:         error(FATAL, "can't read %s", prologue);
                    578: 
                    579:     fprintf(stdout, "%s", ENDPROLOG);
                    580:     fprintf(stdout, "%s", BEGINSETUP);
                    581:     fprintf(stdout, "mark\n");
                    582: 
                    583: }
                    584: 
                    585: void
                    586: options()
                    587: {
                    588:     int                ch;                     /* return value from getopt() */
                    589: 
                    590:     while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
                    591:        switch ( ch )  {
                    592: 
                    593:            case 'a':                   /* aspect ratio */
                    594:                    fprintf(stdout, "/aspectratio %s def\n", optarg);
                    595:                    break;
                    596: 
                    597:            case 'c':                   /* copies */
                    598:                    copies = atoi(optarg);
                    599:                    fprintf(stdout, "/#copies %s store\n", optarg);
                    600:                    break;
                    601: 
                    602:            case 'f':
                    603:                    negative = TRUE;
                    604:                    break;
                    605: 
                    606:            case 'g':
                    607:                    gray = TRUE;
                    608:                    break;
                    609: 
                    610:            case 'l':
                    611:                    fprintf(stdout, "/alignment true def\n");
                    612:                    break;
                    613: 
                    614:            case 'm':                   /* magnification */
                    615:                    fprintf(stdout, "/magnification %s def\n", optarg);
                    616:                    break;
                    617: 
                    618:            case 'n':                   /* forms per page */
                    619:                    formsperpage = atoi(optarg);
                    620:                    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
                    621:                    fprintf(stdout, "/formsperpage %s def\n", optarg);
                    622:                    break;
                    623: 
                    624:            case 'o':                   /* output page list */
                    625:                    out_list(optarg);
                    626:                    break;
                    627: 
                    628:            case 'p':                   /* landscape or portrait mode */
                    629:                    if ( *optarg == 'l' )
                    630:                        fprintf(stdout, "/landscape true def\n");
                    631:                    else fprintf(stdout, "/landscape false def\n");
                    632:                    break;
                    633: 
                    634:            case 'x':                   /* shift things horizontally */
                    635:                    fprintf(stdout, "/xoffset %s def\n", optarg);
                    636:                    break;
                    637: 
                    638:            case 'y':                   /* and vertically on the page */
                    639:                    fprintf(stdout, "/yoffset %s def\n", optarg);
                    640:                    break;
                    641: 
                    642:            case 'C':                   /* copy file straight to output */
                    643:                    if ( cat(optarg) == FALSE )
                    644:                        error(FATAL, "can't read %s", optarg);
                    645:                    break;
                    646: 
                    647:            case 'D':                   /* debug flag */
                    648:                    debug = ON;
                    649:                    break;
                    650: 
                    651:            case 'G':
                    652:                    gammaflag = ON;
                    653:                    gamma = atof(optarg);
                    654:                    break;
                    655: 
                    656:            case 'I':                   /* ignore FATAL errors */
                    657:                    ignore = ON;
                    658:                    break;
                    659: 
                    660:            case 'L':                   /* PostScript prologue file */
                    661:                    prologue = optarg;
                    662:                    break;
                    663: 
                    664:            case 'P':                   /* PostScript pass through */
                    665:                    fprintf(stdout, "%s\n", optarg);
                    666:                    break;
                    667: 
                    668:            case '?':                   /* don't understand the option */
                    669:                    error(FATAL, "");
                    670:                    break;
                    671: 
                    672:            default:                    /* don't know what to do for ch */
                    673:                    error(FATAL, "missing case for option %c\n", ch);
                    674:                    break;
                    675: 
                    676:        }
                    677:     }
                    678: 
                    679:     argc -= optind;                    /* get ready for non-option args */
                    680:     argv += optind;
                    681: }
                    682: 
                    683: void
                    684: setup()
                    685: {
                    686:     fprintf(stdout, "setup\n");
                    687: 
                    688:     if ( formsperpage > 1 )  {          /* followed by stuff for multiple pages
                    689: */
                    690:         if ( cat(formfile) == FALSE )
                    691:             error(FATAL, "can't read %s", formfile);
                    692:         fprintf(stdout, "%d setupforms\n", formsperpage);
                    693:     }   /* End if */
                    694: 
                    695:     fprintf(stdout, "%s", ENDSETUP);
                    696: 
                    697: }
                    698: 
                    699: void
                    700: arguments()
                    701: {
                    702:     if ( argc < 1 ) {
                    703:        fp_in = stdin;
                    704:        readgif();
                    705:     }
                    706:     else  {                            /* at least one argument is left */
                    707:        while ( argc > 0 )  {
                    708:            if ( strcmp(*argv, "-") == 0 )
                    709:                fp_in = stdin;
                    710:            else if ( (fp_in = fopen(*argv, "r")) == NULL )
                    711:                error(FATAL, "can't open %s", *argv);
                    712:            readgif();
                    713:            if ( fp_in != stdin )
                    714:                fclose(fp_in);
                    715:            argc--;
                    716:            argv++;
                    717:        }
                    718:     }
                    719: }
                    720: 
                    721: void
                    722: done()
                    723: {
                    724:     fprintf(stdout, "%s", TRAILER);
                    725:     fprintf(stdout, "done\n");
                    726:     fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, bburx, bbury);
                    727:     fprintf(stdout, "%s %d\n", PAGES, printed); 
                    728: }
                    729: 
                    730: main(agc, agv)
                    731:     int agc;
                    732:     char *agv[];
                    733: {
                    734:     argc = agc;
                    735:     argv = agv;
                    736:     prog_name = argv[0];
                    737: 
                    738:     init_signals();
                    739:     header();
                    740:     options();
                    741:     setup();
                    742:     arguments();
                    743:     done();
                    744: 
                    745:     exit(0);
                    746: }
                    747: 

unix.superglobalmegacorp.com

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