Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libexpr/expr.h
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1989-2012 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
/*
22
* Glenn Fowler
23
* AT&T Research
24
*
25
* expression library definitions
26
*/
27
28
#ifndef _EXPR_H
29
#define _EXPR_H
30
31
#include <ast.h>
32
33
#undef RS /* hp.pa <signal.h> grabs this!! */
34
35
#if _BLD_expr && defined(__EXPORT__)
36
#define extern __EXPORT__
37
#endif
38
#if !_BLD_expr && defined(__IMPORT__)
39
#define extern extern __IMPORT__
40
#endif
41
42
/*
43
* bison -pPREFIX misses YYSTYPE
44
*/
45
46
#if defined(YYSTYPE) || defined(YYBISON)
47
#define EXSTYPE YYSTYPE
48
#else
49
#include <exparse.h>
50
#if defined(YYSTYPE) || defined(yystype)
51
#define EXSTYPE YYSTYPE
52
#else
53
#if defined(YYSTYPE) || defined(YYSTYPE_IS_DECLARED)
54
#define EXSTYPE YYSTYPE
55
#endif
56
#endif
57
#endif
58
59
#undef extern
60
61
#include <cdt.h>
62
#include <vmalloc.h>
63
64
#define EX_VERSION 20000101L
65
66
/*
67
* flags
68
*/
69
70
#define EX_CHARSTRING (1<<0) /* '...' same as "..." */
71
#define EX_CONSTANT (1<<1) /* compile to constant expr */
72
#define EX_FATAL (1<<2) /* errors are fatal */
73
#define EX_INTERACTIVE (1<<3) /* interactive input */
74
#define EX_PURE (1<<4) /* no default symbols/keywords */
75
#define EX_QUALIFY (1<<5) /* '.' refs qualified in id tab */
76
#define EX_RETAIN (1<<6) /* retain expressions on redef */
77
#define EX_SIZED (1<<7) /* strings are sized buffers */
78
#define EX_STRICT (1<<8) /* don't override null label */
79
#define EX_UNDECLARED (1<<9) /* allow undeclared identifiers */
80
81
#define EX_CALL (-2) /* getval() function call elt */
82
#define EX_SCALAR (-1) /* getval() scalar elt */
83
84
#define EX_NAMELEN 32 /* default Exid_t.name length */
85
86
#define EXID(n,l,i,t,f) {{0},(l),(i),(t),(f),0,{0},0,n}
87
88
#define DELETE MINTOKEN /* exexpr() delete `type' */
89
90
#define INTEGRAL(t) ((t)>=CHAR&&(t)<=UNSIGNED)
91
92
/*
93
* arg 0 is the return value type
94
*/
95
96
#define F 01 /* FLOATING */
97
#define I 02 /* INTEGER */
98
#define S 03 /* STRING */
99
100
#define A(n,t) ((t)<<((n)*2)) /* function arg n is type t */
101
#define N(t) ((t)>>=2) /* shift for next arg */
102
#define T(t) a2t[(t)&03] /* get actual type for t */
103
104
#define exalloc(p,n) exnewof(p,0,char,n,0)
105
#define exnewof(p,o,t,n,x) vmnewof((p)->vm,o,t,n,x)
106
#define exfree(p,x) vmfree((p)->vm,x)
107
#define exstrdup(p,s) vmstrdup((p)->vm,s)
108
109
#if LONG_MAX > INT_MAX
110
typedef int Exshort_t;
111
#else
112
typedef short Exshort_t;
113
#endif
114
115
typedef EXSTYPE Extype_t;
116
117
union Exdata_u; typedef union Exdata_u Exdata_t;
118
struct Exdisc_s; typedef struct Exdisc_s Exdisc_t;
119
struct Exnode_s; typedef struct Exnode_s Exnode_t;
120
struct Expr_s; typedef struct Expr_s Expr_t;
121
struct Exref_s; typedef struct Exref_s Exref_t;
122
123
typedef struct Exlocal_s /* user defined member type */
124
{
125
Sflong_t number;
126
char* pointer;
127
} Exlocal_t;
128
129
typedef struct Exid_s /* id symbol table info */
130
{
131
Dtlink_t link; /* symbol table link */
132
long lex; /* lex class */
133
long index; /* user defined index */
134
long type; /* symbol and arg types */
135
long flags; /* user defined flags */
136
Exnode_t* value; /* value */
137
Exlocal_t local; /* user defined local stuff */
138
long isstatic; /* static */
139
char name[EX_NAMELEN];/* symbol name */
140
} Exid_t;
141
142
struct Exref_s /* . reference list */
143
{
144
Exref_t* next; /* next in list */
145
Exid_t* symbol; /* reference id symbol */
146
Exnode_t* index; /* optional reference index */
147
};
148
149
typedef struct Exbuf_s /* sized buffer */
150
{
151
unsigned long size; /* buffer size */
152
char* data; /* buffer data */
153
} Exbuf_t;
154
155
union Exdata_u
156
{
157
158
struct
159
{
160
Extype_t value; /* constant value */
161
Exid_t* reference; /* conversion reference symbol */
162
} constant; /* variable reference */
163
164
struct
165
{
166
Exnode_t* left; /* left operand */
167
Exnode_t* right; /* right operand */
168
Exnode_t* last; /* for cons */
169
} operand; /* operands */
170
171
struct
172
{
173
Exnode_t* statement; /* case label statement(s) */
174
Exnode_t* next; /* next case item */
175
Extype_t** constant; /* case label constant array */
176
} select; /* case item */
177
178
struct
179
{
180
Exid_t* symbol; /* id symbol table entry */
181
Exref_t* reference; /* . reference list */
182
Exnode_t* index; /* array index expression */
183
} variable; /* variable reference */
184
185
#ifdef _EX_DATA_PRIVATE_
186
_EX_DATA_PRIVATE_
187
#endif
188
189
};
190
191
struct Exnode_s /* expression tree node */
192
{
193
Exshort_t type; /* value type */
194
Exshort_t op; /* operator */
195
Exshort_t binary; /* data.operand.{left,right} ok */
196
Exshort_t pad_1; /* padding to help cc */
197
Exlocal_t local; /* user defined local stuff */
198
union
199
{
200
double (*floating)(char**); /* FLOATING return value */
201
Sflong_t(*integer)(char**); /* INTEGER|UNSIGNED return value*/
202
char* (*string)(char**); /* STRING return value */
203
} compiled; /* compiled function pointer */
204
Exdata_t data; /* node data */
205
206
#ifdef _EX_NODE_PRIVATE_
207
_EX_NODE_PRIVATE_
208
#endif
209
210
};
211
212
struct Exdisc_s /* discipline */
213
{
214
unsigned long version; /* EX_VERSION */
215
unsigned long flags; /* EX_* flags */
216
Exid_t* symbols; /* static symbols */
217
char** data; /* compiled function arg data */
218
char* lib; /* pathfind() lib */
219
char* type; /* pathfind() type */
220
int (*castf)(Expr_t*, Exnode_t*, const char*, int, Exid_t*, int, Exdisc_t*);
221
/* unknown cast function */
222
int (*convertf)(Expr_t*, Exnode_t*, int, Exid_t*, int, Exdisc_t*);
223
/* type conversion function */
224
Error_f errorf; /* error function */
225
Extype_t (*getf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, int, Exdisc_t*);
226
/* get value function */
227
Extype_t (*reff)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, char*, int, Exdisc_t*);
228
/* reference value function */
229
int (*setf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, int, Extype_t, Exdisc_t*);
230
/* set value function */
231
int (*matchf)(Expr_t*, Exnode_t*, const char*, Exnode_t*, const char*, void*, Exdisc_t*);
232
};
233
234
struct Expr_s /* ex program state */
235
{
236
const char* id; /* library id */
237
Dt_t* symbols; /* symbol table */
238
const char* more; /* more after %% (sp or != 0) */
239
Sfio_t* file[10]; /* io streams */
240
Vmalloc_t* vm; /* program store */
241
242
#ifdef _EX_PROG_PRIVATE_
243
_EX_PROG_PRIVATE_
244
#endif
245
246
};
247
248
struct Excc_s; typedef struct Excc_s Excc_t;
249
struct Exccdisc_s; typedef struct Exccdisc_s Exccdisc_t;
250
251
struct Exccdisc_s /* excc() discipline */
252
{
253
Sfio_t* text; /* text output stream */
254
char* id; /* symbol prefix */
255
unsigned long flags; /* EXCC_* flags */
256
int (*ccf)(Excc_t*, Exnode_t*, Exid_t*, Exref_t*, Exnode_t*, Exccdisc_t*);
257
/* program generator function */
258
};
259
260
struct Excc_s /* excc() state */
261
{
262
Expr_t* expr; /* exopen() state */
263
Exdisc_t* disc; /* exopen() discipline */
264
265
#ifdef _EX_CC_PRIVATE_
266
_EX_CC_PRIVATE_
267
#endif
268
269
};
270
271
#if _BLD_expr && defined(__EXPORT__)
272
#define extern __EXPORT__
273
#endif
274
275
extern Exnode_t* excast(Expr_t*, Exnode_t*, int, Exnode_t*, int);
276
extern int excc(Excc_t*, const char*, Exid_t*, int);
277
extern int exccclose(Excc_t*);
278
extern Excc_t* exccopen(Expr_t*, Exccdisc_t*);
279
extern void exclose(Expr_t*, int);
280
extern int excomp(Expr_t*, const char*, int, const char*, Sfio_t*);
281
extern char* excontext(Expr_t*, char*, int);
282
extern int exdump(Expr_t*, Exnode_t*, Sfio_t*);
283
extern void exerror(const char*, ...);
284
extern Extype_t exeval(Expr_t*, Exnode_t*, void*);
285
extern Exnode_t* exexpr(Expr_t*, const char*, Exid_t*, int);
286
extern void exfreenode(Expr_t*, Exnode_t*);
287
extern Exnode_t* exnewnode(Expr_t*, int, int, int, Exnode_t*, Exnode_t*);
288
extern char* exnospace(void);
289
extern Expr_t* exopen(Exdisc_t*);
290
extern int expop(Expr_t*);
291
extern int expush(Expr_t*, const char*, int, const char*, Sfio_t*);
292
extern int exrewind(Expr_t*);
293
extern char* exstash(Sfio_t*, Vmalloc_t*);
294
extern void exstatement(Expr_t*);
295
extern int extoken(Expr_t*);
296
extern char* extype(int);
297
extern Extype_t exzero(int);
298
299
#undef extern
300
301
#endif
302
303