#include // I can't live without 'elif' #define elif else if // Good ol' TRUE and FALSE #define TRUE 1 #define FALSE 0 // The 'operator-code' values for the decorated name specification #define OC_ctor ((unsigned char)'0') #define OC_dtor ((unsigned char)'1') #define OC_new ((unsigned char)'2') #define OC_delete ((unsigned char)'3') #define OC_assign ((unsigned char)'4') #define OC_rshift ((unsigned char)'5') #define OC_lshift ((unsigned char)'6') #define OC_not ((unsigned char)'7') #define OC_equal ((unsigned char)'8') #define OC_unequal ((unsigned char)'9') #define OC_index ((unsigned char)'A') #define OC_udc ((unsigned char)'B') #define OC_pointer ((unsigned char)'C') #define OC_star ((unsigned char)'D') #define OC_incr ((unsigned char)'E') #define OC_decr ((unsigned char)'F') #define OC_minus ((unsigned char)'G') #define OC_plus ((unsigned char)'H') #define OC_amper ((unsigned char)'I') #define OC_ptrmem ((unsigned char)'J') #define OC_divide ((unsigned char)'K') #define OC_modulo ((unsigned char)'L') #define OC_less ((unsigned char)'M') #define OC_leq ((unsigned char)'N') #define OC_greater ((unsigned char)'O') #define OC_geq ((unsigned char)'P') #define OC_comma ((unsigned char)'Q') #define OC_call ((unsigned char)'R') #define OC_compl ((unsigned char)'S') #define OC_xor ((unsigned char)'T') #define OC_or ((unsigned char)'U') #define OC_land ((unsigned char)'V') #define OC_lor ((unsigned char)'W') #define OC_asmul ((unsigned char)'X') #define OC_asadd ((unsigned char)'Y') #define OC_assub ((unsigned char)'Z') #define OC_asdiv ((unsigned char)'0') #define OC_asmod ((unsigned char)'1') #define OC_asrshift ((unsigned char)'2') #define OC_aslshift ((unsigned char)'3') #define OC_asand ((unsigned char)'4') #define OC_asor ((unsigned char)'5') #define OC_asxor ((unsigned char)'6') #define OC_vftable ((unsigned char)'7') #define OC_vbtable ((unsigned char)'8') #define OC_vcall ((unsigned char)'9') #define OC_metatype ((unsigned char)'A') #define OC_guard ((unsigned char)'B') #define OC_uctor ((unsigned char)'C') #define OC_udtor ((unsigned char)'D') #define OC_vdeldtor ((unsigned char)'E') #define OC_defctor ((unsigned char)'F') #define OC_sdeldtor ((unsigned char)'G') #define OC_vctor ((unsigned char)'H') #define OC_vdtor ((unsigned char)'I') #define OC_vallctor ((unsigned char)'J') // Values for the 'type-encoding' #define TE_isbadtype(t) ((t)==0xFFFF) #define TE_setisbadtype(t) ((t)=0xFFFF) #define TE_istruncated(t) ((t)==0xFFFE) #define TE_setistruncated(t) ((t)=0xFFFE) #define TE_isfunction(t) ((t)&0x8000) #define TE_setisfunction(t) ((t)|=0x8000) #define TE_isbased(t) ((t)&0x4000) #define TE_setisbased(t) ((t)|=0x4000) #define TE_isnear(t) (((t)&0x2000)==0x0000) #define TE_setisnear(t) ((t)&=~0x2000) #define TE_isfar(t) ((t)&0x2000) #define TE_setisfar(t) ((t)|=0x2000) #define TE_ismember(t) (TE_isfunction(t)?(((t)&0x1800)==0x0800):(((t)&0x6000)==0x0000)) #define TE_setismember(t) (TE_isfunction(t)?((t)=(((t)&~0x1800)|0x0800)):((t)=((t)&~0x6000))) #define TE_isvirtual(t) (TE_isfunction(t)&&(((t)&0x0700)==0x0100)) #define TE_setisvirtual(t) ((t)=(((t)&~0x0700)|0x0100)) #define TE_isthunk(t) (TE_ismember(t)?((t)&0x0400):((t)&0x1000)) #define TE_isvcall(t) (TE_isfunction(t)?(((t)&0x1800)==0x1800):0) #define TE_setisvcall(t) ((t)=(((t)&~0x9800)|0x9800)) #define TE_islocaldtor(t) (TE_isfunction(t)?(((t)&0x1800)==0x1000):0) #define TE_setislocaldtor(t) ((t)=(((t)&~0x9800)|0x9000)) #define TE_isadjustor(t) (TE_ismember(t)&&(((t)&0x0700)==0x0400)) #define TE_setisadjustor(t) ((t)=(((t)&~0x0700)|0x0400)) #define TE_isvtoradj(t) (TE_ismember(t)&&(((t)&0x0700)==0x0500)) #define TE_setisvtoradj(t) ((t)=(((t)&~0x0700)|0x0500)) #define TE_ispublic(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x00C0)==0x0000):(((t)&0x1800)==0x0000))) #define TE_setispublic(t) ((t)=(TE_isfunction(t)?((t)&~0x00C0):((t)&~0x1800))) #define TE_isprivate(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x00C0)==0x0040):(((t)&0x1800)==0x0800))) #define TE_setisprivate(t) ((t)=(TE_isfunction(t)?(((t)&~0x00C0)|0x0040):(((t)&~0x1800)|0x0800))) #define TE_isprotected(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x00C0)==0x0080):(((t)&0x1800)==0x1000))) #define TE_setisprotected(t) ((t)=(TE_isfunction(t)?(((t)&~0x00C0)|0x0080):(((t)&~0x1800)|0x1000))) #define TE_isstatic(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x0700)==0x0200):1)) #define TE_setisstatic(t) ((t)=(TE_isfunction(t)?(((t)&~0x0700)|0x0200):TE_setismember(t))) #define TE_isdata(t) (!TE_isfunction(t)) #define TE_setisdata(t) ((t)&=~0x8000) #define TE_isguard(t) (TE_isdata(t)&&(((t)&0x7800)==0x6000)) #define TE_setisguard(t) ((t)=(((t)&~0x7800)|0x6000)) #define TE_isvftable(t) (TE_isdata(t)&&(((t)&0x7800)==0x6800)) #define TE_setisvftable(t) ((t)=(((t)&~0x7800)|0x6800)) #define TE_isvbtable(t) (TE_isdata(t)&&(((t)&0x7800)==0x7000)) #define TE_setisvbtable(t) ((t)=(((t)&~0x7800)|0x7000)) #define TE_ismetaclass(t) (TE_isdata(t)&&(((t)&0x7800)==0x7800)) #define TE_setismetaclass(t) ((t)=(((t)&~0x7800)|0x7800)) #define TE_islocal(t) (TE_isdata(t)&&(((t)&0x6000)==0x2000)) #define TE_setislocal(t) ((t)=(((t)&~0x6000)|0x2000)) #define TE_isglobal(t) (TE_isdata(t)&&(((t)&0x6000)==0x4000)) #define TE_setisglobal(t) ((t)=(((t)&~0x6000)|0x4000)) #define TE_member ((unsigned char)0) #define TE_static ((unsigned char)2) #define TE_virtual ((unsigned char)4) #define TE_adjustor ((unsigned char)6) #define TE_external ((unsigned char)24) #define TE_far ((unsigned char)0x01) #define TE_private ((unsigned char)0x00) #define TE_protect ((unsigned char)0x08) #define TE_public ((unsigned char)0x10) #define TE_access (TE_protect|TE_public) #define TE_private_d ((unsigned char)0x00) #define TE_protect_d ((unsigned char)0x01) #define TE_public_d ((unsigned char)0x02) #define TE_access_d (TE_protect_d|TE_public_d) #define TE_private_vadj ((unsigned char)0x00) #define TE_protect_vadj ((unsigned char)0x02) #define TE_public_vadj ((unsigned char)0x04) #define TE_access_vadj (TE_protect_vadj|TE_public_vadj) #define TE_static_d ((unsigned char)'0') #define TE_global ((unsigned char)'3') #define TE_local ((unsigned char)'4') #define TE_guard ((unsigned char)'5') #define TE_vftable ((unsigned char)'6') #define TE_vbtable ((unsigned char)'7') #define TE_metatype ((unsigned char)'8') // Values for the 'data-indirect-type' #define DIT_near ((unsigned char)0x00) #define DIT_far ((unsigned char)0x04) #define DIT_huge ((unsigned char)0x08) #define DIT_based ((unsigned char)0x0C) #define DIT_modelmask ((unsigned char)0x0C) #define DIT_const ((unsigned char)0x01) #define DIT_volatile ((unsigned char)0x02) #define DIT_member ((unsigned char)0x10) // Values for the 'calling-convention' #define CC_cdecl ((unsigned char)0x00) #define CC_pascal ((unsigned char)0x02) #define CC_syscall ((unsigned char)0x04) #define CC_stdcall ((unsigned char)0x06) #define CC_fastcall ((unsigned char)0x08) #define CC_interrupt ((unsigned char)0x0A) #define CC_saveregs ((unsigned char)0x01) // Values for the 'data-type' #define DT_void 'X' // Values for the 'reference-data-type' #define RDT_array 'Y' // Values for the 'pointer-data-type' #define PoDT_void 'X' // Values for the 'primary-data-type' #define PDT_reference 'A' #define PDT_volatileReference 'B' // Values for the 'basic-data-type' #define BDT_unsigned 0x01 #define BDT_const 0x01 #define BDT_volatile 0x02 #define BDT_schar 'C' #define BDT_char 'D' #define BDT_short 'F' #define BDT_int 'H' #define BDT_long 'J' #define BDT_segment 'L' #define BDT_float 'M' #define BDT_double 'N' #define BDT_longdouble 'O' #define BDT_pointer 'P' #define BDT_union 'T' #define BDT_struct 'U' #define BDT_class 'V' #define BDT_enum 'W' // Values for the 'enum-type' #define ET_schar '0' #define ET_uchar '1' #define ET_sshort '2' #define ET_ushort '3' #define ET_sint '4' #define ET_uint '5' #define ET_slong '6' #define ET_ulong '7' // Values for the 'function-indirect-type' #define FIT_near 0x00 #define FIT_far 0x01 #define FIT_member 0x02 #define FIT_based 0x04 // Values for the 'function-indirect-type' #define AT_void 'X' #define AT_ellipsis 'Z' #define AT_endoflist '@' // Values for 'indirect-type' #define IT_isfunction(it) ((((it)>='6')&&((it)<='9'))||((it)=='_')) // Values for the 'based-type' #define BT_void '0' #define BT_self '1' #define BT_nearptr '2' #define BT_farptr '3' #define BT_hugeptr '4' #define BT_basedptr '5' #define BT_segment '6' #define BT_segname '7' #define BT_segaddr '8' // Values for the 'based-type' //#define TT_illegal '@' // An illegal value to keep the algorithm happy // Values for the 'ecsu-data-indirect-type' #define ECSU_near DIT_near #define ECSU_far DIT_far #define ECSU_huge DIT_huge #define ECSU_based DIT_based #define ECSU_modelmask DIT_modelmask #define ECSU_const DIT_const #define ECSU_volatile DIT_volatile #define ECSU_valid (0x8000) #define ECSU_invalid (0xFFFF) #define ECSU_truncated (0xFFFE) // Value for the 'vcall-model-type' #define VMT_nTnCnV 'A' #define VMT_nTfCnV 'B' #define VMT_fTnCnV 'C' #define VMT_fTfCnV 'D' #define VMT_nTnCfV 'E' #define VMT_nTfCfV 'F' #define VMT_fTnCfV 'G' #define VMT_fTfCfV 'H' #define VMT_nTnCbV 'I' #define VMT_nTfCbV 'J' #define VMT_fTnCbV 'K' #define VMT_fTfCbV 'L' // Values for the 'letter' and 'number' #define isValidLetter(n) (((n)=='_')||((n)=='$')||(((n)>='a')&&((n)<='z'))||(((n)>='A')&&((n)<='Z'))) #define isValidNumber(n) (((n)>='0')&&((n)<='9')) #define isValidIdentChar(n) (isValidLetter(n)||isValidNumber(n))