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