diff --git a/Makefile.in b/Makefile.in index 8006e074c..fa2c3fd3f 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 fdbf08f50..12564e710 100644 --- a/src/ejabberd_regexp.erl +++ b/src/ejabberd_regexp.erl @@ -85,11 +85,65 @@ greplace(String, Regexp, New) -> A -> A end. --spec sh_to_awk(binary()) -> binary(). -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. +%% 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(<>) -> %% 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(<>, 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. +