summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-11-20 12:13:34 +0900
committerTomoyuki Sahara <[email protected]>2013-11-20 12:13:34 +0900
commit2245818f913e1686d646e308770bcbcb773066ac (patch)
tree9ddfabcdf8689c7c1f8ab780d36a8beac39d2f89 /src
parent78d2d909cfcc2e198c6ef56caef311af72ac024a (diff)
downloadmruby-2245818f913e1686d646e308770bcbcb773066ac.tar.gz
mruby-2245818f913e1686d646e308770bcbcb773066ac.zip
make it more portable.
Diffstat (limited to 'src')
-rw-r--r--src/pack.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/src/pack.c b/src/pack.c
index a9baa0d7d..23bc6e667 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -191,19 +191,35 @@ pack_l(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl
static int
unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
{
- unsigned long n;
+ char msg[60];
+ unsigned long ul;
+ long sl;
+ mrb_int n;
- if (flags & PACK_FLAG_LITTLEENDIAN) {
- n = (src[3] << 24) + (src[2] << 16) + (src[1] << 8) + src[0];
- } else {
- n = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
- }
if (flags & PACK_FLAG_SIGNED) {
- if (!FIXABLE((mrb_int)n))
- mrb_raisef(mrb, E_ARGUMENT_ERROR, "cannot unpack to 32bit signed number: %ld", (mrb_int)n);
+ if (flags & PACK_FLAG_LITTLEENDIAN) {
+ sl = (signed long)(signed char)src[3] * 256*256*256;
+ sl += (src[2] *256*256) + (src[1] * 256) + src[0];
+ } else {
+ sl = (signed long)(signed char)src[0] * 256*256*256;
+ sl += (src[1] *256*256) + (src[2] * 256) + src[3];
+ }
+ if (!FIXABLE(sl)) {
+ snprintf(msg, sizeof(msg), "cannot unpack to Fixnum: %ld", sl);
+ mrb_raise(mrb, E_RANGE_ERROR, msg);
+ }
+ n = sl;
} else {
- if (!POSFIXABLE(n))
- mrb_raisef(mrb, E_ARGUMENT_ERROR, "cannot unpack to 32bit unsigned number: %lu", n);
+ if (flags & PACK_FLAG_LITTLEENDIAN) {
+ ul = src[3] * 256*256*256 + (src[2] *256*256) + (src[1] * 256) + src[0];
+ } else {
+ ul = src[0] * 256*256*256 + (src[1] *256*256) + (src[2] * 256) + src[3];
+ }
+ if (!POSFIXABLE(ul)) {
+ snprintf(msg, sizeof(msg), "cannot unpack to Fixnum: %lu", ul);
+ mrb_raise(mrb, E_RANGE_ERROR, msg);
+ }
+ n = ul;
}
mrb_ary_push(mrb, ary, mrb_fixnum_value(n));
return 4;