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

# User Rev Content
1 greg 2.6 /* RCSid: $Id$ */
2 greg 1.1 /*
3     * calcomp.h - header file for expression parser.
4 greg 2.6 */
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 greg 1.1 *
39 greg 2.6 * 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 greg 1.1 */
62     /* EPNODE types */
63 greg 2.2 #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 greg 1.4 /* also: '+', '-', '*', '/', '^', '=', ':' */
72 greg 1.1
73     typedef struct {
74     char *fname; /* function name */
75 greg 1.5 short nargs; /* # of required arguments */
76     short atyp; /* assignment type (':' or '=') */
77 greg 1.1 double (*f)(); /* pointer to function */
78     } LIBR; /* a library function */
79    
80     typedef struct epnode {
81 greg 2.2 int type; /* node type */
82 greg 1.1 struct epnode *sibling; /* next child this level */
83     union {
84     struct epnode *kid; /* first child */
85 greg 2.2 double num; /* number */
86 greg 1.1 char *name; /* symbol name */
87     int chan; /* channel number */
88 greg 2.4 unsigned long tick; /* timestamp */
89 greg 1.1 struct vardef {
90     char *name; /* variable name */
91 greg 2.2 int nlinks; /* number of references */
92 greg 1.1 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 gregl 2.5 #define MAXWORD 127 /* maximum word/id length */
102 greg 2.2 #define CNTXMARK '`' /* context mark */
103 greg 1.6
104 greg 2.2 #define isid(c) (isalnum(c) || (c) == '_' || \
105 greg 1.6 (c) == '.' || (c) == CNTXMARK)
106    
107 greg 2.6 #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 greg 1.1 extern double (*eoper[])();
118 greg 2.4 extern unsigned long eclock;
119 greg 2.6 extern unsigned int esupport;
120     extern EPNODE *curfunc;
121 greg 1.1 extern int nextc;
122    
123 greg 2.6 #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