6
* expression library definitions
14
#undef RS /* hp.pa <signal.h> grabs this!! */
16
#if _BLD_expr && defined(__EXPORT__)
17
#define extern __EXPORT__
19
#if !_BLD_expr && defined(__IMPORT__)
20
#define extern __IMPORT__
30
#define EX_VERSION 20000101L
36
#define EX_CHARSTRING (1<<0) /* '...' same as "..." */
37
#define EX_CONSTANT (1<<1) /* compile to constant expr */
38
#define EX_FATAL (1<<2) /* errors are fatal */
39
#define EX_INTERACTIVE (1<<3) /* interactive input */
40
#define EX_PURE (1<<4) /* no default symbols/keywords */
41
#define EX_QUALIFY (1<<5) /* '.' refs qualified in id tab */
42
#define EX_RETAIN (1<<6) /* retain expressions on redef */
43
#define EX_SIZED (1<<7) /* strings are sized buffers */
44
#define EX_STRICT (1<<8) /* don't override null label */
45
#define EX_UNDECLARED (1<<9) /* allow undeclared identifiers */
47
#define EX_CALL (-2) /* getval() function call elt */
48
#define EX_SCALAR (-1) /* getval() scalar elt */
50
#define EX_NAMELEN 32 /* default Exid_t.name length */
52
#define EXID(n,l,i,t,f) {{0},(l),(i),(t),(f),0,{0},n}
54
#define DELETE BREAK /* exexpr() delete `type' */
56
#define INTEGRAL(t) ((t)>=CHAR&&(t)<=UNSIGNED)
58
/* function type mechanism
59
* types are encoded in TBITS
60
* Thus, maximum # of parameters, including return type,
61
* is sizeof(Exid_t.type)/TBITS. Also see T in exgram.h
65
* arg 0 is the return value type
68
#define F 01 /* FLOATING */
69
#define I 02 /* INTEGER */
70
#define S 03 /* STRING */
73
#define TMASK ((1<<TBITS)-1)
74
#define A(n,t) ((t)<<((n)*TBITS)) /* function arg n is type t */
75
#define N(t) ((t)>>=TBITS) /* shift for next arg */
77
#define exalloc(p,n) exnewof(p,0,char,n,0)
78
#define exnewof(p,o,t,n,x) vmnewof((p)->vm,o,t,n,x)
79
#define exfree(p,x) vmfree((p)->vm,x)
80
#define exstrdup(p,s) vmstrdup((p)->vm,s)
82
#if LONG_MAX > INT_MAX
83
typedef int Exshort_t;
85
typedef short Exshort_t;
88
typedef EXSTYPE Extype_t;
90
union Exdata_u; typedef union Exdata_u Exdata_t;
91
struct Exdisc_s; typedef struct Exdisc_s Exdisc_t;
92
struct Exnode_s; typedef struct Exnode_s Exnode_t;
93
struct Expr_s; typedef struct Expr_s Expr_t;
94
struct Exref_s; typedef struct Exref_s Exref_t;
96
typedef int (*Exerror_f)(Expr_t*, Exdisc_t*, int, const char*, ...);
98
typedef struct /* user defined member type */
104
typedef struct Exid_s /* id symbol table info */
106
Dtlink_t link; /* symbol table link */
107
long lex; /* lex class */
108
long index; /* user defined index */
109
long type; /* symbol and arg types */
110
long flags; /* user defined flags */
111
Exnode_t* value; /* value */
112
Exlocal_t local; /* user defined local stuff */
113
char name[EX_NAMELEN];/* symbol name */
116
struct Exref_s /* . reference list */
118
Exref_t* next; /* next in list */
119
Exid_t* symbol; /* reference id symbol */
120
Exnode_t* index; /* optional reference index */
123
typedef struct /* sized buffer */
125
unsigned long size; /* buffer size */
126
char* data; /* buffer data */
134
Extype_t value; /* constant value */
135
Exid_t* reference; /* conversion reference symbol */
136
} constant; /* variable reference */
140
Exnode_t* left; /* left operand */
141
Exnode_t* right; /* right operand */
142
} operand; /* operands */
146
Exnode_t* statement; /* case label statement(s) */
147
Exnode_t* next; /* next case item */
148
Extype_t** constant; /* case label constant array */
149
} select; /* case item */
153
Exid_t* symbol; /* id symbol table entry */
154
Exref_t* reference; /* . reference list */
155
Exnode_t* index; /* array index expression */
156
Exnode_t* dyna; /* dynamic expression */
157
} variable; /* variable reference */
159
#ifdef _EX_DATA_PRIVATE_
165
struct Exnode_s /* expression tree node */
167
Exshort_t type; /* value type */
168
Exshort_t op; /* operator */
169
Exshort_t binary; /* data.operand.{left,right} ok */
170
Exshort_t pad_1; /* padding to help cc */
171
Exlocal_t local; /* user defined local stuff */
174
double (*floating)(char**); /* FLOATING return value */
175
Sflong_t(*integer)(char**); /* INTEGER|UNSIGNED return value*/
176
char* (*string)(char**); /* STRING return value */
177
} compiled; /* compiled function pointer */
178
Exdata_t data; /* node data */
180
#ifdef _EX_NODE_PRIVATE_
186
struct Exdisc_s /* discipline */
188
unsigned long version; /* EX_VERSION */
189
unsigned long flags; /* EX_* flags */
190
Exid_t* symbols; /* static symbols */
191
char** data; /* compiled function arg data */
192
char* lib; /* pathfind() lib */
193
char* type; /* pathfind() type */
194
int (*castf)(Expr_t*, Exnode_t*, const char*, int, Exid_t*, int, Exdisc_t*);
195
/* unknown cast function */
196
int (*convertf)(Expr_t*, Exnode_t*, int, Exid_t*, int, Exdisc_t*);
197
/* type conversion function */
198
Exerror_f errorf; /* error function */
199
Extype_t (*getf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, int, Exdisc_t*);
200
/* get value function */
201
Extype_t (*reff)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, char*, int, Exdisc_t*);
202
/* reference value function */
203
int (*setf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, int, Extype_t, Exdisc_t*);
204
/* set value function */
205
int (*matchf)(Expr_t*, Exnode_t*, const char*, Exnode_t*, const char*, void*, Exdisc_t*);
210
struct Expr_s /* ex program state */
212
const char* id; /* library id */
213
Dt_t* symbols; /* symbol table */
214
const char* more; /* more after %% (sp or != 0) */
215
Sfio_t* file[10]; /* io streams */
216
Vmalloc_t* vm; /* program store */
218
#ifdef _EX_PROG_PRIVATE_
224
struct Excc_s; typedef struct Excc_s Excc_t;
225
struct Exccdisc_s; typedef struct Exccdisc_s Exccdisc_t;
227
struct Exccdisc_s /* excc() discipline */
229
Sfio_t* text; /* text output stream */
230
char* id; /* symbol prefix */
231
unsigned long flags; /* EXCC_* flags */
232
int (*ccf)(Excc_t*, Exnode_t*, Exid_t*, Exref_t*, Exnode_t*, Exccdisc_t*);
233
/* program generator function */
236
struct Excc_s /* excc() state */
238
Expr_t* expr; /* exopen() state */
239
Exdisc_t* disc; /* exopen() discipline */
241
#ifdef _EX_CC_PRIVATE_
247
#if _BLD_expr && defined(__EXPORT__)
248
#define extern __EXPORT__
250
#if !_BLD_expr && defined(__IMPORT__)
251
#define extern __IMPORT__
254
extern Exid_t exbuiltin[];
258
#if _BLD_expr && defined(__EXPORT__)
259
#define extern __EXPORT__
262
extern Exnode_t* excast(Expr_t*, Exnode_t*, int, Exnode_t*, int);
263
extern int excc(Excc_t*, const char*, Exid_t*, int);
264
extern int exccclose(Excc_t*);
265
extern Excc_t* exccopen(Expr_t*, Exccdisc_t*);
266
extern void exclose(Expr_t*, int);
267
extern int excomp(Expr_t*, const char*, int, const char*, Sfio_t*);
268
extern char* excontext(Expr_t*, char*, int);
269
extern int exdump(Expr_t*, Exnode_t*, Sfio_t*);
270
extern void exerror(const char*, ...);
271
extern Extype_t exeval(Expr_t*, Exnode_t*, void*);
272
extern Exnode_t* exexpr(Expr_t*, const char*, Exid_t*, int);
273
extern void exfreenode(Expr_t*, Exnode_t*);
274
extern Exnode_t* exnewnode(Expr_t*, int, int, int, Exnode_t*, Exnode_t*);
275
extern Expr_t* exopen(Exdisc_t*);
276
extern int expop(Expr_t*);
277
extern int expush(Expr_t*, const char*, int, const char*, Sfio_t*);
278
extern int exrewind(Expr_t*);
279
extern void exstatement(Expr_t*);
280
extern int extoken(Expr_t*);
281
extern char* extype(int);
282
extern Extype_t exzero(int);