summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-01-15 13:00:19 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-01-15 13:00:19 +0300
commitb970c889418f51c685daa0fbb347f57b7fbc9477 (patch)
tree12001a4cd2351a1c5530c55f809926579af6d815
parentAlways build eimp dependency (diff)
parentDon't report errors when trying to remove not existing files in make install (diff)
Merge branch 'master' of github.com:processone/ejabberd
-rw-r--r--Makefile.in4
-rw-r--r--src/ejabberd_regexp.erl66
2 files changed, 62 insertions, 8 deletions
diff --git a/Makefile.in b/Makefile.in
index 8006e074..fa2c3fd3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -149,7 +149,7 @@ define DEP_VERSION_template
DEP_$(1)_VERSION:=$(shell $(SED) -e '/vsn/!d;s/.*, *"/$(1)-/;s/".*//' $(2) 2>/dev/null)
endef
-DELETE_TARGET_SO=$(if $(subst X.soX,,X$(suffix $(1))X),,rm $(call TO_DEST,$(1));)
+DELETE_TARGET_SO=$(if $(subst X.soX,,X$(suffix $(1))X),,rm -f $(call TO_DEST,$(1));)
$(foreach DEP,$(DEPS),$(eval $(call DEP_VERSION_template,$(DEP),deps/$(DEP)/ebin/$(DEP).app)))
$(eval $(call DEP_VERSION_template,ejabberd,ebin/ejabberd.app))
@@ -159,7 +159,7 @@ $(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; $(call DELETE_TARGET_SO
endef
define COPY_BINARY_template
-$(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; rm $(call TO_DEST,$(1)); $$(INSTALL) -m 755 $$(O_USER) $(1) $(call TO_DEST,$(1))
+$(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; rm -f $(call TO_DEST,$(1)); $$(INSTALL) -m 755 $$(O_USER) $(1) $(call TO_DEST,$(1))
endef
$(foreach file,$(DEPS_FILES_FILTERED) $(MAIN_FILES),$(eval $(call COPY_template,$(file))))
diff --git a/src/ejabberd_regexp.erl b/src/ejabberd_regexp.erl
index fdbf08f5..12564e71 100644
--- a/src/ejabberd_regexp.erl
+++ b/src/ejabberd_regexp.erl
@@ -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.