ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/calcomp.h
Revision: 2.6
Committed: Sat Feb 22 02:07:21 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.5: +232 -15 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 /* RCSid: $Id$ */
2 /*
3 * calcomp.h - header file for expression parser.
4 */
5
6 /* ====================================================================
7 * The Radiance Software License, Version 1.0
8 *
9 * Copyright (c) 1990 - 2002 The Regents of the University of California,
10 * through Lawrence Berkeley National Laboratory. All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in
21 * the documentation and/or other materials provided with the
22 * distribution.
23 *
24 * 3. The end-user documentation included with the redistribution,
25 * if any, must include the following acknowledgment:
26 * "This product includes Radiance software
27 * (http://radsite.lbl.gov/)
28 * developed by the Lawrence Berkeley National Laboratory
29 * (http://www.lbl.gov/)."
30 * Alternately, this acknowledgment may appear in the software itself,
31 * if and wherever such third-party acknowledgments normally appear.
32 *
33 * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
34 * and "The Regents of the University of California" must
35 * not be used to endorse or promote products derived from this
36 * software without prior written permission. For written
37 * permission, please contact [email protected].
38 *
39 * 5. Products derived from this software may not be called "Radiance",
40 * nor may "Radiance" appear in their name, without prior written
41 * permission of Lawrence Berkeley National Laboratory.
42 *
43 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
44 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
45 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
46 * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
47 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
50 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
51 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
52 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
53 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 * SUCH DAMAGE.
55 * ====================================================================
56 *
57 * This software consists of voluntary contributions made by many
58 * individuals on behalf of Lawrence Berkeley National Laboratory. For more
59 * information on Lawrence Berkeley National Laboratory, please see
60 * <http://www.lbl.gov/>.
61 */
62 /* EPNODE types */
63 #define VAR 1
64 #define NUM 2
65 #define UMINUS 3
66 #define CHAN 4
67 #define FUNC 5
68 #define ARG 6
69 #define TICK 7
70 #define SYM 8
71 /* also: '+', '-', '*', '/', '^', '=', ':' */
72
73 typedef struct {
74 char *fname; /* function name */
75 short nargs; /* # of required arguments */
76 short atyp; /* assignment type (':' or '=') */
77 double (*f)(); /* pointer to function */
78 } LIBR; /* a library function */
79
80 typedef struct epnode {
81 int type; /* node type */
82 struct epnode *sibling; /* next child this level */
83 union {
84 struct epnode *kid; /* first child */
85 double num; /* number */
86 char *name; /* symbol name */
87 int chan; /* channel number */
88 unsigned long tick; /* timestamp */
89 struct vardef {
90 char *name; /* variable name */
91 int nlinks; /* number of references */
92 struct epnode *def; /* definition */
93 LIBR *lib; /* library definition */
94 struct vardef *next; /* next in hash list */
95 } *ln; /* link */
96 } v; /* value */
97 } EPNODE; /* an expression node */
98
99 typedef struct vardef VARDEF; /* a variable definition */
100
101 #define MAXWORD 127 /* maximum word/id length */
102 #define CNTXMARK '`' /* context mark */
103
104 #define isid(c) (isalnum(c) || (c) == '_' || \
105 (c) == '.' || (c) == CNTXMARK)
106
107 #define evalue(ep) (*eoper[(ep)->type])(ep)
108
109 /* flags to set in esupport */
110 #define E_VARIABLE 001
111 #define E_FUNCTION 002
112 #define E_INCHAN 004
113 #define E_OUTCHAN 010
114 #define E_RCONST 020
115 #define E_REDEFW 040
116
117 extern double (*eoper[])();
118 extern unsigned long eclock;
119 extern unsigned int esupport;
120 extern EPNODE *curfunc;
121 extern int nextc;
122
123 #ifdef NOPROTO
124
125 extern void fcompile();
126 extern void scompile();
127 extern double varvalue();
128 extern double evariable();
129 extern void varset();
130 extern void dclear();
131 extern void dremove();
132 extern int vardefined();
133 extern char *setcontext();
134 extern char *pushcontext();
135 extern char *popcontext();
136 extern char *qualname();
137 extern int incontext();
138 extern void chanout();
139 extern void dcleanup();
140 extern EPNODE *dlookup();
141 extern VARDEF *varlookup();
142 extern VARDEF *varinsert();
143 extern void varfree();
144 extern EPNODE *dfirst();
145 extern EPNODE *dnext();
146 extern EPNODE *dpop();
147 extern void dpush();
148 extern void addchan();
149 extern void getstatement();
150 extern EPNODE *getdefn();
151 extern EPNODE *getchan();
152 extern EPNODE *eparse();
153 extern double eval();
154 extern int epcmp();
155 extern void epfree();
156 extern EPNODE *ekid();
157 extern int nekids();
158 extern void initfile();
159 extern void initstr();
160 extern void getscanpos();
161 extern int scan();
162 extern char *long2ascii();
163 extern void syntax();
164 extern void addekid();
165 extern char *getname();
166 extern int getinum();
167 extern double getnum();
168 extern EPNODE *getE1();
169 extern EPNODE *getE2();
170 extern EPNODE *getE3();
171 extern EPNODE *getE4();
172 extern EPNODE *getE5();
173 extern EPNODE *rconst();
174 extern int isconstvar();
175 extern int isconstfun();
176 extern int fundefined();
177 extern double funvalue();
178 extern void funset();
179 extern int nargum();
180 extern double argument();
181 extern VARDEF *argf();
182 extern char *argfun();
183 extern double efunc();
184 extern LIBR *liblookup();
185 extern void libupdate();
186 extern void eprint();
187 extern void dprint();
188 extern char *savestr();
189 extern void freestr();
190 extern int shash();
191 extern char *emalloc();
192 extern char *ecalloc();
193 extern char *erealloc();
194 extern void efree();
195 extern void eputs();
196 extern void wputs();
197 extern void quit();
198
199 extern double chanvalue();
200
201 #else
202 /* defined in caldefn.c */
203 extern void fcompile(char *fname);
204 extern void scompile(char *str, char *fname, int ln);
205 extern double varvalue(char *vname);
206 extern double evariable(EPNODE *ep);
207 extern void varset(char *fname, int assign, double val);
208 extern void dclear(char *name);
209 extern void dremove(char *name);
210 extern int vardefined(char *name);
211 extern char *setcontext(char *ctx);
212 extern char *pushcontext(char *ctx);
213 extern char *popcontext(void);
214 extern char *qualname(char *nam, int lvl);
215 extern int incontext(char *qn);
216 extern void chanout(int (*cs)());
217 extern void dcleanup(int lvl);
218 extern EPNODE *dlookup(char *name);
219 extern VARDEF *varlookup(char *name);
220 extern VARDEF *varinsert(char *name);
221 extern void varfree(VARDEF *ln);
222 extern EPNODE *dfirst(void);
223 extern EPNODE *dnext(void);
224 extern EPNODE *dpop(char *name);
225 extern void dpush(char *nm, EPNODE *ep);
226 extern void addchan(EPNODE *sp);
227 extern void getstatement();
228 extern EPNODE *getdefn();
229 extern EPNODE *getchan();
230 /* defined in calexpr.c */
231 extern EPNODE *eparse(char *expr);
232 extern double eval(char *expr);
233 extern int epcmp(EPNODE *ep1, EPNODE *ep2);
234 extern void epfree(EPNODE *epar);
235 extern EPNODE *ekid(EPNODE *ep, int n);
236 extern int nekids(EPNODE *ep);
237 extern void initfile(FILE *fp, char *fn, int ln);
238 extern void initstr(char *s, char *fn, int ln);
239 extern void getscanpos(char **fnp, int *lnp, char **spp, FILE **fpp);
240 extern int scan(void);
241 extern char *long2ascii(long l);
242 extern void syntax(char *err);
243 extern void addekid(EPNODE *ep, EPNODE *ekid);
244 extern char *getname(void);
245 extern int getinum(void);
246 extern double getnum(void);
247 extern EPNODE *getE1(void);
248 extern EPNODE *getE2(void);
249 extern EPNODE *getE3(void);
250 extern EPNODE *getE4(void);
251 extern EPNODE *getE5(void);
252 extern EPNODE *rconst(EPNODE *epar);
253 extern int isconstvar(EPNODE *ep);
254 extern int isconstfun(EPNODE *ep);
255 /* defined in calfunc.c */
256 extern int fundefined(char *fname);
257 extern double funvalue(char *fname, int n, double *a);
258 extern void funset(char *fname, int nargs, int assign, double (*fptr)());
259 extern int nargum(void);
260 extern double argument(int n);
261 extern VARDEF *argf(int n);
262 extern char *argfun(int n);
263 extern double efunc(EPNODE *ep);
264 extern LIBR *liblookup(char *fname);
265 extern void libupdate(char *fn);
266 /* defined in calprnt.c */
267 extern void eprint(EPNODE *ep, FILE *fp);
268 extern void dprint(char *name, FILE *fp);
269 /* defined in savestr.c */
270 extern char *savestr(char *str);
271 extern void freestr(char *s);
272 extern int shash(char *s);
273 /* defined in ealloc.c */
274 extern char *emalloc(unsigned int n);
275 extern char *ecalloc(unsigned int ne, unsigned int es);
276 extern char *erealloc(char *cp, unsigned int n);
277 extern void efree(char *cp);
278 /* miscellaneous */
279 extern void eputs(char *s);
280 extern void wputs(char *s);
281 extern void quit(int code);
282 /* defined by client */
283 extern double chanvalue(int n);
284
285 #endif