Exemple #1
0
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;
            }
        }
    }
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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));
    }
}
Exemple #6
0
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));
}
Exemple #7
0
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");
    }
}
Exemple #8
0
 Utils::CString const & name(void) const { return Utils::CString::_cast(dr_meta_name(*this)); }