⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 format_lib_supp.erl

📁 OTP是开放电信平台的简称
💻 ERL
字号:
%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-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)).

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -