%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%%
%%% Purpose : some debug utilities
-module(ssl_debug).
-export([unhex/1, hexd/1, hex_data/2, term_data/2, hex_data/4, term_data/4, make_binary/1]).
%% external
hex_data(Name, Data) ->
io:format("~s\n~s", [Name, hex(Data)]).
term_data(Name, Term) ->
io:format("~s\n~p\n", [Name, Term]).
hex_data(Name, Data, Mod, Line) ->
io:format("~w:~p ~s\n~s", [Mod, Line, Name, hex(Data)]).
term_data(Name, Term, Mod, Line) ->
io:format("~w:~p ~s\n~p\n", [Mod, Line, Name, Term]).
unhex(S) ->
Lines = string:tokens(S, "\n"),
H = [unhex(L, []) || L <- Lines],
list_to_binary(H).
make_binary(Size) ->
crypto:rand_bytes(Size).
%% internal
is_hex_digit(C) when C >= $0, C =< $9 -> true;
is_hex_digit(C) when C >= $A, C =< $F -> true;
is_hex_digit(C) when C >= $a, C =< $f -> true;
is_hex_digit(_) -> false.
unhex([], Acc) ->
list_to_binary(lists:reverse(Acc));
unhex([_], Acc) ->
unhex([], Acc);
unhex([$ | Tl], Acc) ->
unhex(Tl, Acc);
unhex([D1, D2 | Tl], Acc) ->
case {is_hex_digit(D1), is_hex_digit(D2)} of
{true, true} ->
unhex(Tl, [erlang:list_to_integer([D1, D2], 16) | Acc]);
_ ->
unhex([], Acc)
end.
hexd(B) ->
io:format("~s\n", [hex(B)]).
hex(B) -> hex(erlang:iolist_to_binary(B), []).
hex_asc(B) ->
L = binary_to_list(B),
{hexify(L), asciify(L)}.
hex(<<B:16/binary, Rest/binary>>, Acc) ->
{HS, AS} = hex_asc(B),
hex(Rest, ["\n", AS, " ", HS | Acc]);
hex(<<>>, Acc) ->
lists:reverse(Acc);
hex(B, Acc) ->
{HS, AS} = hex_asc(B),
L = erlang:iolist_size(HS),
lists:flatten(lists:reverse(Acc, [HS, lists:duplicate(3*16 - L, $ ), " ", AS, "\n"])).
hexify(L) -> [[hex_byte(B), " "] || B <- L].
hex_byte(B) when B < 16#10 -> ["0", erlang:integer_to_list(B, 16)];
hex_byte(B) -> erlang:integer_to_list(B, 16).
asciify(L) -> [ascii_byte(C) || C <- L].
ascii_byte($") -> $.;
ascii_byte(C) when C < 32; C >= 127 -> $.;
ascii_byte(C) -> C.