diff options
| author | take_cheeze <[email protected]> | 2014-06-14 13:16:13 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-06-14 13:25:00 +0900 |
| commit | 8f4b7ac15c77f24952364f1b3b1ac42e2e52ebd5 (patch) | |
| tree | d5a6c984a017c0cbe8c3e28d59a6a72a2cfe28c2 /src | |
| parent | 514450e891e015efa9fd01f13a46863d4f118c13 (diff) | |
| download | mruby-8f4b7ac15c77f24952364f1b3b1ac42e2e52ebd5.tar.gz mruby-8f4b7ac15c77f24952364f1b3b1ac42e2e52ebd5.zip | |
Support float/double unpacking.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pack.c | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/pack.c b/src/pack.c index 6b211c961..69cf740ff 100644 --- a/src/pack.c +++ b/src/pack.c @@ -256,6 +256,35 @@ pack_double(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned i } static int +unpack_double(mrb_state *mrb, const unsigned char * src, int srclen, mrb_value ary, unsigned int flags) +{ + int i; + double d; + uint8_t *buffer = (uint8_t *)&d; + + if (flags & PACK_FLAG_LITTLEENDIAN) { +#ifdef MRB_ENDIAN_BIG + for (i = 0; i < 8; ++i) { + buffer[8 - i - 1] = src[i]; + } +#else + memcpy(buffer, src, 8); +#endif + } else { +#ifdef MRB_ENDIAN_BIG + memcpy(buffer, src, 8); +#else + for (i = 0; i < 8; ++i) { + buffer[8 - i - 1] = src[i]; + } +#endif + } + mrb_ary_push(mrb, ary, mrb_float_value(mrb, d)); + + return 8; +} + +static int pack_float(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags) { int i; @@ -286,6 +315,35 @@ pack_float(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned in } static int +unpack_float(mrb_state *mrb, const unsigned char * src, int srclen, mrb_value ary, unsigned int flags) +{ + int i; + float f; + uint8_t *buffer = (uint8_t *)&f; + + if (flags & PACK_FLAG_LITTLEENDIAN) { +#ifdef MRB_ENDIAN_BIG + for (i = 0; i < 4; ++i) { + buffer[4 - i - 1] = src[i]; + } +#else + memcpy(buffer, src, 4); +#endif + } else { +#ifdef MRB_ENDIAN_BIG + memcpy(buffer, src, 4); +#else + for (i = 0; i < 4; ++i) { + buffer[4 - i - 1] = src[i]; + } +#endif + } + mrb_ary_push(mrb, ary, mrb_float_value(mrb, f)); + + return 4; +} + +static int pack_a(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags) { int copylen, slen, padlen; @@ -623,7 +681,7 @@ read_tmpl(mrb_state *mrb, struct tmpl *tmpl, int *dirp, int *typep, int *sizep, case 'F': case 'f': dir = PACK_DIR_FLOAT; type = PACK_TYPE_FLOAT; - size = 8; + size = 4; flags |= PACK_FLAG_SIGNED; break; case 'E': @@ -899,6 +957,12 @@ mrb_pack_unpack(mrb_state *mrb, mrb_value str) case PACK_DIR_BASE64: srcidx += unpack_m(mrb, sptr, srclen - srcidx, result, flags); break; + case PACK_DIR_FLOAT: + srcidx += unpack_float(mrb, sptr, srclen - srcidx, result, flags); + break; + case PACK_DIR_DOUBLE: + srcidx += unpack_double(mrb, sptr, srclen - srcidx, result, flags); + break; } if (count > 0) { count--; |
