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