Rewrite split_* to split/2; taking Splitter list as parm.

o  introduce take_prefix/2 to check for prefix AND remove it combined
o  take_prefix/2 also used to replace strip_leading_blank logic
This commit is contained in:
Steve Powell 2011-11-24 13:31:12 +00:00
parent 550fe21981
commit a8cac262e6
1 changed files with 27 additions and 25 deletions

View File

@ -140,7 +140,7 @@ user_header(_) ->
true.
parse_message_id(MessageId) ->
case split_message_id(MessageId) of
case split(MessageId, ?MESSAGE_ID_SEPARATOR) of
[ConsumerTag, SessionId, DeliveryTag] ->
{ok, {list_to_binary(ConsumerTag),
SessionId,
@ -149,18 +149,6 @@ parse_message_id(MessageId) ->
{error, invalid_message_id}
end.
split_message_id([]) ->
[];
split_message_id(MessageId) ->
split_message_id(MessageId, [], []).
split_message_id(?MESSAGE_ID_SEPARATOR ++ Str, RPiece, RPieces) ->
split_message_id(Str, [], [lists:reverse(RPiece) | RPieces]);
split_message_id([Char | Str], RPiece, RPieces) ->
split_message_id(Str, [Char | RPiece], RPieces);
split_message_id([], RPiece, RPieces) ->
lists:reverse([lists:reverse(RPiece) | RPieces]).
negotiate_version(ClientVers, ServerVers) ->
Common = lists:filter(fun(Ver) ->
lists:member(Ver, ServerVers)
@ -281,21 +269,35 @@ parse_simple_destination(Type, Content) ->
end.
parse_content(Content)->
[unescape(X) || X <- split_content(Content)].
{_, Content2} = take_prefix("/", Content),
[unescape(X) || X <- split(Content2, "/")].
split_content([]) ->
split([], _Splitter) ->
[];
split_content("/" ++ Content) ->
split_content(Content, [], []);
split_content(Content) ->
split_content(Content, [], []).
split(Content, []) ->
Content;
split(Content, Splitter) ->
split(Content, [], [], Splitter).
split_content("/" ++ Str, RName, RNames) ->
split_content(Str, [], [lists:reverse(RName) | RNames]);
split_content([Char | Str], RName, RNames) ->
split_content(Str, [Char | RName], RNames);
split_content([], RName, RNames) ->
lists:reverse([lists:reverse(RName) | RNames]).
split([], RPart, RParts, _Splitter) ->
lists:reverse([lists:reverse(RPart) | RParts]);
split(Content = [Elem | Rest1], RPart, RParts, Splitter) ->
case take_prefix(Splitter, Content) of
{true, Rest2} ->
split(Rest2, [], [lists:reverse(RPart) | RParts], Splitter);
{false, _} ->
split(Rest1, [Elem | RPart], RParts, Splitter)
end.
take_prefix(Prefix, List) ->
take_prefix(Prefix, List, true).
take_prefix([Char | Prefix], [Char | List], AllMatched) ->
take_prefix(Prefix, List, AllMatched);
take_prefix([], List, AllMatched) ->
{AllMatched, List};
take_prefix(_Prefix, List, _AllMatched) ->
{false, List}.
unescape(Str) ->
unescape(Str, []).