ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cal/calc.c
Revision: 1.7
Committed: Thu Dec 19 16:38:12 2013 UTC (10 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.6: +13 -6 lines
Log Message:
Changed rcalc and icalc to search RAYPATH for input *.cal files

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 1.7 static const char RCSid[] = "$Id: calc.c,v 1.6 2003/12/09 15:55:46 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     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 greg 1.7 for (i = 1; i < argc; i++) {
46     char *path = getpath(argv[i], getrlibpath(), 0);
47     if (path == NULL) {
48     eputs(argv[0]);
49     eputs(": cannot find file '");
50     eputs(argv[i]);
51     eputs("'\n");
52     quit(1);
53     }
54     fcompile(path);
55     }
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     fcompile(cp);
104     eclock++;
105     continue;
106     }
107 schorsch 1.3 if ((cp = strchr(expr, '=')) != NULL ||
108     (cp = strchr(expr, ':')) != NULL) {
109 greg 1.1 if (cp[1])
110     scompile(expr, NULL, 0);
111     else if (*cp == '=') {
112     *cp = '\0';
113     if (!strcmp(expr, "*"))
114     dcleanup(1);
115     else
116     dclear(expr);
117     } else {
118     *cp = '\0';
119     if (!strcmp(expr, "*"))
120     dcleanup(2);
121     else
122     dremove(expr);
123     }
124     eclock++;
125     } else {
126     printf("$%d=%.9g\n", nres+1,
127     result[nres%MAXRES] = eval(expr));
128     nres++;
129     }
130     }
131    
132     recover = 0;
133     quit(0);
134 schorsch 1.5 return 0; /* pro forma exit */
135 greg 1.1 }
136    
137    
138     double
139     chanvalue(n) /* return channel value */
140     int n;
141     {
142     if (n == 0)
143     n = nres;
144     else if (n > nres || nres-n >= MAXRES) {
145     fprintf(stderr, "$%d: illegal result\n", n);
146     return(0.0);
147     }
148     return(result[(n-1)%MAXRES]);
149     }
150    
151    
152     void
153     eputs(msg)
154     char *msg;
155     {
156     fputs(msg, stderr);
157     }
158    
159    
160     void
161     wputs(msg)
162     char *msg;
163     {
164     eputs(msg);
165     }
166    
167    
168     void
169     quit(code)
170     int code;
171     {
172     if (recover) /* a cavalier approach */
173     longjmp(env, 1);
174     exit(code);
175     }