#pragma prototyped
#ifndef _CX_H
#define _CX_H
#include <ast.h>
#include <math.h>
#include <dt.h>
#include <vmalloc.h>
#define CX_ID "cx"
#define CX_VERSION 20110811L
#define CX_DEBUG (1<<0)
#define CX_QUIET (1<<1)
#define CX_REGRESS (1<<2)
#define CX_TRACE (1<<3)
#define CX_VALIDATE (1<<4)
#define CX_VERBOSE (1<<5)
#define CX_BALANCED (1<<6)
#define CX_INCLUDE (1<<7)
#define CX_FLAGS (1L<<8)
#define CX_NORMALIZED 0x0001
#define CX_INITIALIZED 0x0002
#define CX_REFERENCED 0x0004
#define CX_DEPRECATED 0x0008
#define CX_IGNORECASE 0x0100
#define CX_ALL 0x0001
#define CX_void 0
#define CX_number 1
#define CX_string 2
#define CX_pointer 3
#define CX_reference 4
#define CX_buffer 5
#define CX_type 6
#define CX_STRING 0x0001
#define CX_INTEGER 0x0002
#define CX_UNSIGNED 0x0004
#define CX_FLOAT 0x0008
#define CX_BUFFER 0x0010
#define CX_BINARY 0x0020
#define CX_MULTIPLE 0x0100
#define CX_FREE 0x0200
#define CX_NUL 0x0400
#define CX_VARIABLE 0x0800
#define CX_QUOTEALL 0x1000
#define CX_LONG 0x2000
#define CX_ASSIGN 01
#define CX_X2 02
#define CX_UNARY 04
#define CX_ATTR 3
#define CX_OPNAME "0+&/>~<~%*!|-^CDeGLnpRJSst"
#define CX_NOP (( 0))
#define CX_ADD (( 1<<CX_ATTR))
#define CX_AND (( 2<<CX_ATTR))
#define CX_DIV (( 3<<CX_ATTR))
#define CX_GT (( 4<<CX_ATTR))
#define CX_INV (( 5<<CX_ATTR)|CX_UNARY)
#define CX_LT (( 6<<CX_ATTR))
#define CX_MAT (( 7<<CX_ATTR))
#define CX_MOD (( 8<<CX_ATTR))
#define CX_MPY (( 9<<CX_ATTR))
#define CX_NOT ((10<<CX_ATTR)|CX_UNARY)
#define CX_OR ((11<<CX_ATTR))
#define CX_SUB ((12<<CX_ATTR))
#define CX_XOR ((13<<CX_ATTR))
#define CX_CALL ((14<<CX_ATTR)|CX_UNARY)
#define CX_DEL ((15<<CX_ATTR))
#define CX_END ((16<<CX_ATTR))
#define CX_GET ((17<<CX_ATTR)|CX_UNARY)
#define CX_LOG ((18<<CX_ATTR)|CX_UNARY)
#define CX_NUM ((19<<CX_ATTR))
#define CX_POP ((20<<CX_ATTR))
#define CX_REF (CX_AND|CX_UNARY)
#define CX_RET ((21<<CX_ATTR)|CX_UNARY)
#define CX_SC0 ((22<<CX_ATTR))
#define CX_SC1 (CX_SC0|CX_X2)
#define CX_SET ((23<<CX_ATTR)|CX_ASSIGN)
#define CX_STR ((24<<CX_ATTR))
#define CX_TST ((25<<CX_ATTR))
#define CX_OPERATORS ((26<<CX_ATTR))
#define CX_CAST (CX_SET|CX_UNARY)
#define CX_EQ (CX_SET|CX_X2)
#define CX_ANDAND (CX_AND|CX_X2)
#define CX_OROR (CX_OR|CX_X2)
#define CX_LSH (CX_LT|CX_X2)
#define CX_RSH (CX_GT|CX_X2)
#define CX_UPLUS (CX_ADD|CX_UNARY)
#define CX_UMINUS (CX_SUB|CX_UNARY)
#define CX_MATCH (CX_MAT|CX_ASSIGN)
#define CX_NOMATCH (CX_MAT)
#define CX_GE (CX_GT|CX_ASSIGN)
#define CX_LE (CX_LT|CX_ASSIGN)
#define CX_NE ((CX_NOT&~CX_UNARY)|CX_ASSIGN)
#define CX_CTYPE_ALPHA (1<<0)
#define CX_CTYPE_DIGIT (1<<1)
#define CX_CTYPE_FLOAT (1<<2)
#define CX_CTYPE_SPACE (1<<3)
#define CXMIN(a,b) (((a)<(b))?(a):(b))
#define CXMAX(a,b) (((a)>(b))?(a):(b))
#define CXINTEGER(n) ((Cxinteger_t)(n))
#define CXUNSIGNED(n) ((Cxunsigned_t)CXINTEGER(n))
#define CXDETAILS(d,f,t,v) \
((d)?(d):((d)=(f)&&(f)->details?(f)->details:(t)->format.details?(t)->format.details:(v)))
#define CX_HEADER_INIT {{0},0}
#define CX_CALLOUT_INIT(op,type1,type2,callout,description) \
{0,description,CX_HEADER_INIT,op,(Cxtype_t*)type1,(Cxtype_t*)type2,callout},
#define CX_FUNCTION_INIT(name,type,function,prototype,description) \
{name,description,CX_HEADER_INIT,function,(Cxtype_t*)type,prototype},
#define CX_RECODE_INIT(op,type1,type2,recode,description) \
{0,description,CX_HEADER_INIT,op,(Cxtype_t*)type1,(Cxtype_t*)type2,recode},
#define CX_TYPE_INIT(name,base,external,internal,match,description) \
{name,description,CX_HEADER_INIT,(Cxtype_t*)base,0,external,internal,0,0,0,0,CX_HEADER_INIT,match},
#define CX_VARIABLE_INIT(name,type,index,description) \
{name,description,CX_HEADER_INIT,0,(Cxtype_t*)type,0,index},
#define cxrepresentation(t) ((t)->representation)
#define cxisbuffer(t) (cxrepresentation(t)==CX_buffer)
#define cxisnumber(t) (cxrepresentation(t)==CX_number)
#define cxisstring(t) (cxrepresentation(t)==CX_string)
#define cxisvoid(t) (cxrepresentation(t)==CX_void)
#define cxsize(t,v) ((cxisstring(t)||cxisbuffer(t))?((v)->buffer.size):0)
#if ! _ast_fltmax_double
#undef strtod
#define strtod(a,b) strtold(a,b)
#undef strntod
#define strntod(a,b,c) strntold(a,b,c)
#endif
typedef _ast_fltmax_t Cxnumber_t;
typedef uint32_t Cxflags_t;
typedef intmax_t Cxinteger_t;
typedef uintmax_t Cxunsigned_t;
struct Cx_s; typedef struct Cx_s Cx_t;
struct Cxarray_s; typedef struct Cxarray_s Cxarray_t;
struct Cxconstraint_s; typedef struct Cxconstraint_s Cxconstraint_t;
struct Cxdisc_s; typedef struct Cxdisc_s Cxdisc_t;
struct Cxedit_s; typedef struct Cxedit_s Cxedit_t;
struct Cxexpr_s; typedef struct Cxexpr_s Cxexpr_t;
struct Cxformat_s; typedef struct Cxformat_s Cxformat_t;
struct Cxinstruction_s; typedef struct Cxinstruction_s Cxinstruction_t;
struct Cxitem_s; typedef struct Cxitem_s Cxitem_t;
struct Cxlib_s; typedef struct Cxlib_s Cxlib_t;
struct Cxmatch_s; typedef struct Cxmatch_s Cxmatch_t;
struct Cxmap_s; typedef struct Cxmap_s Cxmap_t;
struct Cxmember_s; typedef struct Cxmember_s Cxmember_t;
struct Cxop_s; typedef struct Cxop_s Cxop_t;
struct Cxoperand_s; typedef struct Cxoperand_s Cxoperand_t;
struct Cxpart_s; typedef struct Cxpart_s Cxpart_t;
struct Cxquery_s; typedef struct Cxquery_s Cxquery_t;
struct Cxreference_s; typedef struct Cxreference_s Cxreference_t;
struct Cxstate_s; typedef struct Cxstate_s Cxstate_t;
struct Cxstructure_s; typedef struct Cxstructure_s Cxstructure_t;
struct Cxtype_s; typedef struct Cxtype_s Cxtype_t;
struct Cxvariable_s; typedef struct Cxvariable_s Cxvariable_t;
struct Cxop_s
{
int code;
Cxtype_t* type1;
Cxtype_t* type2;
};
#define _CX_HEADER_ \
const char* name; \
const char* description;
#define _CX_HEADER_LINK_ \
Dtlink_t link; \
uint16_t flags; \
uint16_t index;
#define _CX_NAME_HEADER_ \
_CX_HEADER_ \
struct \
{ \
_CX_HEADER_LINK_ \
} header;
#define _CX_LIST_HEADER_ \
_CX_HEADER_ \
struct \
{ \
_CX_HEADER_LINK_ \
Dtlink_t list; \
} header;
#define _CX_CODE_HEADER_ \
_CX_NAME_HEADER_ \
Cxop_t op;
typedef struct Cxheader_s
{
_CX_HEADER_
} Cxheader_t;
typedef struct Cxnameheader_s
{
_CX_NAME_HEADER_
} Cxnameheader_t;
typedef struct Cxlistheader_s
{
_CX_LIST_HEADER_
} Cxlistheader_t;
typedef struct Cxcodeheader_s
{
_CX_CODE_HEADER_
} Cxcodeheader_t;
typedef struct Cxbuffer_s
{
void* data;
uint32_t size;
uint32_t elements;
} Cxbuffer_t;
typedef struct Cxstring_s
{
char* data;
size_t size;
} Cxstring_t;
typedef union Cxvalue_u
{
Cxbuffer_t buffer;
Cxnumber_t number;
void* pointer;
Cxstring_t string;
Cxtype_t* type;
Cxvariable_t* variable;
} Cxvalue_t;
typedef int (*Cxcallout_f) (Cx_t*, Cxinstruction_t*, Cxoperand_t*,
Cxoperand_t*, Cxoperand_t*, void*, Cxdisc_t*);
typedef int (*Cxconstraint_f)(Cx_t*, Cxvalue_t*, void*, Cxdisc_t*);
typedef int (*Cxdone_f) (Cx_t*, void*, Cxdisc_t*);
typedef ssize_t (*Cxexternal_f) (Cx_t*, Cxtype_t*, const char*, Cxformat_t*,
Cxvalue_t*, char*, size_t, Cxdisc_t*);
typedef int (*Cxfunction_f) (Cx_t*, Cxvariable_t*, Cxoperand_t*,
Cxoperand_t*, int, void*, Cxdisc_t*);
typedef void* (*Cxinit_f) (void*, Cxdisc_t*);
typedef ssize_t (*Cxinternal_f) (Cx_t*, Cxtype_t*, const char*, Cxformat_t*,
Cxoperand_t*, const char*, size_t, Vmalloc_t*,
Cxdisc_t*);
typedef Cxlib_t*(*Cxload_f) (const char*, Cxdisc_t*);
typedef char* (*Cxlocation_f) (Cx_t*, void*, Cxdisc_t*);
typedef void* (*Cxmatchcomp_f)(Cx_t*, Cxtype_t*, Cxtype_t*, Cxvalue_t*, Cxdisc_t*);
typedef int (*Cxmatchexec_f)(Cx_t*, void*, Cxtype_t*, Cxvalue_t*, Cxdisc_t*);
typedef int (*Cxmatchfree_f)(Cx_t*, void*, Cxdisc_t*);
typedef char* (*Cxnum2str_f) (Cx_t*, Cxunsigned_t, Cxdisc_t*);
typedef int (*Cxquery_f) (Cx_t*, Cxexpr_t*, void*, Cxdisc_t*);
typedef int (*Cxrecode_f) (Cx_t*, Cxexpr_t*, Cxinstruction_t*,
Cxinstruction_t*, Cxinstruction_t*, void*,
Cxdisc_t*);
typedef int (*Cxstr2num_f) (Cx_t*, const char*, size_t, Cxunsigned_t*, Cxdisc_t*);
struct Cxoperand_s
{
Cxtype_t* type;
int refs;
Cxvalue_t value;
};
struct Cxitem_s
{
Cxitem_t* next;
const char* name;
Cxunsigned_t mask;
Cxunsigned_t value;
Cxmap_t* map;
#ifdef _CX_ITEM_PRIVATE_
_CX_ITEM_PRIVATE_
#endif
};
struct Cxedit_s
{
_CX_NAME_HEADER_
Cxedit_t* next;
Cxinit_f initf;
Cxnum2str_f num2strf;
Cxstr2num_f str2numf;
void* data;
#ifdef _CX_EDIT_PRIVATE_
_CX_EDIT_PRIVATE_
#endif
};
struct Cxpart_s
{
Cxpart_t* next;
Cxunsigned_t shift;
Cxunsigned_t mask;
Cxitem_t* item;
Cxflags_t flags;
Cxtype_t* type;
Cxedit_t* num2str;
Cxedit_t* str2num;
Cxedit_t* edit;
};
struct Cxmap_s
{
_CX_NAME_HEADER_
Cxunsigned_t shift;
Cxunsigned_t mask;
Cxpart_t* part;
Dt_t* str2num;
Dt_t* num2str;
Cxmap_t* map;
};
struct Cxconstraint_s
{
_CX_NAME_HEADER_
Cxinit_f initf;
Cxconstraint_f constraintf;
Cxvalue_t* def;
Cxvalue_t* min;
Cxvalue_t* max;
const char* expression;
const char* pattern;
void* data;
#ifdef _CX_CONSTRAINT_PRIVATE_
_CX_CONSTRAINT_PRIVATE_
#endif
};
struct Cxformat_s
{
const char* description;
char* details;
unsigned short flags;
short width;
short print;
short base;
short fill;
short code;
short delimiter;
short escape;
short quotebegin;
short quoteend;
short fixedpoint;
short unused;
Cxmap_t* map;
Cxconstraint_t* constraint;
};
struct Cxreference_s
{
Cxreference_t* next;
Cxvariable_t* variable;
Cxmember_t* member;
};
struct Cxarray_s
{
Cxvariable_t* variable;
size_t size;
short delimiter;
};
struct Cxstructure_s
{
Cxvariable_t* parent;
Cxvariable_t* members;
Cxvariable_t* next;
size_t size;
int level;
};
struct Cxvariable_s
{
_CX_LIST_HEADER_
Cxfunction_f function;
Cxtype_t* type;
const char* prototype;
unsigned long index;
Cxformat_t format;
void* data;
Cxreference_t* reference;
Cxtype_t* member;
Cxarray_t* array;
Cxstructure_t* structure;
};
struct Cxmatch_s
{
_CX_NAME_HEADER_
Cxmatchcomp_f compf;
Cxmatchexec_f execf;
Cxmatchfree_f freef;
};
struct Cxmember_s
{
Cxcallout_f getf;
Cxcallout_f setf;
Dt_t* members;
};
struct Cxtype_s
{
_CX_NAME_HEADER_
Cxtype_t* base;
Cxinit_f initf;
Cxexternal_f externalf;
Cxinternal_f internalf;
unsigned short representation;
unsigned short index;
unsigned short size;
unsigned short element;
Cxformat_t format;
Cxmatch_t* match;
Cxmember_t* member;
Cxtype_t** generic;
Cxtype_t* fundamental;
void* data;
};
typedef struct Cxcallout_s
{
_CX_CODE_HEADER_
Cxcallout_f callout;
} Cxcallout_t;
typedef struct Cxrecode_s
{
_CX_CODE_HEADER_
Cxrecode_f recode;
} Cxrecode_t;
struct Cxinstruction_s
{
int op;
int pp;
Cxtype_t* type;
Cxvalue_t data;
Cxcallout_f callout;
};
struct Cxdisc_s
{
unsigned long version;
Error_f errorf;
Cxload_f loadf;
Cxlocation_f locationf;
const char* ps1;
const char* ps2;
const char* map;
};
struct Cxquery_s
{
_CX_NAME_HEADER_
Cxquery_f beg;
Cxquery_f sel;
Cxquery_f act;
Cxquery_f end;
const char* method;
Cxquery_f ref;
#ifdef _CX_QUERY_PRIVATE_
_CX_QUERY_PRIVATE_
#endif
};
struct Cxmeth_s; typedef struct Cxmeth_s Cxmeth_t;
struct Cxlib_s
{
_CX_NAME_HEADER_
const char** libraries;
Cxmeth_t* meth;
Cxtype_t* types;
Cxcallout_t* callouts;
Cxrecode_t* recodes;
Cxmap_t** maps;
Cxquery_t* queries;
Cxconstraint_t* constraints;
Cxedit_t* edits;
Cxvariable_t* functions;
void* pad[7];
const char* path;
};
struct Cxexpr_s
{
Cxexpr_t* parent;
Cxexpr_t* group;
Cxexpr_t* next;
Cxexpr_t* pass;
Cxexpr_t* fail;
Cxquery_t* query;
const char* file;
Sfio_t* op;
void* data;
char** argv;
Cxunsigned_t queried;
Cxunsigned_t selected;
#ifdef _CX_EXPR_PRIVATE_
_CX_EXPR_PRIVATE_
#endif
};
struct Cxstate_s
{
Dt_t* libraries;
Dt_t* methods;
Dt_t* types;
Dt_t* callouts;
Dt_t* recodes;
Dt_t* maps;
Dt_t* queries;
Dt_t* constraints;
Dt_t* edits;
Dt_t* variables;
Cxtype_t* type_buffer;
Cxtype_t* type_number;
Cxtype_t* type_reference;
Cxtype_t* type_string;
Cxtype_t* type_type_t;
Cxtype_t* type_void;
#ifdef _CX_STATE_PRIVATE_
_CX_STATE_PRIVATE_
#endif
};
struct Cx_s
{
const char* id;
Vmalloc_t* vm;
Vmalloc_t* em;
Vmalloc_t* rm;
Cxflags_t flags;
Cxflags_t test;
int eof;
int error;
int interactive;
Cxstate_t* state;
Cxdisc_t* disc;
Sfio_t* buf;
void* caller;
Dt_t* variables;
Dt_t* fields;
Dt_t* types;
Dt_t* callouts;
Dt_t* recodes;
Dt_t* maps;
Dt_t* queries;
Dt_t* constraints;
Dt_t* edits;
Cx_t* scope;
unsigned char* ctype;
#ifdef _CX_PRIVATE_
_CX_PRIVATE_
#endif
};
#define cxinit(d,e) (memset(d,0,sizeof(Cxdisc_t)),(d)->version=CX_VERSION,(d)->errorf=(Error_f)(e),cxstate(d))
#if _BLD_cx && defined(__EXPORT__)
#define extern __EXPORT__
#endif
extern Cxstate_t* cxstate(Cxdisc_t*);
extern Cx_t* cxopen(Cxflags_t, Cxflags_t, Cxdisc_t*);
extern Cx_t* cxscope(Cx_t*, Cx_t*, Cxflags_t, Cxflags_t, Cxdisc_t*);
extern int cxclose(Cx_t*);
extern void* cxpush(Cx_t*, const char*, Sfio_t*, const char*, ssize_t, Cxflags_t);
extern int cxpop(Cx_t*, void*);
extern ssize_t cxtell(Cx_t*);
extern Cxexpr_t* cxcomp(Cx_t*);
extern int cxbeg(Cx_t*, Cxexpr_t*, const char*);
extern int cxeval(Cx_t*, Cxexpr_t*, void*, Cxoperand_t*);
extern int cxend(Cx_t*, Cxexpr_t*);
extern int cxlist(Cx_t*, Cxexpr_t*, Sfio_t*);
extern int cxfree(Cx_t*, Cxexpr_t*);
extern int cxcast(Cx_t*, Cxoperand_t*, Cxvariable_t*, Cxtype_t*, void*, const char*);
extern size_t cxsizeof(Cx_t*, Cxvariable_t*, Cxtype_t*, Cxvalue_t*);
extern char* cxcontext(Cx_t*);
extern char* cxlocation(Cx_t*, void*);
extern void cxcodetrace(Cx_t*, const char*, Cxinstruction_t*, unsigned int, Cxoperand_t*, Cxoperand_t*);
extern char* cxcodename(int);
extern char* cxopname(int, Cxtype_t*, Cxtype_t*);
extern int cxaddcallout(Cx_t*, Cxcallout_t*, Cxdisc_t*);
extern int cxaddconstraint(Cx_t*, Cxconstraint_t*, Cxdisc_t*);
extern int cxaddedit(Cx_t*, Cxedit_t*, Cxdisc_t*);
extern int cxaddmap(Cx_t*, Cxmap_t*, Cxdisc_t*);
extern int cxaddquery(Cx_t*, Cxquery_t*, Cxdisc_t*);
extern int cxaddrecode(Cx_t*, Cxrecode_t*, Cxdisc_t*);
extern int cxaddtype(Cx_t*, Cxtype_t*, Cxdisc_t*);
extern int cxaddvariable(Cx_t*, Cxvariable_t*, Cxdisc_t*);
extern Cxtype_t* cxattr(Cx_t*, const char*, char**, Cxformat_t*, Cxdisc_t*);
extern Cxcallout_f cxcallout(Cx_t*, int, Cxtype_t*, Cxtype_t*, Cxdisc_t*);
extern Cxconstraint_t* cxconstraint(Cx_t*, const char*, Cxdisc_t*);
extern Cxedit_t* cxedit(Cx_t*, const char*, Cxdisc_t*);
extern Cxvariable_t* cxfunction(Cx_t*, const char*, Cxdisc_t*);
extern Cxmap_t* cxmap(Cx_t*, const char*, Cxdisc_t*);
extern Cxquery_t* cxquery(Cx_t*, const char*, Cxdisc_t*);
extern Cxrecode_f cxrecode(Cx_t*, int, Cxtype_t*, Cxtype_t*, Cxdisc_t*);
extern Cxtype_t* cxtype(Cx_t*, const char*, Cxdisc_t*);
extern Cxvariable_t* cxvariable(Cx_t*, const char*, Cxtype_t*, Cxdisc_t*);
extern int cxnum2str(Cx_t*, Cxformat_t*, Cxunsigned_t, char**);
extern int cxstr2num(Cx_t*, Cxformat_t*, const char*, size_t, Cxunsigned_t*);
extern int cxsub(Cx_t*, Cxedit_t*, Cxoperand_t*);
extern int cxsuball(Cx_t*, Cxpart_t*, Cxoperand_t*);
extern char* cxcvt(Cx_t*, const char*, size_t);
extern int cxatfree(Cx_t*, Cxexpr_t*, Cxdone_f, void*);
#undef extern
#endif