示例#1
0
文件: numeric.c 项目: lwes/lwes-ruby
/* used for Struct serialization where types are known ahead of time */
static int dump_num(
    LWES_TYPE type,
    VALUE val,
    LWES_BYTE_P buf,
    size_t *off)
{
    if (type != LWES_TYPE_IP_ADDR && TYPE(val) == T_STRING)
        val = rb_funcall(val, id_to_i, 0, 0);

    switch (type) {
    case LWES_TYPE_U_INT_16:
        return dump_uint16(val, buf, off);
    case LWES_TYPE_INT_16:
        return dump_int16(val, buf, off);
    case LWES_TYPE_U_INT_32:
        return dump_uint32(val, buf, off);
    case LWES_TYPE_INT_32:
        return dump_int32(val, buf, off);
    case LWES_TYPE_U_INT_64:
        return dump_uint64(val, buf, off);
    case LWES_TYPE_INT_64:
        return dump_int64(val, buf, off);
    case LWES_TYPE_IP_ADDR:
        return dump_ip_addr(val, buf, off);
    default:
        rb_raise(rb_eRuntimeError,
                 "unknown LWES attribute type: 0x%02x", type);
    }
    assert("you should never get here (dump_num)");
    return -1;
}
void test_double_float() {
    test_header();

    double d = 2.2354e-10;
    float f = d;
    uint32_t i = 7821334;
    uchar_vec b;
    unsigned char *buffer = NULL;

    kv_init(b);
    dump_double(d, &b);
    buffer = b.a;
    fprintf(stderr, "%g == %g - ", d, load_double(&buffer));
    fprintf(stderr, "buffer used: %zu\n", buffer - b.a);

    kv_clear(b);
    dump_float(f, &b);
    buffer = b.a;
    fprintf(stderr, "%g == %g - ", d, load_float(&buffer));
    fprintf(stderr, "buffer used: %zu\n", buffer - b.a);

    kv_clear(b);
    dump_uint32(i, &b);
    buffer = b.a;
    fprintf(stderr, "%d == %d - ", i, load_uint32(&buffer));
    fprintf(stderr, "buffer used: %zu\n", buffer - b.a);

    kv_destroy(b);
}