|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.