-module(findf_util).
-export([add_to_list/2, remove_from_list/2]).
-export([get_list_from_env/1, get_list_from_arg/2]).
-export([split/2]).
-compile(export_all).
add_to_list(Elm, List) ->
case lists:member(Elm, List) of
true -> List;
false -> [Elm | List]
end.
remove_from_list(Elm, List) -> lists:delete(Elm, List).
-define(WIN_DELM_CH, $;).
-define(STD_DELM_CH, $:).
list_delm_ch() ->
case os:type() of
{win32, _} -> ?WIN_DELM_CH;
_ -> ?STD_DELM_CH
end.
get_list_from_env(EnvName) ->
case os:getenv(EnvName) of
false -> [];
EnvStr -> split(EnvStr, list_delm_ch())
end.
get_list_from_arg(AppName, KeyName) ->
case init:get_argument(AppName) of
error -> [];
{ok, ListOfList} ->
lists:foldl(fun (List, Acc) -> gather_list(KeyName, List, Acc) end, [],
ListOfList)
end.
gather_list(KeyName, [KeyName | Values], Acc) ->
Acc ++ split_and_merge_string_list(Values);
gather_list(_KeyName, _NoMatch, Acc) -> Acc.
split_and_merge_string_list([]) -> [];
split_and_merge_string_list([ValueStr | Rest]) ->
List = split(ValueStr, list_delm_ch()), List ++ split_and_merge_string_list(Rest).
split(Str, Ch) -> lists:reverse(split_rev(Str, Ch, "", [])).
split_rev("", _Ch, Acc, Out) -> [lists:reverse(Acc) | Out];
split_rev([Ch | Rest], Ch, Acc, Out) ->
split_rev(Rest, Ch, "", [lists:reverse(Acc) | Out]);
split_rev([OtherCh | Rest], Ch, Acc, Out) -> split_rev(Rest, Ch, [OtherCh | Acc], Out).