static void dr_metalib_validate_align_i(error_monitor_t em, LPDRMETALIB metalib) { int meta_pos; int meta_count; meta_count = dr_lib_meta_num(metalib); for(meta_pos = 0; meta_pos < meta_count; ++meta_pos) { LPDRMETA meta; int entry_pos; int entry_count; meta = dr_lib_meta_at(metalib, meta_pos); entry_count = dr_meta_entry_num(meta); for(entry_pos = 0; entry_pos < entry_count; ++entry_pos) { LPDRMETAENTRY entry = dr_meta_entry_at(meta, entry_pos); int align = dr_entry_align(entry); if (align != 1 && align != 2 && align != 4 && align != 8) { CPE_ERROR( em, "%s.%s: type align %d error", dr_meta_name(meta), dr_entry_name(entry), align); continue; } if ((int)dr_entry_data_start_pos(entry) % align) { CPE_ERROR( em, "%s.%s: start pos error, align is %d, startpos is %d", dr_meta_name(meta), dr_entry_name(entry), align, (int)dr_entry_data_start_pos(entry)); continue; } } } }
dr_cvt_result_t dr_cvt_fun_copy_encode( LPDRMETA meta, void * output, size_t * output_capacity, const void * input, size_t * input_capacity, void * ctx, error_monitor_t em, int debug) { int32_t size; size_t require_size = sizeof(size) + *input_capacity; if (*output_capacity < require_size) { CPE_ERROR( em, "encode %s: copy: not enought output buf, require %d(input=%d), but only %d!", dr_meta_name(meta), (int)require_size, (int)*input_capacity, (int)*output_capacity); return dr_cvt_result_not_enough_output; } size = *input_capacity; memcpy(output, &size, sizeof(size)); memcpy(((char*)output) + sizeof(size), input, *input_capacity); *output_capacity = require_size; if (debug) { CPE_INFO( em, "encode %s: copy: copy %d data to output, input-size=%d", dr_meta_name(meta), (int)require_size, (int)*input_capacity); } return dr_cvt_result_success; }
dr_cvt_result_t dr_cvt_fun_bson_encode( LPDRMETA meta, void * output, size_t * output_capacity, const void * input, size_t * input_capacity, void * ctx, error_monitor_t em, int debug) { int r; r = dr_bson_write(output, *output_capacity, input, *input_capacity, meta, em); if (r < 0) { CPE_ERROR( em, "encode %s: bson: fail, input buf "FMT_SIZE_T", output buf "FMT_SIZE_T, dr_meta_name(meta), *input_capacity, *output_capacity); return dr_cvt_result_error; } *output_capacity = r; if (debug) { CPE_INFO( em, "encode %s: bson: ok, %d data to output, input-size="FMT_SIZE_T, dr_meta_name(meta), r, *input_capacity); } return dr_cvt_result_success; }
dr_cvt_result_t dr_cvt_fun_copy_decode( LPDRMETA meta, void * output, size_t * output_capacity, const void * input, size_t * input_capacity, void * ctx, error_monitor_t em, int debug) { int32_t size; if (*input_capacity < sizeof(size)) { if (debug) { CPE_INFO( em, "decode %s: copy: not enought input data, require at least %d, but only %d!", dr_meta_name(meta), (int)sizeof(size), (int)*input_capacity); } *output_capacity = 0; *input_capacity = 0; return dr_cvt_result_not_enough_input; } memcpy(&size, input, sizeof(size)); if (*input_capacity < sizeof(size) + size) { if (debug) { CPE_INFO( em, "decode %s: copy: not enought input data, require %d(size=%d), but only %d!", dr_meta_name(meta), (int)sizeof(size) + size, size, (int)*input_capacity); } *output_capacity = 0; *input_capacity = 0; return dr_cvt_result_not_enough_input; } if (*output_capacity < (size_t)size) { if (debug) { CPE_INFO( em, "decode %s: copy: not enought output buf, require %d, but only %d!", dr_meta_name(meta), (int)size, (int)*output_capacity); } return dr_cvt_result_not_enough_output; } memcpy(output, ((const char *)input) + sizeof(size), size); *output_capacity = size; *input_capacity = size + sizeof(size); if (debug) { CPE_INFO( em, "decode %s: copy: copy %d data to output, input-size=%d", dr_meta_name(meta), (int)size, (int)*input_capacity); } return dr_cvt_result_success; }
void dr_meta_do_complete(LPDRMETA meta, error_monitor_t em) { int panding = meta->m_data_size % meta->m_align; if (panding) { panding = meta->m_align - panding; } meta->m_data_size += panding; if (meta->m_entry_count == 0) { CPE_ERROR_EX(em, CPE_DR_ERROR_META_NO_ENTRY, "meta %s have no entry", dr_meta_name(meta)); } }
static void dr_lib_dump_meta(write_stream_t stream, LPDRMETA meta, int ident) { stream_putc(stream, '\n'); stream_putc_count(stream, ' ', ident); stream_printf(stream, "%s[%d]:", dr_meta_name(meta), dr_meta_id(meta)); }
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"); } }
Utils::CString const & name(void) const { return Utils::CString::_cast(dr_meta_name(*this)); }