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