diff --git a/ChangeLog b/ChangeLog index 5860fb37..2b99a8dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-03-22 Thomas Rosenau + * 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 * 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 ]], + [[ + #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("ereg, quotestr, REG_EXTENDED); + quoterc = regcomp("ereg, 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