2025-05-05 Paul Eggert <eggert@cs.ucla.edu>
+ obstack: use int where glibc does
+ Make it easier to merge with glibc, by using int where
+ the glibc API uses int, when compiling for glibc.
+ This does not affect Gnulib behavior.
+ * lib/obstack.in.h (_OBSTACK_INDEX_T): New macro.
+ * lib/obstack.in.h (struct obstack):
+ * lib/obstack.c (_obstack_begin_worker, obstack_begin)
+ (_obstack_begin_1, _obstack_newchunk, _obstack_memory_used):
+ Use _OBSTACK_INDEX_T, not _OBSTACK_SIZE_T, for API components
+ where glibc uses int.
+
obstack: use presence of uintptr_t
The code depends on the presence of uintptr_t,
not on whether ptrdiff_t is narrower than a pointer,
static int
_obstack_begin_worker (struct obstack *h,
- _OBSTACK_SIZE_T size, _OBSTACK_SIZE_T alignment)
+ _OBSTACK_INDEX_T size, _OBSTACK_INDEX_T alignment)
{
struct _obstack_chunk *chunk; /* points to new chunk */
int
_obstack_begin (struct obstack *h,
- _OBSTACK_SIZE_T size, _OBSTACK_SIZE_T alignment,
+ _OBSTACK_INDEX_T size, _OBSTACK_INDEX_T alignment,
void *(*chunkfun) (size_t),
void (*freefun) (void *))
{
int
_obstack_begin_1 (struct obstack *h,
- _OBSTACK_SIZE_T size, _OBSTACK_SIZE_T alignment,
+ _OBSTACK_INDEX_T size, _OBSTACK_INDEX_T alignment,
void *(*chunkfun) (void *, size_t),
void (*freefun) (void *, void *),
void *arg)
to the beginning of the new one. */
void
-_obstack_newchunk (struct obstack *h, _OBSTACK_SIZE_T length)
+_obstack_newchunk (struct obstack *h, _OBSTACK_INDEX_T length)
{
struct _obstack_chunk *old_chunk = h->chunk;
struct _obstack_chunk *new_chunk = NULL;
abort ();
}
-_OBSTACK_SIZE_T
+_OBSTACK_INDEX_T
_obstack_memory_used (struct obstack *h)
{
struct _obstack_chunk *lp;
- _OBSTACK_SIZE_T nbytes = 0;
+ _OBSTACK_INDEX_T nbytes = 0;
for (lp = h->chunk; lp != NULL; lp = lp->prev)
{
is different from the one in GNU libc. */
#if defined __GL_GNULIB_HEADER
/* In Gnulib, we use sane types, especially for 64-bit hosts. */
+# define _OBSTACK_INDEX_T size_t
# define _OBSTACK_SIZE_T size_t
# define _CHUNK_SIZE_T size_t
# define _OBSTACK_CAST(type, expr) (expr)
# define _OBSTACK_CHUNK_CONTENTS_SIZE FLEXIBLE_ARRAY_MEMBER
#else
-/* glibc usage. */
+/* For backward compatibility, glibc limits object sizes to int range. */
+# define _OBSTACK_INDEX_T int
# define _OBSTACK_SIZE_T unsigned int
# define _CHUNK_SIZE_T unsigned long
# define _OBSTACK_CAST(type, expr) ((type) (expr))
_OBSTACK_SIZE_T i;
void *p;
} temp; /* Temporary for some macros. */
- _OBSTACK_SIZE_T alignment_mask; /* Mask of alignment for each object. */
+ _OBSTACK_INDEX_T alignment_mask; /* Mask of alignment for each object. */
/* These prototypes vary based on 'use_extra_arg'. */
union
# define _obstack_memory_used rpl_obstack_memory_used
# define _obstack_allocated_p rpl_obstack_allocated_p
#endif
-extern void _obstack_newchunk (struct obstack *, _OBSTACK_SIZE_T);
+extern void _obstack_newchunk (struct obstack *, _OBSTACK_INDEX_T);
extern void _obstack_free (struct obstack *, void *);
extern int _obstack_begin (struct obstack *,
- _OBSTACK_SIZE_T, _OBSTACK_SIZE_T,
+ _OBSTACK_INDEX_T, _OBSTACK_INDEX_T,
void *(*) (size_t), void (*) (void *));
extern int _obstack_begin_1 (struct obstack *,
- _OBSTACK_SIZE_T, _OBSTACK_SIZE_T,
+ _OBSTACK_INDEX_T, _OBSTACK_INDEX_T,
void *(*) (void *, size_t),
void (*) (void *, void *), void *);
-extern _OBSTACK_SIZE_T _obstack_memory_used (struct obstack *)
+extern _OBSTACK_INDEX_T _obstack_memory_used (struct obstack *)
__attribute_pure__;
# define obstack_make_room(OBSTACK, length) \
__extension__ \
({ struct obstack *__o = (OBSTACK); \
- _OBSTACK_SIZE_T __len = (length); \
+ _OBSTACK_INDEX_T __len = length; \
if (obstack_room (__o) < __len) \
_obstack_newchunk (__o, __len); \
(void) 0; })
# define obstack_grow(OBSTACK, where, length) \
__extension__ \
({ struct obstack *__o = (OBSTACK); \
- _OBSTACK_SIZE_T __len = (length); \
+ _OBSTACK_INDEX_T __len = length; \
if (obstack_room (__o) < __len) \
_obstack_newchunk (__o, __len); \
memcpy (__o->next_free, where, __len); \
# define obstack_grow0(OBSTACK, where, length) \
__extension__ \
({ struct obstack *__o = (OBSTACK); \
- _OBSTACK_SIZE_T __len = (length); \
+ _OBSTACK_INDEX_T __len = length; \
if (obstack_room (__o) <= __len) \
_obstack_newchunk (__o, __len + 1); \
memcpy (__o->next_free, where, __len); \
# define obstack_blank(OBSTACK, length) \
__extension__ \
({ struct obstack *__o = (OBSTACK); \
- _OBSTACK_SIZE_T __len = (length); \
+ _OBSTACK_INDEX_T __len = length; \
if (obstack_room (__o) < __len) \
_obstack_newchunk (__o, __len); \
obstack_blank_fast (__o, __len); })