static target_size_t cgTypeTruncSize( // GET SIZE FOR TRUNCATION TYPE type ) // - type to be sized { target_size_t size; // - size of element type_flag flags; // - flags for a type switch( TypedefModifierRemove( type )->id ) { case TYP_ARRAY : case TYP_FUNCTION : case TYP_POINTER : TypePointedAt( type, &flags ); if( flags & ( TF1_BASED | TF1_FAR16 ) ) { type = TypeConvertFromPcPtr( type ); } size = cgPtrSize( type ); break; default : size = CgTypeSize( type ); break; } return( size ); }
CNV_RETN PtrConvertCommon( // CONVERT TO COMMON PTR PTREE expr ) // - expression { PTREE *r_left; // - reference( left node ) PTREE *r_right; // - reference( right node ) TYPE ltype; // - type on left TYPE rtype; // - type on right TYPE lptype; // - new ptr type on left TYPE rptype; // - new ptr type on right TYPE lbtype; // - base type on left TYPE rbtype; // - base type on right TYPE type; // - resultant type TYPE common; // - common base type CNV_RETN retn; // - conversion return r_left = &expr->u.subtree[0]; ltype = NodeType( *r_left ); r_right = &expr->u.subtree[1]; rtype = NodeType( *r_right ); if( same_ptr_types( ltype, rtype ) ) { type = ltype; if( CgTypeSize( ltype ) > CgTypeSize( rtype ) ) { expr->type = ltype; } else { expr->type = rtype; } retn = propogateNonZero( CNV_OK, expr ); } else if( ptr_to_void( ltype ) ) { retn = NodeCheckCnvPtrVoid( &expr, rtype, ltype ); retn = check_common( retn, expr, ltype ); } else if( ptr_to_void( rtype ) ) { retn = NodeCheckCnvPtrVoid( &expr, ltype, rtype ); retn = check_common( retn, expr, rtype ); } else{ lbtype = TypePointedAtModified( ltype ); rbtype = TypePointedAtModified( rtype ); switch( TypeCommonDerivation( lbtype, rbtype ) ) { case CTD_LEFT : case CTD_LEFT_VIRTUAL : retn = NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_left, ltype, rtype ); retn = check_common( retn, expr, rtype ); break; case CTD_RIGHT : case CTD_RIGHT_VIRTUAL : retn = NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_right, rtype, ltype ); retn = check_common( retn, expr, ltype ); break; case CTD_NO : common = TypeCommonBase( rbtype, lbtype ); if( common != NULL ) { lptype = TypePointedAtReplace( ltype, common ); rptype = TypePointedAtReplace( rtype, common ); /* TypeCommonBase verified everything so these convs will work*/ NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_left, ltype, lptype ); NodeConvertPtr( CNVPTR_DERIVED_ONLY, r_right, rtype, rptype); expr->type = expr->u.subtree[0]->type; retn = propogateNonZero( CNV_OK, expr ); } else { retn = UserDefCnvToType( r_left, ltype, rtype ); if( retn == CNV_IMPOSSIBLE ) { retn = UserDefCnvToType( r_right, rtype, ltype ); retn = check_common( retn, expr, ltype ); } else { retn = check_common( retn, expr, rtype ); } } break; case CTD_RIGHT_AMBIGUOUS : ConversionTypesSet( rtype, ltype ); case CTD_LEFT_AMBIGUOUS : retn = CNV_AMBIGUOUS; break; case CTD_RIGHT_PRIVATE : ConversionTypesSet( rtype, ltype ); case CTD_LEFT_PRIVATE : retn = CNV_PRIVATE; break; case CTD_RIGHT_PROTECTED : ConversionTypesSet( rtype, ltype ); case CTD_LEFT_PROTECTED : retn = CNV_PROTECTED; break; } } return( retn ); }