|
|
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.