00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #ifndef _M_TOKEN_HXX
00025 #define _M_TOKEN_HXX
00026 
00032 typedef struct sGcElem {
00033   struct sGcElem *chain;        
00034   size_t length;                
00035   char dta[1];                  
00036 } sGcElem;
00037 
00044 typedef struct libmangle_gc_context_t {
00045   sGcElem *head;                
00046   sGcElem *tail;                
00047 } libmangle_gc_context_t;
00048 
00055 typedef enum eMToken {
00056   eMToken_none = 0,                
00057   eMToken_value = 1,               
00058   eMToken_name = 2,                
00059   eMToken_dim = 3,                 
00060   eMToken_unary = 4,               
00061   eMToken_binary = 5,              
00062   eMToken_MAX                      
00063 } eMToken;
00064 
00072 typedef enum eMSToken {
00073   eMST_unmangled = 0,               
00074   eMST_nttp = 1,                    
00075   eMST_name = 2,                    
00076   eMST_colon = 3,                   
00077   eMST_rtti = 4,                    
00078   eMST_cv = 5,                      
00079   eMST_vftable = 6,                 
00080   eMST_vbtable = 7,                 
00081   eMST_vcall = 8,                   
00082   eMST_opname = 9,                  
00083   eMST_templargname = 10,           
00084   eMST_type = 11,                   
00085   eMST_dim,                         
00086   eMST_val,                         
00087   eMST_gcarray,     
00088   eMST_slashed,                     
00089   eMST_array,                       
00090   eMST_element,                     
00091   eMST_template_argument_list,      
00092   eMST_ltgt,                        
00093   eMST_frame,                       
00094   eMST_throw,                       
00095   eMST_rframe,                      
00096   eMST_destructor,                  
00097   eMST_oper,                        
00098   eMST_colonarray,        
00099   eMST_lexical_frame,               
00100   eMST_scope,                       
00101   eMST_udt_returning,               
00102   eMST_coloncolon,                  
00103   eMST_assign,                      
00104   eMST_templateparam,               
00105   eMST_nonetypetemplateparam,       
00106   eMST_exp,                         
00107   eMST_combine,                     
00108   eMST_ecsu,                        
00109   eMST_based                       
00110 } eMSToken;
00111 
00116 typedef struct sMToken_base {
00117   enum eMToken kind;            
00118   enum eMSToken subkind;        
00119   union uMToken *chain;         
00120   int flags;                    
00121 } sMToken_base;
00122 
00124 #define MTOKEN_KIND(PT)         ((PT)->base.kind)
00125 
00127 #define MTOKEN_SUBKIND(PT)      ((PT)->base.subkind)
00128 
00130 #define MTOKEN_CHAIN(PT)        ((PT)->base.chain)
00131 
00133 #define MTOKEN_FLAGS(PT)        ((PT)->base.flags)
00134 
00135 #define MTOKEN_FLAGS_UDC    0x1 
00136 #define MTOKEN_FLAGS_NOTE   0x2 
00137 #define MTOKEN_FLAGS_PTRREF 0x4 
00138 #define MTOKEN_FLAGS_ARRAY  0x8 
00145 typedef struct sMToken_value {
00146   sMToken_base base;            
00147   uint64_t value;               
00148   uint64_t size : 5;            
00149   uint64_t is_signed : 1;       
00150 } sMToken_value;
00151 
00153 #define MTOKEN_VALUE(PT)        ((PT)->value.value)
00154 
00156 #define MTOKEN_VALUE_SIGNED(PT) ((PT)->value.is_signed)
00157 
00159 #define MTOKEN_VALUE_SIZE(PT)   ((PT)->value.size)
00160 
00165 typedef struct sMToken_name {
00166   sMToken_base base;            
00167   char name[1];                 
00168 } sMToken_name;
00169 
00171 #define MTOKEN_NAME(PT)         ((PT)->name.name)
00172 
00177 typedef struct sMToken_dim {
00178   sMToken_base base;            
00179   union uMToken *value;         
00180   union uMToken *non_tt_param;  
00181   int beNegate;                 
00182 } sMToken_dim;
00183 
00185 #define MTOKEN_DIM_VALUE(PT)    ((PT)->dim.value)
00186 
00188 #define MTOKEN_DIM_NTTP(PT)     ((PT)->dim.non_tt_param)
00189 
00191 #define MTOKEN_DIM_NEGATE(PT)   ((PT)->dim.beNegate)
00192 
00197 typedef struct sMToken_Unary
00198 {
00199   sMToken_base base;            
00200   union uMToken *unary;         
00201 } sMToken_Unary;
00202 
00204 #define MTOKEN_UNARY(PT)        ((PT)->unary.unary)
00205 
00211 typedef struct sMToken_binary {
00212   sMToken_base base;            
00213   union uMToken *left;          
00214   union uMToken *right;         
00215 } sMToken_binary;
00216 
00218 #define MTOKEN_BINARY_LEFT(PT)          ((PT)->binary.left)
00219 
00221 #define MTOKEN_BINARY_RIGHT(PT)         ((PT)->binary.right)
00222 
00229 typedef union uMToken {
00230   sMToken_base base;        
00231   sMToken_value value;      
00232   sMToken_name name;        
00233   sMToken_dim dim;          
00234   sMToken_Unary unary;      
00235   sMToken_binary binary;    
00236 } uMToken;
00237 
00247 uMToken *libmangle_gen_tok (libmangle_gc_context_t *gc, enum eMToken kind, enum eMSToken subkind, size_t addend);
00248 
00254 void libmangle_release_gc (libmangle_gc_context_t *gc);
00255 
00261 libmangle_gc_context_t *libmangle_generate_gc (void);
00262 
00269 uMToken *chain_tok (uMToken *l, uMToken *add);
00270 
00276 void libmangle_dump_tok (FILE *fp, uMToken *p);
00277 
00284 void libmangle_print_decl (FILE *fp, uMToken *p);
00285 
00293 char *libmangle_sprint_decl (uMToken *r);
00294 
00305 uMToken *gen_value (libmangle_gc_context_t *gc, enum eMSToken skind, uint64_t val, int is_signed, int size);
00306 
00315 uMToken *gen_name (libmangle_gc_context_t *gc, enum eMSToken skind, const char *name);
00316 
00328 uMToken *gen_dim (libmangle_gc_context_t *gc, enum eMSToken skind, uint64_t val, const char *non_tt_param, int fSigned, int fNegate);
00329 
00338 uMToken *gen_unary (libmangle_gc_context_t *gc, enum eMSToken skind, uMToken *un);
00339 
00349 uMToken *gen_binary (libmangle_gc_context_t *gc, enum eMSToken skind, uMToken *l, uMToken *r);
00350 
00351 #endif