/* 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); }