ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/igraph.c
Revision: 1.2
Committed: Mon Oct 27 10:28:59 2003 UTC (20 years, 5 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 1.1: +3 -2 lines
Log Message:
Various compatibility fixes.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: igraph.c,v 1.1 2003/02/22 02:07:26 greg Exp $";
3 #endif
4 /*
5 * igraph.c - interactive graphing program.
6 *
7 * 6/30/86
8 *
9 * Greg Ward Larson
10 */
11
12 #include <stdio.h>
13
14 #include <ctype.h>
15
16 #include <setjmp.h>
17
18 #include "rtprocess.h"
19 #include "mgvars.h"
20
21 typedef struct {
22 char *descrip; /* description */
23 char *value; /* value */
24 } SMAP;
25
26 #define NDEV 10 /* number of devices */
27
28 SMAP dev[NDEV] = {
29 { "Tektronix 4014", "t4014" },
30 { "AED 512", "output aed5" },
31 { "X10 Window System", "xmeta" },
32 { "X11 Window System", "x11meta" },
33 { "Epson Printer", "output mx80" },
34 { "Mannesman-Tally Printer", "output mt160" },
35 { "Mannesman-Tally High Density", "output mt160l" },
36 { "Apple Imagewriter", "output imagew" },
37 { "Imagen Printer", "impress | ipr" },
38 { "Postscript Printer", "psmeta | lpr" },
39 };
40
41 #define NTYP 7 /* number of plot types */
42
43 SMAP typ[NTYP] = {
44 { "Cartesian Plot", "cartesian.plt" },
45 { "Polar Plot (degrees)", "polar.plt" },
46 { "Curve Plot (symbols & lines)", "curve.plt" },
47 { "Scatter Plot (symbols only)", "scatter.plt" },
48 { "Line Plot (lines only)", "line.plt" },
49 { "Function Plot (lines)", "function.plt" },
50 { "Box and Whisker Plot", "boxw.plt" },
51 };
52
53 #define NCAL 3 /* number of calculation types */
54
55 SMAP cal[NCAL] = {
56 { "Extrema, Average", "nma" },
57 { "Integral", "ni" },
58 { "Linear Regression", "nl" },
59 };
60
61 char *progname;
62
63 char *libpath[4];
64
65 static int recover = 0; /* try to recover? */
66
67 static jmp_buf env; /* setjmp buffer */
68
69 static char curfile[64] = "temp.plt"; /* current file name */
70
71 char *getfile(), *gets(), *strcpy();
72
73
74 main(argc, argv)
75 int argc;
76 char *argv[];
77 {
78 char *getenv();
79 int i;
80
81 progname = argv[0];
82 libpath[0] = "./";
83 if ((libpath[i=1] = getenv("MDIR")) != NULL)
84 i++;
85 libpath[i++] = MDIR;
86 libpath[i] = NULL;
87
88 for (i = 1; i < argc; i++)
89 mgload(strcpy(curfile, argv[i]));
90
91 mainmenu();
92
93 quit(0);
94 }
95
96
97 eputs(msg) /* print error message */
98 char *msg;
99 {
100 fputs(msg, stderr);
101 }
102
103
104 quit(code) /* recover or quit */
105 int code;
106 {
107 if (code && recover--)
108 longjmp(env, 1);
109 exit(code);
110 }
111
112
113 mainmenu() /* the main menu loop */
114 {
115 char sbuf[128];
116
117 for ( ; ; ) {
118 printf("\nGRAPH MENU\n");
119 printf("\t1 New Plot\n");
120 printf("\t2 Set Plot Type\n");
121 printf("\t3 Load Plot File\n");
122 printf("\t4 Save Plot File\n");
123 printf("\t5 Change Plot Variable\n");
124 printf("\t6 Change Curve Variable\n");
125 printf("\t7 Output Plot\n");
126 printf("\t8 Escape Command\n");
127 printf("\t9 Computation\n");
128 printf("\t10 Quit\n");
129
130 printf("\nChoice: ");
131 clearerr(stdin); gets(sbuf);
132 if (feof(stdin))
133 return;
134 switch (atoi(sbuf)) {
135 case 1: /* new plot */
136 mgclearall();
137 break;
138 case 2: /* set plot type */
139 settype();
140 break;
141 case 3: /* load plot file */
142 if (setjmp(env) == 0) {
143 recover = 1;
144 mgload(getfile());
145 recover = 0;
146 } else
147 uwait();
148 break;
149 case 4: /* save plot file */
150 if (setjmp(env) == 0) {
151 recover = 1;
152 mgsave(getfile());
153 recover = 0;
154 } else
155 uwait();
156 break;
157 case 5: /* set plot variable */
158 setvars(NVARS, gparam);
159 break;
160 case 6: /* set curve variable */
161 printf("\nCurve (A-%c): ", MAXCUR-1+'A');
162 clearerr(stdin); gets(sbuf);
163 if (islower(sbuf[0]))
164 sbuf[0] -= 'a';
165 else if (isupper(sbuf[0]))
166 sbuf[0] -= 'A';
167 else
168 break;
169 if (sbuf[0] < MAXCUR)
170 setvars(NCVARS, cparam[sbuf[0]]);
171 break;
172 case 7: /* output plot */
173 plotout();
174 break;
175 case 8: /* escape command */
176 printf("\nCommand: ");
177 clearerr(stdin); gets(sbuf);
178 if (sbuf[0]) {
179 system(sbuf);
180 uwait();
181 }
182 break;
183 case 9: /* computation */
184 gcompute();
185 break;
186 case 10: /* quit */
187 return;
188 }
189 }
190 }
191
192
193 char *
194 getfile() /* get file name from user */
195 {
196 char sbuf[128];
197
198 printf("\nFile (%s): ", curfile);
199 clearerr(stdin); gets(sbuf);
200 if (sbuf[0] == '-')
201 return(NULL);
202 if (sbuf[0])
203 strcpy(curfile, sbuf);
204 return(curfile);
205 }
206
207
208 settype() /* set plot type */
209 {
210 char sbuf[128];
211 int i;
212
213 printf("\nPLOT TYPE\n");
214
215 for (i = 0; i < NTYP; i++)
216 printf("\t%d %s\n", i+1, typ[i].descrip);
217
218 printf("\nChoice (0): ");
219 clearerr(stdin); gets(sbuf);
220 i = atoi(sbuf) - 1;
221 if (i < 0 || i >= NTYP)
222 return;
223 sprintf(sbuf, "include=%s", typ[i].value);
224 setmgvar("plot type", stdin, sbuf);
225 }
226
227
228 plotout() /* output our graph */
229 {
230 extern FILE *pout;
231 char sbuf[128];
232 char *command;
233 int i;
234
235 printf("\nOUTPUT PLOT\n");
236
237 for (i = 0; i < NDEV; i++)
238 printf("\t%d %s\n", i+1, dev[i].descrip);
239 printf("\t%d Dumb Terminal\n", NDEV+1);
240 printf("\t%d Other\n", NDEV+2);
241
242 printf("\nChoice (0): ");
243 clearerr(stdin); gets(sbuf);
244 i = atoi(sbuf) - 1;
245 if (i < 0 || i > NDEV+1)
246 return;
247 if (i < NDEV)
248 command = dev[i].value;
249 else if (i == NDEV) {
250 if (setjmp(env) == 0) {
251 recover = 1;
252 cgraph(79, 22);
253 recover = 0;
254 }
255 uwait();
256 return;
257 } else if (i == NDEV+1) {
258 printf("\nDriver command: ");
259 clearerr(stdin); gets(sbuf);
260 if (!sbuf[0])
261 return;
262 command = sbuf;
263 }
264 if ((pout = popen(command, "w")) == NULL) {
265 fprintf(stderr, "%s: cannot execute device driver: %s\n",
266 progname, dev[i].value);
267 quit(1);
268 }
269 if (setjmp(env) == 0) {
270 recover = 1;
271 mgraph();
272 recover = 0;
273 } else
274 uwait();
275 mdone();
276 pclose(pout);
277 }
278
279
280 setvars(nvar, vars) /* set variables */
281 int nvar;
282 VARIABLE vars[];
283 {
284 char sbuf[128];
285 int i, j;
286
287 for ( ; ; ) {
288 printf("\nVARIABLES\n");
289
290 for (i = 0; i < nvar; i++)
291 printf("\t%d %s\n", i+1, vars[i].descrip == NULL ?
292 vars[i].name : vars[i].descrip);
293
294 printf("\nChoice (0): ");
295 clearerr(stdin); gets(sbuf);
296 i = atoi(sbuf) - 1;
297 if (i < 0 || i >= nvar)
298 return;
299 printf("\n%s", vars[i].name);
300 if (vars[i].type == FUNCTION)
301 printf("(x)");
302 if (vars[i].flags & DEFINED) {
303 mgtoa(sbuf, &vars[i]);
304 printf(" (%s)", sbuf);
305 }
306 printf(": ");
307 if (vars[i].type == FUNCTION)
308 sprintf(sbuf, "%s(x)=", vars[i].name);
309 else
310 sprintf(sbuf, "%s=", vars[i].name);
311 j = strlen(sbuf);
312 clearerr(stdin); gets(sbuf+j);
313 if (sbuf[j]) {
314 if (vars[i].type == DATA && sbuf[j] == '-')
315 sbuf[j] = '\0';
316
317 if (setjmp(env) == 0) {
318 recover = 1;
319 setmgvar("variable set", stdin, sbuf);
320 recover = 0;
321 } else
322 uwait();
323 }
324 }
325 }
326
327
328 gcompute() /* do a computation */
329 {
330 char sbuf[64];
331 int i;
332
333 printf("\nCOMPUTE\n");
334
335 for (i = 0; i < NCAL; i++)
336 printf("\t%d %s\n", i+1, cal[i].descrip);
337
338 printf("\nChoice (0): ");
339 clearerr(stdin); gets(sbuf);
340 i = atoi(sbuf) - 1;
341 if (i < 0 || i >= NCAL)
342 return;
343 printf("\n");
344 if (setjmp(env) == 0) {
345 recover = 1;
346 gcalc(cal[i].value);
347 recover = 0;
348 }
349 printf("\n");
350 uwait();
351 }
352
353
354 uwait() /* wait for user after command, error */
355 {
356 printf("Hit return to continue: ");
357 while (getchar() != '\n')
358 ;
359 }