Graphviz 12.0.1~dev.20240716.0800
Loading...
Searching...
No Matches
expr.h
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15/*
16 * Glenn Fowler
17 * AT&T Research
18 *
19 * expression library definitions
20 */
21
22#ifndef _EXPR_H
23#define _EXPR_H
24
25#include <ast/ast.h>
26#include <inttypes.h>
27
28#include <expr/exparse.h>
29
30#include <assert.h>
31#include <cdt.h>
32#include <cgraph/agxbuf.h>
33#include <stdarg.h>
34#include <stddef.h>
35#include <stdio.h>
36#include <vmalloc/vmalloc.h>
37
38#define EX_VERSION 20000101L
39
40/*
41 * flags
42 */
43
44#define EX_CHARSTRING (1<<0) /* '...' same as "..." */
45#define EX_UNDECLARED (1<<9) /* allow undeclared identifiers */
46
47#define EX_ARRAY (-3) /* getval() array elt */
48#define EX_CALL (-2) /* getval() function call elt */
49#define EX_SCALAR (-1) /* getval() scalar elt */
50
51#define EX_NAMELEN 32 /* default Exid_t.name length */
52
53#define EX_ID(n,l,i,t) {{0},(l),(i),(t),0,0,0,0,0,n}
54
55#define DELETE_T MINTOKEN /* exexpr() delete `type' */
56
57#define INTEGRAL(t) ((t)>=INTEGER&&(t)<=CHARACTER)
58#define BUILTIN(t) ((t) > MINTOKEN)
59
60/* function type mechanism
61 * types are encoded in TBITS
62 * Thus, maximum # of parameters, including return type,
63 * is sizeof(Exid_t.type)/TBITS. Also see T in exgram.h
64 */
65
66/*
67 * arg 0 is the return value type
68 */
69
70#define F 01 /* FLOATING */
71#define I 02 /* INTEGER */
72#define S 03 /* STRING */
73
74#define TBITS 4
75#define TMASK ((1<<TBITS)-1)
76#define A(n,t) ((t)<<((n)*TBITS)) /* function arg n is type t */
77#define N(t) ((t)>>=TBITS) /* shift for next arg */
78
79#define exalloc(p,n) vmalloc((p)->vm, (n))
80
82
83typedef union Exdata_u Exdata_t;
84typedef struct Exdisc_s Exdisc_t;
85typedef struct Exnode_s Exnode_t;
86typedef struct Expr_s Expr_t;
87typedef struct Exref_s Exref_t;
88
89typedef void (*Exerror_f) (Expr_t *, Exdisc_t *, int, const char *, ...);
90typedef void (*Exexit_f) (Expr_t *, Exdisc_t *, int);
91
92typedef struct Exid_s /* id symbol table info */
93{
94 Dtlink_t link; /* symbol table link */
95 long lex; /* lex class */
96 long index; /* user defined index */
97 long type; /* symbol and arg types */
98 long index_type; /* index type for arrays */
99 long flags; /* user defined flags */
100 Exnode_t* value; /* value */
101 void *local;
102 long isstatic; /* static */
103 char name[EX_NAMELEN];/* symbol name */
105
106struct Exref_s /* . reference list */
107{
108 Exref_t* next; /* next in list */
109 Exid_t* symbol; /* reference id symbol */
110 Exnode_t* index; /* optional reference index */
111};
112
114{
115
116 struct
117 {
118 Extype_t value; /* constant value */
119 Exid_t* reference; /* conversion reference symbol */
120 } constant; /* variable reference */
121
122 struct
123 {
124 Exnode_t* left; /* left operand */
125 Exnode_t* right; /* right operand */
126 Exnode_t* last; /* for cons */
127 } operand; /* operands */
128
129 struct
130 {
131 Exnode_t* statement; /* case label statement(s) */
132 Exnode_t* next; /* next case item */
133 Extype_t** constant; /* case label constant array */
134 } select; /* case item */
135
136 struct
137 {
138 Exid_t* symbol; /* id symbol table entry */
139 Exref_t* reference; /* . reference list */
140 Exnode_t* index; /* array index expression */
141 Exnode_t* dyna; /* dynamic expression */
142 } variable; /* variable reference */
143
144#ifdef _EX_DATA_PRIVATE_
146#endif
147
148};
149
150struct Exnode_s /* expression tree node */
151{
152 long type;
153 int op; /* operator */
154 int binary; /* data.operand.{left,right} ok */
155 void *local;
156 union
157 {
158 double (*floating)(char**); /* FLOATING return value */
159 long long (*integer)(char **);
160 char* (*string)(char**); /* STRING return value */
161 } compiled; /* compiled function pointer */
162 Exdata_t data; /* node data */
163
164#ifdef _EX_NODE_PRIVATE_
166#endif
167
168};
169
170struct Exdisc_s /* discipline */
171{
172 uint64_t version; /* EX_VERSION */
173 uint64_t flags; /* EX_* flags */
174 Exid_t* symbols; /* static symbols */
175 char** data; /* compiled function arg data */
176 int (*castf)(Expr_t*, Exnode_t*, const char*, int, Exid_t*, int, Exdisc_t*);
177 /* unknown cast function */
178 int (*convertf)(Exnode_t *, long, int);
179 /* type conversion function */
180 int (*binaryf) (Exnode_t *, Exnode_t *, Exnode_t *, int);
181 /* binary operator function */
182 char *(*typename)(long);
183 /* application type names */
184 int (*stringof) (Expr_t *, Exnode_t *, int);
185 /* value to string conversion */
187 /* dictionary key for external type objects */
188 Exerror_f errorf; /* error function */
190 /* get value function */
192 /* reference value function */
193 int (*setf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, Extype_t);
194 /* set value function */
195 /* exit function */
197 int* types;
198 void* user;
199};
200
201struct Expr_s /* ex program state */
202{
203 const char* id; /* library id */
204 Dt_t* symbols; /* symbol table */
205 FILE* file[10]; /* io streams */
206 Vmalloc_t* vm; /* program store */
207
208#ifdef _EX_PROG_PRIVATE_
210#endif
211
212};
213
214extern Exnode_t *excast(Expr_t *, Exnode_t *, long, Exnode_t *, int);
216extern void exclose(Expr_t*, int);
217
230extern int excomp(Expr_t *p, const char *name, int line, FILE *fp,
231 char *prefix);
232
233extern char* excontext(Expr_t*, char*, int);
234extern int exdump(Expr_t*, Exnode_t*, agxbuf*);
235#ifdef __GNUC__
236__attribute__((format(printf, 1, 2)))
237#endif
238extern void exerror(const char*, ...);
239#ifdef __GNUC__
240__attribute__((format(printf, 1, 2)))
241#endif
242extern void exwarn(const char *, ...);
243extern Extype_t exeval(Expr_t*, Exnode_t*, void*);
244extern Exnode_t* exexpr(Expr_t*, const char*, Exid_t*, int);
245extern void exfreenode(Expr_t*, Exnode_t*);
246extern Exnode_t* exnewnode(Expr_t*, int, int, long, Exnode_t*, Exnode_t*);
247extern char* exnospace(void);
248extern Expr_t* exopen(Exdisc_t*);
249extern int expop(Expr_t*);
250extern int expush(Expr_t*, const char*, int, FILE*);
251extern int extoken_fn(Expr_t*);
252extern char* exstring(Expr_t *, char *);
253extern void* exstralloc(Expr_t *, size_t);
254extern char* extype(long int);
255extern Extype_t exzero(long int);
256extern char* exopname(int);
257extern void exinit(void);
258extern char *extypename(Expr_t *p, long);
259extern int exisAssign(Exnode_t *);
260
268#ifdef __GNUC__
269__attribute__((format(printf, 2, 3)))
270#endif
271static inline char *exprintf(Vmalloc_t *vm, const char *fmt, ...) {
272 va_list ap;
273 va_start(ap, fmt);
274
275 // how many bytes do we need for this string?
276 va_list ap2;
277 va_copy(ap2, ap);
278 int len = vsnprintf(NULL, 0, fmt, ap2);
279 assert(len >= 0 && "invalid vsnprintf call");
280 ++len; // for NUL terminator
281 va_end(ap2);
282
283 // ask vmalloc for enough space for this
284 char *s = vmalloc(vm, (size_t)len);
285 if (s == NULL) {
286 va_end(ap);
287 return exnospace();
288 }
289
290 // construct the output string
291 (void)vsnprintf(s, (size_t)len, fmt, ap);
292 va_end(ap);
293
294 return s;
295}
296
297#endif
298
299#ifdef __cplusplus
300}
301#endif
container data types API
#define _EX_NODE_PRIVATE_
Definition exlib.h:97
#define _EX_PROG_PRIVATE_
Definition exlib.h:100
#define _EX_DATA_PRIVATE_
Definition exlib.h:52
char * extype(long int)
Definition extype.c:24
int exisAssign(Exnode_t *)
#define EX_NAMELEN
Definition expr.h:51
void exerror(const char *,...)
Definition exerror.c:62
Extype_t exeval(Expr_t *, Exnode_t *, void *)
Definition exeval.c:1965
struct Exid_s Exid_t
char * exnospace(void)
Definition exnospace.c:25
void * exstralloc(Expr_t *, size_t)
Definition exeval.c:2008
void(* Exerror_f)(Expr_t *, Exdisc_t *, int, const char *,...)
Definition expr.h:89
int extoken_fn(Expr_t *)
Definition extoken.c:311
Exnode_t * exnoncast(Exnode_t *)
EX_STYPE Extype_t
Definition expr.h:81
Exnode_t * excast(Expr_t *, Exnode_t *, long, Exnode_t *, int)
static char * exprintf(Vmalloc_t *vm, const char *fmt,...)
Definition expr.h:271
int expop(Expr_t *)
Exnode_t * exnewnode(Expr_t *, int, int, long, Exnode_t *, Exnode_t *)
char * excontext(Expr_t *, char *, int)
Definition excontext.c:27
char * exstring(Expr_t *, char *)
Definition exeval.c:2000
void exclose(Expr_t *, int)
void exinit(void)
char * exopname(int)
Definition excc.c:58
void exfreenode(Expr_t *, Exnode_t *)
char * extypename(Expr_t *p, long)
void exwarn(const char *,...)
Definition exerror.c:79
void(* Exexit_f)(Expr_t *, Exdisc_t *, int)
Definition expr.h:90
Expr_t * exopen(Exdisc_t *)
Definition exopen.c:28
int exdump(Expr_t *, Exnode_t *, agxbuf *)
Definition excc.c:714
int expush(Expr_t *, const char *, int, FILE *)
int excomp(Expr_t *p, const char *name, int line, FILE *fp, char *prefix)
Extype_t exzero(long int)
Definition exzero.c:24
Exnode_t * exexpr(Expr_t *, const char *, Exid_t *, int)
Definition exexpr.c:26
static double len(glCompPoint p)
Definition glutils.c:150
require define api prefix
Definition gmlparse.y:17
node NULL
Definition grammar.y:149
GVIO_API const char * format
Definition gvio.h:51
Exid_t * symbols
Definition expr.h:174
Extype_t(* reff)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *)
Definition expr.h:191
int * types
Definition expr.h:197
Exerror_f errorf
Definition expr.h:188
Extype_t(* keyf)(Extype_t, long)
Definition expr.h:186
int(* castf)(Expr_t *, Exnode_t *, const char *, int, Exid_t *, int, Exdisc_t *)
Definition expr.h:176
int(* convertf)(Exnode_t *, long, int)
Definition expr.h:178
int(* binaryf)(Exnode_t *, Exnode_t *, Exnode_t *, int)
Definition expr.h:180
Extype_t(* getf)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *, void *, int, Exdisc_t *)
Definition expr.h:189
uint64_t version
Definition expr.h:172
int(* stringof)(Expr_t *, Exnode_t *, int)
Definition expr.h:184
Exexit_f exitf
Definition expr.h:196
char ** data
Definition expr.h:175
uint64_t flags
Definition expr.h:173
int(* setf)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *, void *, Extype_t)
Definition expr.h:193
void * user
Definition expr.h:198
Definition expr.h:93
long isstatic
Definition expr.h:102
long flags
Definition expr.h:99
long index_type
Definition expr.h:98
long type
Definition expr.h:97
long lex
Definition expr.h:95
char name[EX_NAMELEN]
Definition expr.h:103
long index
Definition expr.h:96
Dtlink_t link
Definition expr.h:94
void * local
user defined local stuff
Definition expr.h:101
Exnode_t * value
Definition expr.h:100
long long(* integer)(char **)
INTEGER|UNSIGNED return value.
Definition expr.h:159
int op
Definition expr.h:153
double(* floating)(char **)
Definition expr.h:158
void * local
user defined local stuff
Definition expr.h:155
long type
value type
Definition expr.h:152
union Exnode_s::@91 compiled
int binary
Definition expr.h:154
Exdata_t data
Definition expr.h:162
Definition expr.h:202
Dt_t * symbols
Definition expr.h:204
FILE * file[10]
Definition expr.h:205
Vmalloc_t * vm
Definition expr.h:206
const char * id
Definition expr.h:203
Exid_t * symbol
Definition expr.h:109
Exref_t * next
Definition expr.h:108
Exnode_t * index
Definition expr.h:110
Definition cdt.h:104
Exnode_t * last
Definition expr.h:126
struct Exdata_u::@87 constant
Exnode_t * left
Definition expr.h:124
Extype_t ** constant
Definition expr.h:133
Exnode_t * right
Definition expr.h:125
Exref_t * reference
Definition expr.h:139
Exid_t * reference
Definition expr.h:119
Exnode_t * next
Definition expr.h:132
struct Exdata_u::@88 operand
Exnode_t * statement
Definition expr.h:131
Exid_t * symbol
Definition expr.h:138
Exnode_t * dyna
Definition expr.h:141
struct Exdata_u::@89 select
Extype_t value
Definition expr.h:118
Exnode_t * index
Definition expr.h:140
struct Exdata_u::@90 variable
Definition grammar.c:93
void * vmalloc(Vmalloc_t *vm, size_t size)
Definition vmalloc.c:40