#pragma prototyped
#ifndef _EXPR_H
#define _EXPR_H
#include <ast.h>
#undef RS
#ifndef __CYGWIN__
#if _BLD_expr && defined(__EXPORT__)
#define extern __EXPORT__
#endif
#if !_BLD_expr && defined(__IMPORT__)
#define extern __IMPORT__
#endif
#endif
#include <exparse.h>
#undef extern
#include <cdt.h>
#include <vmalloc.h>
#define EX_VERSION 20000101L
#define EX_CHARSTRING (1<<0)
#define EX_CONSTANT (1<<1)
#define EX_FATAL (1<<2)
#define EX_INTERACTIVE (1<<3)
#define EX_PURE (1<<4)
#define EX_QUALIFY (1<<5)
#define EX_RETAIN (1<<6)
#define EX_SIZED (1<<7)
#define EX_STRICT (1<<8)
#define EX_UNDECLARED (1<<9)
#define EX_ARRAY (-3)
#define EX_CALL (-2)
#define EX_SCALAR (-1)
#define EX_NAMELEN 32
#define EX_INTARRAY 1
#define EXID(n,l,i,t,f) {{0},(l),(i),(t),0,(f),0,{0},n}
#define DELETE BREAK
#define INTEGRAL(t) ((t)>=CHAR&&(t)<=UNSIGNED)
#define BUILTIN(t) ((t) > MINTOKEN)
#define F 01
#define I 02
#define S 03
#define TBITS 4
#define TMASK ((1<<TBITS)-1)
#define A(n,t) ((t)<<((n)*TBITS))
#define N(t) ((t)>>=TBITS)
#define exalloc(p,n) exnewof(p,0,char,n,0)
#define exnewof(p,o,t,n,x) vmnewof((p)->vm,o,t,n,x)
#define exfree(p,x) vmfree((p)->vm,x)
#define exstrdup(p,s) vmstrdup((p)->vm,s)
#if LONG_MAX > INT_MAX
typedef int Exshort_t;
#else
typedef short Exshort_t;
#endif
typedef EXSTYPE Extype_t;
union Exdata_u; typedef union Exdata_u Exdata_t;
struct Exdisc_s; typedef struct Exdisc_s Exdisc_t;
struct Exnode_s; typedef struct Exnode_s Exnode_t;
struct Expr_s; typedef struct Expr_s Expr_t;
struct Exref_s; typedef struct Exref_s Exref_t;
typedef int (*Exerror_f)(Expr_t*, Exdisc_t*, int, const char*, ...);
typedef struct
{
Sflong_t number;
char* pointer;
} Exlocal_t;
typedef struct Exid_s
{
Dtlink_t link;
long lex;
long index;
long type;
long index_type;
long flags;
Exnode_t* value;
Exlocal_t local;
char name[EX_NAMELEN];
} Exid_t;
struct Exref_s
{
Exref_t* next;
Exid_t* symbol;
Exnode_t* index;
};
typedef struct
{
unsigned long size;
char* data;
} Exbuf_t;
union Exdata_u
{
struct
{
Extype_t value;
Exid_t* reference;
} constant;
struct
{
Exnode_t* left;
Exnode_t* right;
} operand;
struct
{
Exnode_t* statement;
Exnode_t* next;
Extype_t** constant;
} select;
struct
{
Exid_t* symbol;
Exref_t* reference;
Exnode_t* index;
Exnode_t* dyna;
} variable;
#ifdef _EX_DATA_PRIVATE_
_EX_DATA_PRIVATE_
#endif
};
struct Exnode_s
{
Exshort_t type;
Exshort_t op;
Exshort_t binary;
Exshort_t pad_1;
Exlocal_t local;
union
{
double (*floating)(char**);
Sflong_t(*integer)(char**);
char* (*string)(char**);
} compiled;
Exdata_t data;
#ifdef _EX_NODE_PRIVATE_
_EX_NODE_PRIVATE_
#endif
};
struct Exdisc_s
{
unsigned long version;
unsigned long flags;
Exid_t* symbols;
char** data;
char* lib;
char* type;
int (*castf)(Expr_t*, Exnode_t*, const char*, int, Exid_t*, int, Exdisc_t*);
int (*convertf)(Expr_t*, Exnode_t*, int, Exid_t*, int, Exdisc_t*);
int (*binaryf)(Expr_t*, Exnode_t*, Exnode_t*, Exnode_t*, int, Exdisc_t*);
char* (*typename)(Expr_t*, int);
int (*stringof)(Expr_t*, Exnode_t*, int);
Extype_t (*keyf)(Expr_t*, Extype_t, int, Exdisc_t*);
Exerror_f errorf;
Extype_t (*getf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, int, Exdisc_t*);
Extype_t (*reff)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, char*, int, Exdisc_t*);
int (*setf)(Expr_t*, Exnode_t*, Exid_t*, Exref_t*, void*, int, Extype_t, Exdisc_t*);
int (*matchf)(Expr_t*, Exnode_t*, const char*, Exnode_t*, const char*, void*, Exdisc_t*);
int* types;
void* user;
};
struct Expr_s
{
const char* id;
Dt_t* symbols;
const char* more;
Sfio_t* file[10];
Vmalloc_t* vm;
#ifdef _EX_PROG_PRIVATE_
_EX_PROG_PRIVATE_
#endif
};
struct Excc_s; typedef struct Excc_s Excc_t;
struct Exccdisc_s; typedef struct Exccdisc_s Exccdisc_t;
struct Exccdisc_s
{
Sfio_t* text;
char* id;
unsigned long flags;
int (*ccf)(Excc_t*, Exnode_t*, Exid_t*, Exref_t*, Exnode_t*, Exccdisc_t*);
};
struct Excc_s
{
Expr_t* expr;
Exdisc_t* disc;
#ifdef _EX_CC_PRIVATE_
_EX_CC_PRIVATE_
#endif
};
#ifndef __CYGWIN__
#if _BLD_expr && defined(__EXPORT__)
#define extern __EXPORT__
#endif
#if !_BLD_expr && defined(__IMPORT__)
#define extern __IMPORT__
#endif
#endif
extern Exid_t exbuiltin[];
#undef extern
#if _BLD_expr && defined(__EXPORT__)
#define extern __EXPORT__
#endif
extern Exnode_t* excast(Expr_t*, Exnode_t*, int, Exnode_t*, int);
extern Exnode_t* exnoncast(Exnode_t*);
extern int excc(Excc_t*, const char*, Exid_t*, int);
extern int exccclose(Excc_t*);
extern Excc_t* exccopen(Expr_t*, Exccdisc_t*);
extern void exclose(Expr_t*, int);
extern int excomp(Expr_t*, const char*, int, const char*, Sfio_t*);
extern char* excontext(Expr_t*, char*, int);
extern int exdump(Expr_t*, Exnode_t*, Sfio_t*);
extern void exerror(const char*, ...);
extern void exwarn(const char*, ...);
extern Extype_t exeval(Expr_t*, Exnode_t*, void*);
extern Exnode_t* exexpr(Expr_t*, const char*, Exid_t*, int);
extern void exfreenode(Expr_t*, Exnode_t*);
extern Exnode_t* exnewnode(Expr_t*, int, int, int, Exnode_t*, Exnode_t*);
extern Expr_t* exopen(Exdisc_t*);
extern int expop(Expr_t*);
extern int expush(Expr_t*, const char*, int, const char*, Sfio_t*);
extern int exrewind(Expr_t*);
extern void exstatement(Expr_t*);
extern int extoken_fn(Expr_t*);
extern char* exstring(Expr_t*, char*);
extern void* exstralloc(Expr_t*, void*, size_t);
extern int exstrfree(Expr_t*, void*);
extern char* extype(int);
extern Extype_t exzero(int);
extern char* exopname(int);
extern char* extypename(Expr_t* p, int);
extern int exisAssign(Exnode_t*);
#undef extern
#endif