properly emit sparse LWES::Events from Ruby Hashes
[lwes-ruby.git] / ext / lwes_ext / type_conv.c
blob48fd46a6121ef42511aeb12467ff768efd50373a
1 #include "lwes_ruby.h"
3 void lwesrb_dump_type(LWES_BYTE type, LWES_BYTE_P buf, size_t *off)
5 if (marshall_BYTE(type, buf, MAX_MSG_SIZE, off) > 0)
6 return;
7 rb_raise(rb_eRuntimeError, "failed to dump type=%02x", (unsigned)type);
10 LWES_U_INT_16 lwesrb_uint16(VALUE val)
12 int32_t tmp = NUM2INT(val);
14 if (tmp != (LWES_U_INT_16)tmp) {
15 const char *s = tmp < 0 ? "negative" : "too big";
16 rb_raise(rb_eRangeError, ":uint16 %s: %d", s, tmp);
18 return (LWES_U_INT_16)tmp;
21 LWES_INT_16 lwesrb_int16(VALUE val)
23 int32_t tmp = NUM2INT(val);
25 if (tmp != (LWES_INT_16)tmp) {
26 const char *s = tmp < 0 ? "small" : "big";
27 rb_raise(rb_eRangeError, ":int16 too %s: %d", s, tmp);
29 return (LWES_INT_16)tmp;
32 LWES_U_INT_32 lwesrb_uint32(VALUE val)
34 LONG_LONG tmp = NUM2LL(val);
36 if (tmp != (LWES_U_INT_32)tmp) {
37 const char *s = tmp < 0 ? "negative" : "too big";
38 rb_raise(rb_eRangeError, ":uint32 %s: %lli", s, tmp);
40 return (LWES_U_INT_32)tmp;
43 LWES_INT_32 lwesrb_int32(VALUE val)
45 LONG_LONG tmp = NUM2LL(val);
47 if (tmp != (LWES_INT_32)tmp) {
48 const char *s = tmp < 0 ? "small" : "big";
49 rb_raise(rb_eRangeError, ":int32 too %s: %lli", s, tmp);
51 return (LWES_INT_32)tmp;
54 LWES_U_INT_64 lwesrb_uint64(VALUE val)
56 unsigned LONG_LONG tmp = NUM2ULL(val); /* can raise RangeError */
57 ID type = TYPE(val);
59 if ((type == T_FIXNUM && FIX2LONG(val) < 0) ||
60 (type == T_BIGNUM && RTEST(rb_funcall(val, '<', 1, INT2FIX(0))))) {
61 volatile VALUE raise_inspect;
63 rb_raise(rb_eRangeError, ":uint64 negative: %s",
64 RAISE_INSPECT(val));
66 return (LWES_U_INT_64)tmp;
69 LWES_IP_ADDR lwesrb_ip_addr(VALUE val)
71 LWES_IP_ADDR addr;
72 volatile VALUE raise_inspect;
74 switch (TYPE(val)) {
75 case T_STRING:
76 addr.s_addr = inet_addr(StringValueCStr(val));
77 break;
78 case T_FIXNUM:
79 case T_BIGNUM:
80 addr.s_addr = htonl(NUM2UINT(val));
81 break;
82 default:
83 rb_raise(rb_eTypeError,
84 ":ip_addr address must be String or Integer: %s",
85 RAISE_INSPECT(val));
88 return addr;
91 LWES_BOOLEAN lwesrb_boolean(VALUE val)
93 if (val == Qtrue) return TRUE;
94 if (val != Qfalse) {
95 volatile VALUE raise_inspect;
96 rb_raise(rb_eTypeError, "non-boolean: %s", RAISE_INSPECT(val));
98 return FALSE;