--- ray/src/common/calcomp.h 2023/09/26 18:33:14 2.24 +++ ray/src/common/calcomp.h 2025/12/03 18:14:26 2.28 @@ -1,4 +1,4 @@ -/* RCSid $Id: calcomp.h,v 2.24 2023/09/26 18:33:14 greg Exp $ */ +/* RCSid $Id: calcomp.h,v 2.28 2025/12/03 18:14:26 greg Exp $ */ /* * calcomp.h - header file for expression parser. */ @@ -26,8 +26,16 @@ typedef struct { short nargs; /* # of required arguments */ short atyp; /* assignment type (':' or '=') */ double (*f)(char *); /* pointer to function */ -} LIBR; /* a library function */ +} ELIBR; /* a library function */ +typedef struct vardef { + char *name; /* variable name */ + int nlinks; /* number of references */ + struct epnode *def; /* definition */ + ELIBR *lib; /* library definition */ + struct vardef *next; /* next in hash list */ +} VARDEF; /* a variable definition */ + typedef struct epnode { union { struct epnode *kid; /* first child */ @@ -35,19 +43,14 @@ typedef struct epnode { char *name; /* symbol name */ int chan; /* channel number */ unsigned long tick; /* timestamp */ - struct vardef { - char *name; /* variable name */ - int nlinks; /* number of references */ - struct epnode *def; /* definition */ - LIBR *lib; /* library definition */ - struct vardef *next; /* next in hash list */ - } *ln; /* link */ + VARDEF *ln; /* variable definition link */ } v; /* value */ struct epnode *sibling; /* next child this level */ - int type; /* node type */ + 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 */ @@ -72,7 +75,7 @@ typedef struct vardef VARDEF; /* a variable definitio extern double (*eoper[])(EPNODE *); extern unsigned long eclock; extern unsigned int esupport; -extern EPNODE *curfunc; +extern EPNODE *ecurfunc; extern int nextc; extern int eofc; /* defined in biggerlib.c */ @@ -92,6 +95,7 @@ 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); @@ -101,24 +105,24 @@ extern EPNODE *dfirst(void); extern EPNODE *dnext(void); extern EPNODE *dpop(char *name); extern void dpush(char *nm, EPNODE *ep); -extern void addchan(EPNODE *sp); -extern void getstatement(void); -extern EPNODE *getdefn(void); -extern EPNODE *getchan(void); +extern void eaddchan(EPNODE *sp); +extern void egetstatement(void); +extern EPNODE *egetdefn(void); +extern EPNODE *egetchan(void); /* defined in calexpr.c */ 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 int escan(void); extern char *long2ascii(long l); -extern void syntax(char *err); -extern void addekid(EPNODE *ep, EPNODE *ekid); +extern void esyntax(char *err); +extern void addekid(EPNODE *ep, EPNODE *ek); extern char *getname(void); extern int getinum(void); extern double getnum(void); @@ -137,11 +141,12 @@ 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 VARDEF *eargf(int n); +extern char *eargfun(int n); extern double efunc(EPNODE *ep); -extern LIBR *liblookup(char *fname); -extern void libupdate(char *fn); +extern double eargument(EPNODE *ep); +extern ELIBR *eliblookup(char *fname); +extern void elibupdate(char *fn); /* defined in calprnt.c */ extern void eprint(EPNODE *ep, FILE *fp); extern void dprint(char *name, FILE *fp);