Annotation of researchv10no/cmd/grap/print.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <stdlib.h>
                      3: #include <string.h>
                      4: #include <math.h>
                      5: #include <ctype.h>
                      6: #include "grap.h"
                      7: #include "y.tab.h"
                      8: 
                      9: double margin  = MARGIN;       /* extra space around edges */
                     10: extern double  frame_ht, frame_wid, ticklen;
                     11: extern int just, sizeop, tick_dir;
                     12: extern double sizexpr, lab_up, lab_rt;
                     13: 
                     14: char   graphname[50] = "Graph";
                     15: char   graphpos[200] = "";
                     16: 
                     17: void print(void)       /* arrange final output */
                     18: {
                     19:        FILE *fd;
                     20:        Obj *p, *dfp;
                     21:        int c;
                     22:        double dx, dy, xfac, yfac;
                     23: 
                     24:        if (tfd != NULL) {
                     25:                fclose(tfd);    /* end the temp file */
                     26:                tfd = stdout;
                     27:        }
                     28: 
                     29:        if ((p=lookup("margin",0)) != NULL)
                     30:                margin = p->fval;
                     31:        if (frame_ht < 0)       /* wasn't set explicitly, so use default */
                     32:                frame_ht = getvar(lookup("frameht", 0));
                     33:        if (frame_wid < 0)
                     34:                frame_wid = getvar(lookup("framewid", 0));
                     35:        dfp = NULL;
                     36:        for (p = objlist; p; p = p->next) {
                     37:                dprintf("print: name = <%s>, type = %d\n", p->name, p->type);
                     38:                if (p->type == NAME) {
                     39:                        Point pt, pt1;  
                     40:                        pt = p->pt;
                     41:                        pt1 = p->pt1;
                     42:                        fprintf(tfd, "\t# %s %g .. %g, %g .. %g\n",
                     43:                                p->name, pt.x, pt1.x, pt.y, pt1.y);
                     44:                        if (p->log & XFLAG) {
                     45:                                if (pt.x <= 0.0)
                     46:                                        ERROR "can't take log of x coord %g", pt.x FATAL;
                     47:                                logit(pt.x);
                     48:                                logit(pt1.x);
                     49:                        }
                     50:                        if (p->log & YFLAG) {
                     51:                                if (pt.y <= 0.0)
                     52:                                        ERROR "can't take log of y coord %g", pt.y FATAL;
                     53:                                logit(pt.y);
                     54:                                logit(pt1.y);
                     55:                        }
                     56:                        if (!(p->coord & XFLAG)) {
                     57:                                dx = pt1.x - pt.x;
                     58:                                pt.x -= margin * dx;
                     59:                                pt1.x += margin * dx;
                     60:                        }
                     61:                        if (!(p->coord & YFLAG)) {
                     62:                                dy = pt1.y - pt.y;
                     63:                                pt.y -= margin * dy;
                     64:                                pt1.y += margin * dy;
                     65:                        }
                     66:                        if (autoticks && strcmp(p->name, dflt_coord) == 0) {
                     67:                                p->pt = pt;
                     68:                                p->pt1 = pt1;
                     69:                                if (p->log & XFLAG) {
                     70:                                        p->pt.x = pow(10.0, pt.x);
                     71:                                        p->pt1.x = pow(10.0, pt1.x);
                     72:                                }
                     73:                                if (p->log & YFLAG) {
                     74:                                        p->pt.y = pow(10.0, pt.y);
                     75:                                        p->pt1.y = pow(10.0, pt1.y);
                     76:                                }
                     77:                                dfp = setauto();
                     78:                        }               
                     79:                        dx = pt1.x - pt.x;
                     80:                        dy = pt1.y - pt.y;
                     81:                        xfac = dx > 0 ? frame_wid/dx : frame_wid/2;
                     82:                        yfac = dy > 0 ? frame_ht/dy : frame_ht/2;
                     83: 
                     84:                        fprintf(tfd, "define xy_%s @ ", p->name);
                     85:                        if (dx > 0)
                     86:                                fprintf(tfd, "\t(($1)-(%g))*%g", pt.x, xfac);
                     87:                        else
                     88:                                fprintf(tfd, "\t%g", xfac);
                     89:                        if (dy > 0)
                     90:                                fprintf(tfd, ", (($2)-(%g))*%g @\n", pt.y, yfac);
                     91:                        else
                     92:                                fprintf(tfd, ", %g @\n", yfac);
                     93:                        fprintf(tfd, "define x_%s @ ", p->name);
                     94:                        if (dx > 0)
                     95:                                fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.x, xfac);
                     96:                        else
                     97:                                fprintf(tfd, "\t%g @\n", xfac);
                     98:                        fprintf(tfd, "define y_%s @ ", p->name);
                     99:                        if (dy > 0)
                    100:                                fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.y, yfac);
                    101:                        else
                    102:                                fprintf(tfd, "\t%g @\n", yfac);
                    103:                }
                    104:        }
                    105:        if (codegen)
                    106:                frame();
                    107:        if (codegen && autoticks && dfp)
                    108:                do_autoticks(dfp);
                    109: 
                    110:        if ((fd = fopen(tempfile, "r")) != NULL) {
                    111:                while ((c = getc(fd)) != EOF)
                    112:                        putc(c, tfd);
                    113:                fclose(fd);
                    114:        }
                    115:        tfd = NULL;
                    116: }
                    117: 
                    118: void endstat(void)     /* clean up after each statement */
                    119: {
                    120: 
                    121:        just = sizeop = 0;
                    122:        lab_up = lab_rt = 0.0;
                    123:        sizexpr = 0.0;
                    124:        nnum = 0;
                    125:        ntick = 0;
                    126:        tside = 0;
                    127:        tick_dir = OUT;
                    128:        ticklen = TICKLEN;
                    129: }
                    130: 
                    131: void graph(char *s)    /* graph statement */
                    132: {
                    133:        char *p, *os;
                    134:        int c;
                    135: 
                    136:        if (codegen) {
                    137:                fprintf(stdout, "%s: [\n", graphname);
                    138:                print();        /* pump out previous graph */
                    139:                fprintf(stdout, "\n] %s\n", graphpos);
                    140:                reset();
                    141:        }
                    142:        if (s) {
                    143:                dprintf("into graph with <%s>\n", s);
                    144:                opentemp();
                    145:                os = s;
                    146:                while ((c = *s) == ' ' || c == '\t')
                    147:                        s++;
                    148:                if (c == '\0')
                    149:                        ERROR "no name on graph statement" WARNING;
                    150:                if (!isupper(s[0]))
                    151:                        ERROR "graph name %s must be capitalized", s WARNING;
                    152:                for (p=graphname; (c = *s) != ' ' && c != '\t' && c != '\0'; )
                    153:                        *p++ = *s++;
                    154:                *p = '\0';
                    155:                strcpy(graphpos, s);
                    156:                dprintf("graphname = <%s>, graphpos = <%s>\n", graphname, graphpos);
                    157:                free(os);
                    158:        }
                    159: }
                    160: 
                    161: void setup(void)               /* done at each .G1 */
                    162: {
                    163:        static int firstG1 = 0;
                    164: 
                    165:        reset();
                    166:        opentemp();
                    167:        frame_ht = frame_wid = -1;      /* reset in frame() */
                    168:        ticklen = getvar(lookup("ticklen", 0));
                    169:        if (firstG1++ == 0)
                    170:                do_first();
                    171:        codegen = synerr = 0;
                    172:        strcpy(graphname, "Graph");
                    173:        strcpy(graphpos, "");
                    174: }
                    175: 
                    176: void do_first(void)    /* done at first .G1:  definitions, etc. */
                    177: {
                    178:        extern int lib;
                    179:        extern char *lib_defines;
                    180:        static char buf[50], buf1[50];  /* static because pbstr uses them */
                    181:        FILE *fp;
                    182:        extern int getpid(void);
                    183: 
                    184:        sprintf(buf, "define pid /%d/\n", getpid());
                    185:        pbstr(buf);     
                    186:        if (lib != 0) {
                    187:                if ((fp = fopen(lib_defines, "r")) != NULL) {
                    188:                        sprintf(buf1, "copy \"%s\"\n", lib_defines);
                    189:                        pbstr(buf1);
                    190:                        fclose(fp);
                    191:                } else {
                    192:                        fprintf(stderr, "grap warning: can't open %s\n", lib_defines);
                    193:                }
                    194:        }
                    195: }
                    196: 
                    197: void reset(void)               /* done at each "graph ..." statement */
                    198: {
                    199:        Obj *p, *np, *deflist;
                    200:        extern int tlist, toffside, autodir;
                    201: 
                    202:        curr_coord = dflt_coord;
                    203:        ncoord = auto_x = 0;
                    204:        autoticks = LEFT|BOT;
                    205:        autodir = 0;
                    206:        tside = tlist = toffside = 0;
                    207:        tick_dir = OUT;
                    208:        margin = MARGIN;
                    209:        deflist = NULL;
                    210:        for (p = objlist; p; p = np) {
                    211:                np = p->next;
                    212:                if (p->type == DEFNAME || p->type == VARNAME) {
                    213:                        p->next = deflist;
                    214:                        deflist = p;
                    215:                } else {
                    216:                        free(p->name);
                    217:                        freeattr(p->attr);
                    218:                        free((char *) p);
                    219:                }
                    220:        }
                    221:        objlist = deflist;
                    222: }
                    223: 
                    224: void opentemp(void)
                    225: {
                    226:        if (tfd != NULL)
                    227:                fclose(tfd);
                    228:        if (tfd != stdout) {
                    229:                if (tfd != NULL)
                    230:                        fclose(tfd);
                    231:                if ((tfd = fopen(tempfile, "w")) == NULL) {
                    232:                        fprintf(stderr, "grap: can't open %s\n", tempfile);
                    233:                        exit(1);
                    234:                }
                    235:        }
                    236: }

unix.superglobalmegacorp.com

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