changeset 12464:dfeea9cae79e

require PCRE to build Octave
author John W. Eaton <jwe@octave.org>
date Mon, 21 Feb 2011 03:50:59 -0500
parents 189baf055143
children 6b2abcd20fef
files ChangeLog NEWS configure.ac src/ChangeLog src/DLD-FUNCTIONS/regexp.cc
diffstat 5 files changed, 37 insertions(+), 137 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-02-21  John W. Eaton  <jwe@octave.org>
+
+	* NEWS: Note that PCRE is now required to build Octave.
+	* configure.ac: Improve check for PCRE, which is now required.
+	Don't check for -lregex.
+
 2011-02-19  Rik  <octave@nomad.inbox5.com>
 
 	* README.MacOS: Keep line length below 80, use 2 spaces to start
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,8 @@
       spchol              splchol      unmark_command
       spchol2inv          split        unmark_rawcommand
 
+  ** The PCRE library is now required to build Octave.
+
 Summary of important user-visible changes for version 3.4:
 ---------------------------------------------------------
 
--- a/configure.ac
+++ b/configure.ac
@@ -637,61 +637,43 @@
      AC_DEFINE(HAVE_QHULL, 1, [Define if QHull is available.])], [
      warn_qhull="Qhull library found, but seems not to work properly -- this will result in loss of functionality of some geometry functions.  Please try recompiling the library with -fno-strict-aliasing."])])
 
-### Check for pcre/regex library.
+### Check for pcre regex library.
+
+REGEX_LIBS=
+
+pcre_fail_msg="to build Octave, you must have the PCRE library and header files installed"
 
-## check for pcre-config, and if so, set XTRA_CXXFLAGS appropriately
-AC_CHECK_PROG(WITH_PCRE_CONFIG, pcre-config, yes, no)
-if test $WITH_PCRE_CONFIG = yes ; then
-  XTRA_CXXFLAGS="$XTRA_CXXFLAGS $(pcre-config --cflags)"
-fi
-
-## NB: no need to do separate check for pcre.h header -- checking macros is good enough
-AC_CACHE_CHECK([whether pcre.h defines the macros we need], [ac_cv_pcre_h_macros_present], [
-  AC_EGREP_CPP([PCRE_HAS_MACROS_WE_NEED], [
+## NB: no need to do separate check for pcre.h header -- checking
+## macros is good enough
+AC_CACHE_CHECK([whether pcre.h defines the macros we need],
+  [ac_cv_pcre_h_macros_present],
+  [AC_EGREP_CPP([PCRE_HAS_MACROS_WE_NEED], [
 #include <pcre.h>
 #if defined (PCRE_INFO_NAMECOUNT) \
   && defined (PCRE_INFO_NAMEENTRYSIZE) \
   && defined (PCRE_INFO_NAMETABLE)
 PCRE_HAS_MACROS_WE_NEED
 #endif], ac_cv_pcre_h_macros_present=yes, ac_cv_pcre_h_macros_present=no)])
-WITH_PCRE="$ac_cv_pcre_h_macros_present"
 
-REGEX_LIBS=
-
-using_pcre=no
-using_regex=no
-
-if test "$WITH_PCRE" = yes; then
-  if test "$WITH_PCRE_CONFIG" = yes; then
-    REGEX_LIBS=$(pcre-config --libs)
+if test $ac_cv_pcre_h_macros_present = yes; then
+  ## check for pcre-config, and if so, set XTRA_CXXFLAGS appropriately
+  AC_CHECK_PROG(HAVE_PCRE_CONFIG, pcre-config, [yes], [no])
+  if test $HAVE_PCRE_CONFIG = yes; then
+    XTRA_CXXFLAGS="$XTRA_CXXFLAGS `pcre-config --cflags`"
+    REGEX_LIBS="`pcre-config --libs`"
   else
-    REGEX_LIBS=-lpcre
+    REGEX_LIBS="-lpcre"
   fi
   save_LIBS="$LIBS"
   LIBS="$REGEX_LIBS $LIBS"
-  AC_CHECK_FUNCS(pcre_compile, [using_pcre=yes
-    AC_DEFINE(HAVE_PCRE, 1, [Define if PCRE library is available.])], [
-      REGEX_LIBS=
-      warn_pcre="PCRE library not found.  This will result in some loss of functionality for the regular expression matching functions."
-      AC_MSG_WARN([$warn_pcre])])
+  AC_CHECK_FUNCS(pcre_compile,
+    [AC_SUBST(REGEX_LIBS)],
+    [AC_MSG_ERROR([$pcre_fail_msg])])
   LIBS="$save_LIBS"
 else
-  warn_pcre="PCRE library not found.  This will result in some loss of functionality for the regular expression matching functions."
-  AC_MSG_WARN([$warn_pcre])
+  AC_MSG_ERROR([$pcre_fail_msg])
 fi
 
-AC_CHECK_FUNCS(regexec, [using_regex=yes], [
-  AC_CHECK_LIB(regex, regexec, [using_regex=yes
-    REGEX_LIBS="-lregex $REGEX_LIBS"], [
-      warn_regex="regular expression functions not found.  The regular expression matching functions will be disabled."
-      AC_MSG_WARN([$warn_regex])])])
-
-if test "$using_regex" = yes; then
-  AC_DEFINE(HAVE_REGEX, 1, [Define if regex library is available.])
-fi
-
-AC_SUBST(REGEX_LIBS)
-
 ### Check for ZLIB library.
 
 OCTAVE_CHECK_LIBRARY(z, ZLIB,
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2011-02-21  John W. Eaton  <jwe@octave.org>
+
+	* DLD-FUNCTIONS/regexp.cc: Assume we have PCRE.
+
 2010-02-19  Rik  <octave@nomad.inbox5.com>
 
 	* src/DLD-FUNCTIONS/regexp.cc: Use PCRE regular expressions everywhere
--- a/src/DLD-FUNCTIONS/regexp.cc
+++ b/src/DLD-FUNCTIONS/regexp.cc
@@ -41,15 +41,7 @@
 #include "parse.h"
 #include "oct-locbuf.h"
 
-#if defined (HAVE_PCRE)
 #include <pcre.h>
-#elif defined (HAVE_REGEX)
-#if defined (__MINGW32__)
-#define __restrict
-#endif
-#include <sys/types.h>
-#include <regex.h>
-#endif
 
 // Define the maximum number of retries for a pattern that
 // possibly results in an infinite recursion.
@@ -92,7 +84,7 @@
                 string_vector &named, int &nopts, bool &once)
 {
   int sz = 0;
-#if defined (HAVE_REGEX) || defined (HAVE_PCRE)
+
   int nargin = args.length();
   bool lineanchors = false;
   bool dotexceptnewline = false;
@@ -157,7 +149,7 @@
           freespacing = false;
           nopts--;
         }
-#if HAVE_PCRE
+
       // Only accept these options with pcre
       else if (str.find("dotexceptnewline", 0) == 0)
         {
@@ -178,17 +170,6 @@
                str.find("tokenextents", 0) && str.find("match", 0) &&
                str.find("tokens", 0) && str.find("names", 0))
         error ("%s: unrecognized option", nm.c_str());
-#else
-      else if (str.find("names", 0) == 0 ||
-               str.find("dotexceptnewline", 0) == 0 ||
-               str.find("lineanchors", 0) == 0 ||
-               str.find("freespacing", 0) == 0)
-       error ("%s: %s not implemented in this version", str.c_str(), nm.c_str());
-      else if (str.find("start", 0) && str.find("end", 0) &&
-               str.find("tokenextents", 0) && str.find("match", 0) &&
-               str.find("tokens", 0))
-        error ("%s: unrecognized option", nm.c_str());
-#endif
     }
 
   if (!error_state)
@@ -198,7 +179,6 @@
       double s, e;
 
       // named tokens "(?<name>...)" are only treated with PCRE not regex.
-#if HAVE_PCRE
 
       size_t pos = 0;
       size_t new_pos;
@@ -494,79 +474,8 @@
         }
 
       pcre_free(re);
-#else
-      regex_t compiled;
-      int err=regcomp(&compiled, pattern.c_str(), REG_EXTENDED |
-                      (case_insensitive ? REG_ICASE : 0));
-      if (err)
-        {
-          int len = regerror(err, &compiled, 0, 0);
-          OCTAVE_LOCAL_BUFFER (char, errmsg, len);
-          regerror(err, &compiled, errmsg, len);
-          error("%s: %s in pattern (%s)", nm.c_str(), errmsg,
-                pattern.c_str());
-          regfree(&compiled);
-          return 0;
-        }
-
-      int subexpr = 1;
-      int idx = 0;
-      for (unsigned int i=0; i < pattern.length(); i++)
-          subexpr += ( pattern[i] == '(' ? 1 : 0 );
-      OCTAVE_LOCAL_BUFFER (regmatch_t, match, subexpr );
-
-      while(true)
-        {
-          OCTAVE_QUIT;
-
-          if (regexec(&compiled, buffer.c_str() + idx, subexpr,
-                      match, (idx ? REG_NOTBOL : 0)) == 0)
-            {
-              // Count actual matches
-              int matches = 0;
-              while (matches < subexpr && match[matches].rm_so >= 0)
-                matches++;
-
-              if (matches == 0 || match[0].rm_eo == 0)
-                break;
+    }
 
-              s = double (match[0].rm_so+1+idx);
-              e = double (match[0].rm_eo+idx);
-              Matrix te(matches-1,2);
-              for (int i = 1; i < matches; i++)
-                {
-                  te(i-1,0) = double (match[i].rm_so+1+idx);
-                  te(i-1,1) = double (match[i].rm_eo+idx);
-                }
-
-              m =  buffer.substr (match[0].rm_so+idx,
-                                         match[0].rm_eo-match[0].rm_so);
-
-              Cell cell_t (dim_vector(1,matches-1));
-              for (int i = 1; i < matches; i++)
-                cell_t(i-1) = buffer.substr (match[i].rm_so+idx,
-                                             match[i].rm_eo-match[i].rm_so);
-              t = cell_t;
-
-              idx += match[0].rm_eo;
-
-              string_vector sv;
-              regexp_elem new_elem (sv, t, m, te, s, e);
-              lst.push_back (new_elem);
-              sz++;
-
-              if (once)
-                break;
-            }
-          else
-            break;
-        }
-      regfree(&compiled);
-#endif
-    }
-#else
-  error ("%s: not available in this version of Octave", nm.c_str());
-#endif
   return sz;
 }
 
@@ -587,8 +496,8 @@
       // Converted the linked list in the correct form for the return values
 
       octave_idx_type i = 0;
-#ifdef HAVE_PCRE
       octave_scalar_map nmap;
+
       if (sz == 1)
         {
           for (int j = 0; j < named.length(); j++)
@@ -607,9 +516,6 @@
             }
           retval(5) = nmap;
         }
-#else
-      retval(5) = octave_scalar_map ();
-#endif
 
       if (once)
         retval(4) = sz ? lst.front ().t : Cell();