ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/igraph.c
Revision: 1.3
Committed: Fri Nov 14 00:14:40 2003 UTC (20 years, 4 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 1.2: +38 -28 lines
Log Message:
Continued ansification, and got rid of gets().

File Contents

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