Re: [PATCH 0/5] obstacks again

2014-11-04 Thread Paul Eggert

On 11/02/2014 11:07 PM, Alan Modra wrote:

Really, it's a fiction that the size argument of obstack_blank_fast has a type.


Yes and no.  It's a fiction in the sense that obstack_blank_fast is a macro, so 
its argument doesn't actually have a C type.  But it's not a fiction in the 
sense that obstack_blank_fast can be documented as if it were a function, and if 
a program calls it with valid arguments that a function would have, it behaves 
like that function.


In this sense, obstack_blank_fast is like putchar.  Although putchar is a macro 
and strictly speaking its argument doesn't have a C type, it is documented to 
take a value of type int, and if you call it according to its specification it 
behaves properly.


I've added: "Earlier versions of obstacks allowed you to use 
@code{obstack_blank} to shrink objects. This will no longer work."


But this doesn't suffice for obstack_blank_stack, which *can* shrink objects and 
where user code relies on this feature.  E.g., the following code (taken from 
GCC's finish_regexp_representation) should work if the current object size fits 
into 'int', and should continue to work if we change its 'int' to 'size_t' and 
allocate objects larger than what 'int' can represent:


   int length = obstack_object_size (&irp);
   obstack_blank_fast (&irp, -length);


There another gnulib issue too. AC_FUNC_OBSTACK is no longer correct. The 
system libc may support obstacks, but not the current version. It seems to me 
the easiest solution is to always include obstack.o in libgnu.a.


Thanks, I wrote a "harder" solution, which builds obstack.o only if the system 
version doesn't work with arbitrary size_t values.  This is always true now but 
won't be once these fixes make their way into glibc.


Ianother small tweak: Don't use alignof.h if __IBM__ALIGNOF__ is defined 
(alignof.h just uses __alignof__ in that case), or when __alignof__ is defined 
(for oddball systems, or testing). 


I'd rather insulate obstack from that internal detail of alignof.  I gave a shot 
at doing this in a different way, which preserves the insulation better.


A couple more things.  obstack_chunkfun and obstack_freefun should also return 
void.  And the code should avoid casting function values from one calling 
convention to another: this sort-of-works with the old API on glibc's current 
platforms but is likely to cause problems with the transition to the new one.


I installed the attached patches to gnulib to try to implement the above; please 
let me know of any issues.
From 3d99d9fb66ceea0f93a6cfeb496f0471efa212d3 Mon Sep 17 00:00:00 2001
From: Paul Eggert 
Date: Mon, 3 Nov 2014 16:34:52 -0800
Subject: [PATCH 1/4] obstack: port to platforms that #define __alignof__

* lib/obstack.c: Include  if !defined __alignof__,
not if !_LIBC.  We don't know of any platforms that #define
__alignof__, but it might be useful in tests.  Conversely,
glibc assumes GCC.
---
 ChangeLog | 8 
 lib/obstack.c | 5 -
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 6728893..274b794 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-11-03  Paul Eggert  
+
+   obstack: port to platforms that #define __alignof__
+   * lib/obstack.c: Include  if !defined __alignof__,
+   not if !_LIBC.  We don't know of any platforms that #define
+   __alignof__, but it might be useful in tests.  Conversely,
+   glibc assumes GCC.
+
 2014-11-03  Pádraig Brady  
 
linkat: don't unconditionally replace on GNU/Linux
diff --git a/lib/obstack.c b/lib/obstack.c
index ba7dff3..d763c57 100644
--- a/lib/obstack.c
+++ b/lib/obstack.c
@@ -48,7 +48,10 @@
 #endif
 
 #ifndef _OBSTACK_ELIDE_CODE
-# if !defined _LIBC && !defined __GNUC__
+/* If GCC, or if an oddball (testing?) host that #defines __alignof__,
+   use the already-supplied __alignof__.  Otherwise, this must be Gnulib
+   (as glibc assumes GCC); defer to Gnulib's alignof_type.  */
+# if !defined __GNUC__ && !defined __alignof__
 #  include 
 #  define __alignof__(type) alignof_type (type)
 # endif
-- 
1.9.3

From 035a186cc20f21354720c51cc303b6c0d6017c5f Mon Sep 17 00:00:00 2001
From: Paul Eggert 
Date: Mon, 3 Nov 2014 16:36:27 -0800
Subject: [PATCH 2/4] obstack: do not assume system-supplied obstack is size_t
 safe

* m4/obstack.m4: New file.
* modules/obstack (Files): Add it.
---
 ChangeLog   |  4 
 m4/obstack.m4   | 35 +++
 modules/obstack |  1 +
 3 files changed, 40 insertions(+)
 create mode 100644 m4/obstack.m4

diff --git a/ChangeLog b/ChangeLog
index 274b794..23accbe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2014-11-03  Paul Eggert  
 
+   obstack: do not assume system-supplied obstack is size_t safe
+   * m4/obstack.m4: New file.
+   * modules/obstack (Files): Add it.
+
obstack: port to platforms that #define __alignof__
* lib/obstack.c: Include  if !defined __alignof__,
not if !_LIBC.  We don't

compilation warning in error.c

2014-11-04 Thread Werner LEMBERG

[v0.1-248-gc564172]

A user reported the following warning:

CC   error.lo
  error.c:386:12: warning: data argument not used by format string
  [-Wformat-extra-args]
 file_name, line_number);
 ^

Below is a trivial patch that fixes this.


Werner


==


2014-11-05  Werner Lemberg  

error: fix warning message

* lib/error.c (error_at_line): Always use correct number of
arguments for format string.

diff --git a/lib/error.c b/lib/error.c
index 18ff5db..d83cfb2 100644
--- a/lib/error.c
+++ b/lib/error.c
@@ -379,11 +379,15 @@ error_at_line (int status, int errnum, const char 
*file_name,
 }
 
 #if _LIBC
-  __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ",
-  file_name, line_number);
+  if (file_name != NULL)
+__fxprintf (NULL, "%s:%d: ", file_name, line_number);
+  else
+__fxprintf (NULL, " ");
 #else
-  fprintf (stderr, file_name != NULL ? "%s:%d: " : " ",
-   file_name, line_number);
+  if (file_name != NULL)
+fprintf (stderr, "%s:%d: ", file_name, line_number);
+  else
+fprintf (stderr, " ");
 #endif
 
   va_start (args, message);