Просмотр исходного кода

libcompat: Update obstack module from gnulib

The version taken is the one before the switch to GPLv3+. With a slight
code revert to not have to include exitfail.c and exitfail.h.

This fixes --disable-nls on systems where obstack support is missing, by
using the local "gettext.h" which honours ENABLE_NLS, instead of just
directly using <libintl.h>.

This also fixes code warnings due to obsolete K&R style prototypes, and
removes the need for bcopy checks.
Guillem Jover лет назад: 15
Родитель
Сommit
1261f5aaa2
4 измененных файлов с 258 добавлено и 519 удалено
  1. 1 1
      configure.ac
  2. 2 0
      debian/changelog
  3. 126 296
      lib/compat/obstack.c
  4. 129 222
      lib/compat/obstack.h

+ 1 - 1
configure.ac

@@ -83,7 +83,7 @@ DPKG_CHECK_PROGNAME
 DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free \
 DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free \
                          strnlen strerror strsignal asprintf \
                          strnlen strerror strsignal asprintf \
                          scandir alphasort unsetenv])
                          scandir alphasort unsetenv])
-AC_CHECK_FUNCS([strtoul strtoimax isascii bcopy memcpy setsid getdtablesize \
+AC_CHECK_FUNCS([strtoul strtoimax isascii memcpy setsid getdtablesize \
                 getprogname getexecname lutimes posix_fadvise])
                 getprogname getexecname lutimes posix_fadvise])
 
 
 DPKG_MMAP
 DPKG_MMAP

+ 2 - 0
debian/changelog

@@ -3,6 +3,8 @@ dpkg (1.16.2) UNRELEASED; urgency=low
   [ Guillem Jover ]
   [ Guillem Jover ]
   * Move <config.h> and <compat.h> to the top of trigdeferred.l to properly
   * Move <config.h> and <compat.h> to the top of trigdeferred.l to properly
     use the configured features and compat code.
     use the configured features and compat code.
+  * Honour --disable-nls when the system lacks obstack support, by updating
+    the obstack compat module from gnulib.
 
 
   [ Updated man page translations ]
   [ Updated man page translations ]
   * German (Helge Kreutzmann).
   * German (Helge Kreutzmann).

+ 126 - 296
lib/compat/obstack.c

@@ -1,30 +1,31 @@
 /* obstack.c - subroutines used implicitly by object stack macros
 /* obstack.c - subroutines used implicitly by object stack macros
-   Copyright (C) 1988-1994,96,97,98,99,2000 Free Software Foundation, Inc.
 
 
-   This file is part of the GNU C Library.  Its master source is NOT part of
-   the C library, however.  The master source lives in /gd/gnu/lib.
+   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
+   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+   Foundation, Inc.
 
 
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   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 2, or (at your option)
+   any later version.
 
 
-   The GNU C Library is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   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 Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
+#ifdef _LIBC
+# include <obstack.h>
+# include <shlib-compat.h>
+#else
+# include <config.h>
+# include "obstack.h"
 #endif
 #endif
 
 
-#include "obstack.h"
-
 /* NOTE BEFORE MODIFYING THIS FILE: This version number must be
 /* NOTE BEFORE MODIFYING THIS FILE: This version number must be
    incremented whenever callers compiled using an old obstack.h can no
    incremented whenever callers compiled using an old obstack.h can no
    longer properly call the functions in this obstack.c.  */
    longer properly call the functions in this obstack.c.  */
@@ -40,40 +41,47 @@
    files, it is simpler to just do this in the source for each such file.  */
    files, it is simpler to just do this in the source for each such file.  */
 
 
 #include <stdio.h>		/* Random thing to get __GNU_LIBRARY__.  */
 #include <stdio.h>		/* Random thing to get __GNU_LIBRARY__.  */
-#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1
-#include <gnu-versions.h>
-#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
-#define ELIDE_CODE
-#endif
+#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+# include <gnu-versions.h>
+# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
 #endif
 #endif
 
 
+#include <stddef.h>
 
 
 #ifndef ELIDE_CODE
 #ifndef ELIDE_CODE
 
 
-
-#if defined (__STDC__) && __STDC__
-#define POINTER void *
-#else
-#define POINTER char *
-#endif
+# include <stdint.h>
 
 
 /* Determine default alignment.  */
 /* Determine default alignment.  */
-struct fooalign {char x; double d;};
-#define DEFAULT_ALIGNMENT  \
-  ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
+union fooround
+{
+  uintmax_t i;
+  long double d;
+  void *p;
+};
+struct fooalign
+{
+  char c;
+  union fooround u;
+};
 /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
 /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
    But in fact it might be less smart and round addresses to as much as
    But in fact it might be less smart and round addresses to as much as
    DEFAULT_ROUNDING.  So we prepare for it to do that.  */
    DEFAULT_ROUNDING.  So we prepare for it to do that.  */
-union fooround {long x; double d;};
-#define DEFAULT_ROUNDING (sizeof (union fooround))
+enum
+  {
+    DEFAULT_ALIGNMENT = offsetof (struct fooalign, u),
+    DEFAULT_ROUNDING = sizeof (union fooround)
+  };
 
 
 /* When we copy a long block of data, this is the unit to do it with.
 /* When we copy a long block of data, this is the unit to do it with.
    On some machines, copying successive ints does not work;
    On some machines, copying successive ints does not work;
    in such a case, redefine COPYING_UNIT to `long' (if that works)
    in such a case, redefine COPYING_UNIT to `long' (if that works)
    or `char' as a last resort.  */
    or `char' as a last resort.  */
-#ifndef COPYING_UNIT
-#define COPYING_UNIT int
-#endif
+# ifndef COPYING_UNIT
+#  define COPYING_UNIT int
+# endif
 
 
 
 
 /* The functions allocating more room by calling `obstack_chunk_alloc'
 /* The functions allocating more room by calling `obstack_chunk_alloc'
@@ -82,27 +90,30 @@ union fooround {long x; double d;};
    abort gracefully or use longjump - but shouldn't return.  This
    abort gracefully or use longjump - but shouldn't return.  This
    variable by default points to the internal function
    variable by default points to the internal function
    `print_and_abort'.  */
    `print_and_abort'.  */
-#if defined (__STDC__) && __STDC__
 static void print_and_abort (void);
 static void print_and_abort (void);
 void (*obstack_alloc_failed_handler) (void) = print_and_abort;
 void (*obstack_alloc_failed_handler) (void) = print_and_abort;
-#else
-static void print_and_abort ();
-void (*obstack_alloc_failed_handler) () = print_and_abort;
-#endif
 
 
 /* Exit value used when `print_and_abort' is used.  */
 /* Exit value used when `print_and_abort' is used.  */
-#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
+# include <stdlib.h>
+# ifdef _LIBC
+int obstack_exit_failure = EXIT_FAILURE;
+# else
 #ifndef EXIT_FAILURE
 #ifndef EXIT_FAILURE
 #define EXIT_FAILURE 1
 #define EXIT_FAILURE 1
 #endif
 #endif
-int obstack_exit_failure = EXIT_FAILURE;
-
-/* The non-GNU-C macros copy the obstack into this global variable
-   to avoid multiple evaluation.  */
+int volatile exit_failure = EXIT_FAILURE;
+#  define obstack_exit_failure exit_failure
+# endif
 
 
-struct obstack *_obstack;
+# ifdef _LIBC
+#  if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+/* A looong time ago (before 1994, anyway; we're not sure) this global variable
+   was used by non-GNU-C macros to avoid multiple evaluation.  The GNU C
+   library still exports it because somebody might use it.  */
+struct obstack *_obstack_compat;
+compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
+#  endif
+# endif
 
 
 /* Define a macro that either calls functions with the traditional malloc/free
 /* Define a macro that either calls functions with the traditional malloc/free
    calling interface, or calls functions with the mmalloc/mfree interface
    calling interface, or calls functions with the mmalloc/mfree interface
@@ -110,33 +121,18 @@ struct obstack *_obstack;
    For free, do not use ?:, since some compilers, like the MIPS compilers,
    For free, do not use ?:, since some compilers, like the MIPS compilers,
    do not allow (expr) ? void : void.  */
    do not allow (expr) ? void : void.  */
 
 
-#if defined (__STDC__) && __STDC__
-#define CALL_CHUNKFUN(h, size) \
+# define CALL_CHUNKFUN(h, size) \
   (((h) -> use_extra_arg) \
   (((h) -> use_extra_arg) \
    ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
    ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
    : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
    : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
 
 
-#define CALL_FREEFUN(h, old_chunk) \
+# define CALL_FREEFUN(h, old_chunk) \
   do { \
   do { \
     if ((h) -> use_extra_arg) \
     if ((h) -> use_extra_arg) \
       (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
       (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
     else \
     else \
       (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
       (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
   } while (0)
   } while (0)
-#else
-#define CALL_CHUNKFUN(h, size) \
-  (((h) -> use_extra_arg) \
-   ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
-   : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
-
-#define CALL_FREEFUN(h, old_chunk) \
-  do { \
-    if ((h) -> use_extra_arg) \
-      (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
-    else \
-      (*(void (*) ()) (h)->freefun) ((old_chunk)); \
-  } while (0)
-#endif
 
 
 
 
 /* Initialize an obstack H for use.  Specify chunk size SIZE (0 means default).
 /* Initialize an obstack H for use.  Specify chunk size SIZE (0 means default).
@@ -148,22 +144,15 @@ struct obstack *_obstack;
    allocation fails.  */
    allocation fails.  */
 
 
 int
 int
-_obstack_begin (h, size, alignment, chunkfun, freefun)
-     struct obstack *h;
-     int size;
-     int alignment;
-#if defined (__STDC__) && __STDC__
-     POINTER (*chunkfun) (long);
-     void (*freefun) (void *);
-#else
-     POINTER (*chunkfun) ();
-     void (*freefun) ();
-#endif
+_obstack_begin (struct obstack *h,
+		int size, int alignment,
+		void *(*chunkfun) (long),
+		void (*freefun) (void *))
 {
 {
   register struct _obstack_chunk *chunk; /* points to new chunk */
   register struct _obstack_chunk *chunk; /* points to new chunk */
 
 
   if (alignment == 0)
   if (alignment == 0)
-    alignment = (int) DEFAULT_ALIGNMENT;
+    alignment = DEFAULT_ALIGNMENT;
   if (size == 0)
   if (size == 0)
     /* Default size is what GNU malloc can fit in a 4096-byte block.  */
     /* Default size is what GNU malloc can fit in a 4096-byte block.  */
     {
     {
@@ -181,13 +170,8 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
       size = 4096 - extra;
       size = 4096 - extra;
     }
     }
 
 
-#if defined (__STDC__) && __STDC__
   h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
   h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
   h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
   h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
-#else
-  h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
-  h->freefun = freefun;
-#endif
   h->chunk_size = size;
   h->chunk_size = size;
   h->alignment_mask = alignment - 1;
   h->alignment_mask = alignment - 1;
   h->use_extra_arg = 0;
   h->use_extra_arg = 0;
@@ -195,7 +179,8 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
   chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
   chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
   if (!chunk)
   if (!chunk)
     (*obstack_alloc_failed_handler) ();
     (*obstack_alloc_failed_handler) ();
-  h->next_free = h->object_base = chunk->contents;
+  h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+					       alignment - 1);
   h->chunk_limit = chunk->limit
   h->chunk_limit = chunk->limit
     = (char *) chunk + h->chunk_size;
     = (char *) chunk + h->chunk_size;
   chunk->prev = 0;
   chunk->prev = 0;
@@ -206,23 +191,15 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
 }
 }
 
 
 int
 int
-_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
-     struct obstack *h;
-     int size;
-     int alignment;
-#if defined (__STDC__) && __STDC__
-     POINTER (*chunkfun) (POINTER, long);
-     void (*freefun) (POINTER, POINTER);
-#else
-     POINTER (*chunkfun) ();
-     void (*freefun) ();
-#endif
-     POINTER arg;
+_obstack_begin_1 (struct obstack *h, int size, int alignment,
+		  void *(*chunkfun) (void *, long),
+		  void (*freefun) (void *, void *),
+		  void *arg)
 {
 {
   register struct _obstack_chunk *chunk; /* points to new chunk */
   register struct _obstack_chunk *chunk; /* points to new chunk */
 
 
   if (alignment == 0)
   if (alignment == 0)
-    alignment = (int) DEFAULT_ALIGNMENT;
+    alignment = DEFAULT_ALIGNMENT;
   if (size == 0)
   if (size == 0)
     /* Default size is what GNU malloc can fit in a 4096-byte block.  */
     /* Default size is what GNU malloc can fit in a 4096-byte block.  */
     {
     {
@@ -240,13 +217,8 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
       size = 4096 - extra;
       size = 4096 - extra;
     }
     }
 
 
-#if defined(__STDC__) && __STDC__
   h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
   h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
   h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
   h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
-#else
-  h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
-  h->freefun = freefun;
-#endif
   h->chunk_size = size;
   h->chunk_size = size;
   h->alignment_mask = alignment - 1;
   h->alignment_mask = alignment - 1;
   h->extra_arg = arg;
   h->extra_arg = arg;
@@ -255,7 +227,8 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
   chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
   chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
   if (!chunk)
   if (!chunk)
     (*obstack_alloc_failed_handler) ();
     (*obstack_alloc_failed_handler) ();
-  h->next_free = h->object_base = chunk->contents;
+  h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+					       alignment - 1);
   h->chunk_limit = chunk->limit
   h->chunk_limit = chunk->limit
     = (char *) chunk + h->chunk_size;
     = (char *) chunk + h->chunk_size;
   chunk->prev = 0;
   chunk->prev = 0;
@@ -272,9 +245,7 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
    to the beginning of the new one.  */
    to the beginning of the new one.  */
 
 
 void
 void
-_obstack_newchunk (h, length)
-     struct obstack *h;
-     int length;
+_obstack_newchunk (struct obstack *h, int length)
 {
 {
   register struct _obstack_chunk *old_chunk = h->chunk;
   register struct _obstack_chunk *old_chunk = h->chunk;
   register struct _obstack_chunk *new_chunk;
   register struct _obstack_chunk *new_chunk;
@@ -299,8 +270,7 @@ _obstack_newchunk (h, length)
 
 
   /* Compute an aligned object_base in the new chunk */
   /* Compute an aligned object_base in the new chunk */
   object_base =
   object_base =
-    __INT_TO_PTR ((__PTR_TO_INT (new_chunk->contents) + h->alignment_mask)
-		  & ~ (h->alignment_mask));
+    __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask);
 
 
   /* Move the existing object to the new chunk.
   /* Move the existing object to the new chunk.
      Word at a time is fast and is safe if the object
      Word at a time is fast and is safe if the object
@@ -325,7 +295,10 @@ _obstack_newchunk (h, length)
   /* If the object just copied was the only data in OLD_CHUNK,
   /* If the object just copied was the only data in OLD_CHUNK,
      free that chunk and remove it from the chain.
      free that chunk and remove it from the chain.
      But not if that chunk might contain an empty object.  */
      But not if that chunk might contain an empty object.  */
-  if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
+  if (! h->maybe_empty_object
+      && (h->object_base
+	  == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
+			  h->alignment_mask)))
     {
     {
       new_chunk->prev = old_chunk->prev;
       new_chunk->prev = old_chunk->prev;
       CALL_FREEFUN (h, old_chunk);
       CALL_FREEFUN (h, old_chunk);
@@ -336,21 +309,20 @@ _obstack_newchunk (h, length)
   /* The new chunk certainly contains no empty object yet.  */
   /* The new chunk certainly contains no empty object yet.  */
   h->maybe_empty_object = 0;
   h->maybe_empty_object = 0;
 }
 }
+# ifdef _LIBC
+libc_hidden_def (_obstack_newchunk)
+# endif
 
 
 /* Return nonzero if object OBJ has been allocated from obstack H.
 /* Return nonzero if object OBJ has been allocated from obstack H.
    This is here for debugging.
    This is here for debugging.
    If you use it in a program, you are probably losing.  */
    If you use it in a program, you are probably losing.  */
 
 
-#if defined (__STDC__) && __STDC__
 /* Suppress -Wmissing-prototypes warning.  We don't want to declare this in
 /* Suppress -Wmissing-prototypes warning.  We don't want to declare this in
    obstack.h because it is just for debugging.  */
    obstack.h because it is just for debugging.  */
-int _obstack_allocated_p (struct obstack *h, POINTER obj);
-#endif
+int _obstack_allocated_p (struct obstack *h, void *obj);
 
 
 int
 int
-_obstack_allocated_p (h, obj)
-     struct obstack *h;
-     POINTER obj;
+_obstack_allocated_p (struct obstack *h, void *obj)
 {
 {
   register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
   register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
   register struct _obstack_chunk *plp;	/* point to previous chunk if any */
   register struct _obstack_chunk *plp;	/* point to previous chunk if any */
@@ -359,7 +331,7 @@ _obstack_allocated_p (h, obj)
   /* We use >= rather than > since the object cannot be exactly at
   /* We use >= rather than > since the object cannot be exactly at
      the beginning of the chunk but might be an empty object exactly
      the beginning of the chunk but might be an empty object exactly
      at the end of an adjacent chunk.  */
      at the end of an adjacent chunk.  */
-  while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
+  while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
     {
     {
       plp = lp->prev;
       plp = lp->prev;
       lp = plp;
       lp = plp;
@@ -370,15 +342,10 @@ _obstack_allocated_p (h, obj)
 /* Free objects in obstack H, including OBJ and everything allocate
 /* Free objects in obstack H, including OBJ and everything allocate
    more recently than OBJ.  If OBJ is zero, free everything in H.  */
    more recently than OBJ.  If OBJ is zero, free everything in H.  */
 
 
-#undef obstack_free
-
-/* This function has two names with identical definitions.
-   This is the first one, called from non-ANSI code.  */
+# undef obstack_free
 
 
 void
 void
-_obstack_free (h, obj)
-     struct obstack *h;
-     POINTER obj;
+__obstack_free (struct obstack *h, void *obj)
 {
 {
   register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
   register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
   register struct _obstack_chunk *plp;	/* point to previous chunk if any */
   register struct _obstack_chunk *plp;	/* point to previous chunk if any */
@@ -387,7 +354,7 @@ _obstack_free (h, obj)
   /* We use >= because there cannot be an object at the beginning of a chunk.
   /* We use >= because there cannot be an object at the beginning of a chunk.
      But there can be an empty object at that address
      But there can be an empty object at that address
      at the end of another chunk.  */
      at the end of another chunk.  */
-  while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
+  while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
     {
     {
       plp = lp->prev;
       plp = lp->prev;
       CALL_FREEFUN (h, lp);
       CALL_FREEFUN (h, lp);
@@ -407,43 +374,14 @@ _obstack_free (h, obj)
     abort ();
     abort ();
 }
 }
 
 
-/* This function is used from ANSI code.  */
-
-void
-obstack_free (h, obj)
-     struct obstack *h;
-     POINTER obj;
-{
-  register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
-  register struct _obstack_chunk *plp;	/* point to previous chunk if any */
-
-  lp = h->chunk;
-  /* We use >= because there cannot be an object at the beginning of a chunk.
-     But there can be an empty object at that address
-     at the end of another chunk.  */
-  while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
-    {
-      plp = lp->prev;
-      CALL_FREEFUN (h, lp);
-      lp = plp;
-      /* If we switch chunks, we can't tell whether the new current
-	 chunk contains an empty object, so assume that it may.  */
-      h->maybe_empty_object = 1;
-    }
-  if (lp)
-    {
-      h->object_base = h->next_free = (char *) (obj);
-      h->chunk_limit = lp->limit;
-      h->chunk = lp;
-    }
-  else if (obj != 0)
-    /* obj is not in any of the chunks! */
-    abort ();
-}
+# ifdef _LIBC
+/* Older versions of libc used a function _obstack_free intended to be
+   called by non-GCC compilers.  */
+strong_alias (obstack_free, _obstack_free)
+# endif
 
 
 int
 int
-_obstack_memory_used (h)
-     struct obstack *h;
+_obstack_memory_used (struct obstack *h)
 {
 {
   register struct _obstack_chunk* lp;
   register struct _obstack_chunk* lp;
   register int nbytes = 0;
   register int nbytes = 0;
@@ -456,149 +394,41 @@ _obstack_memory_used (h)
 }
 }
 
 
 /* Define the error handler.  */
 /* Define the error handler.  */
-#ifndef _
-# if defined HAVE_LIBINTL_H || defined _LIBC
+# ifdef _LIBC
 #  include <libintl.h>
 #  include <libintl.h>
-#  ifndef _
-#   define _(Str) gettext (Str)
-#  endif
 # else
 # else
-#  define _(Str) (Str)
+#  include "gettext.h"
+# endif
+# ifndef _
+#  define _(msgid) gettext (msgid)
 # endif
 # endif
-#endif
-#if defined _LIBC && defined USE_IN_LIBIO
-# include <libio/iolibio.h>
-# define fputs(s, f) _IO_fputs (s, f)
-#endif
-
-static void
-print_and_abort ()
-{
-  fputs (_("memory exhausted"), stderr);
-  fputc ('\n', stderr);
-  exit (obstack_exit_failure);
-}
-
-#if 0
-/* These are now turned off because the applications do not use it
-   and it uses bcopy via obstack_grow, which causes trouble on sysV.  */
-
-/* Now define the functional versions of the obstack macros.
-   Define them to simply use the corresponding macros to do the job.  */
-
-#if defined (__STDC__) && __STDC__
-/* These function definitions do not work with non-ANSI preprocessors;
-   they won't pass through the macro names in parentheses.  */
-
-/* The function names appear in parentheses in order to prevent
-   the macro-definitions of the names from being expanded there.  */
-
-POINTER (obstack_base) (obstack)
-     struct obstack *obstack;
-{
-  return obstack_base (obstack);
-}
-
-POINTER (obstack_next_free) (obstack)
-     struct obstack *obstack;
-{
-  return obstack_next_free (obstack);
-}
-
-int (obstack_object_size) (obstack)
-     struct obstack *obstack;
-{
-  return obstack_object_size (obstack);
-}
-
-int (obstack_room) (obstack)
-     struct obstack *obstack;
-{
-  return obstack_room (obstack);
-}
-
-int (obstack_make_room) (obstack, length)
-     struct obstack *obstack;
-     int length;
-{
-  return obstack_make_room (obstack, length);
-}
-
-void (obstack_grow) (obstack, data, length)
-     struct obstack *obstack;
-     const POINTER data;
-     int length;
-{
-  obstack_grow (obstack, data, length);
-}
-
-void (obstack_grow0) (obstack, data, length)
-     struct obstack *obstack;
-     const POINTER data;
-     int length;
-{
-  obstack_grow0 (obstack, data, length);
-}
-
-void (obstack_1grow) (obstack, character)
-     struct obstack *obstack;
-     int character;
-{
-  obstack_1grow (obstack, character);
-}
-
-void (obstack_blank) (obstack, length)
-     struct obstack *obstack;
-     int length;
-{
-  obstack_blank (obstack, length);
-}
-
-void (obstack_1grow_fast) (obstack, character)
-     struct obstack *obstack;
-     int character;
-{
-  obstack_1grow_fast (obstack, character);
-}
-
-void (obstack_blank_fast) (obstack, length)
-     struct obstack *obstack;
-     int length;
-{
-  obstack_blank_fast (obstack, length);
-}
-
-POINTER (obstack_finish) (obstack)
-     struct obstack *obstack;
-{
-  return obstack_finish (obstack);
-}
 
 
-POINTER (obstack_alloc) (obstack, length)
-     struct obstack *obstack;
-     int length;
-{
-  return obstack_alloc (obstack, length);
-}
+# ifdef _LIBC
+#  include <libio/iolibio.h>
+# endif
 
 
-POINTER (obstack_copy) (obstack, address, length)
-     struct obstack *obstack;
-     const POINTER address;
-     int length;
-{
-  return obstack_copy (obstack, address, length);
-}
+# ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later.  */
+#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
+#   define __attribute__(Spec) /* empty */
+#  endif
+# endif
 
 
-POINTER (obstack_copy0) (obstack, address, length)
-     struct obstack *obstack;
-     const POINTER address;
-     int length;
+static void
+__attribute__ ((noreturn))
+print_and_abort (void)
 {
 {
-  return obstack_copy0 (obstack, address, length);
+  /* Don't change any of these strings.  Yes, it would be possible to add
+     the newline to the string and use fputs or so.  But this must not
+     happen because the "memory exhausted" message appears in other places
+     like this and the translation should be reused instead of creating
+     a very similar string which requires a separate translation.  */
+# ifdef _LIBC
+  (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
+# else
+  fprintf (stderr, "%s\n", _("memory exhausted"));
+# endif
+  exit (obstack_exit_failure);
 }
 }
 
 
-#endif /* __STDC__ */
-
-#endif /* 0 */
-
 #endif	/* !ELIDE_CODE */
 #endif	/* !ELIDE_CODE */

+ 129 - 222
lib/compat/obstack.h

@@ -1,23 +1,21 @@
 /* obstack.h - object stack macros
 /* obstack.h - object stack macros
-   Copyright (C) 1988,89,90,91,92,93,94,96,97,98,99 Free Software Foundation, Inc.
+   Copyright (C) 1988-1994,1996-1999,2003,2004,2005,2006
+	Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
 
-   This file is part of the GNU C Library.  Its master source is NOT part of
-   the C library, however.  The master source lives in /gd/gnu/lib.
+   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 2, or (at your option)
+   any later version.
 
 
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   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 Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 
 /* Summary:
 /* Summary:
 
 
@@ -111,45 +109,36 @@ Summary:
 extern "C" {
 extern "C" {
 #endif
 #endif
 
 
-/* We use subtraction of (char *) 0 instead of casting to int
-   because on word-addressable machines a simple cast to int
-   may ignore the byte-within-word field of the pointer.  */
-
-#ifndef __PTR_TO_INT
-# define __PTR_TO_INT(P) ((P) - (char *) 0)
-#endif
-
-#ifndef __INT_TO_PTR
-# define __INT_TO_PTR(P) ((P) + (char *) 0)
-#endif
-
-/* We need the type of the resulting object.  If __PTRDIFF_TYPE__ is
+/* We need the type of a pointer subtraction.  If __PTRDIFF_TYPE__ is
    defined, as with GNU C, use that; that way we don't pollute the
    defined, as with GNU C, use that; that way we don't pollute the
-   namespace with <stddef.h>'s symbols.  Otherwise, if <stddef.h> is
-   available, include it and use ptrdiff_t.  In traditional C, long is
-   the best that we can do.  */
+   namespace with <stddef.h>'s symbols.  Otherwise, include <stddef.h>
+   and use ptrdiff_t.  */
 
 
 #ifdef __PTRDIFF_TYPE__
 #ifdef __PTRDIFF_TYPE__
 # define PTR_INT_TYPE __PTRDIFF_TYPE__
 # define PTR_INT_TYPE __PTRDIFF_TYPE__
 #else
 #else
-# ifdef HAVE_STDDEF_H
-#  include <stddef.h>
-#  define PTR_INT_TYPE ptrdiff_t
-# else
-#  define PTR_INT_TYPE long
-# endif
+# include <stddef.h>
+# define PTR_INT_TYPE ptrdiff_t
 #endif
 #endif
 
 
-#if defined _LIBC || defined HAVE_STRING_H
-# include <string.h>
-# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-#else
-# ifdef memcpy
-#  define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-# else
-#  define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
-# endif
-#endif
+/* If B is the base of an object addressed by P, return the result of
+   aligning P to the next multiple of A + 1.  B and P must be of type
+   char *.  A + 1 must be a power of 2.  */
+
+#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
+
+/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case
+   where pointers can be converted to integers, aligned as integers,
+   and converted back again.  If PTR_INT_TYPE is narrower than a
+   pointer (e.g., the AS/400), play it safe and compute the alignment
+   relative to B.  Otherwise, use the faster strategy of computing the
+   alignment relative to 0.  */
+
+#define __PTR_ALIGN(B, P, A)						    \
+  __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
+		P, A)
+
+#include <string.h>
 
 
 struct _obstack_chunk		/* Lives at front of each chunk. */
 struct _obstack_chunk		/* Lives at front of each chunk. */
 {
 {
@@ -165,20 +154,18 @@ struct obstack		/* control current object in current chunk */
   char	*object_base;		/* address of object we are building */
   char	*object_base;		/* address of object we are building */
   char	*next_free;		/* where to add next char to current object */
   char	*next_free;		/* where to add next char to current object */
   char	*chunk_limit;		/* address of char after current chunk */
   char	*chunk_limit;		/* address of char after current chunk */
-  PTR_INT_TYPE temp;		/* Temporary for some macros.  */
+  union
+  {
+    PTR_INT_TYPE tempint;
+    void *tempptr;
+  } temp;			/* Temporary for some macros.  */
   int   alignment_mask;		/* Mask of alignment for each object. */
   int   alignment_mask;		/* Mask of alignment for each object. */
-#if defined __STDC__ && __STDC__
   /* These prototypes vary based on `use_extra_arg', and we use
   /* These prototypes vary based on `use_extra_arg', and we use
      casts to the prototypeless function type in all assignments,
      casts to the prototypeless function type in all assignments,
      but having prototypes here quiets -Wstrict-prototypes.  */
      but having prototypes here quiets -Wstrict-prototypes.  */
   struct _obstack_chunk *(*chunkfun) (void *, long);
   struct _obstack_chunk *(*chunkfun) (void *, long);
   void (*freefun) (void *, struct _obstack_chunk *);
   void (*freefun) (void *, struct _obstack_chunk *);
   void *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
   void *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
-#else
-  struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
-  void (*freefun) ();		/* User's function to free a chunk.  */
-  char *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
-#endif
   unsigned use_extra_arg:1;	/* chunk alloc/dealloc funcs take extra arg */
   unsigned use_extra_arg:1;	/* chunk alloc/dealloc funcs take extra arg */
   unsigned maybe_empty_object:1;/* There is a possibility that the current
   unsigned maybe_empty_object:1;/* There is a possibility that the current
 				   chunk contains a zero-length object.  This
 				   chunk contains a zero-length object.  This
@@ -191,77 +178,27 @@ struct obstack		/* control current object in current chunk */
 
 
 /* Declare the external functions we use; they are in obstack.c.  */
 /* Declare the external functions we use; they are in obstack.c.  */
 
 
-#if defined __STDC__ && __STDC__
 extern void _obstack_newchunk (struct obstack *, int);
 extern void _obstack_newchunk (struct obstack *, int);
-extern void _obstack_free (struct obstack *, void *);
 extern int _obstack_begin (struct obstack *, int, int,
 extern int _obstack_begin (struct obstack *, int, int,
 			    void *(*) (long), void (*) (void *));
 			    void *(*) (long), void (*) (void *));
 extern int _obstack_begin_1 (struct obstack *, int, int,
 extern int _obstack_begin_1 (struct obstack *, int, int,
 			     void *(*) (void *, long),
 			     void *(*) (void *, long),
 			     void (*) (void *, void *), void *);
 			     void (*) (void *, void *), void *);
 extern int _obstack_memory_used (struct obstack *);
 extern int _obstack_memory_used (struct obstack *);
-#else
-extern void _obstack_newchunk ();
-extern void _obstack_free ();
-extern int _obstack_begin ();
-extern int _obstack_begin_1 ();
-extern int _obstack_memory_used ();
-#endif
-
-#if defined __STDC__ && __STDC__
-
-/* Do the function-declarations after the structs
-   but before defining the macros.  */
-
-void obstack_init (struct obstack *obstack);
-
-void * obstack_alloc (struct obstack *obstack, int size);
-
-void * obstack_copy (struct obstack *obstack, const void *address, int size);
-void * obstack_copy0 (struct obstack *obstack, const void *address, int size);
-
-void obstack_free (struct obstack *obstack, void *block);
-
-void obstack_blank (struct obstack *obstack, int size);
-
-void obstack_grow (struct obstack *obstack, const void *data, int size);
-void obstack_grow0 (struct obstack *obstack, const void *data, int size);
-
-void obstack_1grow (struct obstack *obstack, int data_char);
-void obstack_ptr_grow (struct obstack *obstack, const void *data);
-void obstack_int_grow (struct obstack *obstack, int data);
-
-void * obstack_finish (struct obstack *obstack);
-
-int obstack_object_size (struct obstack *obstack);
-
-int obstack_room (struct obstack *obstack);
-void obstack_make_room (struct obstack *obstack, int size);
-void obstack_1grow_fast (struct obstack *obstack, int data_char);
-void obstack_ptr_grow_fast (struct obstack *obstack, const void *data);
-void obstack_int_grow_fast (struct obstack *obstack, int data);
-void obstack_blank_fast (struct obstack *obstack, int size);
-
-void * obstack_base (struct obstack *obstack);
-void * obstack_next_free (struct obstack *obstack);
-int obstack_alignment_mask (struct obstack *obstack);
-int obstack_chunk_size (struct obstack *obstack);
-int obstack_memory_used (struct obstack *obstack);
 
 
-#endif /* __STDC__ */
-
-/* Non-ANSI C cannot really support alternative functions for these macros,
-   so we do not declare them.  */
+/* The default name of the function for freeing a chunk is 'obstack_free',
+   but gnulib users can override this by defining '__obstack_free'.  */
+#ifndef __obstack_free
+# define __obstack_free obstack_free
+#endif
+extern void __obstack_free (struct obstack *obstack, void *block);
 
 
+
 /* Error handler called when `obstack_chunk_alloc' failed to allocate
 /* Error handler called when `obstack_chunk_alloc' failed to allocate
    more memory.  This can be set to a user defined function which
    more memory.  This can be set to a user defined function which
    should either abort gracefully or use longjump - but shouldn't
    should either abort gracefully or use longjump - but shouldn't
    return.  The default action is to print a message and abort.  */
    return.  The default action is to print a message and abort.  */
-#if defined __STDC__ && __STDC__
 extern void (*obstack_alloc_failed_handler) (void);
 extern void (*obstack_alloc_failed_handler) (void);
-#else
-extern void (*obstack_alloc_failed_handler) ();
-#endif
 
 
 /* Exit value used when `print_and_abort' is used.  */
 /* Exit value used when `print_and_abort' is used.  */
 extern int obstack_exit_failure;
 extern int obstack_exit_failure;
@@ -270,7 +207,7 @@ extern int obstack_exit_failure;
    Note that this might not be the final address of the object
    Note that this might not be the final address of the object
    because a new chunk might be needed to hold the final size.  */
    because a new chunk might be needed to hold the final size.  */
 
 
-#define obstack_base(h) ((h)->object_base)
+#define obstack_base(h) ((void *) (h)->object_base)
 
 
 /* Size for allocating ordinary chunks.  */
 /* Size for allocating ordinary chunks.  */
 
 
@@ -284,67 +221,34 @@ extern int obstack_exit_failure;
 
 
 #define obstack_alignment_mask(h) ((h)->alignment_mask)
 #define obstack_alignment_mask(h) ((h)->alignment_mask)
 
 
-/* To prevent prototype warnings provide complete argument list in
-   standard C version.  */
-#if defined __STDC__ && __STDC__
-
-# define obstack_init(h)					\
+/* To prevent prototype warnings provide complete argument list.  */
+#define obstack_init(h)						\
   _obstack_begin ((h), 0, 0,					\
   _obstack_begin ((h), 0, 0,					\
-		  (void *(*) (long)) obstack_chunk_alloc, 	\
+		  (void *(*) (long)) obstack_chunk_alloc,	\
 		  (void (*) (void *)) obstack_chunk_free)
 		  (void (*) (void *)) obstack_chunk_free)
 
 
-# define obstack_begin(h, size)					\
+#define obstack_begin(h, size)					\
   _obstack_begin ((h), (size), 0,				\
   _obstack_begin ((h), (size), 0,				\
-		  (void *(*) (long)) obstack_chunk_alloc, 	\
+		  (void *(*) (long)) obstack_chunk_alloc,	\
 		  (void (*) (void *)) obstack_chunk_free)
 		  (void (*) (void *)) obstack_chunk_free)
 
 
-# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
+#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun)  \
   _obstack_begin ((h), (size), (alignment),				   \
   _obstack_begin ((h), (size), (alignment),				   \
-		  (void *(*) (long)) (chunkfun), 			   \
+		  (void *(*) (long)) (chunkfun),			   \
 		  (void (*) (void *)) (freefun))
 		  (void (*) (void *)) (freefun))
 
 
-# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
+#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
   _obstack_begin_1 ((h), (size), (alignment),				\
   _obstack_begin_1 ((h), (size), (alignment),				\
 		    (void *(*) (void *, long)) (chunkfun),		\
 		    (void *(*) (void *, long)) (chunkfun),		\
 		    (void (*) (void *, void *)) (freefun), (arg))
 		    (void (*) (void *, void *)) (freefun), (arg))
 
 
-# define obstack_chunkfun(h, newchunkfun) \
+#define obstack_chunkfun(h, newchunkfun) \
   ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
   ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
 
 
-# define obstack_freefun(h, newfreefun) \
+#define obstack_freefun(h, newfreefun) \
   ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
   ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
 
 
-#else
-
-# define obstack_init(h)						\
-  _obstack_begin ((h), 0, 0,						\
-		  (void *(*) ()) obstack_chunk_alloc, 			\
-		  (void (*) ()) obstack_chunk_free)
-
-# define obstack_begin(h, size)						\
-  _obstack_begin ((h), (size), 0,					\
-		  (void *(*) ()) obstack_chunk_alloc,			\
-		  (void (*) ()) obstack_chunk_free)
-
-# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
-  _obstack_begin ((h), (size), (alignment),				   \
-		  (void *(*) ()) (chunkfun), 				   \
-		  (void (*) ()) (freefun))
-
-# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
-  _obstack_begin_1 ((h), (size), (alignment),				\
-		    (void *(*) ()) (chunkfun), 				\
-		    (void (*) ()) (freefun), (arg))
-
-# define obstack_chunkfun(h, newchunkfun) \
-  ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
-
-# define obstack_freefun(h, newfreefun) \
-  ((h) -> freefun = (void (*)()) (newfreefun))
-
-#endif
-
-#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
 
 
 #define obstack_blank_fast(h,n) ((h)->next_free += (n))
 #define obstack_blank_fast(h,n) ((h)->next_free += (n))
 
 
@@ -365,12 +269,12 @@ extern int obstack_exit_failure;
 
 
 # define obstack_object_size(OBSTACK)					\
 # define obstack_object_size(OBSTACK)					\
   __extension__								\
   __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
+  ({ struct obstack const *__o = (OBSTACK);				\
      (unsigned) (__o->next_free - __o->object_base); })
      (unsigned) (__o->next_free - __o->object_base); })
 
 
 # define obstack_room(OBSTACK)						\
 # define obstack_room(OBSTACK)						\
   __extension__								\
   __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
+  ({ struct obstack const *__o = (OBSTACK);				\
      (unsigned) (__o->chunk_limit - __o->next_free); })
      (unsigned) (__o->chunk_limit - __o->next_free); })
 
 
 # define obstack_make_room(OBSTACK,length)				\
 # define obstack_make_room(OBSTACK,length)				\
@@ -383,8 +287,11 @@ __extension__								\
 
 
 # define obstack_empty_p(OBSTACK)					\
 # define obstack_empty_p(OBSTACK)					\
   __extension__								\
   __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
-     (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
+  ({ struct obstack const *__o = (OBSTACK);				\
+     (__o->chunk->prev == 0						\
+      && __o->next_free == __PTR_ALIGN ((char *) __o->chunk,		\
+					__o->chunk->contents,		\
+					__o->alignment_mask)); })
 
 
 # define obstack_grow(OBSTACK,where,length)				\
 # define obstack_grow(OBSTACK,where,length)				\
 __extension__								\
 __extension__								\
@@ -392,7 +299,7 @@ __extension__								\
    int __len = (length);						\
    int __len = (length);						\
    if (__o->next_free + __len > __o->chunk_limit)			\
    if (__o->next_free + __len > __o->chunk_limit)			\
      _obstack_newchunk (__o, __len);					\
      _obstack_newchunk (__o, __len);					\
-   _obstack_memcpy (__o->next_free, (where), __len);			\
+   memcpy (__o->next_free, where, __len);				\
    __o->next_free += __len;						\
    __o->next_free += __len;						\
    (void) 0; })
    (void) 0; })
 
 
@@ -402,7 +309,7 @@ __extension__								\
    int __len = (length);						\
    int __len = (length);						\
    if (__o->next_free + __len + 1 > __o->chunk_limit)			\
    if (__o->next_free + __len + 1 > __o->chunk_limit)			\
      _obstack_newchunk (__o, __len + 1);				\
      _obstack_newchunk (__o, __len + 1);				\
-   _obstack_memcpy (__o->next_free, (where), __len);			\
+   memcpy (__o->next_free, where, __len);				\
    __o->next_free += __len;						\
    __o->next_free += __len;						\
    *(__o->next_free)++ = 0;						\
    *(__o->next_free)++ = 0;						\
    (void) 0; })
    (void) 0; })
@@ -412,7 +319,7 @@ __extension__								\
 ({ struct obstack *__o = (OBSTACK);					\
 ({ struct obstack *__o = (OBSTACK);					\
    if (__o->next_free + 1 > __o->chunk_limit)				\
    if (__o->next_free + 1 > __o->chunk_limit)				\
      _obstack_newchunk (__o, 1);					\
      _obstack_newchunk (__o, 1);					\
-   *(__o->next_free)++ = (datum);					\
+   obstack_1grow_fast (__o, datum);					\
    (void) 0; })
    (void) 0; })
 
 
 /* These assume that the obstack alignment is good enough for pointers
 /* These assume that the obstack alignment is good enough for pointers
@@ -424,22 +331,28 @@ __extension__								\
 ({ struct obstack *__o = (OBSTACK);					\
 ({ struct obstack *__o = (OBSTACK);					\
    if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
    if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
      _obstack_newchunk (__o, sizeof (void *));				\
      _obstack_newchunk (__o, sizeof (void *));				\
-   *((void **)__o->next_free)++ = (datum);				\
-   (void) 0; })
+   obstack_ptr_grow_fast (__o, datum); })				\
 
 
 # define obstack_int_grow(OBSTACK,datum)				\
 # define obstack_int_grow(OBSTACK,datum)				\
 __extension__								\
 __extension__								\
 ({ struct obstack *__o = (OBSTACK);					\
 ({ struct obstack *__o = (OBSTACK);					\
    if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
    if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
      _obstack_newchunk (__o, sizeof (int));				\
      _obstack_newchunk (__o, sizeof (int));				\
-   *((int *)__o->next_free)++ = (datum);				\
-   (void) 0; })
+   obstack_int_grow_fast (__o, datum); })
 
 
-# define obstack_ptr_grow_fast(h,aptr)					\
-  (*((void **) (h)->next_free)++ = (aptr))
+# define obstack_ptr_grow_fast(OBSTACK,aptr)				\
+__extension__								\
+({ struct obstack *__o1 = (OBSTACK);					\
+   *(const void **) __o1->next_free = (aptr);				\
+   __o1->next_free += sizeof (const void *);				\
+   (void) 0; })
 
 
-# define obstack_int_grow_fast(h,aint)					\
-  (*((int *) (h)->next_free)++ = (aint))
+# define obstack_int_grow_fast(OBSTACK,aint)				\
+__extension__								\
+({ struct obstack *__o1 = (OBSTACK);					\
+   *(int *) __o1->next_free = (aint);					\
+   __o1->next_free += sizeof (int);					\
+   (void) 0; })
 
 
 # define obstack_blank(OBSTACK,length)					\
 # define obstack_blank(OBSTACK,length)					\
 __extension__								\
 __extension__								\
@@ -447,7 +360,7 @@ __extension__								\
    int __len = (length);						\
    int __len = (length);						\
    if (__o->chunk_limit - __o->next_free < __len)			\
    if (__o->chunk_limit - __o->next_free < __len)			\
      _obstack_newchunk (__o, __len);					\
      _obstack_newchunk (__o, __len);					\
-   __o->next_free += __len;						\
+   obstack_blank_fast (__o, __len);					\
    (void) 0; })
    (void) 0; })
 
 
 # define obstack_alloc(OBSTACK,length)					\
 # define obstack_alloc(OBSTACK,length)					\
@@ -470,21 +383,20 @@ __extension__								\
 
 
 /* The local variable is named __o1 to avoid a name conflict
 /* The local variable is named __o1 to avoid a name conflict
    when obstack_blank is called.  */
    when obstack_blank is called.  */
-# define obstack_finish(OBSTACK)  					\
+# define obstack_finish(OBSTACK)					\
 __extension__								\
 __extension__								\
 ({ struct obstack *__o1 = (OBSTACK);					\
 ({ struct obstack *__o1 = (OBSTACK);					\
-   void *value;								\
-   value = (void *) __o1->object_base;					\
-   if (__o1->next_free == value)					\
+   void *__value = (void *) __o1->object_base;				\
+   if (__o1->next_free == __value)					\
      __o1->maybe_empty_object = 1;					\
      __o1->maybe_empty_object = 1;					\
    __o1->next_free							\
    __o1->next_free							\
-     = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
-		     & ~ (__o1->alignment_mask));			\
+     = __PTR_ALIGN (__o1->object_base, __o1->next_free,			\
+		    __o1->alignment_mask);				\
    if (__o1->next_free - (char *)__o1->chunk				\
    if (__o1->next_free - (char *)__o1->chunk				\
        > __o1->chunk_limit - (char *)__o1->chunk)			\
        > __o1->chunk_limit - (char *)__o1->chunk)			\
      __o1->next_free = __o1->chunk_limit;				\
      __o1->next_free = __o1->chunk_limit;				\
    __o1->object_base = __o1->next_free;					\
    __o1->object_base = __o1->next_free;					\
-   value; })
+   __value; })
 
 
 # define obstack_free(OBSTACK, OBJ)					\
 # define obstack_free(OBSTACK, OBJ)					\
 __extension__								\
 __extension__								\
@@ -492,7 +404,7 @@ __extension__								\
    void *__obj = (OBJ);							\
    void *__obj = (OBJ);							\
    if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
    if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
      __o->next_free = __o->object_base = (char *)__obj;			\
      __o->next_free = __o->object_base = (char *)__obj;			\
-   else (obstack_free) (__o, __obj); })
+   else (__obstack_free) (__o, __obj); })
 
 
 #else /* not __GNUC__ or not __STDC__ */
 #else /* not __GNUC__ or not __STDC__ */
 
 
@@ -503,7 +415,10 @@ __extension__								\
  (unsigned) ((h)->chunk_limit - (h)->next_free)
  (unsigned) ((h)->chunk_limit - (h)->next_free)
 
 
 # define obstack_empty_p(h) \
 # define obstack_empty_p(h) \
- ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
+ ((h)->chunk->prev == 0							\
+  && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk,		\
+				    (h)->chunk->contents,		\
+				    (h)->alignment_mask))
 
 
 /* Note that the call to _obstack_newchunk is enclosed in (..., 0)
 /* Note that the call to _obstack_newchunk is enclosed in (..., 0)
    so that we can avoid having void expressions
    so that we can avoid having void expressions
@@ -512,51 +427,51 @@ __extension__								\
    but some compilers won't accept it.  */
    but some compilers won't accept it.  */
 
 
 # define obstack_make_room(h,length)					\
 # define obstack_make_room(h,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
+( (h)->temp.tempint = (length),						\
+  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)		\
+   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
 
 
 # define obstack_grow(h,where,length)					\
 # define obstack_grow(h,where,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
-  _obstack_memcpy ((h)->next_free, (where), (h)->temp),			\
-  (h)->next_free += (h)->temp)
+( (h)->temp.tempint = (length),						\
+  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)		\
+   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),		\
+  memcpy ((h)->next_free, where, (h)->temp.tempint),			\
+  (h)->next_free += (h)->temp.tempint)
 
 
 # define obstack_grow0(h,where,length)					\
 # define obstack_grow0(h,where,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),			\
-  _obstack_memcpy ((h)->next_free, (where), (h)->temp),			\
-  (h)->next_free += (h)->temp,						\
+( (h)->temp.tempint = (length),						\
+  (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit)		\
+   ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0),		\
+  memcpy ((h)->next_free, where, (h)->temp.tempint),			\
+  (h)->next_free += (h)->temp.tempint,					\
   *((h)->next_free)++ = 0)
   *((h)->next_free)++ = 0)
 
 
 # define obstack_1grow(h,datum)						\
 # define obstack_1grow(h,datum)						\
 ( (((h)->next_free + 1 > (h)->chunk_limit)				\
 ( (((h)->next_free + 1 > (h)->chunk_limit)				\
    ? (_obstack_newchunk ((h), 1), 0) : 0),				\
    ? (_obstack_newchunk ((h), 1), 0) : 0),				\
-  (*((h)->next_free)++ = (datum)))
+  obstack_1grow_fast (h, datum))
 
 
 # define obstack_ptr_grow(h,datum)					\
 # define obstack_ptr_grow(h,datum)					\
 ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
 ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
    ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
    ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
-  (*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum)))
+  obstack_ptr_grow_fast (h, datum))
 
 
 # define obstack_int_grow(h,datum)					\
 # define obstack_int_grow(h,datum)					\
 ( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
 ( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
    ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
    ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
-  (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum)))
+  obstack_int_grow_fast (h, datum))
 
 
 # define obstack_ptr_grow_fast(h,aptr)					\
 # define obstack_ptr_grow_fast(h,aptr)					\
-  (*((const char **) (h)->next_free)++ = (aptr))
+  (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
 
 
 # define obstack_int_grow_fast(h,aint)					\
 # define obstack_int_grow_fast(h,aint)					\
-  (*((int *) (h)->next_free)++ = (aint))
+  (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
 
 
 # define obstack_blank(h,length)					\
 # define obstack_blank(h,length)					\
-( (h)->temp = (length),							\
-  (((h)->chunk_limit - (h)->next_free < (h)->temp)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
-  ((h)->next_free += (h)->temp))
+( (h)->temp.tempint = (length),						\
+  (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint)		\
+   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),		\
+  obstack_blank_fast (h, (h)->temp.tempint))
 
 
 # define obstack_alloc(h,length)					\
 # define obstack_alloc(h,length)					\
  (obstack_blank ((h), (length)), obstack_finish ((h)))
  (obstack_blank ((h), (length)), obstack_finish ((h)))
@@ -567,35 +482,27 @@ __extension__								\
 # define obstack_copy0(h,where,length)					\
 # define obstack_copy0(h,where,length)					\
  (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
  (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
 
 
-# define obstack_finish(h)  						\
+# define obstack_finish(h)						\
 ( ((h)->next_free == (h)->object_base					\
 ( ((h)->next_free == (h)->object_base					\
    ? (((h)->maybe_empty_object = 1), 0)					\
    ? (((h)->maybe_empty_object = 1), 0)					\
    : 0),								\
    : 0),								\
-  (h)->temp = __PTR_TO_INT ((h)->object_base),				\
+  (h)->temp.tempptr = (h)->object_base,					\
   (h)->next_free							\
   (h)->next_free							\
-    = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)	\
-		    & ~ ((h)->alignment_mask)),				\
+    = __PTR_ALIGN ((h)->object_base, (h)->next_free,			\
+		   (h)->alignment_mask),				\
   (((h)->next_free - (char *) (h)->chunk				\
   (((h)->next_free - (char *) (h)->chunk				\
     > (h)->chunk_limit - (char *) (h)->chunk)				\
     > (h)->chunk_limit - (char *) (h)->chunk)				\
    ? ((h)->next_free = (h)->chunk_limit) : 0),				\
    ? ((h)->next_free = (h)->chunk_limit) : 0),				\
   (h)->object_base = (h)->next_free,					\
   (h)->object_base = (h)->next_free,					\
-  __INT_TO_PTR ((h)->temp))
+  (h)->temp.tempptr)
 
 
-# if defined __STDC__ && __STDC__
-#  define obstack_free(h,obj)						\
-( (h)->temp = (char *) (obj) - (char *) (h)->chunk,			\
-  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
-   ? (int) ((h)->next_free = (h)->object_base				\
-	    = (h)->temp + (char *) (h)->chunk)				\
-   : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
-# else
-#  define obstack_free(h,obj)						\
-( (h)->temp = (char *) (obj) - (char *) (h)->chunk,			\
-  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+# define obstack_free(h,obj)						\
+( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk,		\
+  ((((h)->temp.tempint > 0						\
+    && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk))	\
    ? (int) ((h)->next_free = (h)->object_base				\
    ? (int) ((h)->next_free = (h)->object_base				\
-	    = (h)->temp + (char *) (h)->chunk)				\
-   : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
-# endif
+	    = (h)->temp.tempint + (char *) (h)->chunk)			\
+   : (((__obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
 
 
 #endif /* not __GNUC__ or not __STDC__ */
 #endif /* not __GNUC__ or not __STDC__ */