ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cal/calc.c
Revision: 1.5
Committed: Fri Nov 14 17:31:24 2003 UTC (21 years ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 1.4: +3 -1 lines
Log Message:
Reduced compile warnings.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: calc.c,v 1.4 2003/07/17 09:21:29 schorsch Exp $";
3 #endif
4 /*
5 * calc.c - simple algebraic desk calculator program.
6 *
7 * 4/1/86
8 */
9
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <setjmp.h>
14 #include <ctype.h>
15
16 #include "rterror.h"
17 #include "calcomp.h"
18
19 #define MAXRES 100
20
21 double result[MAXRES];
22 int nres = 0;
23
24 jmp_buf env;
25 int recover = 0;
26
27
28 int
29 main(argc, argv)
30 int argc;
31 char *argv[];
32 {
33 char expr[512];
34 FILE *fp;
35 int i;
36 register char *cp;
37
38 esupport |= E_VARIABLE|E_INCHAN|E_FUNCTION;
39 esupport &= ~(E_REDEFW|E_RCONST|E_OUTCHAN);
40 #ifdef BIGGERLIB
41 biggerlib();
42 #endif
43 varset("PI", ':', 3.14159265358979323846);
44
45 for (i = 1; i < argc; i++)
46 fcompile(argv[i]);
47
48 setjmp(env);
49 recover = 1;
50 eclock++;
51
52 while (fgets(expr, sizeof(expr), stdin) != NULL) {
53 for (cp = expr; *cp && *cp != '\n'; cp++)
54 ;
55 *cp = '\0';
56 switch (expr[0]) {
57 case '\0':
58 continue;
59 case '?':
60 for (cp = expr+1; isspace(*cp); cp++)
61 ;
62 if (*cp)
63 dprint(cp, stdout);
64 else
65 dprint(NULL, stdout);
66 continue;
67 case '>':
68 for (cp = expr+1; isspace(*cp); cp++)
69 ;
70 if (!*cp) {
71 eputs("file name required\n");
72 continue;
73 }
74 if ((fp = fopen(cp, "w")) == NULL) {
75 eputs(cp);
76 eputs(": cannot open\n");
77 continue;
78 }
79 dprint(NULL, fp);
80 fclose(fp);
81 continue;
82 case '<':
83 for (cp = expr+1; isspace(*cp); cp++)
84 ;
85 if (!*cp) {
86 eputs("file name required\n");
87 continue;
88 }
89 fcompile(cp);
90 eclock++;
91 continue;
92 }
93 if ((cp = strchr(expr, '=')) != NULL ||
94 (cp = strchr(expr, ':')) != NULL) {
95 if (cp[1])
96 scompile(expr, NULL, 0);
97 else if (*cp == '=') {
98 *cp = '\0';
99 if (!strcmp(expr, "*"))
100 dcleanup(1);
101 else
102 dclear(expr);
103 } else {
104 *cp = '\0';
105 if (!strcmp(expr, "*"))
106 dcleanup(2);
107 else
108 dremove(expr);
109 }
110 eclock++;
111 } else {
112 printf("$%d=%.9g\n", nres+1,
113 result[nres%MAXRES] = eval(expr));
114 nres++;
115 }
116 }
117
118 recover = 0;
119 quit(0);
120 return 0; /* pro forma exit */
121 }
122
123
124 double
125 chanvalue(n) /* return channel value */
126 int n;
127 {
128 if (n == 0)
129 n = nres;
130 else if (n > nres || nres-n >= MAXRES) {
131 fprintf(stderr, "$%d: illegal result\n", n);
132 return(0.0);
133 }
134 return(result[(n-1)%MAXRES]);
135 }
136
137
138 void
139 eputs(msg)
140 char *msg;
141 {
142 fputs(msg, stderr);
143 }
144
145
146 void
147 wputs(msg)
148 char *msg;
149 {
150 eputs(msg);
151 }
152
153
154 void
155 quit(code)
156 int code;
157 {
158 if (recover) /* a cavalier approach */
159 longjmp(env, 1);
160 exit(code);
161 }