Fix uescape encoding bug
The encoding length for unicode values was applied to the wrong index
variable.
Thanks to Paul Guyot for the detailed bug report and fix.
Fixes #7
diff --git a/c_src/encoder.c b/c_src/encoder.c
index 7d9d321..c46c12d 100644
--- a/c_src/encoder.c
+++ b/c_src/encoder.c
@@ -242,7 +242,7 @@
if(uval < 0) {
return 0;
}
- ulen = utf8_esc_len(uval);
+ esc_extra = utf8_esc_len(uval);
if(ulen < 0) {
return 0;
}
diff --git a/test/004-strings.t b/test/004-strings.t
index 00d87e4..6a69586 100755
--- a/test/004-strings.t
+++ b/test/004-strings.t
@@ -6,8 +6,9 @@
code:add_pathz("ebin"),
code:add_pathz("test"),
- etap:plan(76),
+ etap:plan(78),
util:test_good(good()),
+ util:test_good(uescaped(), [uescape]),
util:test_errors(errors()),
test_utf8(utf8_cases()),
@@ -30,6 +31,14 @@
}
].
+uescaped() ->
+ [
+ {
+ <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
+ <<232,178,168,229,146,129,227,128,130,194,145,194,145>>
+ }
+ ].
+
errors() ->
[
<<"\"foo">>,
diff --git a/test/util.erl b/test/util.erl
index b05edc9..ceaef89 100644
--- a/test/util.erl
+++ b/test/util.erl
@@ -1,8 +1,11 @@
-module(util).
--export([test_good/1, test_errors/1]).
+-export([test_good/1, test_good/2, test_errors/1]).
test_good(Cases) ->
- lists:foreach(fun(Case) -> check_good(Case) end, Cases).
+ test_good(Cases, []).
+
+test_good(Cases, Options) ->
+ lists:foreach(fun(Case) -> check_good(Case, Options) end, Cases).
test_errors(Cases) ->
lists:foreach(fun(Case) -> check_error(Case) end, Cases).
@@ -13,18 +16,18 @@
ok_enc(E, _J) ->
lists:flatten(io_lib:format("Encoded ~p", [E])).
-do_encode(E) ->
- iolist_to_binary(jiffy:encode(E)).
+do_encode(E, Options) ->
+ iolist_to_binary(jiffy:encode(E, Options)).
error_mesg(J) ->
lists:flatten(io_lib:format("Decoding ~p returns an error.", [J])).
-check_good({J, E}) ->
+check_good({J, E}, Options) ->
etap:is(jiffy:decode(J), E, ok_dec(J, E)),
- etap:is(do_encode(E), J, ok_enc(E, J));
-check_good({J, E, J2}) ->
+ etap:is(do_encode(E, Options), J, ok_enc(E, J));
+check_good({J, E, J2}, Options) ->
etap:is(jiffy:decode(J), E, ok_dec(J, E)),
- etap:is(do_encode(E), J2, ok_enc(E, J2)).
+ etap:is(do_encode(E, Options), J2, ok_enc(E, J2)).
check_error({J, E}) ->
etap:fun_is(