1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-14 07:30:32 +02:00

Update gnulib to a3a946f670718d0dee5a7425ad5ac0a29fb46ea1

This fixes https://lists.gnu.org/archive/html/guile-devel/2021-04/msg00009.html
This commit is contained in:
Daniel Llorens 2021-04-08 20:54:42 +02:00
parent 88e7030845
commit bdb07f8fc7
54 changed files with 1075 additions and 302 deletions

View file

@ -19,12 +19,105 @@
#ifndef _GL_SCRATCH_BUFFER_H
#define _GL_SCRATCH_BUFFER_H
/* Scratch buffers with a default stack allocation and fallback to
heap allocation. It is expected that this function is used in this
way:
struct scratch_buffer tmpbuf;
scratch_buffer_init (&tmpbuf);
while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
if (!scratch_buffer_grow (&tmpbuf))
return -1;
scratch_buffer_free (&tmpbuf);
return 0;
The allocation functions (scratch_buffer_grow,
scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
sure that the heap allocation, if any, is freed, so that the code
above does not have a memory leak. The buffer still remains in a
state that can be deallocated using scratch_buffer_free, so a loop
like this is valid as well:
struct scratch_buffer tmpbuf;
scratch_buffer_init (&tmpbuf);
while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
if (!scratch_buffer_grow (&tmpbuf))
break;
scratch_buffer_free (&tmpbuf);
scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
to grow the buffer by at least 512 bytes. This means that when
using the scratch buffer as a backing store for a non-character
array whose element size, in bytes, is 512 or smaller, the scratch
buffer only has to grow once to make room for at least one more
element.
*/
/* Scratch buffer. Must be initialized with scratch_buffer_init
before its use. */
struct scratch_buffer;
/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
and BUFFER->length reflects the available space. */
#if 0
extern void scratch_buffer_init (struct scratch_buffer *buffer);
#endif
/* Deallocates *BUFFER (if it was heap-allocated). */
#if 0
extern void scratch_buffer_free (struct scratch_buffer *buffer);
#endif
/* Grow *BUFFER by some arbitrary amount. The buffer contents is NOT
preserved. Return true on success, false on allocation failure (in
which case the old buffer is freed). On success, the new buffer is
larger than the previous size. On failure, *BUFFER is deallocated,
but remains in a free-able state, and errno is set. */
#if 0
extern bool scratch_buffer_grow (struct scratch_buffer *buffer);
#endif
/* Like scratch_buffer_grow, but preserve the old buffer
contents on success, as a prefix of the new buffer. */
#if 0
extern bool scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
#endif
/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
bytes. The buffer contents are NOT preserved. Both NELEM and SIZE
can be zero. Return true on success, false on allocation failure
(in which case the old buffer is freed, but *BUFFER remains in a
free-able state, and errno is set). It is unspecified whether this
function can reduce the array size. */
#if 0
extern bool scratch_buffer_set_array_size (struct scratch_buffer *buffer,
size_t nelem, size_t size);
#endif
/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
deallocating *BUFFER if it was heap-allocated. SIZE must be at
most *BUFFER's size. Return NULL (setting errno) on memory
exhaustion. */
#if 0
extern void *scratch_buffer_dupfree (struct scratch_buffer *buffer,
size_t size);
#endif
/* The implementation is imported from glibc. */
#include <libc-config.h>
/* Avoid possible conflicts with symbols exported by the GNU libc. */
#define __libc_scratch_buffer_dupfree gl_scratch_buffer_dupfree
#define __libc_scratch_buffer_grow gl_scratch_buffer_grow
#define __libc_scratch_buffer_grow_preserve gl_scratch_buffer_grow_preserve
#define __libc_scratch_buffer_set_array_size gl_scratch_buffer_set_array_size
#include <malloc/scratch_buffer.h>
#endif /* _GL_SCRATCH_BUFFER_H */