1 /*	ideal.h	(CWI)	1.1	85/03/01	*/
2 #include <stdio.h>
3 #include "stdas.h"
4 #include <math.h>
5 
6 extern double modf();
7 
8 #define TRUE	1
9 #define FALSE	0
10 typedef int	boolean;
11 
12 #define EPSILON 0.0001
13 #define	PI	3.1415926535
14 #define	INFINITY	1e30
15 #define INTERSIZE	20
16 #define	POSSINTER	2
17 
18 #define known(x) (!(((DEPPTR)x->left)->var || ((DEPPTR)x->right)->var))
19 #define fabs(z)	((z>0)?z:-(z))
20 #define	iabs(z)	((z>0)?z:-(z))
21 #define max(x,y) (((x)>(y))?(x):(y))
22 #define min(x,y) (((x)<(y))?(x):(y))
23 #define Re(z)	((DEPPTR)z->left)->coeff
24 #define Im(z)	((DEPPTR)z->right)->coeff
25 #define	ISREAL(z)	(z->re_name > 0)
26 #define	THENAME(z)	(iabs(z->re_name))
27 #define	arecollinear(a,b,c,d,e,f)	(fabs((f-b)*(c-a)-(e-a)*(d-b))<EPSILON)
28 #define	between(ax,ay,bx,by,cx,cy)	((ax-bx)*(bx-cx) > 0 || (ay-by)*(by-cy) > 0)
29 
30 extern int when_bug;
31 extern boolean dbg;
32 #define bug_on	dbg = TRUE
33 #define bug_off	dbg = FALSE
34 #define dprintf	if (dbg) fprintf(stderr,
35 
36 extern char *filename;
37 extern int lineno;
38 #define	LIBFIL	1
39 #define	SILENT	2
40 #define	CHATTY	3
41 
42 extern boolean radflag;
43 extern boolean wantout;
44 #define dtor(x)	x *= PI/180
45 #define rtod(x)	x *= 180/PI
46 
47 /* these are codes for classification of intersection points */
48 #define	UNUSED		0
49 #define	SIMPLE		1
50 #define	AT0		2
51 #define	AT1		3
52 #define	COLLINEAR	4
53 #define	ON0		5
54 #define	ON1		6
55 #define	TANGENT		7
56 
57 /* these are codes for setting up the list of intersections */
58 #define	INHERIT		0
59 /*
60 #define	SIMPLE		1
61 */
62 #define	EXTREMUM	2
63 #define	INFLECTION	3
64 #define	EXT0		4
65 #define	EXT1		5
66 #define	INFL0		6
67 #define	INFL1		7
68 #define	IGNORE		8
69 
70 #define	INBEGIN		0
71 #define	OUTBEGIN	1
72 #define	ONBEGIN		2
73 
74 /* structure definitions for data structures */
75 typedef char *EXPR;
76 #define	tryfree(doomed)	free((char *)doomed)
77 
78 typedef struct stmtnode {	/* hooks together stmts in bodies */
79 	struct stmtnode *next;
80 	EXPR stmt;
81 	int kind;
82 	} STMTNODE, *STMTPTR;
83 
84 typedef struct boxnode {	/* hooks together box definitions */
85 	struct boxnode *next;
86 	int name;
87 	STMTPTR stmtlist;
88 	} BOXNODE, *BOXPTR;
89 
90 typedef struct namenode {	/* holds var lists and path names */
91 	struct namenode *next;
92 	int name;
93 	} NAMENODE, *NAMEPTR;
94 
95 typedef struct exprnode {	/* points to equations and bdlists */
96 	struct exprnode *next;
97 	EXPR expr;
98 	} EXPRNODE, *EXPRPTR;
99 
100 typedef struct putnode {	/* put statements */
101 	int name;
102 	BOXPTR parm;
103 	int p_or_c;
104 	} PUTNODE, *PUTPTR;
105 
106 typedef struct pen_node {	/* conn ... using statements */
107 	EXPR from,
108 		to,
109 		copies,
110 		start,
111 		end;
112 	BOXPTR pen;
113 	} PEN_NODE, *PENPTR;
114 
115 typedef struct miscnode {	/* opaque, draw handling */
116 	int info;
117 	} MISCNODE, *MISCPTR;
118 
119 typedef struct strnode {	/* strings */
120 	int command;
121 	char *string;
122 	EXPR at;
123 	} STRNODE, *STRPTR;
124 
125 typedef struct exprintl {	/* internal node of expr tree */
126 	boolean leaf;	/* always FALSE */
127 	int oper;
128 	EXPR left;
129 	EXPR right;
130 	} EXPRINTL, *INTLPTR;
131 
132 typedef struct exprextl {	/* external node of expr tree */
133 	boolean leaf;	/* always TRUE */
134 	union u {
135 		struct namenode *path;
136 		float const;
137 	} info;
138 	int kind;	/* should be one of PATH, CONST */
139 	} EXPREXTL, *EXTLPTR;
140 
141 typedef struct noad {	/* linked structures in which variables reside */
142 	PUTPTR defnode;
143 	struct varnode *edgevarlist;
144 	struct varnode *boxvarlist;
145 	struct linenode *linelist;
146 	struct noad *father;
147 	struct noad *brother;
148 	struct noad *son;
149 	} NOAD, *NOADPTR;
150 
151 typedef struct varnode {	/* where ONE variable--the real or imag part of a var--lives */
152 	struct varnode *next;
153 	int re_name;	/* positive for real part, negative for imag part */
154 	struct depnode *deplist;
155 	} VARNODE, *VARPTR;
156 
157 typedef struct depnode {	/* a term in the dependency list representation of a variable */
158 	struct depnode *next;
159 	VARPTR var;
160 	float coeff;
161 	} DEPNODE, *DEPPTR;
162 
163 typedef struct linenode {	/* a line segment on linelist */
164 	struct linenode *next;
165 	int kind;	/* always LINE */
166 	float x0,
167 		y0,
168 		x1,
169 		y1;
170 	} LINENODE, *LINEPTR;
171 
172 typedef struct edgenode {	/* an edge of an opaque polygon */
173 	struct edgenode *next,
174 		*prev;
175 	struct arcnode *fax;
176 	boolean flipped;
177 	float sx, sy,		/* start point */
178 		ex, ey,		/* end point */
179 		stx, sty,	/* coords of endpt of a tan vector at start */
180 		etx, ety;	/* coords of endpt of a tan vector at end */
181 	int code[POSSINTER];
182 	float alpha[POSSINTER];
183 	} EDGENODE, *EDGEPTR;
184 
185 typedef struct circnode {	/* a circle on linelist */
186 	struct linenode *next;
187 	int kind;	/* always CIRCLE */
188 	float x0,
189 		y0,
190 		r;
191 	} CIRCNODE, *CIRCPTR;
192 
193 typedef struct arcnode {	/* an arc on linelist */
194 	struct linenode *next;
195 	int kind;	/* always ARC */
196 	float x0,
197 		y0,
198 		x1,
199 		y1,
200 		x2,
201 		y2,
202 		theta1,
203 		theta2,
204 		radius;	/* TROFF figures out the center depending on sign of radius */
205 	} ARCNODE, *ARCPTR;
206 
207 typedef struct textnode {	/* a string on linelist */
208 	struct linenode *next;
209 	int kind,	/* always STRING */
210 		command;
211 	char *string;
212 	float x0,
213 		y0;
214 	} TEXTNODE, *TEXTPTR;
215 
216 typedef struct splnode {	/* a spline on linelist */
217 	struct linenode *next;
218 	int kind;	/* always SPLINE */
219 	EXPRPTR knotlist;
220 	} SPLNODE, *SPLPTR;
221 
222 typedef struct eqnnode {	/* a non-linear equation residing on list */
223 	struct eqnnode *next;
224 	EXPR eqn;
225 	NOADPTR noad;
226 	} EQNNODE, *EQNPTR;
227 
228 typedef struct opqnode {	/* an alpha or theta of intersection */
229 	struct opqnode *next;
230 	int code;
231 	float alpha;
232 	} OPQNODE, *OPQPTR;
233 
234 /* routines in memut.c */
235 extern STMTPTR stmtgen ();
236 extern BOXPTR boxgen ();
237 extern NAMEPTR namegen ();
238 extern EXPRPTR exprgen ();
239 extern PUTPTR putgen ();
240 extern PENPTR pengen ();
241 extern MISCPTR miscgen ();
242 extern INTLPTR intlgen ();
243 extern INTLPTR commagen ();
244 extern EXTLPTR extlgen ();
245 extern EXTLPTR fextlgen ();
246 extern NOADPTR noadgen ();
247 extern VARPTR vargen ();
248 extern DEPPTR depgen ();
249 extern LINEPTR linegen ();
250 extern EDGEPTR edgeline ();
251 extern LINEPTR circgen ();
252 extern LINEPTR arcgen ();
253 extern LINEPTR angularc ();
254 extern LINEPTR pointarc ();
255 extern EDGEPTR edgearc ();
256 extern LINEPTR textgen ();
257 extern LINEPTR splgen ();
258 extern STRPTR strgen ();
259 extern EQNPTR eqngen ();
260 extern OPQPTR opqgen ();
261 extern void nextfree ();
262 extern void depfree ();
263 extern void namefree ();
264 extern void exprlsfree ();
265 extern void linefree ();
266 extern void intlfree ();
267 extern void noadfree ();
268 extern void varfree ();
269 extern void exprfree ();
270 extern void boxfree ();
271 extern void emergency ();
272 
273 /* routines in util.c */
274 extern int lookup();
275 extern char* idprint();
276 extern BOXPTR findbox();
277 extern INTLPTR varfind();
278 extern INTLPTR pathfind();
279 extern BOXPTR tail ();
280 extern void forget ();
281 extern void exprprint ();
282 extern STMTPTR nextstmt ();
283 extern EXPR bracket ();
284 extern void depprint ();
285 extern void dexch();
286 extern void fexch();
287 extern float rprin();
288 extern float dprin();
289 extern void angorder();
290 extern STMTPTR reverse ();
291 extern void impossible ();
292 
293 /* routines in bldds.c */
294 extern NOADPTR buildnoadtree();
295 extern VARPTR buildvarlist();
296 extern NOADPTR walkputlist();
297 
298 /* routines in simul.c */
299 extern DEPPTR depadd();
300 extern DEPPTR depsubst();
301 
302 /* routines in exprn.c */
303 extern INTLPTR expreval();
304 extern void eqndo();
305 extern void depvarclean();
306 extern void depvarkill();
307 extern void eqneval();
308 extern void nl_eval();
309 
310 /* routines in action.c */
311 extern LINEPTR build();
312 extern LINEPTR connact();
313 extern LINEPTR penact();
314 extern LINEPTR drawact();
315 extern LINEPTR stract();
316 extern LINEPTR circact();
317 extern LINEPTR arcact();
318 extern LINEPTR splact();
319 
320 /* routines in piece.c */
321 extern void linecall ();
322 extern void circcall ();
323 extern void arccall ();
324 extern void textcall ();
325 extern void splcall ();
326 extern void boundscall ();
327 
328 /* routines in opaque.c */
329 extern LINEPTR opqact();
330 extern void opqinsert();
331 extern LINEPTR lineclean();
332 extern void halfplane();
333 extern void triangle();
334 
335 /* routines in inter.c */
336 extern boolean llinter();
337 extern boolean lcinter();
338 extern boolean ccinter();
339 
340 /* routines in opqpoly.c */
341 extern void opqpoly();
342 extern void polyline();
343 extern void polyarc();
344 extern void linetest();
345 extern void arctest();
346 
347 /* routines in opqcirc.c */
348 extern void opqcirc();
349 extern void circline();
350 extern void circarc();
351 
352 /* routines in opqsect.c */
353 extern void opqsect();
354 
355 /* routines in opqseg.c */
356 extern void opqseg();
357 
358 /* lexical analyzer routines */
359 extern void filepush ();
360 extern void filepop ();
361