|
|
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: int oper;
131: EXPR left;
132: EXPR right;
133: } EXPRINTL, *INTLPTR;
134:
135: typedef struct exprextl { /* external node of expr tree */
136: boolean leaf; /* always TRUE */
137: union u {
138: struct namenode *path;
139: float const;
140: } info;
141: int kind; /* should be one of PATH, CONST */
142: } EXPREXTL, *EXTLPTR;
143:
144: typedef struct noad { /* linked structures in which variables reside */
145: PUTPTR defnode;
146: struct varnode *edgevarlist;
147: struct varnode *boxvarlist;
148: struct linenode *linelist;
149: struct noad *father;
150: struct noad *brother;
151: struct noad *son;
152: } NOAD, *NOADPTR;
153:
154: typedef struct varnode { /* where ONE variable--the real or imag part of a var--lives */
155: struct varnode *next;
156: int re_name; /* positive for real part, negative for imag part */
157: struct depnode *deplist;
158: } VARNODE, *VARPTR;
159:
160: typedef struct depnode { /* a term in the dependency list representation of a variable */
161: struct depnode *next;
162: VARPTR var;
163: float coeff;
164: } DEPNODE, *DEPPTR;
165:
166: typedef struct linenode { /* a line segment on linelist */
167: struct linenode *next;
168: int kind; /* always LINE */
169: float x0,
170: y0,
171: x1,
172: y1;
173: } LINENODE, *LINEPTR;
174:
175: typedef struct edgenode { /* an edge of an opaque polygon */
176: struct edgenode *next,
177: *prev;
178: struct arcnode *fax;
179: boolean flipped;
180: float sx, sy, /* start point */
181: ex, ey, /* end point */
182: stx, sty, /* coords of endpt of a tan vector at start */
183: etx, ety; /* coords of endpt of a tan vector at end */
184: int code[POSSINTER];
185: float alpha[POSSINTER];
186: } EDGENODE, *EDGEPTR;
187:
188: typedef struct circnode { /* a circle on linelist */
189: struct linenode *next;
190: int kind; /* always CIRCLE */
191: float x0,
192: y0,
193: r;
194: } CIRCNODE, *CIRCPTR;
195:
196: typedef struct arcnode { /* an arc on linelist */
197: struct linenode *next;
198: int kind; /* always ARC */
199: float x0,
200: y0,
201: x1,
202: y1,
203: x2,
204: y2,
205: theta1,
206: theta2,
207: radius; /* TROFF figures out the center depending on sign of radius */
208: } ARCNODE, *ARCPTR;
209:
210: typedef struct textnode { /* a string on linelist */
211: struct linenode *next;
212: int kind, /* always STRING */
213: command;
214: char *string;
215: float x0,
216: y0;
217: } TEXTNODE, *TEXTPTR;
218:
219: typedef struct splnode { /* a spline on linelist */
220: struct linenode *next;
221: int kind; /* always SPLINE */
222: EXPRPTR knotlist;
223: } SPLNODE, *SPLPTR;
224:
225: typedef struct eqnnode { /* a non-linear equation residing on list */
226: struct eqnnode *next;
227: EXPR eqn;
228: NOADPTR noad;
229: } EQNNODE, *EQNPTR;
230:
231: typedef struct opqnode { /* an alpha or theta of intersection */
232: struct opqnode *next;
233: int code;
234: float alpha;
235: } OPQNODE, *OPQPTR;
236:
237: /* routines in memut.c */
238: extern STMTPTR stmtgen ();
239: extern BOXPTR boxgen ();
240: extern NAMEPTR namegen ();
241: extern EXPRPTR exprgen ();
242: extern PUTPTR putgen ();
243: extern PENPTR pengen ();
244: extern MISCPTR miscgen ();
245: extern INTLPTR intlgen ();
246: extern INTLPTR commagen ();
247: extern EXTLPTR extlgen ();
248: extern EXTLPTR fextlgen ();
249: extern NOADPTR noadgen ();
250: extern VARPTR vargen ();
251: extern DEPPTR depgen ();
252: extern LINEPTR linegen ();
253: extern EDGEPTR edgeline ();
254: extern LINEPTR circgen ();
255: extern LINEPTR arcgen ();
256: extern LINEPTR angularc ();
257: extern LINEPTR pointarc ();
258: extern EDGEPTR edgearc ();
259: extern LINEPTR textgen ();
260: extern LINEPTR splgen ();
261: extern STRPTR strgen ();
262: extern EQNPTR eqngen ();
263: extern OPQPTR opqgen ();
264: extern void nextfree ();
265: extern void depfree ();
266: extern void namefree ();
267: extern void exprlsfree ();
268: extern void linefree ();
269: extern void intlfree ();
270: extern void noadfree ();
271: extern void varfree ();
272: extern void exprfree ();
273: extern void boxfree ();
274: extern void emergency ();
275:
276: /* routines in util.c */
277: extern int lookup();
278: extern char* idprint();
279: extern BOXPTR findbox();
280: extern INTLPTR varfind();
281: extern INTLPTR pathfind();
282: extern BOXPTR tail ();
283: extern void forget ();
284: extern void exprprint ();
285: extern STMTPTR nextstmt ();
286: extern EXPR bracket ();
287: extern void depprint ();
288: extern void dexch();
289: extern void fexch();
290: extern float rprin();
291: extern float dprin();
292: extern void angorder();
293: extern STMTPTR reverse ();
294: extern void impossible ();
295:
296: /* routines in bldds.c */
297: extern NOADPTR buildnoadtree();
298: extern VARPTR buildvarlist();
299: extern NOADPTR walkputlist();
300:
301: /* routines in simul.c */
302: extern DEPPTR depadd();
303: extern DEPPTR depsubst();
304:
305: /* routines in exprn.c */
306: extern INTLPTR expreval();
307: extern void eqndo();
308: extern void depvarclean();
309: extern void depvarkill();
310: extern void eqneval();
311: extern void nl_eval();
312:
313: /* routines in action.c */
314: extern LINEPTR build();
315: extern LINEPTR connact();
316: extern LINEPTR penact();
317: extern LINEPTR drawact();
318: extern LINEPTR stract();
319: extern LINEPTR circact();
320: extern LINEPTR arcact();
321: extern LINEPTR splact();
322:
323: /* routines in piece.c */
324: extern void linecall ();
325: extern void circcall ();
326: extern void arccall ();
327: extern void textcall ();
328: extern void splcall ();
329: extern void boundscall ();
330: extern void bbline ();
331: extern void bbcirc ();
332:
333: /* routines in opaque.c */
334: extern LINEPTR opqact();
335: extern void opqinsert();
336: extern LINEPTR lineclean();
337: extern void halfplane();
338: extern void triangle();
339:
340: /* routines in inter.c */
341: extern boolean llinter();
342: extern boolean lcinter();
343: extern boolean ccinter();
344:
345: /* routines in opqpoly.c */
346: extern void opqpoly();
347: extern void polyline();
348: extern void polyarc();
349: extern void linetest();
350: extern void arctest();
351:
352: /* routines in opqcirc.c */
353: extern void opqcirc();
354: extern void circline();
355: extern void circarc();
356:
357: /* routines in opqsect.c */
358: extern void opqsect();
359:
360: /* routines in opqseg.c */
361: extern void opqseg();
362:
363: /* lexical analyzer routines */
364: extern void filepush ();
365: extern void filepop ();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.