1 #ifndef lint 2 static char *sccsid ="ideal.c (CWI) 1.1 85/03/01"; 3 #endif 4 #include "ideal.h" 5 #include "y.tab.h" 6 7 boolean dbg = FALSE; 8 int when_bug = 0; 9 char *filename; 10 int lineno = 0; 11 char libstr[50]; 12 boolean radflag = FALSE; 13 14 BOXPTR boxlist = NULL; 15 16 main(argc, argv) 17 int argc; 18 char *argv[]; 19 { 20 bug_off; 21 while (argc > 1 && argv[1][0] == '-') { 22 switch (argv[1][1]) { 23 case 'd': 24 when_bug = argv[1][2]?atoi(&argv[1][2]):~0; 25 break; 26 case 'l': 27 idinclude (&argv[1][2], LIBFIL); 28 while (yyparse()); 29 break; 30 case 'r': 31 radflag = TRUE; 32 break; 33 case 'p': 34 case '4': 35 case 'n': 36 break; 37 default: 38 fprintf(stderr, "ideal: unknown flag %c\n", argv[1][1]); 39 break; 40 } 41 argc--; 42 argv++; 43 } 44 if (argc < 2) { 45 filename = "standard input"; 46 lineno = 0; 47 filepush (stdin); 48 while (yyparse ()); 49 } else 50 while (argc-- > 1) { 51 filename = *argv; 52 lineno = 0; 53 idinclude (*++argv, CHATTY); 54 while (yyparse ()); 55 } 56 exit(0); 57 } 58 59 interpret() 60 { 61 PUTNODE dummyroot; 62 if (when_bug & 01) bug_on; 63 else bug_off; 64 dummyroot.name = lookup("main"); 65 dummyroot.parm = boxgen (lookup("main"), (STMTPTR) NULL); 66 /* if boxlist includes main, execute it */ 67 if (boxlist && findbox(lookup("main"),TRUE)->stmtlist) { 68 NOADPTR noadtree; 69 bug_off; 70 /* make room for all variables */ 71 noadtree = buildnoadtree (&dummyroot); 72 /* solve all equations */ 73 eqneval (noadtree); 74 nl_eval (); 75 depvarkill (); 76 /* make a list of segments in the picture */ 77 noadtree->linelist = build (noadtree, noadtree->linelist); 78 /* draw the thing */ 79 act (noadtree->linelist); 80 /* free the thing, but save definitions */ 81 noadfree (noadtree); 82 fflush (stdout); 83 forget (lookup ("main")); 84 } 85 } 86 87 idinclude (filnam, mode) 88 char *filnam; 89 int mode; 90 { 91 FILE *nufile; 92 dprintf "opening file %s\n", filnam); 93 if (mode == CHATTY) 94 nufile = fopen (filnam, "r"); 95 else if (mode == LIBFIL) { 96 strcpy (libstr, LIBDIR); 97 strcat (&libstr[0],filnam); 98 filnam = libstr; 99 nufile = fopen (filnam, "r"); 100 } 101 filename = filnam; 102 if (!nufile) { 103 fprintf (stderr, "ideal: can't open file %s\n", filnam); 104 exit (1); 105 } else { 106 filepush (nufile); 107 } 108 } 109 110 act (the_picture) 111 LINEPTR the_picture; 112 { 113 LINEPTR lineseg; 114 float maxx, maxy, minx, miny; 115 maxx = -10000.0; 116 maxy = -10000.0; 117 minx = 10000.0; 118 miny = 10000.0; 119 for (lineseg = the_picture; lineseg; lineseg = lineseg->next) { 120 switch (lineseg->kind) { 121 case LINE: 122 maxx = max(maxx, max(lineseg->x0, lineseg->x1)); 123 maxy = max(maxy, max(lineseg->y0, lineseg->y1)); 124 minx = min(minx, min(lineseg->x0, lineseg->x1)); 125 miny = min(miny, min(lineseg->y0, lineseg->y1)); 126 break; 127 case CIRCLE: 128 maxx = max(maxx, ((CIRCPTR) lineseg)->x0 + fabs(((CIRCPTR) lineseg)->r)); 129 minx = min(minx, ((CIRCPTR) lineseg)->x0 - fabs(((CIRCPTR) lineseg)->r)); 130 maxy = max(maxy, ((CIRCPTR) lineseg)->y0 + fabs(((CIRCPTR) lineseg)->r)); 131 miny = min(miny, ((CIRCPTR) lineseg)->y0 - fabs(((CIRCPTR) lineseg)->r)); 132 break; 133 case ARC: 134 maxx = max(maxx, ((ARCPTR) lineseg)->x0 + fabs(((ARCPTR) lineseg)->radius)); 135 minx = min(minx, ((ARCPTR) lineseg)->x0 - fabs(((ARCPTR) lineseg)->radius)); 136 maxy = max(maxy, ((ARCPTR) lineseg)->y0 + fabs(((ARCPTR) lineseg)->radius)); 137 miny = min(miny, ((ARCPTR) lineseg)->y0 - fabs(((ARCPTR) lineseg)->radius)); 138 break; 139 case STRING: 140 maxx = max(maxx, ((TEXTPTR) lineseg)->x0); 141 minx = min(minx, ((TEXTPTR) lineseg)->x0); 142 maxy = max(maxy, ((TEXTPTR) lineseg)->y0); 143 miny = min(miny, ((TEXTPTR) lineseg)->y0); 144 break; 145 case SPLINE: 146 break; 147 default: 148 fprintf (stderr, "ideal: act: can't happen\n"); 149 break; 150 } 151 } 152 if (the_picture) { 153 boundscall (maxx, maxy, minx, miny); 154 } 155 for (lineseg = the_picture; lineseg; lineseg = lineseg->next) { 156 switch (lineseg->kind) { 157 case LINE: 158 linecall (lineseg); 159 break; 160 case CIRCLE: 161 circcall ((CIRCPTR) lineseg); 162 break; 163 case ARC: 164 arccall ((ARCPTR) lineseg); 165 break; 166 case STRING: 167 textcall ((TEXTPTR) lineseg); 168 break; 169 case SPLINE: 170 splcall (((SPLPTR) lineseg)->knotlist); 171 break; 172 default: 173 fprintf (stderr, "ideal: act: can't happen\n"); 174 break; 175 } 176 } 177 } 178