--- ray/src/common/calcomp.h 2003/08/04 19:20:26 2.15 +++ ray/src/common/calcomp.h 2024/02/26 18:16:35 2.26 @@ -1,4 +1,4 @@ -/* RCSid $Id: calcomp.h,v 2.15 2003/08/04 19:20:26 greg Exp $ */ +/* RCSid $Id: calcomp.h,v 2.26 2024/02/26 18:16:35 greg Exp $ */ /* * calcomp.h - header file for expression parser. */ @@ -17,7 +17,7 @@ extern "C" { #define CHAN 4 #define FUNC 5 #define ARG 6 -#define TICK 7 +#define CLKT 7 #define SYM 8 /* also: '+', '-', '*', '/', '^', '=', ':' */ @@ -25,12 +25,10 @@ typedef struct { char *fname; /* function name */ short nargs; /* # of required arguments */ short atyp; /* assignment type (':' or '=') */ - double (*f)(); /* pointer to function */ + double (*f)(char *); /* pointer to function */ } LIBR; /* a library function */ typedef struct epnode { - int type; /* node type */ - struct epnode *sibling; /* next child this level */ union { struct epnode *kid; /* first child */ double num; /* number */ @@ -45,10 +43,15 @@ typedef struct epnode { struct vardef *next; /* next in hash list */ } *ln; /* link */ } v; /* value */ + struct epnode *sibling; /* next child this level */ + short type; /* node type */ + short nkids; /* child count (neg if array) */ } EPNODE; /* an expression node */ typedef struct vardef VARDEF; /* a variable definition */ +#define nekids(ep) abs((ep)->nkids) + #define RMAXWORD 127 /* maximum word/id length */ #define CNTXMARK '`' /* context mark */ @@ -57,6 +60,10 @@ typedef struct vardef VARDEF; /* a variable definitio #define evalue(ep) (*eoper[(ep)->type])(ep) +#define dfn_name(ep) ((ep)->v.kid->type == SYM ? \ + (ep)->v.kid->v.name : \ + (ep)->v.kid->v.kid->v.name) + /* flags to set in esupport */ #define E_VARIABLE 001 #define E_FUNCTION 002 @@ -70,25 +77,25 @@ extern unsigned long eclock; extern unsigned int esupport; extern EPNODE *curfunc; extern int nextc; - +extern int eofc; /* defined in biggerlib.c */ extern void biggerlib(void); - /* defined in caldefn.c */ extern void fcompile(char *fname); extern void scompile(char *str, char *fname, int ln); extern double varvalue(char *vname); extern double evariable(EPNODE *ep); -extern void varset(char *fname, int assign, double val); +extern void varset(char *vname, int assign, double val); extern void dclear(char *name); extern void dremove(char *name); extern int vardefined(char *name); -extern char *setcontext(char *ctx); +extern char *calcontext(char *ctx); extern char *pushcontext(char *ctx); extern char *popcontext(void); extern char *qualname(char *nam, int lvl); extern int incontext(char *qn); extern void chanout(void (*cs)(int n, double v)); +extern void doptimize(int activate); extern void dcleanup(int lvl); extern EPNODE *dlookup(char *name); extern VARDEF *varlookup(char *name); @@ -106,16 +113,16 @@ extern EPNODE *getchan(void); extern EPNODE *eparse(char *expr); extern double eval(char *expr); extern int epcmp(EPNODE *ep1, EPNODE *ep2); -extern void epfree(EPNODE *epar); +extern void epfree(EPNODE *epar, int frep); +extern void epoptimize(EPNODE *epar); extern EPNODE *ekid(EPNODE *ep, int n); -extern int nekids(EPNODE *ep); extern void initfile(FILE *fp, char *fn, int ln); extern void initstr(char *s, char *fn, int ln); extern void getscanpos(char **fnp, int *lnp, char **spp, FILE **fpp); extern int scan(void); extern char *long2ascii(long l); extern void syntax(char *err); -extern void addekid(EPNODE *ep, EPNODE *ekid); +extern void addekid(EPNODE *ep, EPNODE *ek); extern char *getname(void); extern int getinum(void); extern double getnum(void); @@ -130,29 +137,21 @@ extern int isconstfun(EPNODE *ep); /* defined in calfunc.c */ extern int fundefined(char *fname); extern double funvalue(char *fname, int n, double *a); -extern void funset(char *fname, int nargs, int assign, double (*fptr)()); +extern void funset(char *fname, int nargs, int assign, + double (*fptr)(char *)); extern int nargum(void); extern double argument(int n); extern VARDEF *argf(int n); extern char *argfun(int n); extern double efunc(EPNODE *ep); +extern double eargument(EPNODE *ep); extern LIBR *liblookup(char *fname); extern void libupdate(char *fn); /* defined in calprnt.c */ extern void eprint(EPNODE *ep, FILE *fp); extern void dprint(char *name, FILE *fp); - /* defined in savestr.c */ -extern char *savestr(char *str); -extern void freestr(char *s); -extern int shash(char *s); - /* defined in ealloc.c */ -extern char *emalloc(unsigned int n); -extern char *ecalloc(unsigned int ne, unsigned int es); -extern char *erealloc(char *cp, unsigned int n); -extern void efree(char *cp); /* defined by client */ extern double chanvalue(int n); - #ifdef __cplusplus }