Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}