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
line(type,p1,p2,desc)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
circle(r,pt)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
xyname(pt)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
pic(s)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
numlist()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
plot(sl,pt)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
plotnum(f,fmt,pt)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
drawdesc(type,p,desc,s)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
next(p,pt,desc)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