Commit d416dc0a authored by Andrew Thompson's avatar Andrew Thompson
Browse files

Fix escaped char printing in ~p mode, reported by @etrepum

Showing with 23 additions and 6 deletions
+23 -6
...@@ -62,7 +62,7 @@ format(Fmt, Args, Max) -> ...@@ -62,7 +62,7 @@ format(Fmt, Args, Max) ->
format(Fmt, Args, Max, Options) -> format(Fmt, Args, Max, Options) ->
try lager_format:format(Fmt, Args, Max, Options) try lager_format:format(Fmt, Args, Max, Options)
catch catch
_:_ -> _What:_Why ->
erlang:error(badarg, [Fmt, Args]) erlang:error(badarg, [Fmt, Args])
end. end.
...@@ -282,7 +282,7 @@ alist_start([H|T], Max, Options) when is_integer(H), H >= 16#20, H =< 16#7e -> ...@@ -282,7 +282,7 @@ alist_start([H|T], Max, Options) when is_integer(H), H >= 16#20, H =< 16#7e ->
{R, Len} = list_body([H|T], Max-2, Options, false), {R, Len} = list_body([H|T], Max-2, Options, false),
{[$[, R, $]], Len + 2} {[$[, R, $]], Len + 2}
end; end;
alist_start([H|T], Max, Options) when H =:= 9; H =:= 10; H =:= 13 -> alist_start([H|T], Max, Options) when H =:= $\t; H =:= $\n; H =:= $\r; H =:= $\v; H =:= $\e; H=:= $\f; H=:= $\b ->
try alist([H|T], Max -1, Options) of try alist([H|T], Max -1, Options) of
{L, Len} -> {L, Len} ->
{[$"|L], Len + 1} {[$"|L], Len + 1}
...@@ -299,10 +299,14 @@ alist([], _Max, #print_options{force_strings=true}) -> {"", 0}; ...@@ -299,10 +299,14 @@ alist([], _Max, #print_options{force_strings=true}) -> {"", 0};
alist([], _Max, _Options) -> {"\"", 1}; alist([], _Max, _Options) -> {"\"", 1};
alist(_, Max, #print_options{force_strings=true}) when Max < 4 -> {"...", 3}; alist(_, Max, #print_options{force_strings=true}) when Max < 4 -> {"...", 3};
alist(_, Max, #print_options{force_strings=false}) when Max < 5 -> {"...\"", 4}; alist(_, Max, #print_options{force_strings=false}) when Max < 5 -> {"...\"", 4};
alist([H|T], Max, Options = #print_options{force_strings=false,lists_as_strings=true}) when H =:= $"; H =:= $\\ ->
%% preserve escaping around quotes
{L, Len} = alist(T, Max-1, Options),
{[$\\,H|L], Len + 2};
alist([H|T], Max, Options) when is_integer(H), H >= 16#20, H =< 16#7e -> % definitely printable alist([H|T], Max, Options) when is_integer(H), H >= 16#20, H =< 16#7e -> % definitely printable
{L, Len} = alist(T, Max-1, Options), {L, Len} = alist(T, Max-1, Options),
{[H|L], Len + 1}; {[H|L], Len + 1};
alist([H|T], Max, Options) when H =:= 9; H =:= 10; H =:= 13 -> alist([H|T], Max, Options) when H =:= $\t; H =:= $\n; H =:= $\r; H =:= $\v; H =:= $\e; H=:= $\f; H=:= $\b ->
{L, Len} = alist(T, Max-1, Options), {L, Len} = alist(T, Max-1, Options),
case Options#print_options.force_strings of case Options#print_options.force_strings of
true -> true ->
...@@ -349,9 +353,12 @@ dec_depth(#print_options{depth=Depth} = Options) when Depth > 0 -> ...@@ -349,9 +353,12 @@ dec_depth(#print_options{depth=Depth} = Options) when Depth > 0 ->
dec_depth(Options) -> dec_depth(Options) ->
Options. Options.
escape(9) -> "\\t"; escape($\t) -> "\\t";
escape(10) -> "\\n"; escape($\n) -> "\\n";
escape(13) -> "\\r". escape($\r) -> "\\r";
escape($\e) -> "\\e";
escape($\f) -> "\\f";
escape($\b) -> "\\b".
-ifdef(TEST). -ifdef(TEST).
%%-------------------- %%--------------------
...@@ -470,6 +477,16 @@ binary_printing_test() -> ...@@ -470,6 +477,16 @@ binary_printing_test() ->
?assertEqual("hello", lists:flatten(format("~s", [<<"hello">>], 50))), ?assertEqual("hello", lists:flatten(format("~s", [<<"hello">>], 50))),
?assertEqual("hello\nworld", lists:flatten(format("~s", [<<"hello\nworld">>], 50))), ?assertEqual("hello\nworld", lists:flatten(format("~s", [<<"hello\nworld">>], 50))),
?assertEqual("<<\"hello\\nworld\">>", lists:flatten(format("~p", [<<"hello\nworld">>], 50))), ?assertEqual("<<\"hello\\nworld\">>", lists:flatten(format("~p", [<<"hello\nworld">>], 50))),
?assertEqual("<<\"\\\"hello world\\\"\">>", lists:flatten(format("~p", [<<"\"hello world\"">>], 50))),
?assertEqual("<<\"hello\\\\world\">>", lists:flatten(format("~p", [<<"hello\\world">>], 50))),
?assertEqual("<<\"hello\\\\\world\">>", lists:flatten(format("~p", [<<"hello\\\world">>], 50))),
?assertEqual("<<\"hello\\\\\\\\world\">>", lists:flatten(format("~p", [<<"hello\\\\world">>], 50))),
?assertEqual("<<\"hello\\bworld\">>", lists:flatten(format("~p", [<<"hello\bworld">>], 50))),
?assertEqual("<<\"hello\\tworld\">>", lists:flatten(format("~p", [<<"hello\tworld">>], 50))),
?assertEqual("<<\"hello\\nworld\">>", lists:flatten(format("~p", [<<"hello\nworld">>], 50))),
?assertEqual("<<\"hello\\rworld\">>", lists:flatten(format("~p", [<<"hello\rworld">>], 50))),
?assertEqual("<<\"hello\\eworld\">>", lists:flatten(format("~p", [<<"hello\eworld">>], 50))),
?assertEqual("<<\"hello\\fworld\">>", lists:flatten(format("~p", [<<"hello\fworld">>], 50))),
?assertEqual(" hello", lists:flatten(format("~10s", [<<"hello">>], 50))), ?assertEqual(" hello", lists:flatten(format("~10s", [<<"hello">>], 50))),
ok. ok.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment