Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Several fixes for printing binaries, improve quote stripping

In string mode, "..", '..' and <<"..">> are stripped, just like with
io:format.
  • Loading branch information...
commit 7e9da648db4cd7e8972d3b5fb766928ffa8f1d5d 1 parent 28a5c9e
@Vagabond Vagabond authored
Showing with 46 additions and 9 deletions.
  1. +46 −9 src/lager_trunc_io.erl
View
55 src/lager_trunc_io.erl
@@ -102,12 +102,7 @@ format([[$~|H]| T], [AH | AT], Max, Acc, ArgAcc) when length(H) == 1 ->
{Value, RealLen} = case H of
"s" ->
% strip off the doublequotes, if applicable
- Trimmed = case {hd(String), lists:last(String)} == {$", $"} of
- true ->
- string:strip(String, both, $");
- _ ->
- String
- end,
+ Trimmed = unquote_string(lists:flatten(String)),
{Trimmed, length(Trimmed)};
_ ->
{String, Length}
@@ -136,8 +131,9 @@ format([[$~|H]| T], [AH | AT], Max, Acc, ArgAcc) ->
{String, Length} ->
{Value, RealLen} = case C of
$s ->
- % strip off the doublequotes
- {string:substr(String, 2, length(String) -2), Length -2};
+ % strip off the doublequotes, if applicable
+ Trimmed = unquote_string(lists:flatten(String)),
+ {Trimmed, length(Trimmed)};
_ ->
{String, Length}
end,
@@ -235,7 +231,13 @@ print(Binary, 0) when is_binary(Binary) ->
print(Binary, Max) when is_binary(Binary) ->
B = binary_to_list(Binary, 1, lists:min([Max, size(Binary)])),
{L, Len} = alist_start(B, Max-4),
- {["<<", L, ">>"], Len+4};
+ {Res, Length} = case L of
+ [91, X, 93] ->
+ {X, Len - 2};
+ X ->
+ {X, Len}
+ end,
+ {["<<", Res, ">>"], Length+4};
print(Float, _Max) when is_float(Float) ->
%% use the same function io_lib:format uses to print floats
@@ -346,6 +348,30 @@ atom_needs_quoting([H|T]) when (H >= $a andalso H =< $z);
atom_needs_quoting(_) ->
true.
+unquote_string([$<, $<, $"|T] = Str) ->
+ case string:substr(T, length(T) - 2) of
+ "\">>" ->
+ string:substr(T, 1, length(T) - 3);
+ _ ->
+ Str
+ end;
+unquote_string([$"|_] = Str) ->
+ case lists:last(Str) == $" of
+ true ->
+ string:strip(Str, both, $");
+ _ ->
+ Str
+ end;
+unquote_string([$'|_] = Str) ->
+ case lists:last(Str) == $' of
+ true ->
+ string:strip(Str, both, $');
+ _ ->
+ Str
+ end;
+unquote_string(S) ->
+ S.
+
-ifdef(TEST).
%%--------------------
%% The start of a test suite. So far, it only checks for not crashing.
@@ -444,5 +470,16 @@ quote_strip_test() ->
?assertEqual("hello", lists:flatten(format("~s", ["hello"], 50))),
?assertEqual("hello", lists:flatten(format("~s", [hello], 50))),
?assertEqual("hello", lists:flatten(format("~p", [hello], 50))),
+ ?assertEqual("'hello world'", lists:flatten(format("~p", ['hello world'], 50))),
+ ?assertEqual("hello world", lists:flatten(format("~s", ['hello world'], 50))),
+ ok.
+
+binary_printing_test() ->
+ ?assertEqual("<<\"hello\">>", lists:flatten(format("~p", [<<$h, $e, $l, $l, $o>>], 50))),
+ ?assertEqual("<<\"hello\">>", lists:flatten(format("~p", [<<"hello">>], 50))),
+ ?assertEqual("<<1,2,3,4>>", lists:flatten(format("~p", [<<1, 2, 3, 4>>], 50))),
+ ?assertEqual("<<1,2,3,4>>", lists:flatten(format("~s", [<<1, 2, 3, 4>>], 50))),
+ ?assertEqual("hello", lists:flatten(format("~s", [<<"hello">>], 50))),
+ ?assertEqual("hello", lists:flatten(format("~10s", [<<"hello">>], 50))),
ok.
-endif.
Please sign in to comment.
Something went wrong with that request. Please try again.