Annotation of researchv10no/cmd/picasso/ps_include.c, revision 1.1

1.1     ! root        1: /*     Copyright (c) 1989 AT&T */
        !             2: /*       All Rights Reserved   */
        !             3: 
        !             4: /*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
        !             5: /*     The copyright notice above does not evidence any        */
        !             6: /*     actual or intended publication of such source code.     */
        !             7: 
        !             8: /*     @(#)picasso:ps_include.c        1.0     */
        !             9: 
        !            10: /*
        !            11:  *
        !            12:  * Picture inclusion code for PostScript printers, taken from Rich Drechsler
        !            13:  *
        !            14:  */
        !            15: 
        !            16: #include "picasso.h"
        !            17: #include "ps_include.h"
        !            18: 
        !            19: /* in SVR4, the C-preprocessor will not accept the tricky definitions of lq
        !            20:    and rq.  However, we should be able to do it using the following
        !            21: 
        !            22:    define var(x)       fprintf(fout, "/%s %g def\n", #x, x)
        !            23:  */
        !            24: #define lq(x)          "x
        !            25: #define rq(x)          x"
        !            26: #define quote(x)       rq(lq(x))
        !            27: #define var(x)         fprintf(fout, "/%s %g def\n", quote(x), x)
        !            28: #define has(word)      (strncmp(buf, word, strlen(word)) == 0)
        !            29: #define grab(n)                ((Section *)(nglobal \
        !            30:                        ? realloc((char *)global, n*sizeof(Section)) \
        !            31:                        : calloc(n, sizeof(Section))))
        !            32: 
        !            33: char   buf[512];
        !            34: typedef struct {long start, end;} Section;
        !            35: 
        !            36: puteqn(x, y, type, neqn)
        !            37:        double  x, y;
        !            38:        int     type, neqn;
        !            39: {
        !            40: extern FILE    *eqnfp, *outfp;
        !            41: extern float   eqn_move;
        !            42:        double  ax, ay;
        !            43: 
        !            44:        ax = 0;
        !            45:        ay = 0;
        !            46:        if (type & LJUST|RJUST|ABOVE|BELOW) {
        !            47:                /* modify ax,ay if text_bounds can get the bounding box */
        !            48:        }
        !            49:        if (eqnfp != NULL)
        !            50:        ps_include(eqnfp, outfp, neqn, x, y + eqn_move, 0., 0., ax, ay/*,0.*/);
        !            51: }
        !            52: 
        !            53: ps_include(fin, fout, page_no, cx, cy, sx, sy, ax, ay /*, rot */)
        !            54: 
        !            55:        FILE    *fin, *fout;            /* input and output files */
        !            56:        int     page_no;                /* physical page number from *fin */
        !            57:        double  cx, cy;                 /* center of the picture and */
        !            58:        double  sx, sy;                 /* its size - in current coordinates */
        !            59:        double  ax, ay;                 /* left-right, up-down adjustment */
        !            60: /*     double  rot;                    /* rotation - in clockwise degrees */
        !            61: {
        !            62:        int     foundpage = 0;          /* found the page when non zero */
        !            63:        int     foundpbox = 0;          /* found the page bounding box  */
        !            64:        int     nglobal   = 0;          /* number of global defs so far */
        !            65:        int     maxglobal = 0;          /* and the number we've got room for */
        !            66:        Section prolog, setup,          /* major divisions in document  */
        !            67:                page, trailer;
        !            68:        Section *global;                /* offsets for all global definitions */
        !            69:        double  llx, lly;               /* lower left and upper right corners */
        !            70:        double  urx, ury;               /* (default -- printer pt -- coords)  */
        !            71:        int     i = 0;                  /* found page number */
        !            72: /*
        !            73:  *
        !            74:  * Reads a PostScript file (*fin), and uses structuring comments to locate the
        !            75:  * prologue, trailer, global definitions, and the requested page.  After the
        !            76:  * file is scanned, the  special ps_include PostScript definitions are copied to
        !            77:  * *fout, followed by the prologue, global definitions, the requested page, and
        !            78:  * the trailer. Before returning the initial environment (saved in PS_head) is
        !            79:  * restored.
        !            80:  *
        !            81:  * By default we assume the picture is 8.5 by 11 inches, but the BoundingBox
        !            82:  * comment, if found, takes precedence.
        !            83:  *
        !            84:  */
        !            85: 
        !            86:        llx = lly = 0;          /* default BoundingBox - 8.5x11 inches */
        !            87:        urx = 72 * 8.5;
        !            88:        ury = 72 * 11.0;
        !            89: 
        !            90:        /* section boundaries and bounding box */
        !            91: 
        !            92:        prolog.start = prolog.end = 0;
        !            93:        setup.start  = setup.end  = 0;
        !            94:        page.start   = page.end   = 0;
        !            95:        trailer.start = 0;
        !            96:        fseek(fin, 0L, 0);
        !            97: 
        !            98:        while ( fgets(buf, sizeof(buf), fin) != NULL ) {
        !            99:                if (!has("%%"))
        !           100:                        continue;
        !           101:                else if (has("%%PageBoundingBox: (atend)")
        !           102:                     ||  has("%%BoundingBox: (atend)"))
        !           103:                        continue;
        !           104:                else if (has("%%Page: ")) {
        !           105:                        if (!foundpage)
        !           106:                                page.start = ftell(fin);
        !           107:                        sscanf(buf, "%*s %*s %d", &i);
        !           108:                        if (i == page_no)
        !           109:                                foundpage = 1;
        !           110:                        else if (foundpage && page.end <= page.start)
        !           111:                                page.end = ftell(fin);
        !           112:                } else if (has("%%EndPage: ")) {
        !           113:                        sscanf(buf, "%*s %*s %d", &i);
        !           114:                        if (i == page_no) {
        !           115:                                foundpage = 1;
        !           116:                                page.end = ftell(fin);
        !           117:                        }
        !           118:                        if (!foundpage)
        !           119:                                page.start = ftell(fin);
        !           120:                } else if (has("%%PageBoundingBox: ")) {
        !           121:                        if (i > page_no & !foundpbox) {
        !           122:                                foundpbox = 1;
        !           123:                                llx = lly = urx = ury = 0;
        !           124:                        } else if (i == page_no) {
        !           125:                                sscanf(buf, "%*s %lf %lf %lf %lf",
        !           126:                                                &llx, &lly, &urx, &ury);
        !           127:                                foundpbox = 1;
        !           128:                        }
        !           129:                } else if (has("%%BoundingBox: ")) {
        !           130:                        if (!foundpbox)
        !           131:                                sscanf(buf,"%*s %lf %lf %lf %lf",
        !           132:                                                &llx, &lly, &urx, &ury);
        !           133:                } else if (has("%%EndProlog"))
        !           134:                        prolog.end = setup.start = page.start = ftell(fin);
        !           135:                else if (has("%%BeginSetup")
        !           136:                     ||  has("%%BeginDocumentSetup")) {
        !           137: 
        !           138:                        if (!setup.start) setup.start = ftell(fin);
        !           139:                } else if (has("%%EndSetup")
        !           140:                       ||  has("%%EndDocumentSetup"))
        !           141:                        setup.end = page.start = ftell(fin);
        !           142:                else if (has("%%Trailer"))
        !           143:                        trailer.start = ftell(fin);
        !           144:                else if (has("%%BeginGlobal"))
        !           145:                        if (page.end <= page.start) {
        !           146:                                if (nglobal >= maxglobal) {
        !           147:                                        maxglobal += 20;
        !           148:                                        global = grab(maxglobal);
        !           149:                                }
        !           150:                                global[nglobal].start = ftell(fin);
        !           151:                        }
        !           152:                else if (has("%%EndGlobal"))
        !           153:                        if (page.end <= page.start)
        !           154:                                global[nglobal++].end = ftell(fin);
        !           155:        }
        !           156:        if (urx == llx && ury == lly)
        !           157:                return;
        !           158:        fseek(fin, 0L, 2);
        !           159:        if (trailer.start == 0)
        !           160:                trailer.start = ftell(fin);
        !           161:        trailer.end = ftell(fin);
        !           162: 
        !           163:        if (page.end <= page.start)
        !           164:                page.end = trailer.start;
        !           165: 
        !           166:        ps_print(fout, PS_head);
        !           167:        if (sx == 0)
        !           168:                sx = (urx-llx)/pgscale;
        !           169:        if (sy == 0)
        !           170:                sy = (ury-lly)/pgscale;
        !           171:        track_bounds(cx-sx/2, cy-sy/2, cx+sy/2, cy+sy/2);
        !           172: 
        !           173:        fprintf(fout, "/llx %g def\n", llx);
        !           174:        fprintf(fout, "/lly %g def\n", lly);
        !           175:        fprintf(fout, "/urx %g def\n", urx);
        !           176:        fprintf(fout, "/ury %g def\n", ury);
        !           177:        fprintf(fout, "/cx %g def\n", cx);
        !           178:        fprintf(fout, "/cy %g def\n", cy);
        !           179:        fprintf(fout, "/sx %g def\n", sx);
        !           180:        fprintf(fout, "/sy %g def\n", sy);
        !           181:        fprintf(fout, "/ax %g def\n", ax);
        !           182:        fprintf(fout, "/ay %g def\n", ay);
        !           183: 
        !           184:        ps_print(fout, PS_setup);
        !           185:        ps_copy(fin, fout, &prolog);
        !           186:        fprintf(fout,"/useclippath false def\n");
        !           187:        ps_copy(fin, fout, &setup);
        !           188:        for(i = 0; i < nglobal; i++)
        !           189:                ps_copy(fin, fout, &global[i]);
        !           190:        ps_copy(fin, fout, &page);
        !           191:        ps_copy(fin, fout, &trailer);
        !           192:        ps_print(fout, PS_tail);
        !           193:        if(nglobal)
        !           194:                free(global);
        !           195: }
        !           196: 
        !           197: pic_include(fin, fout, page_no, o)
        !           198:        FILE    *fin, *fout;            /* input and output files */
        !           199:        int     page_no;                /* physical page number from *fin */
        !           200:        obj     *o;                     /* has bounds and transformation */
        !           201: {
        !           202:        int     foundpage = 0;          /* found the page when non zero */
        !           203:        int     foundpbox = 0;          /* found the page bounding box  */
        !           204:        int     nglobal   = 0;          /* number of global defs so far */
        !           205:        int     maxglobal = 0;          /* and the number we've got room for */
        !           206:        Section prolog, setup,          /* major divisions in document  */
        !           207:                page, trailer;
        !           208:        Section *global;                /* offsets for all global definitions */
        !           209:        double  cx, cy;
        !           210:        double  sx, sy;
        !           211:        double  llx, lly;               /* lower left and upper right corners */
        !           212:        double  urx, ury;               /* (default -- printer pt -- coords)  */
        !           213:        int     i = 0;                  /* found page number */
        !           214: /*
        !           215:  *
        !           216:  * Reads a PostScript file (*fin), and uses structuring comments to locate the
        !           217:  * prologue, trailer, global definitions, and the requested page.  After the
        !           218:  * file is scanned, the  special ps_include PostScript definitions are copied to
        !           219:  * *fout, followed by the prologue, global definitions, the requested page, and
        !           220:  * the trailer. Before returning the initial environment (saved in PS_head) is
        !           221:  * restored.
        !           222:  *
        !           223:  * By default we assume the picture is 8.5 by 11 inches, but the BoundingBox
        !           224:  * comment, if found, takes precedence.
        !           225:  *
        !           226:  */
        !           227: 
        !           228:        llx = lly = 0;          /* default BoundingBox - 8.5x11 inches */
        !           229:        urx = 72 * 8.5;
        !           230:        ury = 72 * 11.0;
        !           231:        cx = o->o_x;
        !           232:        cy = o->o_y;
        !           233:        sx = o->o_wid;
        !           234:        sy = o->o_ht;
        !           235: 
        !           236:        /* section boundaries and bounding box */
        !           237: 
        !           238:        prolog.start = prolog.end = 0;
        !           239:        setup.start  = setup.end  = 0;
        !           240:        page.start   = page.end   = 0;
        !           241:        trailer.start = 0;
        !           242:        fseek(fin, 0L, 0);
        !           243: 
        !           244:        while ( fgets(buf, sizeof(buf), fin) != NULL ) {
        !           245:                if (!has("%%"))
        !           246:                        continue;
        !           247:                else if (has("%%PageBoundingBox: (atend)")
        !           248:                     ||  has("%%BoundingBox: (atend)"))
        !           249:                        continue;
        !           250:                else if (has("%%Page: ")) {
        !           251:                        if (!foundpage)
        !           252:                                page.start = ftell(fin);
        !           253:                        sscanf(buf, "%*s %*s %d", &i);
        !           254:                        if (i == page_no)
        !           255:                                foundpage = 1;
        !           256:                        else if (foundpage && page.end <= page.start)
        !           257:                                page.end = ftell(fin);
        !           258:                } else if (has("%%EndPage: ")) {
        !           259:                        sscanf(buf, "%*s %*s %d", &i);
        !           260:                        if (i == page_no) {
        !           261:                                foundpage = 1;
        !           262:                                page.end = ftell(fin);
        !           263:                        }
        !           264:                        if (!foundpage)
        !           265:                                page.start = ftell(fin);
        !           266:                } else if (has("%%PageBoundingBox: ")) {
        !           267:                        if (i > page_no & !foundpbox) {
        !           268:                                foundpbox = 1;
        !           269:                                llx = lly = urx = ury = 0;
        !           270:                        } else if (i == page_no) {
        !           271:                                sscanf(buf, "%*s %lf %lf %lf %lf",
        !           272:                                                &llx, &lly, &urx, &ury);
        !           273:                                foundpbox = 1;
        !           274:                        }
        !           275:                } else if (has("%%BoundingBox: ")) {
        !           276:                        if (!foundpbox)
        !           277:                                sscanf(buf,"%*s %lf %lf %lf %lf",
        !           278:                                                &llx, &lly, &urx, &ury);
        !           279:                } else if (has("%%EndProlog"))
        !           280:                        prolog.end = setup.start = page.start = ftell(fin);
        !           281:                else if (has("%%BeginSetup")
        !           282:                     ||  has("%%BeginDocumentSetup")) {
        !           283: 
        !           284:                        if (!setup.start) setup.start = ftell(fin);
        !           285:                } else if (has("%%EndSetup")
        !           286:                       ||  has("%%EndDocumentSetup"))
        !           287:                        setup.end = page.start = ftell(fin);
        !           288:                else if (has("%%Trailer"))
        !           289:                        trailer.start = ftell(fin);
        !           290:                else if (has("%%BeginGlobal"))
        !           291:                        if (page.end <= page.start) {
        !           292:                                if (nglobal >= maxglobal) {
        !           293:                                        maxglobal += 20;
        !           294:                                        global = grab(maxglobal);
        !           295:                                }
        !           296:                                global[nglobal].start = ftell(fin);
        !           297:                        }
        !           298:                else if (has("%%EndGlobal"))
        !           299:                        if (page.end <= page.start)
        !           300:                                global[nglobal++].end = ftell(fin);
        !           301:        }
        !           302:        if (urx == llx && ury == lly)
        !           303:                return;
        !           304:        fseek(fin, 0L, 2);
        !           305:        if (trailer.start == 0)
        !           306:                trailer.start = ftell(fin);
        !           307:        trailer.end = ftell(fin);
        !           308: 
        !           309:        if (page.end <= page.start)
        !           310:                page.end = trailer.start;
        !           311: 
        !           312:        ps_print(fout, PS_head);
        !           313:        if (sx == 0)
        !           314:                sx = (urx-llx)/pgscale;
        !           315:        if (sy == 0)
        !           316:                sy = (ury-lly)/pgscale;
        !           317:        track_bounds(cx-sx/2, cy-sy/2, cx+sy/2, cy+sy/2);
        !           318: 
        !           319:        fprintf(fout, "/llx %g def\n", llx);
        !           320:        fprintf(fout, "/lly %g def\n", lly);
        !           321:        fprintf(fout, "/urx %g def\n", urx);
        !           322:        fprintf(fout, "/ury %g def\n", ury);
        !           323:        fprintf(fout, "/cx %g def\n", cx);
        !           324:        fprintf(fout, "/cy %g def\n", cy);
        !           325:        fprintf(fout, "/sx %g def\n", sx);
        !           326:        fprintf(fout, "/sy %g def\n", sy);
        !           327:        fprintf(fout, "/B [ %g %g %g %g 0 0 ] def\n", o->o_mxx, o->o_myx,
        !           328:                                                        o->o_mxy, o->o_myy);
        !           329: 
        !           330:        ps_print(fout, Pic_setup);
        !           331:        ps_copy(fin, fout, &prolog);
        !           332:        fprintf(fout,"/useclippath false def\n");
        !           333:        ps_copy(fin, fout, &setup);
        !           334:        for(i = 0; i < nglobal; i++)
        !           335:                ps_copy(fin, fout, &global[i]);
        !           336:        ps_copy(fin, fout, &page);
        !           337:        ps_copy(fin, fout, &trailer);
        !           338:        ps_print(fout, PS_tail);
        !           339:        if(nglobal)
        !           340:                free(global);
        !           341: }
        !           342: 
        !           343: static
        !           344: ps_print(fout, s)
        !           345: FILE *fout;
        !           346: char **s;
        !           347: {
        !           348:        while (*s)
        !           349:                fprintf(fout, "%s\n", *s++);
        !           350: }
        !           351: 
        !           352: static
        !           353: ps_copy(fin, fout, s)
        !           354: FILE *fin, *fout;
        !           355: Section *s;
        !           356: {
        !           357:        if (s->end <= s->start)
        !           358:                return;
        !           359:        fseek(fin, s->start, 0);
        !           360:        while (ftell(fin) < s->end && fgets(buf, sizeof(buf), fin) != NULL)
        !           361:                if (buf[0] != '%')
        !           362:                        fprintf(fout, "%s", buf);
        !           363: }

unix.superglobalmegacorp.com

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