]> granicus.if.org Git - ejabberd/commitdiff
Copy sh_to_ask function from xmerl_regexp.erl
authorPaweł Chmielowski <pchmielowski@process-one.net>
Mon, 15 Jan 2018 09:31:06 +0000 (10:31 +0100)
committerPaweł Chmielowski <pchmielowski@process-one.net>
Mon, 15 Jan 2018 09:31:26 +0000 (10:31 +0100)
This way we don't need to include xmerl application in our docker container

src/ejabberd_regexp.erl

index fdbf08f5031d729313ce92b2bef2fe449bf1dc50..12564e710fa2d08da55553ce95ff6f56ac4ab0dd 100644 (file)
@@ -85,11 +85,65 @@ greplace(String, Regexp, New) ->
       A -> A
     end.
 
+
+%% This code was copied and adapted from xmerl_regexp.erl
+
 -spec sh_to_awk(binary()) -> binary().
+sh_to_awk(Sh) ->
+    iolist_to_binary([<<"^(">>, sh_to_awk_1(Sh)]).     %Fix the beginning
+
+sh_to_awk_1(<<"*", Sh/binary>>) ->                     %This matches any string
+    [<<".*">>, sh_to_awk_1(Sh)];
+sh_to_awk_1(<<"?", Sh/binary>>) ->                     %This matches any character
+    [$., sh_to_awk_1(Sh)];
+sh_to_awk_1(<<"[^]", Sh/binary>>) ->                   %This takes careful handling
+    [<<"\\^">>, sh_to_awk_1(Sh)];
+%% Must move '^' to end.
+sh_to_awk_1(<<"[^", Sh/binary>>) ->
+    [$[, sh_to_awk_2(Sh, true)];
+sh_to_awk_1(<<"[!", Sh/binary>>) ->
+    [<<"[^">>, sh_to_awk_2(Sh, false)];
+sh_to_awk_1(<<"[", Sh/binary>>) ->
+    [$[, sh_to_awk_2(Sh, false)];
+sh_to_awk_1(<<C:8, Sh/binary>>) ->                     %% Unspecialise everything else which is not an escape character.
+    case sh_special_char(C) of
+        true -> [$\\,C|sh_to_awk_1(Sh)];
+        false -> [C|sh_to_awk_1(Sh)]
+    end;
+sh_to_awk_1(<<>>) ->
+    <<")$">>.                                          %Fix the end
+
+sh_to_awk_2(<<"]", Sh/binary>>, UpArrow) ->
+    [$]|sh_to_awk_3(Sh, UpArrow)];
+sh_to_awk_2(Sh, UpArrow) ->
+    sh_to_awk_3(Sh, UpArrow).
+
+sh_to_awk_3(<<"]", Sh/binary>>, true) ->
+    [<<"^]">>, sh_to_awk_1(Sh)];
+sh_to_awk_3(<<"]", Sh/binary>>, false) ->
+    [$]|sh_to_awk_1(Sh)];
+sh_to_awk_3(<<C:8, Sh/binary>>, UpArrow) ->
+    [C|sh_to_awk_3(Sh, UpArrow)];
+sh_to_awk_3(<<>>, true) ->
+    [$^|sh_to_awk_1([])];
+sh_to_awk_3(<<>>, false) ->
+    sh_to_awk_1([]).
+
+%% -type sh_special_char(char()) -> bool().
+%%  Test if a character is a special character.
+
+sh_special_char($|) -> true;
+sh_special_char($*) -> true;
+sh_special_char($+) -> true;
+sh_special_char($?) -> true;
+sh_special_char($() -> true;
+sh_special_char($)) -> true;
+sh_special_char($\\) -> true;
+sh_special_char($^) -> true;
+sh_special_char($$) -> true;
+sh_special_char($.) -> true;
+sh_special_char($[) -> true;
+sh_special_char($]) -> true;
+sh_special_char($") -> true;
+sh_special_char(_C) -> false.
 
-sh_to_awk(ShRegExp) ->
-    case exec({xmerl_regexp, sh_to_awk, [binary_to_list(ShRegExp)]},
-              {regexp, sh_to_awk, [binary_to_list(ShRegExp)]})
-       of
-      A -> iolist_to_binary(A)
-    end.