|
|
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.