diff options
Diffstat (limited to 'lib/stdlib/src/io_lib_pretty.erl')
-rw-r--r-- | lib/stdlib/src/io_lib_pretty.erl | 194 |
1 files changed, 98 insertions, 96 deletions
diff --git a/lib/stdlib/src/io_lib_pretty.erl b/lib/stdlib/src/io_lib_pretty.erl index 98eea64b0e..4ed42d6c9f 100644 --- a/lib/stdlib/src/io_lib_pretty.erl +++ b/lib/stdlib/src/io_lib_pretty.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2021. All Rights Reserved. +%% Copyright Ericsson AB 1996-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ -export([print/1,print/2,print/3,print/4,print/5,print/6]). %% To be used by io_lib only. --export([intermediate/6, write/1]). +-export([intermediate/7, write/1]). %%% %%% Exported functions @@ -64,7 +64,8 @@ print(Term) -> | {'line_length', line_length()} | {'line_max_chars', line_max_chars()} | {'record_print_fun', rec_print_fun()} - | {'strings', boolean()}. + | {'strings', boolean()} + | {'maps_order', maps:iterator_order()}. -type options() :: [option()]. -spec print(term(), rec_print_fun()) -> chars(); @@ -79,7 +80,8 @@ print(Term, Options) when is_list(Options) -> RecDefFun = get_option(record_print_fun, Options, no_fun), Encoding = get_option(encoding, Options, epp:default_encoding()), Strings = get_option(strings, Options, true), - print(Term, Col, Ll, D, M, T, RecDefFun, Encoding, Strings); + MapsOrder = get_option(maps_order, Options, undefined), + print(Term, Col, Ll, D, M, T, RecDefFun, Encoding, Strings, MapsOrder); print(Term, RecDefFun) -> print(Term, -1, RecDefFun). @@ -91,7 +93,7 @@ print(Term, Depth, RecDefFun) -> -spec print(term(), column(), line_length(), depth()) -> chars(). print(Term, Col, Ll, D) -> - print(Term, Col, Ll, D, _M=-1, _T=-1, no_fun, latin1, true). + print(Term, Col, Ll, D, _M=-1, _T=-1, no_fun, latin1, true, undefined). -spec print(term(), column(), line_length(), depth(), rec_print_fun()) -> chars(). @@ -102,7 +104,7 @@ print(Term, Col, Ll, D, RecDefFun) -> rec_print_fun()) -> chars(). print(Term, Col, Ll, D, M, RecDefFun) -> - print(Term, Col, Ll, D, M, _T=-1, RecDefFun, latin1, true). + print(Term, Col, Ll, D, M, _T=-1, RecDefFun, latin1, true, undefined). %% D = Depth, default -1 (infinite), or LINEMAX=30 when printing from shell %% T = chars_limit, that is, maximal number of characters, default -1 @@ -111,22 +113,22 @@ print(Term, Col, Ll, D, M, RecDefFun) -> %% Col = current column, default 1 %% Ll = line length/~p field width, default 80 %% M = CHAR_MAX (-1 if no max, 60 when printing from shell) -print(_, _, _, 0, _M, _T, _RF, _Enc, _Str) -> "..."; -print(_, _, _, _D, _M, 0, _RF, _Enc, _Str) -> "..."; -print(Term, Col, Ll, D, M, T, RecDefFun, Enc, Str) when Col =< 0 -> +print(_, _, _, 0, _M, _T, _RF, _Enc, _Str, _Ord) -> "..."; +print(_, _, _, _D, _M, 0, _RF, _Enc, _Str, _Ord) -> "..."; +print(Term, Col, Ll, D, M, T, RecDefFun, Enc, Str, Ord) when Col =< 0 -> %% ensure Col is at least 1 - print(Term, 1, Ll, D, M, T, RecDefFun, Enc, Str); -print(Atom, _Col, _Ll, _D, _M, _T, _RF, Enc, _Str) when is_atom(Atom) -> + print(Term, 1, Ll, D, M, T, RecDefFun, Enc, Str, Ord); +print(Atom, _Col, _Ll, _D, _M, _T, _RF, Enc, _Str, _Ord) when is_atom(Atom) -> write_atom(Atom, Enc); -print(Term, Col, Ll, D, M0, T, RecDefFun, Enc, Str) when is_tuple(Term); +print(Term, Col, Ll, D, M0, T, RecDefFun, Enc, Str, Ord) when is_tuple(Term); is_list(Term); is_map(Term); is_bitstring(Term) -> %% preprocess and compute total number of chars {_, Len, _Dots, _} = If = case T < 0 of - true -> print_length(Term, D, T, RecDefFun, Enc, Str); - false -> intermediate(Term, D, T, RecDefFun, Enc, Str) + true -> print_length(Term, D, T, RecDefFun, Enc, Str, Ord); + false -> intermediate(Term, D, T, RecDefFun, Enc, Str, Ord) end, %% use Len as CHAR_MAX if M0 = -1 M = max_cs(M0, Len), @@ -143,7 +145,7 @@ print(Term, Col, Ll, D, M0, T, RecDefFun, Enc, Str) when is_tuple(Term); 1), pp(If, Col, Ll, M, TInd, indent(Col), 0, 0) end; -print(Term, _Col, _Ll, _D, _M, _T, _RF, _Enc, _Str) -> +print(Term, _Col, _Ll, _D, _M, _T, _RF, _Enc, _Str, _Ord) -> %% atomic data types (bignums, atoms, ...) are never truncated io_lib:write(Term). @@ -442,19 +444,19 @@ write_tail(E, S) -> }. -spec intermediate(term(), depth(), pos_integer(), rec_print_fun(), - encoding(), boolean()) -> intermediate_format(). + encoding(), boolean(), boolean()) -> intermediate_format(). -intermediate(Term, D, T, RF, Enc, Str) when T > 0 -> +intermediate(Term, D, T, RF, Enc, Str, Ord) when T > 0 -> D0 = 1, - If = print_length(Term, D0, T, RF, Enc, Str), + If = print_length(Term, D0, T, RF, Enc, Str, Ord), case If of {_, Len, Dots, _} when Dots =:= 0; Len > T; D =:= 1 -> If; {_, Len, _, _} -> - find_upper(If, Term, T, D0, 2, D, RF, Enc, Str, Len) + find_upper(If, Term, T, D0, 2, D, RF, Enc, Str, Ord, Len) end. -find_upper(Lower, Term, T, Dl, Dd, D, RF, Enc, Str, LastLen) -> +find_upper(Lower, Term, T, Dl, Dd, D, RF, Enc, Str, Ord, LastLen) -> Dd2 = Dd * 2, D1 = case D < 0 of true -> Dl + Dd2; @@ -468,14 +470,14 @@ find_upper(Lower, Term, T, Dl, Dd, D, RF, Enc, Str, LastLen) -> %% Cannot happen if print_length() is free of bugs. If; {_, Len, _, _} when Len =< T, D1 < D orelse D < 0 -> - find_upper(If, Term, T, D1, Dd2, D, RF, Enc, Str, Len); + find_upper(If, Term, T, D1, Dd2, D, RF, Enc, Str, Ord, Len); _ -> - search_depth(Lower, If, Term, T, Dl, D1, RF, Enc, Str) + search_depth(Lower, If, Term, T, Dl, D1, RF, Enc, Str, Ord) end. %% Lower has NumOfDots > 0 and Len =< T. %% Upper has NumOfDots > 0 and Len > T. -search_depth(Lower, Upper, _Term, T, Dl, Du, _RF, _Enc, _Str) +search_depth(Lower, Upper, _Term, T, Dl, Du, _RF, _Enc, _Str, _Ord) when Du - Dl =:= 1 -> %% The returned intermediate format has Len >= T. case Lower of @@ -484,7 +486,7 @@ search_depth(Lower, Upper, _Term, T, Dl, Du, _RF, _Enc, _Str) _ -> Upper end; -search_depth(Lower, Upper, Term, T, Dl, Du, RF, Enc, Str) -> +search_depth(Lower, Upper, Term, T, Dl, Du, RF, Enc, Str, Ord) -> D1 = (Dl + Du) div 2, If = expand(Lower, T, D1 - Dl), case If of @@ -493,9 +495,9 @@ search_depth(Lower, Upper, Term, T, Dl, Du, RF, Enc, Str) -> %% This is a bit expensive since the work to %% crate Upper is wasted. It is the price %% to pay to get a more balanced output. - search_depth(Lower, If, Term, T, Dl, D1, RF, Enc, Str); + search_depth(Lower, If, Term, T, Dl, D1, RF, Enc, Str, Ord); _ -> - search_depth(If, Upper, Term, T, D1, Du, RF, Enc, Str) + search_depth(If, Upper, Term, T, D1, Du, RF, Enc, Str, Ord) end. %% The depth (D) is used for extracting and counting the characters to @@ -504,16 +506,16 @@ search_depth(Lower, Upper, Term, T, Dl, Du, RF, Enc, Str) -> %% counted but need to be added later. %% D =/= 0 -print_length([], _D, _T, _RF, _Enc, _Str) -> +print_length([], _D, _T, _RF, _Enc, _Str, _Ord) -> {"[]", 2, 0, no_more}; -print_length({}, _D, _T, _RF, _Enc, _Str) -> +print_length({}, _D, _T, _RF, _Enc, _Str, _Ord) -> {"{}", 2, 0, no_more}; -print_length(#{}=M, _D, _T, _RF, _Enc, _Str) when map_size(M) =:= 0 -> +print_length(#{}=M, _D, _T, _RF, _Enc, _Str, _Ord) when map_size(M) =:= 0 -> {"#{}", 3, 0, no_more}; -print_length(Atom, _D, _T, _RF, Enc, _Str) when is_atom(Atom) -> +print_length(Atom, _D, _T, _RF, Enc, _Str, _Ord) when is_atom(Atom) -> S = write_atom(Atom, Enc), {S, io_lib:chars_length(S), 0, no_more}; -print_length(List, D, T, RF, Enc, Str) when is_list(List) -> +print_length(List, D, T, RF, Enc, Str, Ord) when is_list(List) -> %% only flat lists are "printable" case Str andalso printable_list(List, D, T, Enc) of true -> @@ -527,37 +529,37 @@ print_length(List, D, T, RF, Enc, Str) when is_list(List) -> %% does not make Prefix longer. {[S | "..."], 3 + io_lib:chars_length(S), 0, no_more}; false -> - case print_length_list(List, D, T, RF, Enc, Str) of + case print_length_list(List, D, T, RF, Enc, Str, Ord) of {What, Len, Dots, _More} when Dots > 0 -> More = fun(T1, Dd) -> - ?FUNCTION_NAME(List, D+Dd, T1, RF, Enc, Str) + ?FUNCTION_NAME(List, D+Dd, T1, RF, Enc, Str, Ord) end, {What, Len, Dots, More}; If -> If end end; -print_length(Fun, _D, _T, _RF, _Enc, _Str) when is_function(Fun) -> +print_length(Fun, _D, _T, _RF, _Enc, _Str, _Ord) when is_function(Fun) -> S = io_lib:write(Fun), {S, iolist_size(S), 0, no_more}; -print_length(R, D, T, RF, Enc, Str) when is_atom(element(1, R)), - is_function(RF) -> +print_length(R, D, T, RF, Enc, Str, Ord) when is_atom(element(1, R)), + is_function(RF) -> case RF(element(1, R), tuple_size(R) - 1) of no -> - print_length_tuple(R, D, T, RF, Enc, Str); + print_length_tuple(R, D, T, RF, Enc, Str, Ord); RDefs -> - print_length_record(R, D, T, RF, RDefs, Enc, Str) + print_length_record(R, D, T, RF, RDefs, Enc, Str, Ord) end; -print_length(Tuple, D, T, RF, Enc, Str) when is_tuple(Tuple) -> - print_length_tuple(Tuple, D, T, RF, Enc, Str); -print_length(Map, D, T, RF, Enc, Str) when is_map(Map) -> - print_length_map(Map, D, T, RF, Enc, Str); -print_length(<<>>, _D, _T, _RF, _Enc, _Str) -> +print_length(Tuple, D, T, RF, Enc, Str, Ord) when is_tuple(Tuple) -> + print_length_tuple(Tuple, D, T, RF, Enc, Str, Ord); +print_length(Map, D, T, RF, Enc, Str, Ord) when is_map(Map) -> + print_length_map(Map, D, T, RF, Enc, Str, Ord); +print_length(<<>>, _D, _T, _RF, _Enc, _Str, _Ord) -> {"<<>>", 4, 0, no_more}; -print_length(<<_/bitstring>> = Bin, 1, _T, RF, Enc, Str) -> - More = fun(T1, Dd) -> ?FUNCTION_NAME(Bin, 1+Dd, T1, RF, Enc, Str) end, +print_length(<<_/bitstring>> = Bin, 1, _T, RF, Enc, Str, Ord) -> + More = fun(T1, Dd) -> ?FUNCTION_NAME(Bin, 1+Dd, T1, RF, Enc, Str, Ord) end, {"<<...>>", 7, 3, More}; -print_length(<<_/bitstring>> = Bin, D, T, RF, Enc, Str) -> +print_length(<<_/bitstring>> = Bin, D, T, RF, Enc, Str, Ord) -> D1 = D - 1, case Str andalso @@ -573,13 +575,13 @@ print_length(<<_/bitstring>> = Bin, D, T, RF, Enc, Str) -> {true, true, Prefix} -> S = io_lib:write_string(Prefix, $"), %" More = fun(T1, Dd) -> - ?FUNCTION_NAME(Bin, D+Dd, T1, RF, Enc, Str) + ?FUNCTION_NAME(Bin, D+Dd, T1, RF, Enc, Str, Ord) end, {[$<,$<,S|"...>>"], 7 + length(S), 3, More}; {false, true, Prefix} -> S = io_lib:write_string(Prefix, $"), %" More = fun(T1, Dd) -> - ?FUNCTION_NAME(Bin, D+Dd, T1, RF, Enc, Str) + ?FUNCTION_NAME(Bin, D+Dd, T1, RF, Enc, Str, Ord) end, {[$<,$<,S|"/utf8...>>"], 12 + io_lib:chars_length(S), 3, More}; false -> @@ -588,135 +590,135 @@ print_length(<<_/bitstring>> = Bin, D, T, RF, Enc, Str) -> {{bin, S}, iolist_size(S), 0, no_more}; {S, _Rest} -> More = fun(T1, Dd) -> - ?FUNCTION_NAME(Bin, D+Dd, T1, RF, Enc, Str) + ?FUNCTION_NAME(Bin, D+Dd, T1, RF, Enc, Str, Ord) end, {{bin, S}, iolist_size(S), 3, More} end end; -print_length(Term, _D, _T, _RF, _Enc, _Str) -> +print_length(Term, _D, _T, _RF, _Enc, _Str, _Ord) -> S = io_lib:write(Term), %% S can contain unicode, so iolist_size(S) cannot be used here {S, io_lib:chars_length(S), 0, no_more}. -print_length_map(Map, 1, _T, RF, Enc, Str) -> - More = fun(T1, Dd) -> ?FUNCTION_NAME(Map, 1+Dd, T1, RF, Enc, Str) end, +print_length_map(Map, 1, _T, RF, Enc, Str, Ord) -> + More = fun(T1, Dd) -> ?FUNCTION_NAME(Map, 1+Dd, T1, RF, Enc, Str, Ord) end, {"#{...}", 6, 3, More}; -print_length_map(Map, D, T, RF, Enc, Str) when is_map(Map) -> - Next = maps:next(maps:iterator(Map)), - PairsS = print_length_map_pairs(Next, D, D - 1, tsub(T, 3), RF, Enc, Str), +print_length_map(Map, D, T, RF, Enc, Str, Ord) when is_map(Map) -> + Next = maps:next(maps:iterator(Map, Ord)), + PairsS = print_length_map_pairs(Next, D, D - 1, tsub(T, 3), RF, Enc, Str, Ord), {Len, Dots} = list_length(PairsS, 3, 0), {{map, PairsS}, Len, Dots, no_more}. -print_length_map_pairs(none, _D, _D0, _T, _RF, _Enc, _Str) -> +print_length_map_pairs(none, _D, _D0, _T, _RF, _Enc, _Str, _Ord) -> []; -print_length_map_pairs(Term, D, D0, T, RF, Enc, Str) when D =:= 1; T =:= 0-> +print_length_map_pairs(Term, D, D0, T, RF, Enc, Str, Ord) when D =:= 1; T =:= 0-> More = fun(T1, Dd) -> - ?FUNCTION_NAME(Term, D+Dd, D0, T1, RF, Enc, Str) + ?FUNCTION_NAME(Term, D+Dd, D0, T1, RF, Enc, Str, Ord) end, {dots, 3, 3, More}; -print_length_map_pairs({K, V, Iter}, D, D0, T, RF, Enc, Str) -> +print_length_map_pairs({K, V, Iter}, D, D0, T, RF, Enc, Str, Ord) -> Next = maps:next(Iter), T1 = case Next =:= none of false -> tsub(T, 1); true -> T end, - Pair1 = print_length_map_pair(K, V, D0, T1, RF, Enc, Str), + Pair1 = print_length_map_pair(K, V, D0, T1, RF, Enc, Str, Ord), {_, Len1, _, _} = Pair1, [Pair1 | - print_length_map_pairs(Next, D - 1, D0, tsub(T1, Len1), RF, Enc, Str)]. + print_length_map_pairs(Next, D - 1, D0, tsub(T1, Len1), RF, Enc, Str, Ord)]. -print_length_map_pair(K, V, D, T, RF, Enc, Str) -> - {_, KL, KD, _} = P1 = print_length(K, D, T, RF, Enc, Str), +print_length_map_pair(K, V, D, T, RF, Enc, Str, Ord) -> + {_, KL, KD, _} = P1 = print_length(K, D, T, RF, Enc, Str, Ord), KL1 = KL + 4, - {_, VL, VD, _} = P2 = print_length(V, D, tsub(T, KL1), RF, Enc, Str), + {_, VL, VD, _} = P2 = print_length(V, D, tsub(T, KL1), RF, Enc, Str, Ord), {{map_pair, P1, P2}, KL1 + VL, KD + VD, no_more}. -print_length_tuple(Tuple, 1, _T, RF, Enc, Str) -> - More = fun(T1, Dd) -> ?FUNCTION_NAME(Tuple, 1+Dd, T1, RF, Enc, Str) end, +print_length_tuple(Tuple, 1, _T, RF, Enc, Str, Ord) -> + More = fun(T1, Dd) -> ?FUNCTION_NAME(Tuple, 1+Dd, T1, RF, Enc, Str, Ord) end, {"{...}", 5, 3, More}; -print_length_tuple(Tuple, D, T, RF, Enc, Str) -> - L = print_length_tuple1(Tuple, 1, D, tsub(T, 2), RF, Enc, Str), +print_length_tuple(Tuple, D, T, RF, Enc, Str, Ord) -> + L = print_length_tuple1(Tuple, 1, D, tsub(T, 2), RF, Enc, Str, Ord), IsTagged = is_atom(element(1, Tuple)) and (tuple_size(Tuple) > 1), {Len, Dots} = list_length(L, 2, 0), {{tuple,IsTagged,L}, Len, Dots, no_more}. -print_length_tuple1(Tuple, I, _D, _T, _RF, _Enc, _Str) +print_length_tuple1(Tuple, I, _D, _T, _RF, _Enc, _Str, _Ord) when I > tuple_size(Tuple) -> []; -print_length_tuple1(Tuple, I, D, T, RF, Enc, Str) when D =:= 1; T =:= 0-> - More = fun(T1, Dd) -> ?FUNCTION_NAME(Tuple, I, D+Dd, T1, RF, Enc, Str) end, +print_length_tuple1(Tuple, I, D, T, RF, Enc, Str, Ord) when D =:= 1; T =:= 0-> + More = fun(T1, Dd) -> ?FUNCTION_NAME(Tuple, I, D+Dd, T1, RF, Enc, Str, Ord) end, {dots, 3, 3, More}; -print_length_tuple1(Tuple, I, D, T, RF, Enc, Str) -> +print_length_tuple1(Tuple, I, D, T, RF, Enc, Str, Ord) -> E = element(I, Tuple), T1 = case I =:= tuple_size(Tuple) of false -> tsub(T, 1); true -> T end, - {_, Len1, _, _} = Elem1 = print_length(E, D - 1, T1, RF, Enc, Str), + {_, Len1, _, _} = Elem1 = print_length(E, D - 1, T1, RF, Enc, Str, Ord), T2 = tsub(T1, Len1), - [Elem1 | print_length_tuple1(Tuple, I + 1, D - 1, T2, RF, Enc, Str)]. + [Elem1 | print_length_tuple1(Tuple, I + 1, D - 1, T2, RF, Enc, Str, Ord)]. -print_length_record(Tuple, 1, _T, RF, RDefs, Enc, Str) -> +print_length_record(Tuple, 1, _T, RF, RDefs, Enc, Str, Ord) -> More = fun(T1, Dd) -> - ?FUNCTION_NAME(Tuple, 1+Dd, T1, RF, RDefs, Enc, Str) + ?FUNCTION_NAME(Tuple, 1+Dd, T1, RF, RDefs, Enc, Str, Ord) end, {"{...}", 5, 3, More}; -print_length_record(Tuple, D, T, RF, RDefs, Enc, Str) -> +print_length_record(Tuple, D, T, RF, RDefs, Enc, Str, Ord) -> Name = [$# | write_atom(element(1, Tuple), Enc)], NameL = io_lib:chars_length(Name), T1 = tsub(T, NameL+2), - L = print_length_fields(RDefs, D - 1, T1, Tuple, 2, RF, Enc, Str), + L = print_length_fields(RDefs, D - 1, T1, Tuple, 2, RF, Enc, Str, Ord), {Len, Dots} = list_length(L, NameL + 2, 0), {{record, [{Name,NameL} | L]}, Len, Dots, no_more}. -print_length_fields([], _D, _T, Tuple, I, _RF, _Enc, _Str) +print_length_fields([], _D, _T, Tuple, I, _RF, _Enc, _Str, _Ord) when I > tuple_size(Tuple) -> []; -print_length_fields(Term, D, T, Tuple, I, RF, Enc, Str) +print_length_fields(Term, D, T, Tuple, I, RF, Enc, Str, Ord) when D =:= 1; T =:= 0 -> More = fun(T1, Dd) -> - ?FUNCTION_NAME(Term, D+Dd, T1, Tuple, I, RF, Enc, Str) + ?FUNCTION_NAME(Term, D+Dd, T1, Tuple, I, RF, Enc, Str, Ord) end, {dots, 3, 3, More}; -print_length_fields([Def | Defs], D, T, Tuple, I, RF, Enc, Str) -> +print_length_fields([Def | Defs], D, T, Tuple, I, RF, Enc, Str, Ord) -> E = element(I, Tuple), T1 = case I =:= tuple_size(Tuple) of false -> tsub(T, 1); true -> T end, - Field1 = print_length_field(Def, D - 1, T1, E, RF, Enc, Str), + Field1 = print_length_field(Def, D - 1, T1, E, RF, Enc, Str, Ord), {_, Len1, _, _} = Field1, T2 = tsub(T1, Len1), [Field1 | - print_length_fields(Defs, D - 1, T2, Tuple, I + 1, RF, Enc, Str)]. + print_length_fields(Defs, D - 1, T2, Tuple, I + 1, RF, Enc, Str, Ord)]. -print_length_field(Def, D, T, E, RF, Enc, Str) -> +print_length_field(Def, D, T, E, RF, Enc, Str, Ord) -> Name = write_atom(Def, Enc), NameL = io_lib:chars_length(Name) + 3, {_, Len, Dots, _} = - Field = print_length(E, D, tsub(T, NameL), RF, Enc, Str), + Field = print_length(E, D, tsub(T, NameL), RF, Enc, Str, Ord), {{field, Name, NameL, Field}, NameL + Len, Dots, no_more}. -print_length_list(List, D, T, RF, Enc, Str) -> - L = print_length_list1(List, D, tsub(T, 2), RF, Enc, Str), +print_length_list(List, D, T, RF, Enc, Str, Ord) -> + L = print_length_list1(List, D, tsub(T, 2), RF, Enc, Str, Ord), {Len, Dots} = list_length(L, 2, 0), {{list, L}, Len, Dots, no_more}. -print_length_list1([], _D, _T, _RF, _Enc, _Str) -> +print_length_list1([], _D, _T, _RF, _Enc, _Str, _Ord) -> []; -print_length_list1(Term, D, T, RF, Enc, Str) when D =:= 1; T =:= 0-> - More = fun(T1, Dd) -> ?FUNCTION_NAME(Term, D+Dd, T1, RF, Enc, Str) end, +print_length_list1(Term, D, T, RF, Enc, Str, Ord) when D =:= 1; T =:= 0-> + More = fun(T1, Dd) -> ?FUNCTION_NAME(Term, D+Dd, T1, RF, Enc, Str, Ord) end, {dots, 3, 3, More}; -print_length_list1([E | Es], D, T, RF, Enc, Str) -> +print_length_list1([E | Es], D, T, RF, Enc, Str, Ord) -> %% If E is the last element in list, don't account length for a comma. T1 = case Es =:= [] of false -> tsub(T, 1); true -> T end, - {_, Len1, _, _} = Elem1 = print_length(E, D - 1, T1, RF, Enc, Str), - [Elem1 | print_length_list1(Es, D - 1, tsub(T1, Len1), RF, Enc, Str)]; -print_length_list1(E, D, T, RF, Enc, Str) -> - print_length(E, D - 1, T, RF, Enc, Str). + {_, Len1, _, _} = Elem1 = print_length(E, D - 1, T1, RF, Enc, Str, Ord), + [Elem1 | print_length_list1(Es, D - 1, tsub(T1, Len1), RF, Enc, Str, Ord)]; +print_length_list1(E, D, T, RF, Enc, Str, Ord) -> + print_length(E, D - 1, T, RF, Enc, Str, Ord). list_length([], Acc, DotsAcc) -> {Acc, DotsAcc}; |