7 void line(int type
, Point p1
, Point p2
, Attr
*desc
) /* draw a line segment */
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 */
17 void circle(double r
, Point pt
) /* draw a circle */
20 fprintf(tfd
, "circle rad %g at %s\n", r
, xyname(pt
));
22 fprintf(tfd
, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt
));
26 char *xyname(Point pt
) /* generate xy name macro for point p */
34 ERROR
"can't take log of x coord %g", pt
.x FATAL
;
39 ERROR
"can't take log of y coord %g", pt
.y FATAL
;
42 sprintf(buf
, "xy_%s(%g,%g)", p
->name
, pt
.x
, pt
.y
);
43 return buf
; /* WATCH IT: static */
46 void pic(char *s
) /* fire out pic stuff directly */
50 fprintf(tfd
, "%s\n", s
);
53 int auto_x
= 0; /* counts abscissa if none provided */
55 void numlist(void) /* print numbers in default way */
60 static char *spot
= "\\(bu";
63 p
= pt
.obj
= lookup(curr_coord
, 1);
70 if (p
->attr
&& p
->attr
->sval
)
72 for (i
= 1; i
< nnum
; i
++) {
74 if (p
->attr
== 0 || p
->attr
->type
== 0) {
75 ap
= makesattr(tostring(spot
));
83 void plot(Attr
*sl
, Point pt
) /* put stringlist sl at point pt */
85 fprintf(tfd
, "%s at %s\n", slprint(sl
), xyname(pt
));
90 void plotnum(double f
, char *fmt
, Point pt
) /* plot value f at point */
98 sprintf(buf
, "%g", f
);
100 sprintf(buf
, "\\-%g", -f
);
101 fprintf(tfd
, "\"%s\" at %s\n", buf
, xyname(pt
));
105 void drawdesc(int type
, Obj
*p
, Attr
*desc
, char *s
) /* set line description for p */
110 p
->first
= 0; /* so it really looks new */
115 void next(Obj
*p
, Point pt
, Attr
*desc
) /* add component to a path */
121 fprintf(tfd
, "L%s: %s\n", p
->name
, xyname(pt
));
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
);
127 if (p
->attr
&& (s
=p
->attr
->sval
)) {
128 /* BUG: should fix size here */
129 fprintf(tfd
, "\"%s\" at %s\n", s
, xyname(pt
));