]> Savannah Git Hosting - gnulib.git/commitdiff
string-buffer, string-buffer-reversed: Make OOM handling consistent.
authorBruno Haible <bruno@clisp.org>
Sun, 9 Feb 2025 15:56:39 +0000 (16:56 +0100)
committerBruno Haible <bruno@clisp.org>
Sun, 9 Feb 2025 15:56:39 +0000 (16:56 +0100)
* 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.

ChangeLog
lib/string-buffer-printf.c
lib/string-buffer-reversed-printf.c
lib/string-buffer-reversed.c
lib/string-buffer-reversed.h
lib/string-buffer.c
lib/string-buffer.h

index a24d96bc4fd8d77c98cf3b31f418bf1b77d7d80d..c224e4d81e31add973615e6b4f64eb81fe92cf65 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+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.
index e3a4d9b6dad61d3883ea4f3b9c8d7fa1dccd746c..ef9ad122e8c60caabfbd20b254c672c8eb586873 100644 (file)
@@ -43,7 +43,7 @@ sb_appendvf (struct string_buffer *buffer, const char *formatstring,
     {
       if (sb_ensure_more_bytes (buffer, 64) < 0)
         {
-          buffer->error = true;
+          buffer->oom = true;
           errno = ENOMEM;
           return -1;
         }
@@ -58,7 +58,10 @@ sb_appendvf (struct string_buffer *buffer, const char *formatstring,
   if (ret < 0)
     {
       /* Failed.  errno is set.  */
-      buffer->error = true;
+      if (errno == ENOMEM)
+        buffer->oom = true;
+      else
+        buffer->error = true;
       ret = -1;
     }
   else
@@ -75,7 +78,7 @@ sb_appendvf (struct string_buffer *buffer, const char *formatstring,
              vsnzprintf() call.  */
           if (sb_ensure_more_bytes (buffer, (size_t) ret) < 0)
             {
-              buffer->error = true;
+              buffer->oom = true;
               errno = ENOMEM;
               ret = -1;
             }
@@ -88,7 +91,10 @@ sb_appendvf (struct string_buffer *buffer, const char *formatstring,
               if (ret < 0)
                 {
                   /* Failed.  errno is set.  */
-                  buffer->error = true;
+                  if (errno == ENOMEM)
+                    buffer->oom = true;
+                  else
+                    buffer->error = true;
                   ret = -1;
                 }
               else
@@ -124,7 +130,7 @@ sb_appendf (struct string_buffer *buffer, const char *formatstring, ...)
     {
       if (sb_ensure_more_bytes (buffer, 64) < 0)
         {
-          buffer->error = true;
+          buffer->oom = true;
           errno = ENOMEM;
           return -1;
         }
@@ -139,7 +145,10 @@ sb_appendf (struct string_buffer *buffer, const char *formatstring, ...)
   if (ret < 0)
     {
       /* Failed.  errno is set.  */
-      buffer->error = true;
+      if (errno == ENOMEM)
+        buffer->oom = true;
+      else
+        buffer->error = true;
       ret = -1;
     }
   else
@@ -156,7 +165,7 @@ sb_appendf (struct string_buffer *buffer, const char *formatstring, ...)
              vsnzprintf() call.  */
           if (sb_ensure_more_bytes (buffer, (size_t) ret) < 0)
             {
-              buffer->error = true;
+              buffer->oom = true;
               errno = ENOMEM;
               ret = -1;
             }
@@ -171,7 +180,10 @@ sb_appendf (struct string_buffer *buffer, const char *formatstring, ...)
               if (ret < 0)
                 {
                   /* Failed.  errno is set.  */
-                  buffer->error = true;
+                  if (errno == ENOMEM)
+                    buffer->oom = true;
+                  else
+                    buffer->error = true;
                   ret = -1;
                 }
               else
index 76db571cf3558d88be896d047fbbd4a0808e0454..adcdc54bc37a9686c98cd799ad6615a395d1d4a5 100644 (file)
@@ -45,7 +45,7 @@ sbr_prependvf (struct string_buffer_reversed *buffer, const char *formatstring,
     {
       if (sbr_ensure_more_bytes (buffer, 64) < 0)
         {
-          buffer->error = true;
+          buffer->oom = true;
           errno = ENOMEM;
           return -1;
         }
@@ -59,7 +59,10 @@ sbr_prependvf (struct string_buffer_reversed *buffer, const char *formatstring,
   if (ret < 0)
     {
       /* Failed.  errno is set.  */
-      buffer->error = true;
+      if (errno == ENOMEM)
+        buffer->oom = true;
+      else
+        buffer->error = true;
       ret = -1;
     }
   else
@@ -79,7 +82,7 @@ sbr_prependvf (struct string_buffer_reversed *buffer, const char *formatstring,
              vsnzprintf() call.  */
           if (sbr_ensure_more_bytes (buffer, (size_t) ret) < 0)
             {
-              buffer->error = true;
+              buffer->oom = true;
               errno = ENOMEM;
               ret = -1;
             }
@@ -91,7 +94,10 @@ sbr_prependvf (struct string_buffer_reversed *buffer, const char *formatstring,
               if (ret < 0)
                 {
                   /* Failed.  errno is set.  */
-                  buffer->error = true;
+                  if (errno == ENOMEM)
+                    buffer->oom = true;
+                  else
+                    buffer->error = true;
                   ret = -1;
                 }
               else
@@ -131,7 +137,7 @@ sbr_prependf (struct string_buffer_reversed *buffer, const char *formatstring,
     {
       if (sbr_ensure_more_bytes (buffer, 64) < 0)
         {
-          buffer->error = true;
+          buffer->oom = true;
           errno = ENOMEM;
           return -1;
         }
@@ -145,7 +151,10 @@ sbr_prependf (struct string_buffer_reversed *buffer, const char *formatstring,
   if (ret < 0)
     {
       /* Failed.  errno is set.  */
-      buffer->error = true;
+      if (errno == ENOMEM)
+        buffer->oom = true;
+      else
+        buffer->error = true;
       ret = -1;
     }
   else
@@ -165,7 +174,7 @@ sbr_prependf (struct string_buffer_reversed *buffer, const char *formatstring,
              vsnzprintf() call.  */
           if (sbr_ensure_more_bytes (buffer, (size_t) ret) < 0)
             {
-              buffer->error = true;
+              buffer->oom = true;
               errno = ENOMEM;
               ret = -1;
             }
@@ -179,7 +188,10 @@ sbr_prependf (struct string_buffer_reversed *buffer, const char *formatstring,
               if (ret < 0)
                 {
                   /* Failed.  errno is set.  */
-                  buffer->error = true;
+                  if (errno == ENOMEM)
+                    buffer->oom = true;
+                  else
+                    buffer->error = true;
                   ret = -1;
                 }
               else
index a2bce83b9c1d3af62241031de2f6c1c98539977a..4f093f66dcffdd4669dc180b2a26de733c298410 100644 (file)
@@ -45,6 +45,7 @@ sbr_init (struct string_buffer_reversed *buffer)
   buffer->data[sizeof (buffer->space) - 1] = '\0';
   buffer->length = 1;
   buffer->allocated = sizeof (buffer->space);
+  buffer->oom = false;
   buffer->error = false;
 }
 
@@ -100,7 +101,7 @@ sbr_prepend1 (struct string_buffer_reversed *buffer, char c)
 {
   if (sbr_ensure_more_bytes (buffer, 1) < 0)
     {
-      buffer->error = true;
+      buffer->oom = true;
       return -1;
     }
   buffer->data[buffer->allocated - buffer->length - 1] = c;
@@ -114,7 +115,7 @@ sbr_prepend_desc (struct string_buffer_reversed *buffer, string_desc_t s)
   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);
@@ -128,7 +129,7 @@ sbr_prepend_c (struct string_buffer_reversed *buffer, const char *str)
   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);
@@ -159,7 +160,7 @@ sbr_contents_c (struct string_buffer_reversed *buffer)
 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;
@@ -190,7 +191,7 @@ sbr_dupfree (struct string_buffer_reversed *buffer)
 char *
 sbr_dupfree_c (struct string_buffer_reversed *buffer)
 {
-  if (buffer->error)
+  if (buffer->oom || buffer->error)
     goto fail;
 
   size_t length = buffer->length;
index 7fe05e486983327d30d43c53f09326b962c505d4..4915aa529789946d5bc7848a992341b21742323d 100644 (file)
@@ -43,7 +43,8 @@ struct string_buffer_reversed
   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 */
 };
 
index efb95adf6a6cd5c67f69de269c9fa63d58295642..ac1606f23d9d91a979c7f8c17cbdd6d816640854 100644 (file)
@@ -41,6 +41,7 @@ sb_init (struct string_buffer *buffer)
   buffer->data = buffer->space;
   buffer->length = 0;
   buffer->allocated = sizeof (buffer->space);
+  buffer->oom = false;
   buffer->error = false;
 }
 
@@ -91,7 +92,7 @@ sb_append1 (struct string_buffer *buffer, char c)
 {
   if (sb_ensure_more_bytes (buffer, 1) < 0)
     {
-      buffer->error = true;
+      buffer->oom = true;
       return -1;
     }
   buffer->data[buffer->length++] = c;
@@ -104,7 +105,7 @@ sb_append_desc (struct string_buffer *buffer, string_desc_t s)
   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);
@@ -118,7 +119,7 @@ sb_append_c (struct string_buffer *buffer, const char *str)
   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);
@@ -152,7 +153,7 @@ sb_contents_c (struct string_buffer *buffer)
 string_desc_t
 sb_dupfree (struct string_buffer *buffer)
 {
-  if (buffer->error)
+  if (buffer->oom || buffer->error)
     goto fail;
 
   size_t length = buffer->length;
@@ -185,7 +186,7 @@ sb_dupfree (struct string_buffer *buffer)
 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)
index 48c40eb3de637edb1e36670baaab984a0797383d..19b54ea6e7b10cf47d6b4f0b5c02048e0562606c 100644 (file)
@@ -42,7 +42,8 @@ struct string_buffer
   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 */
 };