ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cal/calc.c
Revision: 1.8
Committed: Thu Dec 19 16:56:31 2013 UTC (10 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R2P1, rad5R3
Changes since 1.7: +10 -5 lines
Log Message:
Minor changes following on RAYPATH search

File Contents

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