bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gnulib regex problem


From: Paul Eggert
Subject: Re: gnulib regex problem
Date: Thu, 16 Mar 2006 23:30:43 -0800
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

address@hidden writes:

> I've noticed a problem in regex.m4; in gl_REGEX _REGEX_LARGE_OFFSETS is
> defined, if gl_cv_type_off_t_switch = yes, regardless of the fact that
> we are using the glibc api or the internal gnulib module. This breaks
> when the user forces --without-included-regex and the glibc regoff_t is
> an int, because the gnulib regex.h will typedef regoff_t to off_t (this
> is a problem for the app using gnulib because the included regex.h is
> always the internal gnulib one, since -I../gnulib/lib is in INCLUDES).

Thanks for reporting that.  I installed the following patch into
gnulib, which I hope fixes this problem (in a simpler way than the
patch that you sent me), along with another issue due to anticipated
changes to POSIX.  I'll install it into coreutils shortly.  If it
doesn't solve your problem please let me know.

2006-03-16  Paul Eggert  <address@hidden>

        * lib/regex.h (regoff_t) [defined _REGEX_LARGE_OFFSETS]:
        Typedef to long int, not to off_, as POSIX will likely change
        in that direction.

        * m4/regex.m4 (gl_REGEX): Don't check for off_t, since the code
        no longer needs it.  Instead, check that regoff_t is as least
        as wide as ptrdiff_t.

        Don't define _REGEX_WIDE_OFFSETS unless using the included regex,
        so that our regex.h stays compatible with the installed regex.
        This is helpful for installers who configure --without-included-regex.
        Problem reported by Emanuele Giaquinta.

Index: lib/regex.h
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/regex.h,v
retrieving revision 1.34
diff -p -u -r1.34 regex.h
--- lib/regex.h 31 Aug 2005 22:51:10 -0000      1.34
+++ lib/regex.h 17 Mar 2006 07:20:38 -0000
@@ -1,6 +1,6 @@
 /* Definitions for data structures and routines for the regular
    expression library.
-   Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003,2005
+   Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -53,11 +53,13 @@ extern "C" {
 
 /* The type of the offset of a byte within a string.
    For historical reasons POSIX 1003.1-2004 requires that regoff_t be
-   at least as wide as off_t.  This is a bit odd (and many common
-   POSIX platforms set it to the more-sensible ssize_t) but we might
-   as well conform.  We don't know of any hosts where ssize_t is wider
-   than off_t, so off_t is safe.  */
-typedef off_t regoff_t;
+   at least as wide as off_t.  However, many common POSIX platforms set
+   regoff_t to the more-sensible ssize_t and the Open Group has
+   signalled its intention to change the requirement to be that
+   regoff_t be at least as wide as ptrdiff_t and ssize_t; see XBD ERN
+   60 (2005-08-25).  We don't know of any hosts where ssize_t or
+   ptrdiff_t is wider than long int, so long int is safe.  */
+typedef long int regoff_t;
 
 /* The type of nonnegative object indexes.  Traditionally, GNU regex
    uses 'int' for these.  Code that uses __re_idx_t should work
Index: m4/regex.m4
===================================================================
RCS file: /cvsroot/gnulib/gnulib/m4/regex.m4,v
retrieving revision 1.47
diff -p -u -r1.47 regex.m4
--- m4/regex.m4 2 Dec 2005 00:30:09 -0000       1.47
+++ m4/regex.m4 17 Mar 2006 07:20:38 -0000
@@ -1,7 +1,7 @@
-#serial 31
+#serial 32
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free
-# Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+# 2006 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,31 +14,6 @@ AC_PREREQ([2.50])
 
 AC_DEFUN([gl_REGEX],
 [
-  AC_REQUIRE([AC_SYS_LARGEFILE]) dnl for a sufficently-wide off_t
-
-  AC_CACHE_CHECK([whether off_t can be used in a switch statement],
-    [gl_cv_type_off_t_switch],
-    [AC_COMPILE_IFELSE(
-      [AC_LANG_PROGRAM(
-         [AC_INCLUDES_DEFAULT],
-        [[off_t o = -1;
-          switch (o)
-            {
-            case -2:
-              return 1;
-            case -1:
-              return 2;
-            default:
-              return 0;
-            }
-        ]])],
-      [gl_cv_type_off_t_switch=yes],
-      [gl_cv_type_off_t_switch=no])])
-  if test $gl_cv_type_off_t_switch = yes; then
-    AC_DEFINE([_REGEX_LARGE_OFFSETS], 1,
-      [Define if you want regoff_t to be at least as wide POSIX requires.])
-  fi
-
   AC_LIBSOURCES(
     [regcomp.c, regex.c, regex.h,
      regex_internal.c, regex_internal.h, regexec.c])
@@ -123,10 +98,10 @@ AC_DEFUN([gl_REGEX],
              exit (1);
 
            /* Reject hosts whose regoff_t values are too narrow.
-              These include glibc 2.3.5 on hosts with 64-bit off_t
-              and 32-bit int, and Solaris 10 on hosts with 32-bit int
-              and _FILE_OFFSET_BITS=64.  */
-           if (sizeof (regoff_t) < sizeof (off_t))
+              These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t
+              and 32-bit int.  */
+           if (sizeof (regoff_t) < sizeof (ptrdiff_t)
+               || sizeof (regoff_t) < sizeof (ssize_t))
              exit (1);
 
            exit (0);]])],
@@ -141,6 +116,8 @@ AC_DEFUN([gl_REGEX],
   esac
 
   if test $ac_use_included_regex = yes; then
+    AC_DEFINE([_REGEX_WIDE_OFFSETS], 1,
+      [Define if you want regoff_t to be at least as wide POSIX requires.])
     AC_DEFINE([re_syntax_options], [rpl_re_syntax_options],
       [Define to rpl_re_syntax_options if the replacement should be used.])
     AC_DEFINE([re_set_syntax], [rpl_re_set_syntax],




reply via email to

[Prev in Thread] Current Thread [Next in Thread]