Quellcode durchsuchen

Add an option to escape forward slashes

This brings back escaping forward slashes as an option during encoding.
Default is still not to escape.
pull/93/head
Jeremie Lasalle Ratelle vor 10 Jahren
Ursprung
Commit
1784ca2ab5
4 geänderte Dateien mit 32 neuen und 1 gelöschten Zeilen
  1. +17
    -0
      c_src/encoder.c
  2. +1
    -0
      c_src/jiffy.c
  3. +1
    -0
      c_src/jiffy.h
  4. +13
    -1
      test/jiffy_04_string_tests.erl

+ 17
- 0
c_src/encoder.c Datei anzeigen

@ -34,6 +34,7 @@ typedef struct {
int uescape;
int pretty;
int use_nil;
int escape_forward_slashes;
int shiftcnt;
int count;
@ -77,6 +78,7 @@ enc_new(ErlNifEnv* env)
e->uescape = 0;
e->pretty = 0;
e->use_nil = 0;
e->escape_forward_slashes = 0;
e->shiftcnt = 0;
e->count = 0;
@ -281,6 +283,12 @@ enc_string(Encoder* e, ERL_NIF_TERM val)
esc_extra += 1;
i++;
continue;
case '/':
if(e->escape_forward_slashes) {
esc_extra += 1;
i++;
continue;
}
default:
if(data[i] < 0x20) {
esc_extra += 5;
@ -348,6 +356,13 @@ enc_string(Encoder* e, ERL_NIF_TERM val)
e->p[e->i++] = 't';
i++;
continue;
case '/':
if(e->escape_forward_slashes) {
e->p[e->i++] = '\\';
e->u[e->i++] = data[i];
i++;
continue;
}
default:
if(data[i] < 0x20) {
ulen = unicode_uescape(data[i], &(e->p[e->i]));
@ -591,6 +606,8 @@ encode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
e->uescape = 1;
} else if(enif_compare(val, e->atoms->atom_pretty) == 0) {
e->pretty = 1;
} else if(enif_compare(val, e->atoms->atom_escape_forward_slashes) == 0) {
e->escape_forward_slashes = 1;
} else if(enif_compare(val, e->atoms->atom_use_nil) == 0) {
e->use_nil = 1;
} else if(enif_compare(val, e->atoms->atom_force_utf8) == 0) {

+ 1
- 0
c_src/jiffy.c Datei anzeigen

@ -29,6 +29,7 @@ load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
st->atom_nil = make_atom(env, "nil");
st->atom_use_nil = make_atom(env, "use_nil");
st->atom_null_term = make_atom(env, "null_term");
st->atom_escape_forward_slashes = make_atom(env, "escape_forward_slashes");
// Markers used in encoding
st->ref_object = make_atom(env, "$object_ref$");

+ 1
- 0
c_src/jiffy.h Datei anzeigen

@ -31,6 +31,7 @@ typedef struct {
ERL_NIF_TERM atom_nil;
ERL_NIF_TERM atom_use_nil;
ERL_NIF_TERM atom_null_term;
ERL_NIF_TERM atom_escape_forward_slashes;
ERL_NIF_TERM ref_object;
ERL_NIF_TERM ref_array;

+ 13
- 1
test/jiffy_04_string_tests.erl Datei anzeigen

@ -23,6 +23,8 @@ string_error_test_() ->
string_utf8_test_() ->
[gen(utf8, Case) || Case <- cases(utf8)].
string_escaped_slashes_test_() ->
[gen(escaped_slashes, Case) || Case <- cases(escaped_slashes)].
gen(ok, {J, E}) ->
gen(ok, {J, E, J});
@ -50,8 +52,13 @@ gen(utf8, {Case, Fixed}) ->
?_assertThrow({error, {invalid_string, _}}, jiffy:encode(Case)),
?_assertEqual(Fixed2, jiffy:encode(Case, [force_utf8])),
?_assertThrow({error, {_, invalid_string}}, jiffy:decode(Case2))
]}.
]};
gen(escaped_slashes, {J, E}) ->
{msg("escaped_slashes - ~s", [J]), [
{"Decode", ?_assertEqual(E, dec(J))},
{"Encode", ?_assertEqual(J, enc(E, [escape_forward_slashes]))}
]}.
cases(ok) ->
[
@ -143,4 +150,9 @@ cases(utf8) ->
{<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
{<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
{<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>}
];
cases(escaped_slashes) ->
[
{<<"\"\\/\"">>, <<"/">>}
].

Laden…
Abbrechen
Speichern