浏览代码

Fixed large number encoding on 32bit architectures

I was accidentally truncating numbers when casting to long on
machines that don't have longs that are 8 bytes.

Fixes #5
pull/8/merge
Paul J. Davis 13 年前
父节点
当前提交
666091a93f
共有 2 个文件被更改,包括 11 次插入3 次删除
  1. +9
    -2
      c_src/encoder.c
  2. +2
    -1
      test/003-numbers.t

+ 9
- 2
c_src/encoder.c 查看文件

@ -330,13 +330,20 @@ enc_string(Encoder* e, ERL_NIF_TERM val)
}
static inline int
enc_long(Encoder* e, long val)
enc_long(Encoder* e, ErlNifSInt64 val)
{
if(!enc_ensure(e, 32)) {
return 0;
}
#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
snprintf(&(e->p[e->i]), 32, "%ld", val);
#elif SIZEOF_LONG == 8
snprintf(&(e->p[e->i]), 32, "%ld", val);
#else
snprintf(&(e->p[e->i]), 32, "%lld", val);
#endif
e->i += strlen(&(e->p[e->i]));
e->count++;
@ -421,8 +428,8 @@ encode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ERL_NIF_TERM item;
const ERL_NIF_TERM* tuple;
int arity;
ErlNifSInt64 lval;
double dval;
long lval;
if(argc != 2) {
return enif_make_badarg(env);

+ 2
- 1
test/003-numbers.t 查看文件

@ -6,7 +6,7 @@ main([]) ->
code:add_pathz("ebin"),
code:add_pathz("test"),
etap:plan(57),
etap:plan(59),
util:test_good(good()),
util:test_errors(errors()),
etap:end_tests().
@ -19,6 +19,7 @@ good() ->
{<<"12">>, 12},
{<<"-3">>, -3},
{<<"1234567890123456789012345">>, 1234567890123456789012345},
{<<"1310050760199">>, 1310050760199},
{
<<"1234567890123456789012345.0">>,
1.23456789012345678e24,

正在加载...
取消
保存