On 01/31/13 10:39, arn...@skeeve.com wrote:

> The problem is dfa.c that includes limits.h after regex.h is included.
> If you leave it as is you are then relying on all systems to have header
> files that guard against multiple includes.

There's already a fix for this in Gnulib: its regex.h
arranges to include limits.h before it undefs and redefines
RE_DUP_MAX.

That reminds me, have you had a chance to look at my patch to
sync Gawk's regex code from Gnulib?  That would fix this
problem for Gawk.  It'd also fix a recently discovered
buffer overrun in the Gawk regex code; see
<http://www.sourceware.org/ml/libc-alpha/2013-01/msg00967.html>.
I'll attach an updated version of that patch.  After applying
the patch, run the command "./merge-gnulib".
From df1819094ef7fa210df7e076cd1c18da62ac454f Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Thu, 31 Jan 2013 12:51:47 -0800
Subject: [PATCH] Use gnulib's regex code, now merged with Gawk's.

* awk.h, dfa.c: Include <stddef.h> on all platforms, for ptrdiff_t.
<stddef.h> is required by C89 and is safe to assume nowadays.
* configure.ac (gl_EARLY, gl_INIT): Invoke, for gnulib.
(with_included_regex): Set to yes, for gnulib.
* replace.c: Include missing_d/btowc.c if ! HAVE_BTOWC.
* merge-gnulib: New file.  Invoke this script after installing
this patch, to sync the rest of the files from gnulib.
* missing_d/btowc.c: New file.
* pc/config.sed: Configure HAVE_DECL_ISBLANK, HAVE_ISBLANK,
HAVE_MBSTATE_T, _REGEX_INCLUDE_LIMITS_H, _REGEX_LARGE_OFFSETS.
---
 ChangeLog           |  11 ++++++
 awk.h               |   2 +-
 configure.ac        |   3 ++
 dfa.c               |   3 +-
 merge-gnulib        | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 missing_d/ChangeLog |   5 +++
 missing_d/btowc.c   |  19 +++++++++
 pc/ChangeLog        |   6 +++
 pc/config.sed       |  14 +++++++
 replace.c           |   4 ++
 10 files changed, 175 insertions(+), 3 deletions(-)
 create mode 100755 merge-gnulib
 create mode 100644 missing_d/btowc.c

diff --git a/ChangeLog b/ChangeLog
index d00b1fb..2fc1f0e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2013-01-31  Paul Eggert  <egg...@cs.ucla.edu>
+
+       Use gnulib's regex code, now merged with Gawk's.
+       * awk.h, dfa.c: Include <stddef.h> on all platforms, for ptrdiff_t.
+       <stddef.h> is required by C89 and is safe to assume nowadays.
+       * configure.ac (gl_EARLY, gl_INIT): Invoke, for gnulib.
+       (with_included_regex): Set to yes, for gnulib.
+       * replace.c: Include missing_d/btowc.c if ! HAVE_BTOWC.
+       * merge-gnulib: New file.  Invoke this script after installing
+       this patch, to sync the rest of the files from gnulib.
+
 2013-01-31         Arnold D. Robbins     <arn...@skeeve.com>
 
        * dfa.c: Include "dfa.h" which includes regex.h after limits.h
diff --git a/awk.h b/awk.h
index f26ec20..f5469d6 100644
--- a/awk.h
+++ b/awk.h
@@ -133,6 +133,7 @@ typedef  long int32_t;
 
 /* This section is the messiest one in the file, not a lot that can be done */
 
+#include <stddef.h>
 #ifndef VMS
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
@@ -140,7 +141,6 @@ typedef  long int32_t;
 #include <sys/types.h>
 #include <sys/stat.h>
 #else  /* VMS */
-#include <stddef.h>
 #include <stat.h>
 #include <file.h>      /* avoid <fcntl.h> in io.c */
 /* debug.c needs this; when _DECC_V4_SOURCE is defined (as it is
diff --git a/configure.ac b/configure.ac
index 4ba5f6a..6d910ec 100644
--- a/configure.ac
+++ b/configure.ac
@@ -106,6 +106,9 @@ AC_SUBST(acl_shlibext)
 AC_SUBST([pkgextensiondir], ['${pkglibdir}'])
 
 dnl checks for systems
+gl_EARLY
+with_included_regex=yes
+gl_INIT
 AC_ZOS_USS
 AC_ISC_POSIX
 AC_SYS_LARGEFILE
diff --git a/dfa.c b/dfa.c
index 88d34d5..b2bbbd3 100644
--- a/dfa.c
+++ b/dfa.c
@@ -26,10 +26,9 @@
 #include <ctype.h>
 #include <stdio.h>
 
+#include <stddef.h>
 #ifndef VMS
 #include <sys/types.h>
-#else
-#include <stddef.h>
 #endif
 #include <stdlib.h>
 #include <limits.h>
diff --git a/merge-gnulib b/merge-gnulib
new file mode 100755
index 0000000..c76dd3a
--- /dev/null
+++ b/merge-gnulib
@@ -0,0 +1,111 @@
+#! /bin/sh
+# Merge gnulib sources into GAWK sources.
+# Typical usage:
+#
+#      ./merge-gnulib
+
+# Copyright 2012-2013 Free Software Foundation, Inc.
+
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+
+# GAWK is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GAWK.  If not, see <http://www.gnu.org/licenses/>.
+
+# written by Paul Eggert
+
+GNULIB_URL=git://git.savannah.gnu.org/gnulib.git
+
+GNULIB_MODULES='
+  regex
+'
+
+GNULIB_TOOL_FLAGS='
+  --avoid=alloca-opt
+  --avoid=gettext-h
+  --avoid=btowc
+  --avoid=localcharset
+  --avoid=malloc-gnu
+  --avoid=mbrtowc
+  --avoid=mbsinit
+  --avoid=mbtowc
+  --avoid=memcmp
+  --avoid=memmove
+  --avoid=nl_langinfo
+  --avoid=stdbool
+  --avoid=stdint
+  --avoid=wchar
+  --avoid=wcrtomb
+  --avoid=wctype
+  --avoid=wctype-h
+  --conditional-dependencies --import
+  --no-changelog --no-vc-files
+  --makefile-name=gnulib.mk
+  --source-base=.
+'
+
+# The source directory, with a trailing '/'.
+# If empty, the source directory is the working directory.
+src=$2
+case $src in
+  */ | '') ;;
+  *) src=$src/ ;;
+esac
+
+# Gnulib's source directory.
+gnulib_srcdir=${1-$src../gnulib}
+
+case $gnulib_srcdir in
+  -*) src=- ;;
+esac
+case $src in
+  -*)
+    echo >&2 "$0: usage: $0 [GNULIB_SRCDIR [SRCDIR]]
+
+    SRCDIR is the GAWK source directory (default: working directory).
+    GNULIB_SRCDIR is the Gnulib source directory (default: SRCDIR/../gnulib)."
+    exit 1 ;;
+esac
+
+test -r "$src"awk.h || {
+  echo >&2 "$0: '${src:-.}' is not a Gawk source directory."
+  exit 1
+}
+
+test -d "$gnulib_srcdir" ||
+git clone -- "$GNULIB_URL" "$gnulib_srcdir" ||
+exit
+
+test -x "$gnulib_srcdir"/gnulib-tool || {
+  echo >&2 "$0: '$gnulib_srcdir' is not a Gnulib source directory."
+  exit 1
+}
+
+"$gnulib_srcdir"/gnulib-tool --dir="$src" $GNULIB_TOOL_FLAGS $GNULIB_MODULES &&
+rm -- "$src"dummy.c "$src"gnulib.mk "$src"m4/gnulib-cache.m4 &&
+cp -- "$gnulib_srcdir"/build-aux/texinfo.tex "$src"doc &&
+cp -- "$gnulib_srcdir"/build-aux/ar-lib \
+      "$gnulib_srcdir"/build-aux/config.guess \
+      "$gnulib_srcdir"/build-aux/config.rpath \
+      "$gnulib_srcdir"/build-aux/config.sub \
+      "$gnulib_srcdir"/build-aux/depcomp \
+      "$gnulib_srcdir"/build-aux/install-sh \
+      "$src"extension/build-aux &&
+cp -- "$gnulib_srcdir"/build-aux/config.guess \
+      "$gnulib_srcdir"/build-aux/config.rpath \
+      "$gnulib_srcdir"/build-aux/config.sub \
+      "$gnulib_srcdir"/build-aux/depcomp \
+      "$gnulib_srcdir"/build-aux/install-sh \
+      "$gnulib_srcdir"/build-aux/mkinstalldirs \
+      "$src". &&
+autoreconf -I m4 -- ${src:+"$src"}
diff --git a/missing_d/ChangeLog b/missing_d/ChangeLog
index 54825c8..87f9b5b 100644
--- a/missing_d/ChangeLog
+++ b/missing_d/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-31  Paul Eggert  <egg...@penguin.cs.ucla.edu>
+
+       Use gnulib's regex code, now merged with Gawk's.
+       * btowc.c: New file.
+
 2012-12-24         Arnold D. Robbins     <arn...@skeeve.com>
 
        * 4.0.2: Release tar ball made.
diff --git a/missing_d/btowc.c b/missing_d/btowc.c
new file mode 100644
index 0000000..4ebf6ce
--- /dev/null
+++ b/missing_d/btowc.c
@@ -0,0 +1,19 @@
+#ifdef ZOS_USS
+
+/* For ZOS USS we must define btowc */
+
+wchar_t
+btowc (int c)
+{
+   wchar_t wtmp[2];
+   char tmp[2];
+   mbstate_t mbs;
+
+   memset(& mbs, 0, sizeof(mbs));
+   tmp[0] = c;
+   tmp[1] = 0;
+
+   mbrtowc (wtmp, tmp, 1, & mbs);
+   return wtmp[0];
+}
+#endif
diff --git a/pc/ChangeLog b/pc/ChangeLog
index 1dc181d..fc7edd5 100644
--- a/pc/ChangeLog
+++ b/pc/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-31  Paul Eggert  <egg...@cs.ucla.edu>
+
+       Use gnulib's regex code, now merged with Gawk's.
+       * config.sed: Configure HAVE_DECL_ISBLANK, HAVE_ISBLANK,
+       HAVE_MBSTATE_T, _REGEX_INCLUDE_LIMITS_H, _REGEX_LARGE_OFFSETS.
+
 2013-01-25         Arnold D. Robbins     <arn...@skeeve.com>
 
        * config.h: Version bumped.
diff --git a/pc/config.sed b/pc/config.sed
index 5e57e82..803a833 100644
--- a/pc/config.sed
+++ b/pc/config.sed
@@ -38,6 +38,10 @@ s/^#undef HAVE_ATEXIT *$/#define HAVE_ATEXIT 1/
 #ifdef _WIN32\
 #define HAVE_BTOWC 1\
 #endif
+/^#undef HAVE_DECL_ISBLANK *$/c\
+#ifdef __MINGW32__\
+#define HAVE_DECL_ISBLANK 1\
+#endif
 /^#undef HAVE_DECL_TZNAME *$/c\
 #ifdef __MINGW32__\
 #define HAVE_DECL_TZNAME 1\
@@ -60,6 +64,10 @@ s/^#undef HAVE_FMOD *$/#define HAVE_FMOD 1/
 #ifdef __MINGW32__\
 #define HAVE_ISASCII 1\
 #endif
+/^#undef HAVE_ISBLANK *$/c\
+#ifdef __MINGW32__\
+#define HAVE_ISBLANK 1\
+#endif
 /^#undef HAVE_ISWCTYPE *$/c\
 #ifdef __MINGW32__\
 #define HAVE_ISWCTYPE 1\
@@ -92,6 +100,10 @@ s/^#undef HAVE_LIMITS_H *$/#define HAVE_LIMITS_H 1/
 #ifdef __MINGW32__\
 #define HAVE_MBRTOWC 1\
 #endif
+/^#undef HAVE_MBSTATE_T *$/c\
+#ifdef __MINGW32__\
+#define HAVE_MBSTATE_T 1\
+#endif
 s/^#undef HAVE_MEMCMP *$/#define HAVE_MEMCMP 1/
 s/^#undef HAVE_MEMCPY *$/#define HAVE_MEMCPY 1/
 /^#undef HAVE_MEMMOVE *$/c\
@@ -220,6 +232,8 @@ s/^#undef HAVE_VPRINTF *$/#define HAVE_VPRINTF 1/
 #define HAVE_WINT_T 1\
 #endif
 s/^#undef PROTOTYPES *$/#define PROTOTYPES 1/
+s/^#undef _REGEX_INCLUDE_LIMITS_H *$/#define _REGEX_INCLUDE_LIMITS_H 1/
+s/^#undef _REGEX_LARGE_OFFSETS *$/#define _REGEX_LARGE_OFFSETS 1/
 s/^#undef RETSIGTYPE *$/#define RETSIGTYPE void/
 /^#.*RETSIGTYPE /a\
 \
diff --git a/replace.c b/replace.c
index 4259aaf..1568cf3 100644
--- a/replace.c
+++ b/replace.c
@@ -34,6 +34,10 @@
 #include "missing_d/system.c"
 #endif /* HAVE_SYSTEM */
 
+#ifndef HAVE_BTOWC
+#include "missing_d/btowc.c"
+#endif /* HAVE_MEMCPY */
+
 #ifndef HAVE_MEMCMP
 #include "missing_d/memcmp.c"
 #endif /* HAVE_MEMCMP */
-- 
1.7.11.7

Reply via email to