|
@ -75,10 +75,10 @@ parse(OptSpecList, OptAcc, ArgAcc, _ArgPos, ["--" | Tail]) -> |
|
|
% Any argument present after the terminator is not considered an option. |
|
|
% Any argument present after the terminator is not considered an option. |
|
|
{ok, {lists:reverse(append_default_options(OptSpecList, OptAcc)), lists:reverse(ArgAcc, Tail)}}; |
|
|
{ok, {lists:reverse(append_default_options(OptSpecList, OptAcc)), lists:reverse(ArgAcc, Tail)}}; |
|
|
%% Process long options. |
|
|
%% Process long options. |
|
|
parse(OptSpecList, OptAcc, ArgAcc, ArgPos, [[$-, $- | OptArg] = OptStr | Tail]) -> |
|
|
|
|
|
|
|
|
parse(OptSpecList, OptAcc, ArgAcc, ArgPos, ["--" ++ OptArg = OptStr | Tail]) -> |
|
|
parse_option_long(OptSpecList, OptAcc, ArgAcc, ArgPos, Tail, OptStr, OptArg); |
|
|
parse_option_long(OptSpecList, OptAcc, ArgAcc, ArgPos, Tail, OptStr, OptArg); |
|
|
%% Process short options. |
|
|
%% Process short options. |
|
|
parse(OptSpecList, OptAcc, ArgAcc, ArgPos, [[$- | [_Char | _] = OptArg] = OptStr | Tail]) -> |
|
|
|
|
|
|
|
|
parse(OptSpecList, OptAcc, ArgAcc, ArgPos, ["-" ++ ([_Char | _] = OptArg) = OptStr | Tail]) -> |
|
|
parse_option_short(OptSpecList, OptAcc, ArgAcc, ArgPos, Tail, OptStr, OptArg); |
|
|
parse_option_short(OptSpecList, OptAcc, ArgAcc, ArgPos, Tail, OptStr, OptArg); |
|
|
%% Process non-option arguments. |
|
|
%% Process non-option arguments. |
|
|
parse(OptSpecList, OptAcc, ArgAcc, ArgPos, [Arg | Tail]) -> |
|
|
parse(OptSpecList, OptAcc, ArgAcc, ArgPos, [Arg | Tail]) -> |
|
@ -111,11 +111,11 @@ parse_option_long(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, OptArg) -> |
|
|
parse_option_assigned_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, Long, Arg); |
|
|
parse_option_assigned_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, Long, Arg); |
|
|
|
|
|
|
|
|
Long -> |
|
|
Long -> |
|
|
case lists:keysearch(Long, ?OPT_LONG, OptSpecList) of |
|
|
|
|
|
{value, {Name, _Short, Long, undefined, _Help}} -> |
|
|
|
|
|
|
|
|
case lists:keyfind(Long, ?OPT_LONG, OptSpecList) of |
|
|
|
|
|
{Name, _Short, Long, undefined, _Help} -> |
|
|
parse(OptSpecList, [Name | OptAcc], ArgAcc, ArgPos, Args); |
|
|
parse(OptSpecList, [Name | OptAcc], ArgAcc, ArgPos, Args); |
|
|
|
|
|
|
|
|
{value, {_Name, _Short, Long, _ArgSpec, _Help} = OptSpec} -> |
|
|
|
|
|
|
|
|
{_Name, _Short, Long, _ArgSpec, _Help} = OptSpec -> |
|
|
% The option argument string is empty, but the option requires |
|
|
% The option argument string is empty, but the option requires |
|
|
% an argument, so we look into the next string in the list. |
|
|
% an argument, so we look into the next string in the list. |
|
|
parse_option_next_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptSpec); |
|
|
parse_option_next_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptSpec); |
|
@ -132,8 +132,8 @@ parse_option_long(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, OptArg) -> |
|
|
[string()], string(), string(), string()) -> |
|
|
[string()], string(), string(), string()) -> |
|
|
{ok, {[option()], [string()]}}. |
|
|
{ok, {[option()], [string()]}}. |
|
|
parse_option_assigned_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, Long, Arg) -> |
|
|
parse_option_assigned_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, Long, Arg) -> |
|
|
case lists:keysearch(Long, ?OPT_LONG, OptSpecList) of |
|
|
|
|
|
{value, {_Name, _Short, Long, ArgSpec, _Help} = OptSpec} -> |
|
|
|
|
|
|
|
|
case lists:keyfind(Long, ?OPT_LONG, OptSpecList) of |
|
|
|
|
|
{_Name, _Short, Long, ArgSpec, _Help} = OptSpec -> |
|
|
case ArgSpec of |
|
|
case ArgSpec of |
|
|
undefined -> |
|
|
undefined -> |
|
|
throw({error, {invalid_option_arg, OptStr}}); |
|
|
throw({error, {invalid_option_arg, OptStr}}); |
|
@ -151,7 +151,7 @@ parse_option_assigned_arg(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, Lon |
|
|
split_assigned_arg(OptStr) -> |
|
|
split_assigned_arg(OptStr) -> |
|
|
split_assigned_arg(OptStr, OptStr, []). |
|
|
split_assigned_arg(OptStr, OptStr, []). |
|
|
|
|
|
|
|
|
split_assigned_arg(_OptStr, [$= | Tail], Acc) -> |
|
|
|
|
|
|
|
|
split_assigned_arg(_OptStr, "=" ++ Tail, Acc) -> |
|
|
{lists:reverse(Acc), Tail}; |
|
|
{lists:reverse(Acc), Tail}; |
|
|
split_assigned_arg(OptStr, [Char | Tail], Acc) -> |
|
|
split_assigned_arg(OptStr, [Char | Tail], Acc) -> |
|
|
split_assigned_arg(OptStr, Tail, [Char | Acc]); |
|
|
split_assigned_arg(OptStr, Tail, [Char | Acc]); |
|
@ -170,11 +170,11 @@ split_assigned_arg(OptStr, [], _Acc) -> |
|
|
-spec parse_option_short([option_spec()], [option()], [string()], integer(), [string()], string(), string()) -> |
|
|
-spec parse_option_short([option_spec()], [option()], [string()], integer(), [string()], string(), string()) -> |
|
|
{ok, {[option()], [string()]}}. |
|
|
{ok, {[option()], [string()]}}. |
|
|
parse_option_short(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, [Short | Arg]) -> |
|
|
parse_option_short(OptSpecList, OptAcc, ArgAcc, ArgPos, Args, OptStr, [Short | Arg]) -> |
|
|
case lists:keysearch(Short, ?OPT_SHORT, OptSpecList) of |
|
|
|
|
|
{value, {Name, Short, _Long, undefined, _Help}} -> |
|
|
|
|
|
|
|
|
case lists:keyfind(Short, ?OPT_SHORT, OptSpecList) of |
|
|
|
|
|
{Name, Short, _Long, undefined, _Help} -> |
|
|
parse_option_short(OptSpecList, [Name | OptAcc], ArgAcc, ArgPos, Args, OptStr, Arg); |
|
|
parse_option_short(OptSpecList, [Name | OptAcc], ArgAcc, ArgPos, Args, OptStr, Arg); |
|
|
|
|
|
|
|
|
{value, {_Name, Short, _Long, ArgSpec, _Help} = OptSpec} -> |
|
|
|
|
|
|
|
|
{_Name, Short, _Long, ArgSpec, _Help} = OptSpec -> |
|
|
case Arg of |
|
|
case Arg of |
|
|
[] -> |
|
|
[] -> |
|
|
% The option argument string is empty, but the option requires |
|
|
% The option argument string is empty, but the option requires |
|
|