asn1ct_pretty_format.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 200 行
ERL
200 行
%% ``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$%%%% usage: pretty_format:term(Term) -> PNF list of characters%% %% Note: this is usually used in expressions like:%% io:format('~s\n',[pretty_format:term(Term)]).%%%% Uses the following simple heuristics%%%% 1) Simple tuples are printed across the page%% (Simple means *all* the elements are "flat")%% 2) The Complex tuple {Arg1, Arg2, Arg3,....} is printed thus:%% {Arg1,%% Arg2,%% Arg3,%% ...}%% 3) Lists are treated as for tuples%% 4) Lists of printable characters are treated as strings%%%% This method seems to work reasonable well for {Tag, ...} type%% data structures-module(asn1ct_pretty_format).-export([term/1]).-import(io_lib, [write/1, write_string/1]).term(Term) -> element(2, term(Term, 0)).%%______________________________________________________________________%% pretty_format:term(Term, Indent} -> {Indent', Chars}%% Format <Term> -- use <Indent> to indent the *next* line%% Note: Indent' is a new indentaion level (sometimes printing <Term>%% the next line to need an "extra" indent!).term([], Indent) -> {Indent, [$[,$]]};term(L, Indent) when list(L) -> case is_string(L) of true -> {Indent, write_string(L)}; false -> case complex_list(L) of true -> write_complex_list(L, Indent); false -> write_simple_list(L, Indent) end end;term(T, Indent) when tuple(T) -> case complex_tuple(T) of true -> write_complex_tuple(T, Indent); false -> write_simple_tuple(T, Indent) end;term(A, Indent) -> {Indent, write(A)}.%%______________________________________________________________________%% write_simple_list([H|T], Indent) -> {Indent', Chars}write_simple_list([H|T], Indent) -> {_, S1} = term(H, Indent), {_, S2} = write_simple_list_tail(T, Indent), {Indent, [$[,S1|S2]}.write_simple_list_tail([H|T], Indent) -> {_, S1} = term(H, Indent), {_, S2} = write_simple_list_tail(T, Indent), {Indent, [$,,S1| S2]};write_simple_list_tail([], Indent) -> {Indent, "]"};write_simple_list_tail(Other, Indent) -> {_, S} = term(Other, Indent), {Indent, [$|,S,$]]}.%%______________________________________________________________________%% write_complex_list([H|T], Indent) -> {Indent', Chars}write_complex_list([H|T], Indent) -> {I1, S1} = term(H, Indent+1), {_, S2} = write_complex_list_tail(T, I1), {Indent, [$[,S1|S2]}.write_complex_list_tail([H|T], Indent) -> {I1, S1} = term(H, Indent), {_, S2} = write_complex_list_tail(T, I1), {Indent, [$,,nl_indent(Indent),S1,S2]};write_complex_list_tail([], Indent) -> {Indent, "]"};write_complex_list_tail(Other, Indent) ->$,, {_, S} = term(Other, Indent), {Indent, [$|,S,$]]}.%%______________________________________________________________________%% complex_list(List) -> true | false%% returns true if the list is complex otherwise falsecomplex_list([]) -> false;complex_list([H|T]) when constant(H) -> complex_list(T);complex_list([H|T]) -> case is_string(H) of true -> complex_list(T); false -> true end;complex_list(_) -> true.%%______________________________________________________________________%% complex_tuple(Tuple) -> true | false%% returns true if the tuple is complex otherwise falsecomplex_tuple(T) -> complex_list(tuple_to_list(T)).%%______________________________________________________________________%% write_simple_tuple(Tuple, Indent} -> {Indent', Chars}write_simple_tuple({}, Indent) -> {Indent, "{}"};write_simple_tuple(Tuple, Indent) -> {_, S} = write_simple_tuple_args(tuple_to_list(Tuple), Indent), {Indent, [${, S, $}]}.write_simple_tuple_args([X], Indent) -> term(X, Indent);write_simple_tuple_args([H|T], Indent) -> {_, SH} = term(H, Indent), {_, ST} = write_simple_tuple_args(T, Indent), {Indent, [SH, $,, ST]}.%%______________________________________________________________________%% write_complex_tuple(Tuple, Indent} -> {Indent', Chars}write_complex_tuple(Tuple, Indent) -> [H|T] = tuple_to_list(Tuple), {I1, SH} = term(H, Indent+2), {_, ST} = write_complex_tuple_args(T, I1), {Indent, [${, SH, ST, $}]}.write_complex_tuple_args([X], Indent) -> {_, S} = term(X, Indent), {Indent, [$,, nl_indent(Indent), S]};write_complex_tuple_args([H|T], Indent) -> {I1, SH} = term(H, Indent), {_, ST} = write_complex_tuple_args(T, I1), {Indent, [$,, nl_indent(Indent) , SH, ST]};write_complex_tuple_args([], Indent) -> {Indent, []}. %%______________________________________________________________________%% utilities nl_indent(I) when I >= 0 -> ["\n"|indent(I)];nl_indent(_) -> [$\s].indent(I) when I >= 8 -> [$\t|indent(I-8)];indent(I) when I > 0 -> [$\s|indent(I-1)];indent(_) -> [].is_string([9|T]) -> is_string(T);is_string([10|T]) -> is_string(T);is_string([H|T]) when H >31, H < 127 -> is_string(T);is_string([]) -> true;is_string(_) -> false.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?