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)
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 */
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",
66 return (LWES_U_INT_64
)tmp
;
69 LWES_IP_ADDR
lwesrb_ip_addr(VALUE val
)
72 volatile VALUE raise_inspect
;
76 addr
.s_addr
= inet_addr(StringValueCStr(val
));
80 addr
.s_addr
= htonl(NUM2UINT(val
));
83 rb_raise(rb_eTypeError
,
84 ":ip_addr address must be String or Integer: %s",
91 LWES_BOOLEAN
lwesrb_boolean(VALUE val
)
93 if (val
== Qtrue
) return TRUE
;
95 volatile VALUE raise_inspect
;
96 rb_raise(rb_eTypeError
, "non-boolean: %s", RAISE_INSPECT(val
));