|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <stdlib.h> ! 3: #include <math.h> ! 4: #include "grap.h" ! 5: #include "y.tab.h" ! 6: ! 7: void line(int type, Point p1, Point p2, Attr *desc) /* draw a line segment */ ! 8: { ! 9: fprintf(tfd, "%s %s from %s", ! 10: type==LINE ? "line" : "arrow", desc_str(desc), xyname(p1)); ! 11: fprintf(tfd, " to %s", xyname(p2)); /* 'cause xyname is botched */ ! 12: fprintf(tfd, "\n"); ! 13: range(p1); ! 14: range(p2); ! 15: } ! 16: ! 17: void circle(double r, Point pt) /* draw a circle */ ! 18: { ! 19: if (r > 0.0) ! 20: fprintf(tfd, "circle rad %g at %s\n", r, xyname(pt)); ! 21: else ! 22: fprintf(tfd, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt)); ! 23: range(pt); ! 24: } ! 25: ! 26: char *xyname(Point pt) /* generate xy name macro for point p */ ! 27: { ! 28: static char buf[200]; ! 29: Obj *p; ! 30: ! 31: p = pt.obj; ! 32: if (p->log & XFLAG) { ! 33: if (pt.x <= 0.0) ! 34: ERROR "can't take log of x coord %g", pt.x FATAL; ! 35: logit(pt.x); ! 36: } ! 37: if (p->log & YFLAG) { ! 38: if (pt.y <= 0.0) ! 39: ERROR "can't take log of y coord %g", pt.y FATAL; ! 40: logit(pt.y); ! 41: } ! 42: sprintf(buf, "xy_%s(%g,%g)", p->name, pt.x, pt.y); ! 43: return buf; /* WATCH IT: static */ ! 44: } ! 45: ! 46: void pic(char *s) /* fire out pic stuff directly */ ! 47: { ! 48: while (*s == ' ') ! 49: s++; ! 50: fprintf(tfd, "%s\n", s); ! 51: } ! 52: ! 53: int auto_x = 0; /* counts abscissa if none provided */ ! 54: ! 55: void numlist(void) /* print numbers in default way */ ! 56: { ! 57: Obj *p; ! 58: Point pt; ! 59: int i; ! 60: static char *spot = "\\(bu"; ! 61: Attr *ap; ! 62: ! 63: p = pt.obj = lookup(curr_coord, 1); ! 64: if (nnum == 1) { ! 65: nnum = 2; ! 66: num[1] = num[0]; ! 67: num[0] = ++auto_x; ! 68: } ! 69: pt.x = num[0]; ! 70: if (p->attr && p->attr->sval) ! 71: spot = p->attr->sval; ! 72: for (i = 1; i < nnum; i++) { ! 73: pt.y = num[i]; ! 74: if (p->attr == 0 || p->attr->type == 0) { ! 75: ap = makesattr(tostring(spot)); ! 76: plot(ap, pt); ! 77: } else ! 78: next(p, pt, p->attr); ! 79: } ! 80: nnum = 0; ! 81: } ! 82: ! 83: void plot(Attr *sl, Point pt) /* put stringlist sl at point pt */ ! 84: { ! 85: fprintf(tfd, "%s at %s\n", slprint(sl), xyname(pt)); ! 86: range(pt); ! 87: freeattr(sl); ! 88: } ! 89: ! 90: void plotnum(double f, char *fmt, Point pt) /* plot value f at point */ ! 91: { ! 92: char buf[100]; ! 93: ! 94: if (fmt) { ! 95: sprintf(buf, fmt, f); ! 96: free(fmt); ! 97: } else if (f >= 0.0) ! 98: sprintf(buf, "%g", f); ! 99: else ! 100: sprintf(buf, "\\-%g", -f); ! 101: fprintf(tfd, "\"%s\" at %s\n", buf, xyname(pt)); ! 102: range(pt); ! 103: } ! 104: ! 105: void drawdesc(int type, Obj *p, Attr *desc, char *s) /* set line description for p */ ! 106: { ! 107: p->attr = desc; ! 108: p->attr->sval = s; ! 109: if (type == NEW) { ! 110: p->first = 0; /* so it really looks new */ ! 111: auto_x = 0; ! 112: } ! 113: } ! 114: ! 115: void next(Obj *p, Point pt, Attr *desc) /* add component to a path */ ! 116: { ! 117: char *s; ! 118: ! 119: if (p->first == 0) { ! 120: p->first++; ! 121: fprintf(tfd, "L%s: %s\n", p->name, xyname(pt)); ! 122: } else { ! 123: fprintf(tfd, "line %s from L%s to %s; L%s: Here\n", ! 124: desc_str(desc->type ? desc : p->attr), ! 125: p->name, xyname(pt), p->name); ! 126: } ! 127: if (p->attr && (s=p->attr->sval)) { ! 128: /* BUG: should fix size here */ ! 129: fprintf(tfd, "\"%s\" at %s\n", s, xyname(pt)); ! 130: } ! 131: range(pt); ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.