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