From 2f817a6740fea52541d101fc3450883001c42a1c Mon Sep 17 00:00:00 2001
From: Benno Schulenberg <bensberg@justemail.net>
Date: Tue, 22 Mar 2016 10:42:28 +0000
Subject: [PATCH] Checking for the existence of the REG_ENHANCED regex flag,
 and using it when it's available (which it is on OS X systems). This
 completes the fix for Savannah bug #47325. Patch by Thomas Rosenau.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5759 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog    |  5 +++++
 configure.ac | 19 ++++++++++++++++---
 src/color.c  |  2 +-
 src/nano.c   |  2 +-
 src/rcfile.c |  6 +++---
 src/search.c |  2 +-
 6 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5860fb37..2b99a8dc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-22  Thomas Rosenau  <thomasr@fantasymail.de>
+	* configure.ac, src/*.c: Check for the existence of the REG_ENHANCED
+	regex flag, and use it when it's available (on OS X systems).  This
+	completes the fix for Savannah bug #47325.
+
 2016-03-21  Benno Schulenberg  <bensberg@justemail.net>
 	* src/browser.c (findnextfile): Trim a duplicate variable.
 	* src/browser.c (browser_refresh, findnextfile): Rename four vars.
diff --git a/configure.ac b/configure.ac
index 96fc65a6..072dc11d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -572,6 +572,19 @@ else
     fi
 fi
 
+AC_CACHE_CHECK([for enhanced regular expression flag], nano_cv_flag_reg_extended,
+	       [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <regex.h>]],
+						   [[
+						     #ifndef REG_ENHANCED
+						     error: No REG_ENHANCED support!
+						     #endif
+						   ]])],
+				  [nano_cv_flag_reg_extended="REG_EXTENDED | REG_ENHANCED"],
+				  [nano_cv_flag_reg_extended="REG_EXTENDED"])])
+
+AC_DEFINE_UNQUOTED(NANO_REG_EXTENDED, $nano_cv_flag_reg_extended,
+		   [Flag(s) to use to get the full range of extended regular expressions])
+
 if test x$color_support = xyes; then
 	# Now check for the end-of-word boundary support (/< and />).
 	AC_MSG_CHECKING([for GNU-style word boundary regex support])
@@ -601,7 +614,7 @@ int main(void)
     size_t nmatch;
     regmatch_t pmatch;
 
-    if (regcomp(&r, "\\\\>", REG_EXTENDED|REG_NOSUB))
+    if (regcomp(&r, "\\\\>", $nano_cv_flag_reg_extended|REG_NOSUB))
 	return 1;
     if (regexec(&r, "word boundary", nmatch, &pmatch, 0))
 	return 1;
@@ -639,8 +652,8 @@ int main(void)
 	AC_MSG_WARN([*** Couldn't successfully compile basic color test with or without _XOPEN_SOURCE_EXTENDED])
 	AC_MSG_WARN([*** This build may not compile. Consider configuring with --disable-color or installing ncurses])),
 	AC_MSG_WARN([*** Can't check need for _XOPEN_SOURCE_EXTENDED when cross-compiling]))
-    fi
-#fi
+#    fi
+fi
 
 AC_MSG_CHECKING([whether LINES and COLS can be redefined])
 AC_TRY_RUN([
diff --git a/src/color.c b/src/color.c
index 03263f8c..b1eb5594 100644
--- a/src/color.c
+++ b/src/color.c
@@ -147,7 +147,7 @@ bool found_in_list(regexlisttype *head, const char *shibboleth)
     regex_t rgx;
 
     for (item = head; item != NULL; item = item->next) {
-	regcomp(&rgx, fixbounds(item->full_regex), REG_EXTENDED);
+	regcomp(&rgx, fixbounds(item->full_regex), NANO_REG_EXTENDED);
 
 	if (regexec(&rgx, shibboleth, 0, NULL, 0) == 0) {
 	    regfree(&rgx);
diff --git a/src/nano.c b/src/nano.c
index 1398a78d..78fbc8c8 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -2424,7 +2424,7 @@ int main(int argc, char **argv)
 #endif
 		);
 #ifdef HAVE_REGEX_H
-    quoterc = regcomp(&quotereg, quotestr, REG_EXTENDED);
+    quoterc = regcomp(&quotereg, quotestr, NANO_REG_EXTENDED);
 
     if (quoterc == 0) {
 	/* We no longer need quotestr, just quotereg. */
diff --git a/src/rcfile.c b/src/rcfile.c
index f16be9e9..bab39a27 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -831,7 +831,7 @@ void grab_and_store(const char *kind, char *ptr, regexlisttype **storage)
 	    return;
 
 	/* If the regex string is malformed, skip it. */
-	if (!nregcomp(regexstring, REG_EXTENDED | REG_NOSUB))
+	if (!nregcomp(regexstring, NANO_REG_EXTENDED | REG_NOSUB))
 	    continue;
 
 	/* Copy the regex into a struct, and hook this in at the end. */
@@ -1010,9 +1010,9 @@ void parse_rcfile(FILE *rcstream
 	    ;
 #endif
 	else if (strcasecmp(keyword, "color") == 0)
-	    parse_colors(ptr, REG_EXTENDED);
+	    parse_colors(ptr, NANO_REG_EXTENDED);
 	else if (strcasecmp(keyword, "icolor") == 0)
-	    parse_colors(ptr, REG_EXTENDED | REG_ICASE);
+	    parse_colors(ptr, NANO_REG_EXTENDED | REG_ICASE);
 	else if (strcasecmp(keyword, "linter") == 0)
 	    pick_up_name("linter", ptr, &live_syntax->linter);
 	else if (strcasecmp(keyword, "formatter") == 0)
diff --git a/src/search.c b/src/search.c
index 8a408a24..4172e123 100644
--- a/src/search.c
+++ b/src/search.c
@@ -48,7 +48,7 @@ bool regexp_init(const char *regexp)
 
     assert(!regexp_compiled);
 
-    rc = regcomp(&search_regexp, fixbounds(regexp), REG_EXTENDED
+    rc = regcomp(&search_regexp, fixbounds(regexp), NANO_REG_EXTENDED
 #ifndef NANO_TINY
 	| (ISSET(CASE_SENSITIVE) ? 0 : REG_ICASE)
 #endif
-- 
GitLab