Переглянути джерело

- sync obstack.{c,h} with glibc (Peter S. Mazinger)

Bernhard Reutner-Fischer 15 роки тому
батько
коміт
c2aa4183b8
2 змінених файлів з 236 додано та 508 видалено
  1. 113 209
      include/obstack.h
  2. 123 299
      libc/misc/gnu/obstack.c

+ 113 - 209
include/obstack.h

@@ -1,7 +1,7 @@
 /* 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.
-   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-1994,1996-1999,2003,2004,2005
+	Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
 
    The GNU C Library is free software; you can redistribute it and/or
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    modify it under the terms of the GNU Lesser General Public
@@ -15,8 +15,8 @@
 
 
    You should have received a copy of the GNU Lesser General Public
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, write to the Free
    License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 
 /* Summary:
 /* Summary:
 
 
@@ -110,45 +110,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. */
 {
 {
@@ -164,20 +155,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
@@ -190,77 +179,22 @@ 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_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.  */
 
 
 /* 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;
@@ -269,7 +203,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.  */
 
 
@@ -283,67 +217,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))
 
 
@@ -364,12 +265,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)				\
@@ -382,8 +283,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__								\
@@ -391,7 +295,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; })
 
 
@@ -401,7 +305,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; })
@@ -411,7 +315,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
@@ -423,22 +327,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__								\
@@ -446,7 +356,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)					\
@@ -469,21 +379,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__								\
@@ -502,7 +411,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
@@ -511,51 +423,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)))
@@ -566,35 +478,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__ */
 
 

+ 123 - 299
libc/misc/gnu/obstack.c

@@ -1,7 +1,7 @@
 /* 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,2001 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 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
 
    The GNU C Library is free software; you can redistribute it and/or
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    modify it under the terms of the GNU Lesser General Public
@@ -15,19 +15,30 @@
 
 
    You should have received a copy of the GNU Lesser General Public
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, write to the Free
    License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 
-/* Make uClibc lie about being glibc. */
-#define __FORCE_GLIBC 1
-
-#include <locale.h>
 
 
 #ifdef HAVE_CONFIG_H
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 # include <config.h>
 #endif
 #endif
 
 
-#include <obstack.h>
+#ifdef _LIBC
+# include <obstack.h>
+#ifndef __UCLIBC__
+# include <shlib-compat.h>
+#else
+# define HAVE_INTTYPES_H 1
+# define HAVE_STDINT_H 1
+# define SHLIB_COMPAT(x,y,z) 0
+# undef libc_hidden_def
+# define libc_hidden_def(x)
+# undef strong_alias
+# define strong_alias(x,y)
+#endif
+#else
+# include "obstack.h"
+#endif
 
 
 /* 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
@@ -51,28 +62,38 @@
 # endif
 # endif
 #endif
 #endif
 
 
-#if (defined _LIBC && defined USE_IN_LIBIO) || defined __UCLIBC_HAS_WCHAR__
-# include <wchar.h>
-#endif
+#include <stddef.h>
 
 
 #ifndef ELIDE_CODE
 #ifndef ELIDE_CODE
 
 
 
 
-# if defined __STDC__ && __STDC__
-#  define POINTER void *
-# else
-#  define POINTER char *
+# if HAVE_INTTYPES_H
+#  include <inttypes.h>
+# endif
+# if HAVE_STDINT_H || defined _LIBC
+#  include <stdint.h>
 # endif
 # endif
 
 
 /* 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;
@@ -89,36 +110,29 @@ 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;
-# else
-static void print_and_abort ();
-void (*obstack_alloc_failed_handler) () = print_and_abort;
-# endif
-
+static void (*__obstack_alloc_failed_handler) (void) = print_and_abort;
+weak_alias(__obstack_alloc_failed_handler,obstack_alloc_failed_handler)
 
 
 /* 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
-# ifndef EXIT_FAILURE
-#  define EXIT_FAILURE 1
+# include <stdlib.h>
+# ifdef _LIBC
+static int __obstack_exit_failure = EXIT_FAILURE;
+weak_alias(__obstack_exit_failure,obstack_exit_failure)
+# else
+#  include "exitfail.h"
+#  define __obstack_exit_failure exit_failure
 # endif
 # endif
 
 
-libc_hidden_proto(fprintf)
-libc_hidden_proto(abort)
-libc_hidden_proto(exit)
-#ifdef __UCLIBC_HAS_WCHAR__
-libc_hidden_proto(fwprintf)
-#endif
-
-int obstack_exit_failure = EXIT_FAILURE;
-
-/* The non-GNU-C macros copy the obstack into this global variable
-   to avoid multiple evaluation.  */
-
-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
@@ -126,33 +140,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).
@@ -164,23 +163,15 @@ struct obstack *_obstack;
    allocation fails.  */
    allocation fails.  */
 
 
 int
 int
-_obstack_begin (
-     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.  */
     {
     {
@@ -198,21 +189,17 @@ _obstack_begin (
       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;
 
 
   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) ();
-  h->next_free = h->object_base = chunk->contents;
+    (*__obstack_alloc_failed_handler) ();
+  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;
@@ -223,23 +210,15 @@ _obstack_begin (
 }
 }
 
 
 int
 int
-_obstack_begin_1 (
-     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.  */
     {
     {
@@ -257,13 +236,8 @@ _obstack_begin_1 (
       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;
@@ -271,8 +245,9 @@ _obstack_begin_1 (
 
 
   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) ();
-  h->next_free = h->object_base = chunk->contents;
+    (*__obstack_alloc_failed_handler) ();
+  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;
@@ -289,9 +264,7 @@ _obstack_begin_1 (
    to the beginning of the new one.  */
    to the beginning of the new one.  */
 
 
 void
 void
-_obstack_newchunk (
-     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;
@@ -309,15 +282,14 @@ _obstack_newchunk (
   /* Allocate and initialize the new chunk.  */
   /* Allocate and initialize the new chunk.  */
   new_chunk = CALL_CHUNKFUN (h, new_size);
   new_chunk = CALL_CHUNKFUN (h, new_size);
   if (!new_chunk)
   if (!new_chunk)
-    (*obstack_alloc_failed_handler) ();
+    (*__obstack_alloc_failed_handler) ();
   h->chunk = new_chunk;
   h->chunk = new_chunk;
   new_chunk->prev = old_chunk;
   new_chunk->prev = old_chunk;
   new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
   new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
 
 
   /* 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
@@ -342,7 +314,10 @@ _obstack_newchunk (
   /* 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);
@@ -353,21 +328,20 @@ _obstack_newchunk (
   /* 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 (
-     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 */
@@ -376,7 +350,7 @@ _obstack_allocated_p (
   /* 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;
@@ -389,13 +363,8 @@ _obstack_allocated_p (
 
 
 # undef obstack_free
 # undef obstack_free
 
 
-/* This function has two names with identical definitions.
-   This is the first one, called from non-ANSI code.  */
-
 void
 void
-_obstack_free (
-     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 */
@@ -404,7 +373,7 @@ _obstack_free (
   /* 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);
@@ -424,43 +393,14 @@ _obstack_free (
     abort ();
     abort ();
 }
 }
 
 
-/* This function is used from ANSI code.  */
-
-void
-obstack_free (
-     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 (
-     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;
@@ -473,20 +413,27 @@ _obstack_memory_used (
 }
 }
 
 
 /* Define the error handler.  */
 /* Define the error handler.  */
+# ifdef _LIBC
+#  include <libintl.h>
+# else
+#  include "gettext.h"
+# endif
+/* NLS: Disable gettext in obstack for now: */
+# undef _
+# define _(Str) (Str)
 # ifndef _
 # ifndef _
-#  if ((HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC) && \
-      defined __UCLIBC_HAS_GETTEXT_AWARENESS__ && 00
-#   include <libintl.h>
-#   ifndef _
-#    define _(Str) INTUSE(__dcgettext) (NULL, Str, LC_MESSAGES)
-#   endif
-#  else
-#   define _(Str) (Str)
-#  endif
+#  define _(msgid) gettext (msgid)
 # endif
 # endif
-# if defined _LIBC && defined USE_IN_LIBIO
+
+# if defined _LIBC && !defined __UCLIBC__
 #  include <libio/iolibio.h>
 #  include <libio/iolibio.h>
-#  define fputs(s, f) _IO_fputs (s, f)
+# endif
+
+# 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
 # endif
 
 
 static void
 static void
@@ -498,135 +445,12 @@ print_and_abort (void)
      happen because the "memory exhausted" message appears in other places
      happen because the "memory exhausted" message appears in other places
      like this and the translation should be reused instead of creating
      like this and the translation should be reused instead of creating
      a very similar string which requires a separate translation.  */
      a very similar string which requires a separate translation.  */
-# if defined _LIBC && defined USE_IN_LIBIO
-  if (_IO_fwide (stderr, 0) > 0)
-    fwprintf (stderr, L"%s\n", _("memory exhausted"));
-  else
+# if defined _LIBC && !defined __UCLIBC__
+  (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
+# else
+  fprintf (stderr, "%s\n", _("memory exhausted"));
 # endif
 # endif
-    fprintf (stderr, "%s\n", _("memory exhausted"));
-  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);
+  exit (__obstack_exit_failure);
 }
 }
 
 
-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);
-}
-
-POINTER (obstack_copy) (obstack, address, length)
-     struct obstack *obstack;
-     const POINTER address;
-     int length;
-{
-  return obstack_copy (obstack, address, length);
-}
-
-POINTER (obstack_copy0) (obstack, address, length)
-     struct obstack *obstack;
-     const POINTER address;
-     int length;
-{
-  return obstack_copy0 (obstack, address, length);
-}
-
-#  endif /* __STDC__ */
-
-# endif /* 0 */
-
 #endif	/* !ELIDE_CODE */
 #endif	/* !ELIDE_CODE */