ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cal/calc.c
Revision: 1.6
Committed: Tue Dec 9 15:55:46 2003 UTC (20 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad4R1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9
Changes since 1.5: +13 -6 lines
Log Message:
Added ability for calc to read on a continued line

File Contents

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