diff options
author | Jim Meyering <jim@meyering.net> | 2000-10-25 06:00:26 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2000-10-25 06:00:26 +0000 |
commit | d538aba94d9e1c8be6f965e25f47b96e3a33e9cf (patch) | |
tree | f545898aaf882ee360ff5dffeb395a257330c975 | |
parent | 26f187aa3673c51c9859483ace8cbece0a8ee7e1 (diff) | |
download | coreutils-d538aba94d9e1c8be6f965e25f47b96e3a33e9cf.tar.xz |
Update from libc.
-rw-r--r-- | lib/.cppi-disable | 1 | ||||
-rw-r--r-- | lib/obstack.c | 18 |
2 files changed, 13 insertions, 6 deletions
diff --git a/lib/.cppi-disable b/lib/.cppi-disable index cfacdfc63..b3f9dfd47 100644 --- a/lib/.cppi-disable +++ b/lib/.cppi-disable @@ -8,3 +8,4 @@ obstack.h regex.h regex.c getpagesize.h +obstack.c diff --git a/lib/obstack.c b/lib/obstack.c index 639a6b067..53ede1506 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 <libintl.h> # ifndef _ # define _(Str) gettext (Str) |