Paul Eggert wrote:
> I didn't think the patch would be controversial

... whereas I would think that every revert or partial revert is controversial
(except for obvious typos).

> Please feel free to 
> revert the patch and replace it with something better.

Done as follows:
  - I added a small test module 'scratch_buffer-tests'. It showed the same
    errors as reported by Reuben.
  - The I inserted '#include <libc-config.h>' in scratch_buffer.h. The errors
    went away.

Reuben, could you please verify that it fixes the issue with glob.c in your
situation? Thanks.


2018-08-18  Bruno Haible  <br...@clisp.org>

        scratch_buffer: Add tests.
        * tests/test-scratch-buffer.c: New file.
        * modules/scratch_buffer-tests: New file.

2018-08-18  Bruno Haible  <br...@clisp.org>

        scratch_buffer: Fix include file.
        Reported by Reuben Thomas <r...@sc3d.org> in
        <https://lists.gnu.org/archive/html/bug-gnulib/2018-08/msg00082.html>.
        * lib/scratch_buffer.h: Include <libc-config.h> first. Add
        double-inclusion guard.

2018-08-18  Bruno Haible  <br...@clisp.org>

        glob-h: Revert Paul Eggert's revert.
        * m4/glob_h.m4: Revert to previous state.
        * modules/glob-h: Likewise.

>From 5fef422c49de3f1c220fb0082af9246569af420d Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 18 Aug 2018 21:31:30 +0200
Subject: [PATCH 1/3] glob-h: Revert Paul Eggert's revert.

* m4/glob_h.m4: Revert to previous state.
* modules/glob-h: Likewise.
---
 ChangeLog      |  6 ++++++
 m4/glob_h.m4   | 18 +++++++++++++++++-
 modules/glob-h |  7 ++++++-
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 120b4e9..973abae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-18  Bruno Haible  <br...@clisp.org>
+
+	glob-h: Revert Paul Eggert's revert.
+	* m4/glob_h.m4: Revert to previous state.
+	* modules/glob-h: Likewise.
+
 2018-08-18  Paul Eggert  <egg...@cs.ucla.edu>
 
 	glob-h: always build glob.h
diff --git a/m4/glob_h.m4 b/m4/glob_h.m4
index 9fe49c7..717cf54 100644
--- a/m4/glob_h.m4
+++ b/m4/glob_h.m4
@@ -1,4 +1,4 @@
-# glob_h.m4 serial 2
+# glob_h.m4 serial 3
 dnl Copyright (C) 2018 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -21,6 +21,22 @@ AC_DEFUN([gl_GLOB_H],
   fi
   AC_SUBST([HAVE_GLOB_H])
 
+  m4_ifdef([gl_POSIXCHECK],
+    [GLOB_H=glob.h],
+    [GLOB_H=''
+     if m4_ifdef([gl_ANSI_CXX], [test "$CXX" != no], [false]); then
+       dnl Override <glob.h> always, to support the C++ GNULIB_NAMESPACE.
+       GLOB_H=glob.h
+     else
+       if test $ac_cv_header_glob_h != yes; then
+         dnl Provide a substitute <glob.h> file.
+         GLOB_H=glob.h
+       fi
+     fi
+    ])
+  AC_SUBST([GLOB_H])
+  AM_CONDITIONAL([GL_GENERATE_GLOB_H], [test -n "$GLOB_H"])
+
   dnl Check for declarations of anything we want to poison if the
   dnl corresponding gnulib module is not in use.
   gl_WARN_ON_USE_PREPARE([[#include <glob.h>
diff --git a/modules/glob-h b/modules/glob-h
index b61bc33..b490a73 100644
--- a/modules/glob-h
+++ b/modules/glob-h
@@ -20,9 +20,10 @@ configure.ac:
 gl_GLOB_H
 
 Makefile.am:
-BUILT_SOURCES += glob.h
+BUILT_SOURCES += $(GLOB_H)
 
 # We need the following in order to create <glob.h>.
+if GL_GENERATE_GLOB_H
 glob.h: glob.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
 	$(AM_V_GEN)rm -f $@-t $@ && \
 	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
@@ -43,6 +44,10 @@ glob.h: glob.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(
 	      < $(srcdir)/glob.in.h; \
 	} > $@-t && \
 	mv $@-t $@
+else
+glob.h: $(top_builddir)/config.status
+	rm -f $@
+endif
 MOSTLYCLEANFILES += glob.h glob.h-t
 
 Include:
-- 
2.7.4

>From ba153ed1edb23bf14f21b9892ff169f10d39911f Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 18 Aug 2018 21:35:11 +0200
Subject: [PATCH 2/3] scratch_buffer: Fix include file.

Reported by Reuben Thomas <r...@sc3d.org> in
<https://lists.gnu.org/archive/html/bug-gnulib/2018-08/msg00082.html>.

* lib/scratch_buffer.h: Include <libc-config.h> first. Add
double-inclusion guard.
---
 ChangeLog            | 8 ++++++++
 lib/scratch_buffer.h | 7 +++++++
 2 files changed, 15 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 973abae..000eb2b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2018-08-18  Bruno Haible  <br...@clisp.org>
 
+	scratch_buffer: Fix include file.
+	Reported by Reuben Thomas <r...@sc3d.org> in
+	<https://lists.gnu.org/archive/html/bug-gnulib/2018-08/msg00082.html>.
+	* lib/scratch_buffer.h: Include <libc-config.h> first. Add
+	double-inclusion guard.
+
+2018-08-18  Bruno Haible  <br...@clisp.org>
+
 	glob-h: Revert Paul Eggert's revert.
 	* m4/glob_h.m4: Revert to previous state.
 	* modules/glob-h: Likewise.
diff --git a/lib/scratch_buffer.h b/lib/scratch_buffer.h
index 52f0ed6..4c0db3e 100644
--- a/lib/scratch_buffer.h
+++ b/lib/scratch_buffer.h
@@ -1,4 +1,11 @@
+#ifndef _GL_SCRATCH_BUFFER_H
+#define _GL_SCRATCH_BUFFER_H
+
+#include <libc-config.h>
+
 #define __libc_scratch_buffer_grow gl_scratch_buffer_grow
 #define __libc_scratch_buffer_grow_preserve gl_scratch_buffer_grow_preserve
 #define __libc_scratch_buffer_set_array_size gl_scratch_buffer_set_array_size
 #include <malloc/scratch_buffer.h>
+
+#endif /* _GL_SCRATCH_BUFFER_H */
-- 
2.7.4

>From 2c578fe339cdcf863c54ce4d10213d654c8b3077 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 18 Aug 2018 21:37:03 +0200
Subject: [PATCH 3/3] scratch_buffer: Add tests.

* tests/test-scratch-buffer.c: New file.
* modules/scratch_buffer-tests: New file.
---
 ChangeLog                    |   6 ++
 modules/scratch_buffer-tests |  12 ++++
 tests/test-scratch-buffer.c  | 130 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 148 insertions(+)
 create mode 100644 modules/scratch_buffer-tests
 create mode 100644 tests/test-scratch-buffer.c

diff --git a/ChangeLog b/ChangeLog
index 000eb2b..f34eb61 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2018-08-18  Bruno Haible  <br...@clisp.org>
 
+	scratch_buffer: Add tests.
+	* tests/test-scratch-buffer.c: New file.
+	* modules/scratch_buffer-tests: New file.
+
+2018-08-18  Bruno Haible  <br...@clisp.org>
+
 	scratch_buffer: Fix include file.
 	Reported by Reuben Thomas <r...@sc3d.org> in
 	<https://lists.gnu.org/archive/html/bug-gnulib/2018-08/msg00082.html>.
diff --git a/modules/scratch_buffer-tests b/modules/scratch_buffer-tests
new file mode 100644
index 0000000..1e52951
--- /dev/null
+++ b/modules/scratch_buffer-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-scratch-buffer.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-scratch-buffer
+check_PROGRAMS += test-scratch-buffer
+test_scratch_buffer_SOURCES = test-scratch-buffer.c
diff --git a/tests/test-scratch-buffer.c b/tests/test-scratch-buffer.c
new file mode 100644
index 0000000..0e35b88
--- /dev/null
+++ b/tests/test-scratch-buffer.c
@@ -0,0 +1,130 @@
+/* Test of scratch_buffer functions.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This program 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.
+
+   This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <br...@clisp.org>, 2018.  */
+
+#include <config.h>
+
+#include <scratch_buffer.h>
+
+#include <string.h>
+#include "macros.h"
+
+static int
+byte_at (size_t i)
+{
+  return ((i % 13) + ((i * i) % 251)) & 0xff;
+}
+
+int
+main ()
+{
+  /* Check scratch_buffer_set_array_size.  */
+  {
+    size_t sizes[] = { 100, 1000, 10000, 100000 };
+    size_t s;
+    for (s = 0; s < SIZEOF (sizes); s++)
+      {
+        size_t size = sizes[s];
+        struct scratch_buffer buf;
+        bool ok;
+        size_t i;
+
+        scratch_buffer_init (&buf);
+
+        ok = scratch_buffer_set_array_size (&buf, size, 1);
+        ASSERT (ok);
+
+        for (i = 0; i < size; i++)
+          ((unsigned char *) buf.data)[i] = byte_at (i);
+
+        memset (buf.data, 'x', buf.length);
+        memset (buf.data, 'y', size);
+
+        scratch_buffer_free (&buf);
+      }
+  }
+
+  /* Check scratch_buffer_grow.  */
+  {
+    size_t sizes[] = { 100, 1000, 10000, 100000 };
+    size_t s;
+    for (s = 0; s < SIZEOF (sizes); s++)
+      {
+        size_t size = sizes[s];
+        struct scratch_buffer buf;
+        bool ok;
+        size_t i;
+
+        scratch_buffer_init (&buf);
+
+        while (buf.length < size)
+          {
+            ok = scratch_buffer_grow (&buf);
+            ASSERT (ok);
+          }
+
+        for (i = 0; i < size; i++)
+          ((unsigned char *) buf.data)[i] = byte_at (i);
+
+        memset (buf.data, 'x', buf.length);
+        memset (buf.data, 'y', size);
+
+        scratch_buffer_free (&buf);
+      }
+  }
+
+  /* Check scratch_buffer_grow_preserve.  */
+  {
+    size_t sizes[] = { 100, 1000, 10000, 100000 };
+    struct scratch_buffer buf;
+    size_t s;
+    size_t size;
+    bool ok;
+    size_t i;
+
+    scratch_buffer_init (&buf);
+
+    s = 0;
+    size = sizes[s];
+    ok = scratch_buffer_set_array_size (&buf, size, 1);
+    ASSERT (ok);
+
+    for (i = 0; i < size; i++)
+      ((unsigned char *) buf.data)[i] = byte_at (i);
+
+    for (; s < SIZEOF (sizes); s++)
+      {
+        size_t oldsize = size;
+        size = sizes[s];
+
+        while (buf.length < size)
+          {
+            ok = scratch_buffer_grow_preserve (&buf);
+            ASSERT (ok);
+          }
+
+        for (i = 0; i < oldsize; i++)
+          ASSERT(((unsigned char *) buf.data)[i] == byte_at (i));
+        for (i = oldsize; i < size; i++)
+          ((unsigned char *) buf.data)[i] = byte_at (i);
+      }
+
+    scratch_buffer_free (&buf);
+  }
+
+  return 0;
+}
-- 
2.7.4

Reply via email to