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