Blame


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