From c869bdedc0ffcb7f6650ce2f519dceb9a41bae24 Mon Sep 17 00:00:00 2001 From: Julien Ammous Date: Tue, 7 May 2013 21:08:03 +0200 Subject: added support for E in pack (double) --- README.md | 1 + src/pack.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ead796169..0e11a61a5 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ rake ENABLE_GEMS="true" ## support template string - C : 8-bit unsigned (unsigned char) - c : 8-bit signed (signed char) + - E : 64-bit double, little endian - S : 16-bit unsigned, native endian (uint16_t) - s : 16-bit signed, native endian (int16_t) - L : 32-bit unsigned, native endian (uint32_t) diff --git a/src/pack.c b/src/pack.c index 659a0e424..4d26a1fe6 100644 --- a/src/pack.c +++ b/src/pack.c @@ -30,7 +30,7 @@ enum { //PACK_DIR_VAX, //PACK_DIR_UTF8, /* U */ //PACK_DIR_BER, - //PACK_DIR_DOUBLE, /* d */ + PACK_DIR_DOUBLE, /* E */ //PACK_DIR_FLOAT, /* f */ PACK_DIR_STR, /* A */ PACK_DIR_HEX, /* h */ @@ -188,6 +188,26 @@ pack_l(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl return 4; } +static int +pack_double(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags) +{ + int i; + double d; + str = str_len_ensure(mrb, str, sidx + 8); + d = mrb_float(o); + uint8_t *buffer = (uint8_t *)&d; + +#ifdef MRB_ENDIAN_BIG + #error unsupported +#else + for(i = 0; i< 8; i++){ + RSTRING_PTR(str)[sidx+i] = buffer[i]; + } +#endif + + return 8; +} + static int unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags) { @@ -541,6 +561,12 @@ read_tmpl(mrb_state *mrb, struct tmpl *tmpl, int *dirp, int *typep, int *sizep, size = 1; flags |= PACK_FLAG_SIGNED; break; + case 'E': + dir = PACK_DIR_DOUBLE; + type = PACK_TYPE_FLOAT; + size = 8; + flags |= PACK_FLAG_SIGNED; + break; case 'H': dir = PACK_DIR_HEX; type = PACK_TYPE_STRING; @@ -683,6 +709,10 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary) } else if (!mrb_fixnum_p(o)) { mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %s into Integer", mrb_obj_classname(mrb, o)); } + } else if (type == PACK_TYPE_FLOAT) { + if (!mrb_float_p(o)) { + o = mrb_funcall(mrb, o, "to_f", 0); + } } else if (type == PACK_TYPE_STRING) { if (!mrb_string_p(o)) { mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %s into String", mrb_obj_classname(mrb, o)); @@ -708,6 +738,9 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary) case PACK_DIR_STR: ridx += pack_a(mrb, o, result, ridx, count, flags); break; + case PACK_DIR_DOUBLE: + ridx += pack_double(mrb, o, result, ridx, flags); + break; default: break; } -- cgit v1.2.3 From dce09fb7fd409eec1bada66c52c3a7f0a58e1e5f Mon Sep 17 00:00:00 2001 From: Julien Ammous Date: Tue, 7 May 2013 21:08:16 +0200 Subject: removed unused variables --- src/pack.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/pack.c b/src/pack.c index 4d26a1fe6..e28c0ca73 100644 --- a/src/pack.c +++ b/src/pack.c @@ -232,7 +232,7 @@ unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un static int pack_a(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags) { - int copylen, dlen, slen, padlen; + int copylen, slen, padlen; char *dptr, *dptr0, pad, *sptr; sptr = RSTRING_PTR(src); @@ -269,7 +269,7 @@ static int unpack_a(mrb_state *mrb, const void *src, int slen, mrb_value ary, long count, unsigned int flags) { mrb_value dst; - const char *sptr, *sptr0; + const char *sptr; char *dptr, *dptr0; sptr = src; @@ -298,7 +298,7 @@ unpack_a(mrb_state *mrb, const void *src, int slen, mrb_value ary, long count, u static int pack_h(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags) { - unsigned int a, ashift, b, bshift, x; + unsigned int a, ashift, b, bshift; int slen; char *dptr, *dptr0, *sptr; @@ -343,9 +343,7 @@ static int unpack_h(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, unsigned int flags) { mrb_value dst; - unsigned long l; - int a, ashift, b, bshift, i, padding; - unsigned char c, ch[4]; + int a, ashift, b, bshift, padding; const char *sptr, *sptr0; char *dptr, *dptr0; const char hexadecimal[] = "0123456789abcdef"; -- cgit v1.2.3