ソースを参照

ft: 修改为二进制匹配

master
SisMaker 4年前
コミット
93eb41c970
2個のファイルの変更57行の追加1199行の削除
  1. +57
    -65
      src/eFmt.erl
  2. +0
    -1134
      src/eFmtPretty.erl

+ 57
- 65
src/eFmt.erl ファイルの表示

@ -156,63 +156,13 @@ writeList([One | List], D, E, BinAcc) ->
writeList(Other, D, E, BinAcc) ->
<<BinAcc/binary, "|", (writeTerm(Other, D, E))/binary, "]">>.
-spec printable_list(Term) -> boolean() when
Term :: term().
visableList(L, Encoding) ->
%% There will be more alternatives returns from io:printable range
%% in the future. To not have a catch-all clause is deliberate.
case Encoding of
latin1 ->
printable_latin1_list(L);
_ ->
printable_unicode_list(L)
end.
-spec printable_unicode_list(Term) -> boolean() when
Term :: term().
-spec printable_latin1_list(Term) -> boolean() when
Term :: term().
printable_latin1_list([C|Cs]) when is_integer(C), C >= $\040, C =< $\176 ->
printable_latin1_list(Cs);
printable_latin1_list([C|Cs]) when is_integer(C), C >= $\240, C =< $\377 ->
printable_latin1_list(Cs);
printable_latin1_list([$\n|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([$\r|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([$\t|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([$\v|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([$\b|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([$\f|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([$\e|Cs]) -> printable_latin1_list(Cs);
printable_latin1_list([]) -> true;
printable_latin1_list(_) -> false. %Everything else is false
printable_unicode_list([C|Cs]) when is_integer(C), C >= $\040, C =< $\176 ->
printable_unicode_list(Cs);
printable_unicode_list([C|Cs])
when is_integer(C), C >= 16#A0, C < 16#D800;
is_integer(C), C > 16#DFFF, C < 16#FFFE;
is_integer(C), C > 16#FFFF, C =< 16#10FFFF ->
printable_unicode_list(Cs);
printable_unicode_list([$\n|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([$\r|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([$\t|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([$\v|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([$\b|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([$\f|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([$\e|Cs]) -> printable_unicode_list(Cs);
printable_unicode_list([]) -> true;
printable_unicode_list(_) -> false. %Everything else is false
writeList(List, Depth, Width, Encoding, Strings) ->
case Strings andalso visableList(List, Encoding) of
case Strings andalso visualList(List, Encoding) of
true ->
list_to_binary(List);
_ ->
writeList([], Depth, Widt, Encoding, Strings, SumLC, <<"[">>)
writeList([], Depth, Width, Encoding, Strings, SumLC, <<"[">>)
end.
writeList([], Depth, Width, Encoding, Strings, SumLC, BinAcc) ->
@ -239,16 +189,7 @@ writeList(Term, Depth, Width, Encoding, Strings, <<"[">>) ->
writeTuple(Tuple, Depth, Width, CharsLimit, Encoding, Strings, Index, TupleSize, BinAcc) ->
if
Depth =:= 1 -> <<BinAcc/binary, "...}">>;
true ->
if
Index < TupleSize ->
writeTuple(Tuple, Depth, Width, CharsLimit, Encoding, Strings, Index + 1, TupleSize, <<BinAcc/binary, (writeTerm(element(Index, Tuple), D - 1, E))/binary, ",">>);
Index == TupleSize ->
<<BinAcc/binary, (writeTerm(element(Index, Tuple), Depth, Width, CharsLimit, Encoding, Strings))/binary, "}">>;
true ->
<<BinAcc/binary, "}">>
end
end.
writeMap(Map, D, E, BinAcc) ->
@ -318,9 +259,12 @@ writeTerm(_Term, Depth, _Width, _Encoding, _Strings) when Depth =< 0 -> <<"...">
writeTerm(Term, _Depth, _Width, _Encoding, _Strings) when is_integer(Term) -> ?writeInt(Term);
writeTerm(Term, _Depth, _Width, Encoding, _Strings) when is_atom(Term) -> ?writeAtom(Term, Encoding);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_list(Term) -> writeList(Term, Depth, Width, Encoding, Strings);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_map(Term) -> writeMap(Term, Depth, Width, Encoding, Strings, <<"#{">>);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_tuple(Term) -> writeTuple(Term, Depth, Width, Encoding, Strings, 1, tuple_size(Term), <<"{">>);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_bitstring(Term) -> writeBinary(Term, Depth, Width, Encoding, Strings, <<"<<">>);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_map(Term) ->
writeMap(Term, Depth, Width, Encoding, Strings, <<"#{">>);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_tuple(Term) ->
writeTuple(Term, Depth, Width, Encoding, Strings, 1, tuple_size(Term), <<"{">>);
writeTerm(Term, Depth, Width, Encoding, Strings) when is_bitstring(Term) ->
writeBinary(Term, Depth, Width, Encoding, Strings, <<"<<">>);
writeTerm(Term, _Depth, _Width, _Encoding, _Strings) when is_pid(Term) -> ?writePid(Term);
writeTerm(Term, _Depth, _Width, _Encoding, _Strings) when is_float(Term) -> ?writeFloat(Term);
writeTerm(Term, _Depth, _Width, _Encoding, _Strings) when is_port(Term) -> ?writePort(Term);
@ -867,4 +811,52 @@ toBinary(Value) when is_float(Value) -> float_to_binary(Value, [{decimals, 6}, c
toBinary(Value) when is_atom(Value) -> atom_to_binary(Value, utf8);
toBinary(Value) when is_binary(Value) -> Value;
toBinary(Value) -> term_to_binary(Value).
visualList(L, Encoding) ->
?IIF(Encoding == latin1, visualLatin1List(L), visualUnicodeList(L, Encoding)).
visualBin(Bin, Encoding) ->
?IIF(Encoding == latin1, visualLatin1Bin(Bin), visualUtf8Bin(Bin, io:printable_range())).
visualLatin1List([]) -> true;
visualLatin1List([C | Cs]) -> ?IIF(visualLatin1Char(C), visualLatin1List(Cs), false);
visualLatin1List(_) -> false.
visualUnicodeList([], _) -> true;
visualUnicodeList([C | Cs], Encoding) -> ?IIF(visualUtf8Char(C, Encoding), visualUnicodeList(Cs, Encoding), false);
visualUnicodeList(_, _) -> false.
visualLatin1Bin(<<>>) -> true;
visualLatin1Bin(<<C:8, Left/binary>>) -> ?IIF(visualLatin1Char(C), visualLatin1Bin(Left), false);
visualLatin1Bin(_) -> false.
visualUtf8Bin(<<>>, _) -> true;
visualUtf8Bin(<<C/utf8, Left/binary>>, Range) -> ?IIF(visualUtf8Char(C, Range), visualUtf8Bin(Left, Range), false);
visualUtf8Bin(_, _) -> false.
visualLatin1Char($\n) -> true;
visualLatin1Char($\r) -> true;
visualLatin1Char($\t) -> true;
visualLatin1Char($\v) -> true;
visualLatin1Char($\b) -> true;
visualLatin1Char($\f) -> true;
visualLatin1Char($\e) -> true;
visualLatin1Char(C) ->
C >= $\040 andalso C =< $\176 orelse C >= $\240, C =< $\377.
visualUtf8Char($\n, _) -> true;
visualUtf8Char($\r, _) -> true;
visualUtf8Char($\t, _) -> true;
visualUtf8Char($\v, _) -> true;
visualUtf8Char($\b, _) -> true;
visualUtf8Char($\f, _) -> true;
visualUtf8Char($\e, _) -> true;
visualUtf8Char(C, _Encoding) ->
C >= $\s andalso C =< $~ orelse C >= 16#A0 andalso C < 16#D800 orelse C > 16#DFFF andalso C < 16#FFFE orelse C > 16#FFFF andalso C =< 16#10FFFF.
%% case Encoding of
%% latin1 ->
%% C >= $\s andalso C =< $~ orelse C >= 16#A0 andalso C =< 16#FF;
%% _ ->
%% C >= $\s andalso C =< $~ orelse C >= 16#A0 andalso C < 16#D800 orelse C > 16#DFFF andalso C < 16#FFFE orelse C > 16#FFFF andalso C =< 16#10FFFF
%% end.
%% ********************************************** utils end **********************************************************

+ 0
- 1134
src/eFmtPretty.erl
ファイル差分が大きすぎるため省略します
ファイルの表示


読み込み中…
キャンセル
保存