#ifndef BASIC_H #define BASIC_H #include enum{ BBTYPE_END=0, BBTYPE_INT=1,BBTYPE_FLT=2, BBTYPE_STR=3,BBTYPE_CSTR=4, BBTYPE_OBJ=5,BBTYPE_VEC=6 }; #pragma pack( push,1 ) struct BBObj; struct BBStr; struct BBType; struct BBObjType; struct BBVecType; union BBField; struct BBArray; struct BBObj{ BBField *fields; BBObj *next,*prev; BBObjType *type; int ref_cnt; }; struct BBType{ int type; BBType( int n ):type(n){} }; struct BBObjType : public BBType{ BBObj used,free; int fieldCnt; BBType *fieldTypes[1]; }; struct BBVecType : public BBType{ int size; BBType *elementType; }; union BBField{ int INT; float FLT; BBStr *STR; char *CSTR; BBObj *OBJ; void *VEC; }; struct BBArray{ void *data; int elementType,dims,scales[1]; }; struct BBStr : public std::string{ BBStr *next,*prev; BBStr(); BBStr( const char *s ); BBStr( const char *s,int n ); BBStr( const BBStr &s ); BBStr( const std::string &s ); BBStr &operator=( const char *s ); BBStr &operator=( const BBStr &s ); BBStr &operator=( const std::string &s ); ~BBStr(); void *operator new( size_t size ); void operator delete( void *q ); void *operator new( size_t size,const char *file,int line ){ return operator new( size ); } void operator delete( void *q,const char *file,int line ){ operator delete( q ); } }; struct BBData{ int fieldType; BBField field; }; #pragma pack( pop ) void basic_link(); extern BBType _bbIntType; extern BBType _bbFltType; extern BBType _bbStrType; extern BBType _bbCStrType; BBStr * _bbStrLoad( BBStr **var ); void _bbStrRelease( BBStr *str ); void _bbStrStore( BBStr **var,BBStr *str ); int _bbStrCompare( BBStr *lhs,BBStr *rhs ); BBStr * _bbStrConcat( BBStr *s1,BBStr *s2 ); int _bbStrToInt( BBStr *s ); BBStr * _bbStrFromInt( int n ); float _bbStrToFloat( BBStr *s ); BBStr * _bbStrFromFloat( float n ); BBStr * _bbStrConst( const char *s ); void _bbDimArray( BBArray *array ); void _bbUndimArray( BBArray *array ); void _bbArrayBoundsEx(); void * _bbVecAlloc( BBVecType *type ); void _bbVecFree( void *vec,BBVecType *type ); void _bbVecBoundsEx(); BBObj * _bbObjNew( BBObjType *t ); void _bbObjDelete( BBObj *obj ); void _bbObjDeleteEach( BBObjType *type ); void _bbObjRelease( BBObj *obj ); void _bbObjStore( BBObj **var,BBObj *obj ); BBObj * _bbObjNext( BBObj *obj ); BBObj * _bbObjPrev( BBObj *obj ); BBObj * _bbObjFirst( BBObjType *t ); BBObj * _bbObjLast( BBObjType *t ); void _bbObjInsBefore( BBObj *o1,BBObj *o2 ); void _bbObjInsAfter( BBObj *o1,BBObj *o2 ); int _bbObjEachFirst( BBObj **var,BBObjType *type ); int _bbObjEachNext( BBObj **var ); int _bbObjCompare( BBObj *o1,BBObj *o2 ); BBStr * _bbObjToStr( BBObj *obj ); int _bbObjToHandle( BBObj *obj ); BBObj * _bbObjFromHandle( int handle,BBObjType *type ); void _bbNullObjEx(); void _bbRestore( BBData *data ); int _bbReadInt(); float _bbReadFloat(); BBStr * _bbReadStr(); int _bbAbs( int n ); int _bbSgn( int n ); int _bbMod( int x,int y ); float _bbFAbs( float n ); float _bbFSgn( float n ); float _bbFMod( float x,float y ); float _bbFPow( float x,float y ); void bbRuntimeStats(); #endif