diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-08-28 17:33:16 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 18:20:06 +0900 |
| commit | 471479e723157c1a7df2023ab2eea24fa4ca2246 (patch) | |
| tree | 8d5c18642f44ca2f47832b66b6a49e5f0250afb7 /src/load.c | |
| parent | 397b005715b443ff8175ffe3549f13ebfc6a9e7f (diff) | |
| download | mruby-471479e723157c1a7df2023ab2eea24fa4ca2246.tar.gz mruby-471479e723157c1a7df2023ab2eea24fa4ca2246.zip | |
Change float representation in `mrb` binary files.
From human readable (ASCII) string representation to binary dump of
IEEE754 in little endian.
Diffstat (limited to 'src/load.c')
| -rw-r--r-- | src/load.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/src/load.c b/src/load.c index 2cc0f7557..392a38456 100644 --- a/src/load.c +++ b/src/load.c @@ -15,6 +15,7 @@ #include <mruby/debug.h> #include <mruby/error.h> #include <mruby/data.h> +#include <mruby/endian.h> #if SIZE_MAX < UINT32_MAX # error size_t must be at least 32 bits wide @@ -40,17 +41,26 @@ offset_crc_body(void) } #ifndef MRB_NO_FLOAT -double mrb_str_len_to_dbl(mrb_state *mrb, const char *s, size_t len, mrb_bool badcheck); - static double str_to_double(mrb_state *mrb, const char *p, size_t len) { - /* `i`, `inf`, `infinity` */ - if (len > 0 && p[0] == 'i') return INFINITY; - - /* `I`, `-inf`, `-infinity` */ - if (p[0] == 'I' || (len > 1 && p[0] == '-' && p[1] == 'i')) return -INFINITY; - return mrb_str_len_to_dbl(mrb, p, len, TRUE); + /* dump IEEE754 little endian binary */ + union { + char s[sizeof(double)]; + double f; + } u; + + mrb_assert(sizeof(double)==len); + if (littleendian) { + memcpy(u.s, p, sizeof(double)); + } + else { + int i; + for (i=0; i<sizeof(double); i++) { + u.s[i] = p[sizeof(double)-i-1]; + } + } + return u.f; } #endif |
