X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fobstack.c;h=66639d77be7ffc362fab7cb6c21004692f82f17a;hb=702f288a1c0d2053385edfe9a47ed0e184a9f1fe;hp=0322fb6733fda21e25df79ed51a34209ccc90f95;hpb=40c60144c35ecf0ec6c7bb72c6fc08df98cb4e09;p=gnulib.git diff --git a/lib/obstack.c b/lib/obstack.c index 0322fb673..66639d77b 100644 --- a/lib/obstack.c +++ b/lib/obstack.c @@ -1,5 +1,5 @@ /* obstack.c - subroutines used implicitly by object stack macros - Copyright (C) 1988-1994,96,97,98,1999, 2000 Free Software Foundation, Inc. + 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. @@ -282,9 +282,10 @@ _obstack_newchunk (h, length) register long obj_size = h->next_free - h->object_base; register long i; long already; + char *object_base; /* Compute size for new chunk. */ - new_size = (obj_size + length) + (obj_size >> 3) + 100; + new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100; if (new_size < h->chunk_size) new_size = h->chunk_size; @@ -296,6 +297,11 @@ _obstack_newchunk (h, length) new_chunk->prev = old_chunk; new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; + /* Compute an aligned object_base in the new chunk */ + object_base = + __INT_TO_PTR ((__PTR_TO_INT (new_chunk->contents) + h->alignment_mask) + & ~ (h->alignment_mask)); + /* Move the existing object to the new chunk. Word at a time is fast and is safe if the object is sufficiently aligned. */ @@ -303,7 +309,7 @@ _obstack_newchunk (h, length) { for (i = obj_size / sizeof (COPYING_UNIT) - 1; i >= 0; i--) - ((COPYING_UNIT *)new_chunk->contents)[i] + ((COPYING_UNIT *)object_base)[i] = ((COPYING_UNIT *)h->object_base)[i]; /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, but that can cross a page boundary on a machine @@ -314,7 +320,7 @@ _obstack_newchunk (h, length) already = 0; /* Copy remaining bytes one by one. */ for (i = already; i < obj_size; i++) - new_chunk->contents[i] = h->object_base[i]; + object_base[i] = h->object_base[i]; /* If the object just copied was the only data in OLD_CHUNK, free that chunk and remove it from the chain. @@ -325,7 +331,7 @@ _obstack_newchunk (h, length) CALL_FREEFUN (h, old_chunk); } - h->object_base = new_chunk->contents; + h->object_base = object_base; h->next_free = h->object_base + obj_size; /* The new chunk certainly contains no empty object yet. */ h->maybe_empty_object = 0; @@ -451,7 +457,7 @@ _obstack_memory_used (h) /* Define the error handler. */ # ifndef _ -# ifdef HAVE_LIBINTL_H +# if defined HAVE_LIBINTL_H || defined _LIBC # include # ifndef _ # define _(Str) gettext (Str) @@ -468,7 +474,7 @@ _obstack_memory_used (h) static void print_and_abort () { - fputs (_("virtual memory exhausted"), stderr); + fputs (_("memory exhausted"), stderr); fputc ('\n', stderr); exit (obstack_exit_failure); } @@ -518,20 +524,20 @@ int (obstack_make_room) (obstack, length) return obstack_make_room (obstack, length); } -void (obstack_grow) (obstack, pointer, length) +void (obstack_grow) (obstack, data, length) struct obstack *obstack; - POINTER pointer; + const POINTER data; int length; { - obstack_grow (obstack, pointer, length); + obstack_grow (obstack, data, length); } -void (obstack_grow0) (obstack, pointer, length) +void (obstack_grow0) (obstack, data, length) struct obstack *obstack; - POINTER pointer; + const POINTER data; int length; { - obstack_grow0 (obstack, pointer, length); + obstack_grow0 (obstack, data, length); } void (obstack_1grow) (obstack, character) @@ -575,20 +581,20 @@ POINTER (obstack_alloc) (obstack, length) return obstack_alloc (obstack, length); } -POINTER (obstack_copy) (obstack, pointer, length) +POINTER (obstack_copy) (obstack, address, length) struct obstack *obstack; - POINTER pointer; + const POINTER address; int length; { - return obstack_copy (obstack, pointer, length); + return obstack_copy (obstack, address, length); } -POINTER (obstack_copy0) (obstack, pointer, length) +POINTER (obstack_copy0) (obstack, address, length) struct obstack *obstack; - POINTER pointer; + const POINTER address; int length; { - return obstack_copy0 (obstack, pointer, length); + return obstack_copy0 (obstack, address, length); } # endif /* __STDC__ */