diff options
| author | take_cheeze <[email protected]> | 2014-06-13 17:56:36 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-06-14 13:24:49 +0900 |
| commit | f4f968241b1518175192c4f5302c36d420497fa5 (patch) | |
| tree | 7df953c50018f96234d2d408b8dfa54e46b19fd9 /src | |
| parent | a0c4ca24067dc23ecbae59665e83cf49b8fa5bb1 (diff) | |
| download | mruby-f4f968241b1518175192c4f5302c36d420497fa5.tar.gz mruby-f4f968241b1518175192c4f5302c36d420497fa5.zip | |
Add support of little endian float.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pack.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/pack.c b/src/pack.c index 3e56454f2..f8cdcbaad 100644 --- a/src/pack.c +++ b/src/pack.c @@ -31,7 +31,7 @@ enum { //PACK_DIR_UTF8, /* U */ //PACK_DIR_BER, PACK_DIR_DOUBLE, /* E */ - //PACK_DIR_FLOAT, /* f */ + PACK_DIR_FLOAT, /* f */ PACK_DIR_STR, /* A */ PACK_DIR_HEX, /* h */ PACK_DIR_BASE64, /* m */ @@ -246,6 +246,26 @@ pack_double(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned i } static int +pack_float(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags) +{ + int i; + float f; + uint8_t *buffer = (uint8_t *)&f; + str = str_len_ensure(mrb, str, sidx + 4); + f = mrb_float(o); + +#ifdef MRB_ENDIAN_BIG + #error unsupported +#else + for(i = 0; i < 4; i++){ + RSTRING_PTR(str)[sidx+i] = buffer[i]; + } +#endif + + 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; @@ -580,6 +600,12 @@ read_tmpl(mrb_state *mrb, struct tmpl *tmpl, int *dirp, int *typep, int *sizep, size = 8; flags |= PACK_FLAG_SIGNED; break; + case 'e': + dir = PACK_DIR_FLOAT; + type = PACK_TYPE_FLOAT; + size = 4; + flags |= PACK_FLAG_SIGNED; + break; case 'H': dir = PACK_DIR_HEX; type = PACK_TYPE_STRING; @@ -756,6 +782,9 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary) case PACK_DIR_DOUBLE: ridx += pack_double(mrb, o, result, ridx, flags); break; + case PACK_DIR_FLOAT: + ridx += pack_float(mrb, o, result, ridx, flags); + break; default: break; } |
