aboutsummaryrefslogtreecommitdiffstats
path: root/lib/sasl/src/format_lib_supp.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sasl/src/format_lib_supp.erl')
-rw-r--r--lib/sasl/src/format_lib_supp.erl224
1 files changed, 224 insertions, 0 deletions
diff --git a/lib/sasl/src/format_lib_supp.erl b/lib/sasl/src/format_lib_supp.erl
new file mode 100644
index 0000000000..af15fd3288
--- /dev/null
+++ b/lib/sasl/src/format_lib_supp.erl
@@ -0,0 +1,224 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-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%
+%%
+-module(format_lib_supp).
+
+%%%---------------------------------------------------------------------
+%%% Description:
+%%% This module contains generic formatting functions for the SUPPort
+%%% tools.
+%%% The main parts are:
+%%% 1) print_info. Prints information tagged by 'header', 'data',
+%%% 'table', 'items' and 'newline'.
+%%%---------------------------------------------------------------------
+
+%% intermodule exports
+-export([print_info/2, print_info/3]).
+
+%% exports for use within module
+-export([maxcol/2]).
+
+%%---------------------------------------------------------------------
+%% Format is an ordered list of:
+%% {header, HeaderString}
+%% {data, List_Of_KeyValue_tuples}
+%% The KeyValues_tuples will be printed on one line
+%% (if possible); 'Key: Value'.
+%% Elements in the list may also be single terms, which are
+%% printed as they are.
+%% {table, {TableName, ColumnNames, Columns}}
+%% ColumnNames is a tuple of names for the columns, and
+%% Columns is a list, where each element is a tuple of
+%% data for that column.
+%% {items, {Name, Items}}
+%% Items is a list of KeyValue_tuples. Will be printed as:
+%% 'Name:
+%% Key1: Value1
+%% KeyN: ValueN'
+%% {newline, N}
+%% Any other format will be ignored.
+%% This list is printed in order. If the header clause is present,
+%% it must be the first element in the format list.
+%% ------------------------------------------------------------------
+print_info(Device, Format) ->
+ print_info(Device, 79, Format).
+print_info(Device, Line, Format) ->
+ print_header(Device, Line, Format),
+ print_format(Device, Line, Format).
+
+print_header(Device, Line, [{header, Header}|_]) ->
+ print_header2(Device, Line, Header);
+print_header(Device, Line, _) ->
+ print_header2(Device, Line, "").
+print_header2(Device, Line, Header) ->
+ Format1 = lists:concat(["~n~", Line, ".", Line, "s~n"]),
+ Format2 = lists:concat(["~", Line, "c~n"]),
+ io:format(Device, Format1, [Header]),
+ io:format(Device, Format2, [$=]).
+
+print_format(Device, _Line, []) ->
+ io:format(Device, '~n', []);
+print_format(Device, Line, [{data, Data}|T]) ->
+ print_data(Device, Line, Data),
+ print_format(Device, Line, T);
+print_format(Device, Line, [{table, Table}|T]) ->
+ print_table(Device, Line, Table),
+ print_format(Device, Line, T);
+print_format(Device, Line, [{items, Items}|T]) ->
+ print_items(Device, Line, Items),
+ print_format(Device, Line, T);
+print_format(Device, Line, [{newline, N}|T]) ->
+ print_newlines(Device, N),
+ print_format(Device, Line, T);
+print_format(Device, Line, [_|T]) -> % ignore any erroneous format.
+ print_format(Device, Line, T).
+
+print_data(_Device, _Line, []) -> ok;
+print_data(Device, Line, [{Key, Value}|T]) ->
+ print_one_line(Device, Line, Key, Value),
+ print_data(Device, Line, T);
+print_data(Device, Line, [Value|T]) ->
+ io:format(Device, "~p~n", [Value]),
+ print_data(Device, Line, T).
+
+print_items(Device, Line, {Name, Items}) ->
+ print_items(Device, Line, Name, Items).
+
+print_table(Device, Line, {TableName, ColumnNames, Columns}) ->
+ print_table(Device, Line, TableName, ColumnNames, Columns).
+
+print_newlines(_Device, 0) -> ok;
+print_newlines(Device, N) when N > 0 ->
+ io:format(Device, '~n', []),
+ print_newlines(Device, N-1).
+
+print_one_line(Device, Line, Key, Value) ->
+ StrKey = term_to_string(Key),
+ KeyLen = lists:min([length(StrKey), Line]),
+ ValueLen = Line - KeyLen,
+ Format1 = lists:concat(["~-", KeyLen, s]),
+ Format2 = lists:concat(["~", ValueLen, "s~n"]),
+ io:format(Device, Format1, [StrKey]),
+ Try = term_to_string(Value),
+ Length = length(Try),
+ if
+ Length < ValueLen ->
+ io:format(Device, Format2, [Try]);
+ true ->
+ io:format(Device, "~n ", []),
+ Format3 = lists:concat(["~", Line, ".9p~n"]),
+ io:format(Device, Format3, [Value])
+ end.
+
+term_to_string(Value) ->
+ lists:flatten(io_lib:format(get_format(Value), [Value])).
+
+get_format(Value) ->
+ case misc_supp:is_string(Value) of
+ true -> "~s";
+ false -> "~p"
+ end.
+
+make_list(0, _Elem) -> [];
+make_list(N, Elem) -> [Elem|make_list(N-1, Elem)].
+
+
+%%-----------------------------------------------------------------
+%% Items
+%%-----------------------------------------------------------------
+print_items(Device, Line, Name, Items) ->
+ print_one_line(Device, Line, Name, " "),
+ print_item_elements(Device, Line, Items).
+
+print_item_elements(_Device, _Line, []) -> ok;
+print_item_elements(Device, Line, [{Key, Value}|T]) ->
+ print_one_line(Device, Line, lists:concat([" ", Key]), Value),
+ print_item_elements(Device, Line, T).
+
+%%-----------------------------------------------------------------
+%% Table handling
+%%-----------------------------------------------------------------
+extra_space_between_columns() -> 3.
+
+find_max_col([Row | T], ColumnSizes) ->
+ find_max_col(T, misc_supp:multi_map({format_lib_supp, maxcol},
+ [Row, ColumnSizes]));
+
+find_max_col([], ColumnSizes) -> ColumnSizes.
+
+maxcol(Term, OldMax) ->
+ lists:max([length(term_to_string(Term)), OldMax]).
+
+make_column_format(With) ->
+ lists:concat(["~", With + extra_space_between_columns(), s]).
+
+is_correct_column_length(_Length, []) -> true;
+is_correct_column_length(Length, [Tuple|T]) ->
+ case size(Tuple) of
+ Length -> is_correct_column_length(Length, T);
+ _ -> false
+ end;
+is_correct_column_length(_, _) -> false.
+
+print_table(Device, Line, TableName, _TupleOfColumnNames, []) ->
+ print_one_line(Device, Line, TableName, "<empty table>"),
+ io:format(Device, "~n", []);
+
+print_table(Device, Line, TableName, TupleOfColumnNames, ListOfTuples)
+ when is_list(ListOfTuples), is_tuple(TupleOfColumnNames) ->
+ case is_correct_column_length(size(TupleOfColumnNames),
+ ListOfTuples) of
+ true ->
+ print_one_line(Device, Line, TableName, " "),
+ ListOfColumnNames = tuple_to_list(TupleOfColumnNames),
+ ListOfLists = lists:map(fun(Tuple) ->
+ tuple_to_list(Tuple)
+ end,
+ ListOfTuples),
+ ColWidths = find_max_col([ListOfColumnNames |
+ ListOfLists],
+ make_list(length(ListOfColumnNames),0)),
+ Format = lists:flatten([lists:map(fun(CW) ->
+ make_column_format(CW)
+ end,
+ ColWidths), "~n"]),
+ io:format(Device, Format, ListOfColumnNames),
+ io:format(Device,
+ lists:concat(['~', extra_space_between_columns(),
+ 'c', '~', lists:sum(ColWidths)
+ + (length(ColWidths) - 1)
+ * extra_space_between_columns(),
+ 'c~n']), [$ , $-]),
+ lists:foreach(fun(List) ->
+ print_row(List, Device, Format)
+ end,
+ ListOfLists),
+ io:format(Device, '~n', []),
+ true;
+ false ->
+ {error, {'a tuple has wrong size',
+ {TableName, TupleOfColumnNames, ListOfTuples}}}
+ end.
+
+%%--------------------------------------------------
+%% Device MUST be 2nd arg because of extraarg ni foreach...
+%%--------------------------------------------------
+print_row(Row, Device, Format) ->
+ io:format(Device, Format,
+ lists:map(fun(Term) -> term_to_string(Term) end,
+ Row)).