TEST_F(BuildFromXmlUnionAlign, align1_basic) { parseMeta( "<metalib tagsetversion='1' name='net' version='10'>" " <union name='S1' version='1' id='33'>" " <entry name='b1' type='int8'/>" " <entry name='b2' type='int16'/>" " </union>" " <struct name='S2' version='1' id='34'>" " <entry name='a1' type='int8'/>" " <entry name='m_u' type='S1'/>" " </struct>" "</metalib>" ); ASSERT_TRUE(t_em_no_error()); EXPECT_EQ(1, dr_meta_align(meta("S1"))); EXPECT_EQ((size_t)2, dr_meta_size(meta("S1"))); EXPECT_EQ(0, entry("S1", "b1")->m_data_start_pos); EXPECT_EQ(0, entry("S1", "b2")->m_data_start_pos); EXPECT_EQ(1, dr_meta_align(meta("S2"))); EXPECT_EQ((size_t)3, dr_meta_size(meta("S2"))); EXPECT_EQ(0, entry("S2", "a1")->m_data_start_pos); EXPECT_EQ(1, entry("S2", "m_u")->m_data_start_pos); }
int entryCount(void) const { return dr_meta_align(*this); }
static void cpe_dr_generate_h_metas(write_stream_t stream, dr_metalib_source_t source, cpe_dr_generate_ctx_t ctx) { struct dr_metalib_source_element_it element_it; dr_metalib_source_element_t element; int curent_pack; int packed; curent_pack = 0; packed = 0; dr_metalib_source_elements(&element_it, source); while((element = dr_metalib_source_element_next(&element_it))) { LPDRMETA meta; int entry_pos; if (dr_metalib_source_element_type(element) != dr_metalib_source_element_type_meta) continue; meta = dr_lib_find_meta_by_name(ctx->m_metalib, dr_metalib_source_element_name(element)); if (meta == NULL) continue; if (dr_meta_align(meta) != curent_pack) { stream_printf(stream, "\n#pragma pack(1)\n"); curent_pack = dr_meta_align(meta); packed = 1; } stream_printf(stream, "\nstruct %s {", dr_meta_name(meta)); for(entry_pos = 0; entry_pos < dr_meta_entry_num(meta); ++entry_pos) { LPDRMETAENTRY entry = dr_meta_entry_at(meta, entry_pos); stream_printf(stream, "\n"); stream_printf(stream, " "); switch(dr_entry_type(entry)) { case CPE_DR_TYPE_UNION: case CPE_DR_TYPE_STRUCT: { LPDRMETA ref_meta; ref_meta = dr_entry_ref_meta(entry); if (ref_meta == NULL) continue; stream_printf(stream, "%s %s %s", dr_type_name(dr_entry_type(entry)), dr_meta_name(ref_meta), dr_entry_name(entry)); break; } case CPE_DR_TYPE_STRING: { stream_printf(stream, "char %s[%d]", dr_entry_name(entry), dr_entry_size(entry)); break; } default: { stream_printf(stream, "%s_t %s", dr_type_name(dr_entry_type(entry)), dr_entry_name(entry)); break; } } if (dr_entry_array_count(entry) != 1) { stream_printf(stream, "[%d]", dr_entry_array_count(entry) < 1 ? 1 : dr_entry_array_count(entry)); } stream_printf(stream, ";"); } stream_printf(stream, "\n};\n"); } if (packed) { stream_printf(stream, "\n#pragma pack()\n\n"); } }
int align(void) const { return dr_meta_align(*this); }