* lib/string-buffer.h (struct string_buffer): New field 'oom'.
* lib/string-buffer.c (sb_init): Initialize the 'oom' field.
(sb_append1, sb_append_desc, sb_append_c): Upon out-of-memory, set
buffer->oom, not buffer->error.
(sb_dupfree, sb_dupfree_c): If there was an OOM, return NULL.
* lib/string-buffer-printf.c (sb_appendvf, sb_appendf): Upon
out-of-memory, set buffer->oom, not buffer->error.
* lib/string-buffer-reversed.h (struct string_buffer_reversed): New
field 'oom'.
* lib/string-buffer-reversed.c (sbr_init): Initialize the 'oom' field.
(sbr_prepend1, sbr_prepend_desc, sbr_prepend_c): Upon out-of-memory, set
buffer->oom, not buffer->error.
(sbr_dupfree, sbr_dupfree_c): If there was an OOM, return NULL.
* lib/string-buffer-reversed-printf.c (sbr_prependvf, sbr_prependf):
Upon out-of-memory, set buffer->oom, not buffer->error.
+2025-02-09 Bruno Haible <bruno@clisp.org>
+
+ string-buffer, string-buffer-reversed: Make OOM handling consistent.
+ * lib/string-buffer.h (struct string_buffer): New field 'oom'.
+ * lib/string-buffer.c (sb_init): Initialize the 'oom' field.
+ (sb_append1, sb_append_desc, sb_append_c): Upon out-of-memory, set
+ buffer->oom, not buffer->error.
+ (sb_dupfree, sb_dupfree_c): If there was an OOM, return NULL.
+ * lib/string-buffer-printf.c (sb_appendvf, sb_appendf): Upon
+ out-of-memory, set buffer->oom, not buffer->error.
+ * lib/string-buffer-reversed.h (struct string_buffer_reversed): New
+ field 'oom'.
+ * lib/string-buffer-reversed.c (sbr_init): Initialize the 'oom' field.
+ (sbr_prepend1, sbr_prepend_desc, sbr_prepend_c): Upon out-of-memory, set
+ buffer->oom, not buffer->error.
+ (sbr_dupfree, sbr_dupfree_c): If there was an OOM, return NULL.
+ * lib/string-buffer-reversed-printf.c (sbr_prependvf, sbr_prependf):
+ Upon out-of-memory, set buffer->oom, not buffer->error.
+
2025-02-09 Bruno Haible <bruno@clisp.org>
unistr, unigbrk: Use const-improved function macros for 30 functions.
{
if (sb_ensure_more_bytes (buffer, 64) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
return -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
vsnzprintf() call. */
if (sb_ensure_more_bytes (buffer, (size_t) ret) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
ret = -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
{
if (sb_ensure_more_bytes (buffer, 64) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
return -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
vsnzprintf() call. */
if (sb_ensure_more_bytes (buffer, (size_t) ret) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
ret = -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
{
if (sbr_ensure_more_bytes (buffer, 64) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
return -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
vsnzprintf() call. */
if (sbr_ensure_more_bytes (buffer, (size_t) ret) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
ret = -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
{
if (sbr_ensure_more_bytes (buffer, 64) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
return -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
vsnzprintf() call. */
if (sbr_ensure_more_bytes (buffer, (size_t) ret) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
errno = ENOMEM;
ret = -1;
}
if (ret < 0)
{
/* Failed. errno is set. */
- buffer->error = true;
+ if (errno == ENOMEM)
+ buffer->oom = true;
+ else
+ buffer->error = true;
ret = -1;
}
else
buffer->data[sizeof (buffer->space) - 1] = '\0';
buffer->length = 1;
buffer->allocated = sizeof (buffer->space);
+ buffer->oom = false;
buffer->error = false;
}
{
if (sbr_ensure_more_bytes (buffer, 1) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
return -1;
}
buffer->data[buffer->allocated - buffer->length - 1] = c;
size_t len = sd_length (s);
if (sbr_ensure_more_bytes (buffer, len) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
return -1;
}
memcpy (buffer->data + buffer->allocated - buffer->length - len, sd_data (s), len);
size_t len = strlen (str);
if (sbr_ensure_more_bytes (buffer, len) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
return -1;
}
memcpy (buffer->data + buffer->allocated - buffer->length - len, str, len);
string_desc_t
sbr_dupfree (struct string_buffer_reversed *buffer)
{
- if (buffer->error)
+ if (buffer->oom || buffer->error)
goto fail;
size_t length = buffer->length;
char *
sbr_dupfree_c (struct string_buffer_reversed *buffer)
{
- if (buffer->error)
+ if (buffer->oom || buffer->error)
goto fail;
size_t length = buffer->length;
sbr_heap_allocated_pointer_t data;
size_t length; /* used bytes, <= allocated */
size_t allocated; /* allocated bytes */
- bool error; /* true if there was an error */
+ bool oom; /* true if there was an out-of-memory error */
+ bool error; /* true if there was an error other than out-of-memory */
char space[1024]; /* stack allocated space */
};
buffer->data = buffer->space;
buffer->length = 0;
buffer->allocated = sizeof (buffer->space);
+ buffer->oom = false;
buffer->error = false;
}
{
if (sb_ensure_more_bytes (buffer, 1) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
return -1;
}
buffer->data[buffer->length++] = c;
size_t len = sd_length (s);
if (sb_ensure_more_bytes (buffer, len) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
return -1;
}
memcpy (buffer->data + buffer->length, sd_data (s), len);
size_t len = strlen (str);
if (sb_ensure_more_bytes (buffer, len) < 0)
{
- buffer->error = true;
+ buffer->oom = true;
return -1;
}
memcpy (buffer->data + buffer->length, str, len);
string_desc_t
sb_dupfree (struct string_buffer *buffer)
{
- if (buffer->error)
+ if (buffer->oom || buffer->error)
goto fail;
size_t length = buffer->length;
char *
sb_dupfree_c (struct string_buffer *buffer)
{
- if (buffer->error)
+ if (buffer->oom || buffer->error)
goto fail;
if (sb_ensure_more_bytes (buffer, 1) < 0)
sb_heap_allocated_pointer_t data;
size_t length; /* used bytes, <= allocated */
size_t allocated; /* allocated bytes */
- bool error; /* true if there was an error */
+ bool oom; /* true if there was an out-of-memory error */
+ bool error; /* true if there was an error other than out-of-memory */
char space[1024]; /* stack allocated space */
};