~ubuntu-branches/ubuntu/lucid/graphviz/lucid-security

« back to all changes in this revision

Viewing changes to tools/expr/expr.h

  • Committer: Bazaar Package Importer
  • Author(s): Stephen M Moraco
  • Date: 2002-02-05 18:52:12 UTC
  • Revision ID: james.westby@ubuntu.com-20020205185212-8i04c70te00rc40y
Tags: upstream-1.7.16
ImportĀ upstreamĀ versionĀ 1.7.16

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#pragma prototyped
 
2
/*
 
3
 * Glenn Fowler
 
4
 * AT&T Research
 
5
 *
 
6
 * expression library definitions
 
7
 */
 
8
 
 
9
#ifndef _EXPR_H
 
10
#define _EXPR_H
 
11
 
 
12
#include <ast.h>
 
13
 
 
14
#undef  RS      /* hp.pa <signal.h> grabs this!! */
 
15
 
 
16
#if _BLD_expr && defined(__EXPORT__)
 
17
#define extern          __EXPORT__
 
18
#endif
 
19
#if !_BLD_expr && defined(__IMPORT__)
 
20
#define extern          __IMPORT__
 
21
#endif
 
22
 
 
23
#include <exparse.h>
 
24
 
 
25
#undef  extern
 
26
 
 
27
#include <cdt.h>
 
28
#include <vmalloc.h>
 
29
 
 
30
#define EX_VERSION      20000101L
 
31
 
 
32
/*
 
33
 * flags
 
34
 */
 
35
 
 
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 */
 
46
 
 
47
#define EX_CALL         (-2)            /* getval() function call elt   */
 
48
#define EX_SCALAR       (-1)            /* getval() scalar elt          */
 
49
 
 
50
#define EX_NAMELEN      32              /* default Exid_t.name length   */
 
51
 
 
52
#define EXID(n,l,i,t,f) {{0},(l),(i),(t),(f),0,{0},n}
 
53
 
 
54
#define DELETE          BREAK           /* exexpr() delete `type'       */
 
55
 
 
56
#define INTEGRAL(t)     ((t)>=CHAR&&(t)<=UNSIGNED)
 
57
 
 
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
 
62
 */
 
63
 
 
64
/*
 
65
 * arg 0 is the return value type
 
66
 */
 
67
 
 
68
#define F               01              /* FLOATING                     */
 
69
#define I               02              /* INTEGER                      */
 
70
#define S               03              /* STRING                       */
 
71
 
 
72
#define TBITS       4
 
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           */
 
76
 
 
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)
 
81
 
 
82
#if LONG_MAX > INT_MAX
 
83
typedef int Exshort_t;
 
84
#else
 
85
typedef short Exshort_t;
 
86
#endif
 
87
 
 
88
typedef EXSTYPE Extype_t;
 
89
 
 
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;
 
95
 
 
96
typedef int (*Exerror_f)(Expr_t*, Exdisc_t*, int, const char*, ...);
 
97
 
 
98
typedef struct                          /* user defined member type     */
 
99
{
 
100
        Sflong_t        number;
 
101
        char*           pointer;
 
102
} Exlocal_t;
 
103
 
 
104
typedef struct Exid_s                   /* id symbol table info         */
 
105
{
 
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                 */
 
114
} Exid_t;
 
115
 
 
116
struct Exref_s                          /* . reference list             */
 
117
{
 
118
        Exref_t*        next;           /* next in list                 */
 
119
        Exid_t*         symbol;         /* reference id symbol          */
 
120
        Exnode_t*       index;          /* optional reference index     */
 
121
};
 
122
 
 
123
typedef struct                          /* sized buffer                 */
 
124
{
 
125
        unsigned long   size;           /* buffer size                  */
 
126
        char*           data;           /* buffer data                  */
 
127
} Exbuf_t;
 
128
 
 
129
union Exdata_u
 
130
{
 
131
 
 
132
        struct
 
133
        {
 
134
        Extype_t        value;          /* constant value               */
 
135
        Exid_t*         reference;      /* conversion reference symbol  */
 
136
        }               constant;       /* variable reference           */
 
137
 
 
138
        struct
 
139
        {
 
140
        Exnode_t*       left;           /* left operand                 */
 
141
        Exnode_t*       right;          /* right operand                */
 
142
        }               operand;        /* operands                     */
 
143
 
 
144
        struct
 
145
        {
 
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                    */
 
150
 
 
151
        struct
 
152
        {
 
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           */
 
158
 
 
159
#ifdef _EX_DATA_PRIVATE_
 
160
        _EX_DATA_PRIVATE_
 
161
#endif
 
162
 
 
163
};
 
164
 
 
165
struct Exnode_s                         /* expression tree node         */
 
166
{
 
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     */
 
172
        union
 
173
        {
 
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                    */
 
179
 
 
180
#ifdef _EX_NODE_PRIVATE_
 
181
        _EX_NODE_PRIVATE_
 
182
#endif
 
183
 
 
184
};
 
185
 
 
186
struct Exdisc_s                         /* discipline                   */
 
187
{
 
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*);
 
206
        int*    types;
 
207
    void*       user;
 
208
};
 
209
 
 
210
struct Expr_s                           /* ex program state             */
 
211
{
 
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                */
 
217
 
 
218
#ifdef _EX_PROG_PRIVATE_
 
219
        _EX_PROG_PRIVATE_
 
220
#endif
 
221
 
 
222
};
 
223
 
 
224
struct Excc_s; typedef struct Excc_s Excc_t;
 
225
struct Exccdisc_s; typedef struct Exccdisc_s Exccdisc_t;
 
226
 
 
227
struct Exccdisc_s                       /* excc() discipline            */
 
228
{
 
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   */
 
234
};
 
235
 
 
236
struct Excc_s                           /* excc() state                 */
 
237
{
 
238
        Expr_t*         expr;           /* exopen() state               */
 
239
        Exdisc_t*       disc;           /* exopen() discipline          */
 
240
 
 
241
#ifdef _EX_CC_PRIVATE_
 
242
        _EX_CC_PRIVATE_
 
243
#endif
 
244
 
 
245
};
 
246
 
 
247
#if _BLD_expr && defined(__EXPORT__)
 
248
#define extern          __EXPORT__
 
249
#endif
 
250
#if !_BLD_expr && defined(__IMPORT__)
 
251
#define extern          __IMPORT__
 
252
#endif
 
253
 
 
254
extern Exid_t           exbuiltin[];
 
255
 
 
256
#undef  extern
 
257
 
 
258
#if _BLD_expr && defined(__EXPORT__)
 
259
#define extern          __EXPORT__
 
260
#endif
 
261
 
 
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);
 
283
 
 
284
#undef  extern
 
285
 
 
286
#endif