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