Graphviz 15.1.0~dev.20260610.0127
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 v2.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#pragma once
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17/*
18 * Glenn Fowler
19 * AT&T Research
20 *
21 * expression library definitions
22 */
23
24#include <ast/ast.h>
25#include <inttypes.h>
26
27#include <expr/exparse.h>
28
29#include <assert.h>
30#include <cdt.h>
31#include <stdarg.h>
32#include <stdbool.h>
33#include <stddef.h>
34#include <stdio.h>
35#include <util/agxbuf.h>
36#include <util/arena.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, 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
80
81typedef union Exdata_u Exdata_t;
82typedef struct Exdisc_s Exdisc_t;
83typedef struct Exnode_s Exnode_t;
84typedef struct Expr_s Expr_t;
85typedef struct Exref_s Exref_t;
86
87typedef void (*Exerror_f)(const char *, void *, int, const char *, ...);
88typedef void (*Exexit_f)(void *, int);
89
90typedef struct Exid_s /* id symbol table info */
91{
92 Dtlink_t link; /* symbol table link */
93 long lex; /* lex class */
94 long index; /* user defined index */
95 long type; /* symbol and arg types */
96 long index_type; /* index type for arrays */
97 Exnode_t *value; /* value */
98 void *local;
99 char name[EX_NAMELEN]; /* symbol name */
101
102struct Exref_s /* . reference list */
103{
104 Exref_t *next; /* next in list */
105 Exid_t *symbol; /* reference id symbol */
106 Exnode_t *index; /* optional reference index */
107};
108
109union Exdata_u {
110
111 struct {
112 Extype_t value; /* constant value */
113 Exid_t *reference; /* conversion reference symbol */
114 } constant; /* variable reference */
115
116 struct {
117 Exnode_t *left; /* left operand */
118 Exnode_t *right; /* right operand */
119 } operand; /* operands */
120
121 struct {
122 Exnode_t *statement; /* case label statement(s) */
123 Exnode_t *next; /* next case item */
124 Extype_t **constant; /* case label constant array */
125 } select; /* case item */
126
127 struct {
128 Exid_t *symbol; /* id symbol table entry */
129 Exref_t *reference; /* . reference list */
130 Exnode_t *index; /* array index expression */
131 Exnode_t *dyna; /* dynamic expression */
132 } variable; /* variable reference */
133
134#ifdef _EX_DATA_PRIVATE_
136#endif
137};
138
139struct Exnode_s /* expression tree node */
140{
141 long type;
142 long op;
143 bool binary;
144 Exdata_t data; /* node data */
145
146#ifdef _EX_NODE_PRIVATE_
148#endif
149};
150
151struct Exdisc_s /* discipline */
152{
153 uint64_t version; /* EX_VERSION */
154 uint64_t flags; /* EX_* flags */
155 Exid_t *symbols; /* static symbols */
156 char **data; /* compiled function arg data */
157 int (*castf)(Expr_t *, Exnode_t *, const char *, int, Exid_t *, int,
158 Exdisc_t *);
159 /* unknown cast function */
160 int (*convertf)(Exnode_t *, long, int);
161 /* type conversion function */
162 int (*binaryf)(Exnode_t *, Exnode_t *, Exnode_t *, int);
163 /* binary operator function */
164 char *(*typename)(long);
165 /* application type names */
166 int (*stringof)(Expr_t *, Exnode_t *, int);
167 /* value to string conversion */
169 /* dictionary key for external type objects */
170 Exerror_f errorf; /* error function */
171 Extype_t (*getf)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *, void *, int,
172 Exdisc_t *);
173 /* get value function */
175 /* reference value function */
176 int (*setf)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *, void *, Extype_t);
177 /* set value function */
199 int (*inf)(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc);
200 /* exit function */
202 int *types;
203 void *user;
204};
205
206struct Expr_s /* ex program state */
207{
208 const char *id; /* library id */
209 Dt_t *symbols; /* symbol table */
210 FILE *file[10]; /* io streams */
211 arena_t vm; /* program store */
212
213#ifdef _EX_PROG_PRIVATE_
215#endif
216};
217
221
234int excomp(Expr_t *p, const char *name, int line, FILE *fp, char *prefix);
235
236char *excontext(Expr_t *, char *, int);
237void exdump(Expr_t *, Exnode_t *, agxbuf *);
238#ifdef __GNUC__
239__attribute__((format(printf, 1, 2)))
240#endif
241void exerror(const char *, ...);
242#ifdef __GNUC__
243__attribute__((format(printf, 1, 2)))
244#endif
245void exwarn(const char *, ...);
246Extype_t exeval(Expr_t *, Exnode_t *, void *);
247Exnode_t *exexpr(Expr_t *, const char *, Exid_t *, int);
249Exnode_t *exnewnode(Expr_t *, long, bool, long, Exnode_t *, Exnode_t *);
250char *exnospace(void);
253int expush(Expr_t *, const char *, int, FILE *);
254int extoken_fn(Expr_t *);
255char *exstring(Expr_t *, char *);
256void *exstralloc(Expr_t *, size_t);
257char *extype(long int);
258Extype_t exzero(long int);
259char *exopname(long);
260void exinit(void);
261char *extypename(Expr_t *p, long);
263
271#ifdef __GNUC__
272__attribute__((format(printf, 2, 3)))
273#endif
274static inline char *
275exprintf(arena_t *vm, const char *fmt, ...) {
276 va_list ap;
277 va_start(ap, fmt);
278
279 // how many bytes do we need for this string?
280 va_list ap2;
281 va_copy(ap2, ap);
282 int len = vsnprintf(NULL, 0, fmt, ap2);
283 assert(len >= 0 && "invalid vsnprintf call");
284 ++len; // for NUL terminator
285 va_end(ap2);
286
287 // ask arena for enough space for this
288 char *const s = gv_arena_alloc(vm, 1, (size_t)len);
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#ifdef __cplusplus
298}
299#endif
Dynamically expanding string buffers.
void * gv_arena_alloc(arena_t *arena, size_t alignment, size_t size)
Definition arena.c:120
Region-based memory allocator.
container data types API
#define _EX_NODE_PRIVATE_
Definition exlib.h:99
#define _EX_PROG_PRIVATE_
Definition exlib.h:102
#define _EX_DATA_PRIVATE_
Definition exlib.h:54
static Dtdisc_t disc
Definition exparse.y:209
char * extype(long int)
Definition extype.c:26
int exisAssign(Exnode_t *)
#define EX_NAMELEN
Definition expr.h:51
void exerror(const char *,...)
Definition exerror.c:63
Extype_t exeval(Expr_t *, Exnode_t *, void *)
Definition exeval.c:1949
struct Exid_s Exid_t
char * exnospace(void)
Definition exnospace.c:27
void * exstralloc(Expr_t *, size_t)
Definition exeval.c:1972
void exdump(Expr_t *, Exnode_t *, agxbuf *)
Definition excc.c:617
int extoken_fn(Expr_t *)
Definition extoken.c:313
Exnode_t * exnoncast(Exnode_t *)
EX_STYPE Extype_t
Definition expr.h:79
Exnode_t * excast(Expr_t *, Exnode_t *, long, Exnode_t *, int)
int expop(Expr_t *)
char * excontext(Expr_t *, char *, int)
Definition excontext.c:29
char * exstring(Expr_t *, char *)
Definition exeval.c:1964
static char * exprintf(arena_t *vm, const char *fmt,...)
Definition expr.h:275
void exinit(void)
Exnode_t * exnewnode(Expr_t *, long, bool, long, Exnode_t *, Exnode_t *)
void(* Exexit_f)(void *, int)
Definition expr.h:88
void exfreenode(Expr_t *, Exnode_t *)
void exclose(Expr_t *)
char * extypename(Expr_t *p, long)
void exwarn(const char *,...)
Definition exerror.c:77
char * exopname(long)
Definition excc.c:43
Expr_t * exopen(Exdisc_t *)
Definition exopen.c:40
int expush(Expr_t *, const char *, int, FILE *)
void(* Exerror_f)(const char *, void *, int, const char *,...)
Definition expr.h:87
int excomp(Expr_t *p, const char *name, int line, FILE *fp, char *prefix)
Extype_t exzero(long int)
Definition exzero.c:26
Exnode_t * exexpr(Expr_t *, const char *, Exid_t *, int)
Definition exexpr.c:28
static double len(glCompPoint p)
Definition glutils.c:138
require define api prefix
Definition gmlparse.y:17
node NULL
Definition grammar.y:181
GVIO_API const char * format
Definition gvio.h:51
Exid_t * symbols
Definition expr.h:155
Extype_t(* reff)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *)
Definition expr.h:174
int * types
Definition expr.h:202
Exerror_f errorf
Definition expr.h:170
Extype_t(* keyf)(Extype_t, long)
Definition expr.h:168
int(* castf)(Expr_t *, Exnode_t *, const char *, int, Exid_t *, int, Exdisc_t *)
Definition expr.h:157
int(* convertf)(Exnode_t *, long, int)
Definition expr.h:160
int(* binaryf)(Exnode_t *, Exnode_t *, Exnode_t *, int)
Definition expr.h:162
Extype_t(* getf)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *, void *, int, Exdisc_t *)
Definition expr.h:171
uint64_t version
Definition expr.h:153
int(* stringof)(Expr_t *, Exnode_t *, int)
Definition expr.h:166
int(* inf)(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc)
Definition expr.h:199
Exexit_f exitf
Definition expr.h:201
char ** data
Definition expr.h:156
uint64_t flags
Definition expr.h:154
int(* setf)(Expr_t *, Exnode_t *, Exid_t *, Exref_t *, void *, Extype_t)
Definition expr.h:176
void * user
Definition expr.h:203
Extype_t(* lengthf)(Exid_t *rhs, Exdisc_t *disc)
Definition expr.h:187
Definition expr.h:91
long index_type
Definition expr.h:96
long type
Definition expr.h:95
long lex
Definition expr.h:93
char name[EX_NAMELEN]
Definition expr.h:99
long index
Definition expr.h:94
Dtlink_t link
Definition expr.h:92
void * local
user defined local stuff
Definition expr.h:98
Exnode_t * value
Definition expr.h:97
long op
operator
Definition expr.h:142
long type
value type
Definition expr.h:141
bool binary
data.operand.{left,right} ok
Definition expr.h:143
Exdata_t data
Definition expr.h:144
Definition expr.h:207
arena_t vm
Definition expr.h:211
Dt_t * symbols
Definition expr.h:209
FILE * file[10]
Definition expr.h:210
const char * id
Definition expr.h:208
Exid_t * symbol
Definition expr.h:105
Exref_t * next
Definition expr.h:104
Exnode_t * index
Definition expr.h:106
Definition cdt.h:98
Exnode_t * left
Definition expr.h:117
Extype_t ** constant
Definition expr.h:124
Exnode_t * right
Definition expr.h:118
struct Exdata_u::@63 select
Exref_t * reference
Definition expr.h:129
Exid_t * reference
Definition expr.h:113
Exnode_t * next
Definition expr.h:123
Exnode_t * statement
Definition expr.h:122
Exid_t * symbol
Definition expr.h:128
struct Exdata_u::@61 constant
Exnode_t * dyna
Definition expr.h:131
struct Exdata_u::@62 operand
struct Exdata_u::@64 variable
Extype_t value
Definition expr.h:112
Exnode_t * index
Definition expr.h:130
Definition grammar.c:90