static T dl_convert_bf_format( T old_val, const SDLMember* bf_members, uint32 bf_members_count, SConvertContext* conv_ctx ) { T new_val = 0; for( uint32 i = 0; i < bf_members_count; ++i ) { const SDLMember& bf_member = bf_members[i]; uint32 bf_bits = bf_member.BitFieldBits(); uint32 bf_offset = bf_member.BitFieldOffset(); uint32 bf_source_offset = dl_bf_offset( conv_ctx->m_SourceEndian, sizeof(T), bf_offset, bf_bits ); uint32 bf_target_offset = dl_bf_offset( conv_ctx->m_TargetEndian, sizeof(T), bf_offset, bf_bits ); T extracted = (T)DL_EXTRACT_BITS( old_val, T(bf_source_offset), T(bf_bits) ); new_val = (T)DL_INSERT_BITS ( new_val, extracted, T(bf_target_offset), T(bf_bits) ); } return new_val; }
static void dl_txt_unpack_member( dl_ctx_t dl_ctx, dl_txt_unpack_ctx* unpack_ctx, dl_binary_writer* writer, const dl_member_desc* member, const uint8_t* member_data ) { dl_txt_unpack_write_indent( writer, unpack_ctx ); dl_txt_unpack_write_string( writer, dl_internal_member_name( dl_ctx, member ) ); dl_binary_writer_write( writer, " : ", 3 ); switch( member->AtomType() ) { case DL_TYPE_ATOM_POD: { switch( member->StorageType() ) { case DL_TYPE_STORAGE_INT8: dl_txt_unpack_int8 ( writer, *(int8_t* )member_data ); break; case DL_TYPE_STORAGE_INT16: dl_txt_unpack_int16 ( writer, *(int16_t*)member_data ); break; case DL_TYPE_STORAGE_INT32: dl_txt_unpack_int32 ( writer, *(int32_t*)member_data ); break; case DL_TYPE_STORAGE_INT64: dl_txt_unpack_int64 ( writer, *(int64_t*)member_data ); break; case DL_TYPE_STORAGE_UINT8: dl_txt_unpack_uint8 ( writer, *(uint8_t* )member_data ); break; case DL_TYPE_STORAGE_UINT16: dl_txt_unpack_uint16( writer, *(uint16_t*)member_data ); break; case DL_TYPE_STORAGE_UINT32: dl_txt_unpack_uint32( writer, *(uint32_t*)member_data ); break; case DL_TYPE_STORAGE_UINT64: dl_txt_unpack_uint64( writer, *(uint64_t*)member_data ); break; case DL_TYPE_STORAGE_FP32: dl_txt_unpack_fp32 ( writer, *(float*)member_data ); break; case DL_TYPE_STORAGE_FP64: dl_txt_unpack_fp64 ( writer, *(double*)member_data ); break; case DL_TYPE_STORAGE_ENUM_INT8: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*( int8_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_UINT8: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*(uint8_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_INT16: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*( int16_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_UINT16: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*(uint16_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_INT32: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*( int32_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_UINT32: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*(uint32_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_INT64: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*( int64_t*) member_data ); break; case DL_TYPE_STORAGE_ENUM_UINT64: dl_txt_unpack_enum ( dl_ctx, writer, dl_internal_find_enum( dl_ctx, member->type_id ), (uint64_t)*(uint64_t*) member_data ); break; case DL_TYPE_STORAGE_STR: dl_txt_unpack_write_string_or_null( writer, unpack_ctx, *(uintptr_t*)member_data ); break; case DL_TYPE_STORAGE_PTR: { dl_txt_unpack_ptr( writer, *(uintptr_t*)member_data ); unpack_ctx->has_ptrs = true; } break; case DL_TYPE_STORAGE_STRUCT: dl_txt_unpack_struct( dl_ctx, unpack_ctx, writer, dl_internal_find_type( dl_ctx, member->type_id ), member_data ); break; default: DL_ASSERT(false); } } break; case DL_TYPE_ATOM_ARRAY: { uintptr_t offset = *(uintptr_t*)member_data; uint32_t count = *(uint32_t*)(member_data + sizeof(uintptr_t)); if( offset == (uintptr_t)-1 ) dl_binary_writer_write( writer, "[]", 2 ); else dl_txt_unpack_array( dl_ctx, unpack_ctx, writer, member->StorageType(), &unpack_ctx->packed_instance[offset], count, member->type_id ); } break; case DL_TYPE_ATOM_INLINE_ARRAY: dl_txt_unpack_array( dl_ctx, unpack_ctx, writer, member->StorageType(), member_data, member->inline_array_cnt(), member->type_id ); break; case DL_TYPE_ATOM_BITFIELD: { uint64_t write_me = 0; uint32_t bf_bits = member->bitfield_bits(); uint32_t bf_offset = dl_bf_offset( DL_ENDIAN_HOST, member->size[DL_PTR_SIZE_HOST], member->bitfield_offset(), bf_bits ); switch( member->size[DL_PTR_SIZE_HOST] ) { case 1: write_me = DL_EXTRACT_BITS( uint64_t( *(uint8_t*)member_data), uint64_t(bf_offset), uint64_t(bf_bits) ); break; case 2: write_me = DL_EXTRACT_BITS( uint64_t(*(uint16_t*)member_data), uint64_t(bf_offset), uint64_t(bf_bits) ); break; case 4: write_me = DL_EXTRACT_BITS( uint64_t(*(uint32_t*)member_data), uint64_t(bf_offset), uint64_t(bf_bits) ); break; case 8: write_me = DL_EXTRACT_BITS( uint64_t(*(uint64_t*)member_data), uint64_t(bf_offset), uint64_t(bf_bits) ); break; default: DL_ASSERT(false && "This should not happen!"); break; } dl_txt_unpack_uint64( writer, write_me ); } break; default: DL_ASSERT( false ); } }