Annotation of researchv9/jtools/src/Jpic/driver.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <ctype.h>
        !             3: 
        !             4: #define        DEV202  1
        !             5: #define        DEVAPS  2
        !             6: #define        DEVCAT  3
        !             7: #define        DEV450  4
        !             8: int    devtype = DEV202;
        !             9: 
        !            10: float  deltx;  /* max x value in output, for scaling */
        !            11: float  delty;  /* max y value in output, for scaling */
        !            12: int    dbg     = 0;
        !            13: int    res     = 972;  /* 202 is default */
        !            14: FILE   *fin;   /* input file pointer */
        !            15: char   *cmdname;
        !            16: int    crop    = 1;    /* trim off exterior white space if non-zero */
        !            17: float  hshift  = 0.3;  /* move this far left for text (in em's) */
        !            18: float  vshift  = 0.3;  /* this far down */
        !            19:                        /* these values are suitable for circuit diagrams */
        !            20: int    linetype        = 's';  /* solid is normal */
        !            21: 
        !            22: char   buf[20000];
        !            23: char   *bp     = buf;
        !            24: 
        !            25: int    sxmin;          /* lower limit from s command */
        !            26: int    symin;
        !            27: int    sxmax   = 4096; /* upper */
        !            28: int    symax   = 4096;
        !            29: int    xmin    = 30000;        /* min values found in actual data */
        !            30: int    ymin    = 30000;
        !            31: int    xmax    = -30000;       /* max */
        !            32: int    ymax    = -30000;
        !            33: 
        !            34: main(argc,argv)
        !            35: char **argv;
        !            36: {
        !            37:        float atof();
        !            38:        int c;
        !            39: 
        !            40:        cmdname = argv[0];
        !            41:        while (argc > 1 && *argv[1] == '-') {
        !            42:                switch (c = argv[1][1]) {
        !            43:                case 'T':
        !            44:                        if (strcmp(&argv[1][2], "aps") == 0) {
        !            45:                                res = 720;
        !            46:                                devtype = DEVAPS;
        !            47:                        } else if (strcmp(&argv[1][2], "cat") == 0) {
        !            48:                                res = 432;
        !            49:                                devtype = DEVCAT;
        !            50:                        }
        !            51:                        break;
        !            52:                case 'c':
        !            53:                        crop = 0;
        !            54:                        break;
        !            55:                case 'l':
        !            56:                        delty = atof(&argv[1][2]);
        !            57:                        break;
        !            58:                case 'w':
        !            59:                case 's':       /* set size */
        !            60:                        if (argv[1][2] == 0) {
        !            61:                                argv++;
        !            62:                                argc--;
        !            63:                                deltx = atof(&argv[1][0]);
        !            64:                        } else
        !            65:                                deltx = atof(&argv[1][2]);
        !            66:                        if (c == 's')
        !            67:                                delty = deltx;
        !            68:                        break;
        !            69:                case 'd':
        !            70:                        dbg = 1;
        !            71:                        break;
        !            72:                }
        !            73:                argc--;
        !            74:                argv++;
        !            75:        }
        !            76:        if (argc <= 1) {
        !            77:                fin = stdin;
        !            78:                getdata();
        !            79:        } else
        !            80:                while (argc-- > 1) {
        !            81:                        if ((fin = fopen(*++argv, "r")) == NULL) {
        !            82:                                fprintf(stderr, "%s: can't open %s\n", cmdname, *argv);
        !            83:                                exit(1);
        !            84:                        }
        !            85:                        getdata();
        !            86:                        fclose(fin);
        !            87:                }
        !            88:        print();
        !            89:        exit(0);
        !            90: }
        !            91: 
        !            92: getdata()      /* read the file, collect max, min sizes, etc. */
        !            93: {
        !            94:        char s[100], s1[20], *p;
        !            95:        int x, y, x1, y1, x2, y2, r, c;
        !            96: 
        !            97:        while ((c = getc(fin)) != EOF) {
        !            98:                switch (c) {
        !            99:                case 'M':
        !           100:                case 'N':
        !           101:                case 'P':
        !           102:                        fscanf(fin, "%d %d", &x, &y);
        !           103:                        extreme(x, y);
        !           104:                        ctobuf(tolower(c));
        !           105:                        xytobuf(x, y);
        !           106:                        break;
        !           107:                case 'm':
        !           108:                case 'n':
        !           109:                case 'p':
        !           110:                        x = getsi(fin);
        !           111:                        y = getsi(fin);
        !           112:                        extreme(x, y);
        !           113:                        ctobuf(c);
        !           114:                        xytobuf(x, y);
        !           115:                        break;
        !           116:                case 'L':
        !           117:                case 'B':
        !           118:                        fscanf(fin, "%d %d %d %d", &x, &y, &x1, &y1);
        !           119:                        extreme(x, y);
        !           120:                        extreme(x1, y1);
        !           121:                        ctobuf(tolower(c));
        !           122:                        xytobuf(x, y);
        !           123:                        xytobuf(x1, y1);
        !           124:                        break;
        !           125:                case 'l':
        !           126:                case 'b':
        !           127:                        x = getsi(fin);
        !           128:                        y = getsi(fin);
        !           129:                        x1 = getsi(fin);
        !           130:                        y1 = getsi(fin);
        !           131:                        extreme(x, y);
        !           132:                        extreme(x1, y1);
        !           133:                        ctobuf(c);
        !           134:                        xytobuf(x, y);
        !           135:                        xytobuf(x1, y1);
        !           136:                        break;
        !           137:                case 'S':
        !           138:                        fscanf(fin, "%d %d %d %d", &sxmin, &symin, &sxmax, &symax);
        !           139:                        break;  /* BUG -- ignoring this because it overrides -c */
        !           140:                        ctobuf('s');
        !           141:                        xytobuf(sxmin, symin);
        !           142:                        xytobuf(sxmax, symax);
        !           143:                        break;
        !           144:                case 's':
        !           145:                        sxmin = getsi(fin);
        !           146:                        symin = getsi(fin);
        !           147:                        sxmax = getsi(fin);
        !           148:                        symax = getsi(fin);
        !           149:                        break;  /* BUG -- ignoring this because it overrides -c */
        !           150:                        ctobuf(c);
        !           151:                        xytobuf(sxmin, symin);
        !           152:                        xytobuf(sxmax, symax);
        !           153:                        break;
        !           154:                case 'T':
        !           155:                case 't':
        !           156:                        fgets(s, sizeof s, fin);
        !           157:                        for (p = s; *p != '\n'; p++)
        !           158:                                ;
        !           159:                        *p = 0; /* zap newline */
        !           160:                        ctobuf('t');
        !           161:                        stobuf(s);
        !           162:                        break;
        !           163:                case 'E':
        !           164:                case 'e':
        !           165:                        ctobuf('e');
        !           166:                        break;
        !           167:                case 'A':
        !           168:                        fscanf(fin, "%d %d %d %d %d %d", &x, &y, &x1, &y1, &x2, &y2);
        !           169:                        extreme(x, y);  /* should use radius */
        !           170:                        ctobuf('a');
        !           171:                        xytobuf(x, y);
        !           172:                        xytobuf(x1, y1);
        !           173:                        xytobuf(x2, y2);
        !           174:                        break;
        !           175:                case 'a':
        !           176:                        x = getsi(fin);
        !           177:                        y = getsi(fin);
        !           178:                        x1 = getsi(fin);
        !           179:                        y1 = getsi(fin);
        !           180:                        x2 = getsi(fin);
        !           181:                        y2 = getsi(fin);
        !           182:                        extreme(x, y);  /* should use radius */
        !           183:                        ctobuf('a');
        !           184:                        xytobuf(x, y);
        !           185:                        xytobuf(x1, y1);
        !           186:                        xytobuf(x2, y2);
        !           187:                        break;
        !           188:                case 'C':
        !           189:                        fscanf(fin, "%d %d %d", &x, &y, &r);
        !           190:                        extreme(x+r, y+r);
        !           191:                        extreme(x-r, y-r);
        !           192:                        ctobuf('c');
        !           193:                        xytobuf(x, y);
        !           194:                        xtobuf(r);
        !           195:                        break;
        !           196:                case 'c':
        !           197:                        x = getsi(fin);
        !           198:                        y = getsi(fin);
        !           199:                        r = getsi(fin);
        !           200:                        extreme(x+r, y+r);
        !           201:                        extreme(x-r, y-r);
        !           202:                        ctobuf('c');
        !           203:                        xytobuf(x, y);
        !           204:                        xtobuf(r);
        !           205:                        break;
        !           206:                case 'F':
        !           207:                case 'f':
        !           208:                        fgets(s, sizeof s, fin);
        !           209:                        ctobuf('f');
        !           210:                        sscanf(s, "%s", s1);
        !           211:                        if (strcmp(s1, "solid") == 0)
        !           212:                                c = 's';
        !           213:                        else if (strcmp(s1, "dotted") == 0)
        !           214:                                c = '.';
        !           215:                        else if (strcmp(s1, "longdashed") == 0)
        !           216:                                c = '_';
        !           217:                        else if (strcmp(s1, "shortdashed") == 0)
        !           218:                                c = '-';
        !           219:                        else
        !           220:                                c = '!';        /* would you believe dotdashed? */
        !           221:                        ctobuf(c);
        !           222:                        break;
        !           223:                case 'd':
        !           224:                case 'D':
        !           225:                        fgets(s, 100, fin);
        !           226:                        /* ignore */
        !           227:                        break;
        !           228:                default:
        !           229:                        break;
        !           230:                }
        !           231:                if (bp >= buf + sizeof buf) {
        !           232:                        fprintf(stderr, "pltroff: input too big to handle\n");
        !           233:                        exit(1);
        !           234:                }
        !           235:        }
        !           236:        *bp = 0;
        !           237: }
        !           238: 
        !           239: extreme(x, y)  /* record max and min x and y values */
        !           240: {
        !           241:        if (x > xmax)
        !           242:                xmax = x;
        !           243:        if (y > ymax)
        !           244:                ymax = y;
        !           245:        if (x < xmin)
        !           246:                xmin = x;
        !           247:        if (y < ymin)
        !           248:                ymin = y;
        !           249: }
        !           250: 
        !           251: ctobuf(c)
        !           252: {
        !           253:        *bp++ = c;
        !           254: }
        !           255: 
        !           256: stobuf(s)
        !           257: char *s;
        !           258: {
        !           259:        while (*bp++ = *s++)
        !           260:                ;
        !           261: }
        !           262: 
        !           263: xytobuf(x, y)
        !           264: {
        !           265:        *bp++ = x >> 8;
        !           266:        *bp++ = x & 0377;
        !           267:        *bp++ = y >> 8;
        !           268:        *bp++ = y & 0377;
        !           269: }
        !           270: 
        !           271: xtobuf(x)
        !           272: {
        !           273:        *bp++ = x >> 8;
        !           274:        *bp++ = x & 0377;
        !           275: }
        !           276: 
        !           277: print()
        !           278: {
        !           279:        char s[100], *p;
        !           280:        int x, y, x1, y1, x2, y2, r, c;
        !           281: 
        !           282:        openpl("\n");   /* outputs .PS\n */
        !           283:        for (bp = buf; *bp; ) {
        !           284:                switch (c = *bp++) {
        !           285:                case 'm':
        !           286:                        x = getbuf();
        !           287:                        y = getbuf();
        !           288:                        move(x, y);
        !           289:                        break;
        !           290:                case 'f':       /* line mode */
        !           291:                        linetype = *bp++;
        !           292:                        break;
        !           293:                case 'l':
        !           294:                        x = getbuf();
        !           295:                        y = getbuf();
        !           296:                        x1 = getbuf();
        !           297:                        y1 = getbuf();
        !           298:                        if (linetype == 's')
        !           299:                                line(x, y, x1, y1);
        !           300:                        else
        !           301:                                dotline(x, y, x1, y1, linetype);
        !           302:                        break;
        !           303:                case 't':
        !           304:                        for (p = s; *p++ = *bp++; )
        !           305:                                ;
        !           306:                        label(s, 'L', 0);
        !           307:                        break;
        !           308:                case 'e':
        !           309:                        erase();
        !           310:                        break;
        !           311:                case 'p':
        !           312:                        x = getbuf();
        !           313:                        y = getbuf();
        !           314:                        point(x, y);
        !           315:                        break;
        !           316:                case 'n':
        !           317:                        x = getbuf();
        !           318:                        y = getbuf();
        !           319:                        cont(x, y);
        !           320:                        break;
        !           321:                case 's':
        !           322:                        x = getbuf();
        !           323:                        y = getbuf();
        !           324:                        x1 = getbuf();
        !           325:                        y1 = getbuf();
        !           326:                        space(x, y, x1, y1);
        !           327:                        break;
        !           328:                case 'a':
        !           329:                        x = getbuf();
        !           330:                        y = getbuf();
        !           331:                        x1 = getbuf();
        !           332:                        y1 = getbuf();
        !           333:                        x2 = getbuf();
        !           334:                        y2 = getbuf();
        !           335:                        arc(x, y, x1, y1, x2, y2);
        !           336:                        break;
        !           337:                case 'c':
        !           338:                        x = getbuf();
        !           339:                        y = getbuf();
        !           340:                        r = getbuf();
        !           341:                        circle(x, y, r);
        !           342:                        break;
        !           343:                case 'b':
        !           344:                        x = getbuf();
        !           345:                        y = getbuf();
        !           346:                        x1 = getbuf();
        !           347:                        y1 = getbuf();
        !           348:                        box(x, y, x1, y1);
        !           349:                        break;
        !           350:                default:
        !           351:                        break;
        !           352:                }
        !           353:        }
        !           354:        closepl();
        !           355: }
        !           356: 
        !           357: dotline(x0, y0, x1, y1, type) /* dotted or dashed line */
        !           358: int x0, y0, x1, y1;
        !           359: int type;
        !           360: {
        !           361:        int prevval = 10;
        !           362:        int i, numdots;
        !           363:        double a, b, sqrt(), dx, dy;
        !           364: 
        !           365:        dx = x1 - x0;
        !           366:        dy = y1 - y0;
        !           367:        if (type == '.') {
        !           368:                numdots = sqrt(dx*dx + dy*dy) / prevval + 0.5;
        !           369:                for (i = 0; i <= numdots; i++) {
        !           370:                        a = (float) i / (float) numdots;
        !           371:                        move(x0 + (int)(a * dx), y0 + (int)(a * dy));
        !           372:                        dot();
        !           373:                }
        !           374:        } else {        /* all others */
        !           375:                double d, dashsize, spacesize;
        !           376:                d = sqrt(dx*dx + dy*dy) + 0.5;
        !           377:                if (d <= 2 * prevval) {
        !           378:                        line(x0, y0, x1, y1);
        !           379:                        return;
        !           380:                }
        !           381:                numdots = d / (2 * prevval - 1) + 1;    /* ceiling */
        !           382:                dashsize = prevval;
        !           383:                spacesize = (d - numdots * dashsize) / (numdots - 1);
        !           384:                for (i = 0; i < numdots-1; i++) {
        !           385:                        a = i * (dashsize + spacesize) / d;
        !           386:                        b = a + dashsize / d;
        !           387:                        line(x0 + (int)(a*dx), y0 + (int)(a*dy), x0 + (int)(b*dx), y0 + (int)(b*dy));
        !           388:                        a = b;
        !           389:                        b = a + spacesize / d;
        !           390:                        move(x0 + (int)(a*dx), y0 + (int)(a*dy));
        !           391:                }
        !           392:                line(x0 + (int)(b * dx), y0 + (int)(b * dy), x1, y1);
        !           393:        }
        !           394: }
        !           395: 
        !           396: getbuf()
        !           397: {
        !           398:        int n;
        !           399: 
        !           400:        n = *bp++ << 8;
        !           401:        n |= (*bp++ & 0377);
        !           402:        return(n);
        !           403: }
        !           404: 
        !           405: getsi(fin)  FILE *fin; {       /* get an integer stored in 2 ascii bytes. */
        !           406:        short a, b;
        !           407:        if((b = getc(fin)) == EOF)
        !           408:                return(EOF);
        !           409:        if((a = getc(fin)) == EOF)
        !           410:                return(EOF);
        !           411:        a = a<<8;
        !           412:        return(a|b);
        !           413: }

unix.superglobalmegacorp.com

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