summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-06-13 17:56:36 +0900
committertake_cheeze <[email protected]>2014-06-14 13:24:49 +0900
commitf4f968241b1518175192c4f5302c36d420497fa5 (patch)
tree7df953c50018f96234d2d408b8dfa54e46b19fd9 /src
parenta0c4ca24067dc23ecbae59665e83cf49b8fa5bb1 (diff)
downloadmruby-f4f968241b1518175192c4f5302c36d420497fa5.tar.gz
mruby-f4f968241b1518175192c4f5302c36d420497fa5.zip
Add support of little endian float.
Diffstat (limited to 'src')
-rw-r--r--src/pack.c31
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;
}