wingo pushed a commit to branch wip-whippet
in repository guile.

commit 337eaec77d66f994e2e0a7efc1295bec1c718483
Author: Andy Wingo <wi...@pobox.com>
AuthorDate: Wed Apr 30 09:58:48 2025 +0200

    Refactor srfi-14.c to use malloc instead of realloc
    
    * libguile/srfi-14.c (char_ranges_insert, char_ranges_delete): New
    helpers.
    (scm_i_charset_set, scm_i_charset_set_range, scm_i_charset_unset): Use
    the new helpers.
---
 libguile/srfi-14.c | 139 +++++++++++++++++------------------------------------
 1 file changed, 45 insertions(+), 94 deletions(-)

diff --git a/libguile/srfi-14.c b/libguile/srfi-14.c
index f92b0e95e..8cd999cc1 100644
--- a/libguile/srfi-14.c
+++ b/libguile/srfi-14.c
@@ -97,6 +97,40 @@ scm_i_charset_get (scm_t_char_set *cs, scm_t_wchar n)
   return 0;
 }
 
+static scm_t_char_range*
+char_ranges_insert (scm_t_char_range *ranges, size_t len, size_t idx,
+                    scm_t_wchar lo, scm_t_wchar hi)
+{
+  scm_t_char_range *new_ranges =
+    scm_gc_malloc_pointerless (sizeof (scm_t_char_range) * (len + 1),
+                               "charset");
+  if (idx)
+    memcpy (new_ranges, ranges, sizeof (scm_t_char_range) * idx);
+  new_ranges[idx].lo = lo;
+  new_ranges[idx].hi = hi;
+  if (idx < len)
+    memcpy (new_ranges + idx + 1, ranges + idx,
+            sizeof (scm_t_char_range) * (len - idx));
+  return new_ranges;
+}
+
+static scm_t_char_range*
+char_ranges_delete (scm_t_char_range *ranges, size_t len, size_t idx)
+{
+  if (len == 1)
+    return NULL;
+
+  scm_t_char_range *new_ranges =
+    scm_gc_malloc_pointerless (sizeof (scm_t_char_range) * (len - 1),
+                               "charset");
+  if (idx)
+    memcpy (new_ranges, ranges, sizeof (scm_t_char_range) * idx);
+  if (idx + 1 < len)
+    memcpy (new_ranges + idx, ranges + idx + 1,
+            sizeof (scm_t_char_range) * (len - idx - 1));
+  return new_ranges;
+}
+
 /* Put N into charset CS.  */
 void
 scm_i_charset_set (scm_t_char_set *cs, scm_t_wchar n)
@@ -140,14 +174,7 @@ scm_i_charset_set (scm_t_char_set *cs, scm_t_wchar n)
             {
               /* It is also one below the next range, so combine them.  */
               cs->ranges[i].hi = cs->ranges[i + 1].hi;
-              if (i < len - 2)
-                memmove (cs->ranges + (i + 1), cs->ranges + (i + 2),
-                         sizeof (scm_t_char_range) * (len - i - 2));
-              cs->ranges = scm_gc_realloc (cs->ranges,
-                                           sizeof (scm_t_char_range) * len,
-                                           sizeof (scm_t_char_range) * (len -
-                                                                        1),
-                                           "character-set");
+              cs->ranges = char_ranges_delete (cs->ranges, len, i + 1);
               cs->len = len - 1;
               return;
             }
@@ -161,14 +188,7 @@ scm_i_charset_set (scm_t_char_set *cs, scm_t_wchar n)
       else if (n < cs->ranges[i].lo - 1)
         {
           /* This is a new range below the current one.  */
-          cs->ranges = scm_gc_realloc (cs->ranges,
-                                       sizeof (scm_t_char_range) * len,
-                                       sizeof (scm_t_char_range) * (len + 1),
-                                       "character-set");
-          memmove (cs->ranges + (i + 1), cs->ranges + i,
-                   sizeof (scm_t_char_range) * (len - i));
-          cs->ranges[i].lo = n;
-          cs->ranges[i].hi = n;
+          cs->ranges = char_ranges_insert (cs->ranges, len, i, n, n);
           cs->len = len + 1;
           return;
         }
@@ -177,19 +197,7 @@ scm_i_charset_set (scm_t_char_set *cs, scm_t_wchar n)
     }
 
   /* This is a new range above all previous ranges.  */
-  if (len == 0)
-    {
-      cs->ranges = scm_gc_malloc (sizeof (scm_t_char_range), "character-set");
-    }
-  else
-    {
-      cs->ranges = scm_gc_realloc (cs->ranges,
-                                   sizeof (scm_t_char_range) * len,
-                                   sizeof (scm_t_char_range) * (len + 1),
-                                   "character-set");
-    }
-  cs->ranges[len].lo = n;
-  cs->ranges[len].hi = n;
+  cs->ranges = char_ranges_insert (cs->ranges, len, len, n, n);
   cs->len = len + 1;
 
   return;
@@ -214,14 +222,7 @@ scm_i_charset_set_range (scm_t_char_set *cs, scm_t_wchar 
lo, scm_t_wchar hi)
       if (cs->ranges[i].lo - 1 > hi)
         {
           /* Add a new range below the current one.  */
-          cs->ranges = scm_gc_realloc (cs->ranges,
-                                       sizeof (scm_t_char_range) * cs->len,
-                                       sizeof (scm_t_char_range) * (cs->len + 
1),
-                                       "character-set");
-          memmove (cs->ranges + (i + 1), cs->ranges + i,
-                   sizeof (scm_t_char_range) * (cs->len - i));
-          cs->ranges[i].lo = lo;
-          cs->ranges[i].hi = hi;
+          cs->ranges = char_ranges_insert (cs->ranges, cs->len, i, lo, hi);
           cs->len += 1;
           return;
         }
@@ -259,13 +260,7 @@ scm_i_charset_set_range (scm_t_char_set *cs, scm_t_wchar 
lo, scm_t_wchar hi)
               /* Combine this range with the previous one.  */
               if (cs->ranges[i + 1].hi > hi)
                 cs->ranges[i].hi = cs->ranges[i + 1].hi;
-              if (i + 1 < cs->len)
-                memmove (cs->ranges + i + 1, cs->ranges + i + 2,
-                         sizeof (scm_t_char_range) * (cs->len - i - 2));
-              cs->ranges = scm_gc_realloc (cs->ranges,
-                                           sizeof (scm_t_char_range) * cs->len,
-                                           sizeof (scm_t_char_range) * 
(cs->len - 1),
-                                           "character-set");
+              cs->ranges = char_ranges_delete (cs->ranges, cs->len, i + 1);
               cs->len -= 1;
             }
           return;
@@ -274,20 +269,8 @@ scm_i_charset_set_range (scm_t_char_set *cs, scm_t_wchar 
lo, scm_t_wchar hi)
     }
 
   /* This is a new range above all previous ranges.  */
-  if (cs->len == 0)
-    {
-      cs->ranges = scm_gc_malloc (sizeof (scm_t_char_range), "character-set");
-    }
-  else
-    {
-      cs->ranges = scm_gc_realloc (cs->ranges,
-                                   sizeof (scm_t_char_range) * cs->len,
-                                   sizeof (scm_t_char_range) * (cs->len + 1),
-                                   "character-set");
-    }
+  cs->ranges = char_ranges_insert (cs->ranges, cs->len, cs->len, lo, hi);
   cs->len += 1;
-  cs->ranges[cs->len - 1].lo = lo;
-  cs->ranges[cs->len - 1].hi = hi;
 
   return;
 }
@@ -311,34 +294,9 @@ scm_i_charset_unset (scm_t_char_set *cs, scm_t_wchar n)
       if (n == cs->ranges[i].lo && n == cs->ranges[i].hi)
         {
           /* Remove this one-character range.  */
-          if (len == 1)
-            {
-              cs->ranges = NULL;
-              cs->len = 0;
-              return;
-            }
-          else if (i < len - 1)
-            {
-              memmove (cs->ranges + i, cs->ranges + (i + 1),
-                       sizeof (scm_t_char_range) * (len - i - 1));
-              cs->ranges = scm_gc_realloc (cs->ranges,
-                                           sizeof (scm_t_char_range) * len,
-                                           sizeof (scm_t_char_range) * (len -
-                                                                        1),
-                                           "character-set");
-              cs->len = len - 1;
-              return;
-            }
-          else if (i == len - 1)
-            {
-              cs->ranges = scm_gc_realloc (cs->ranges,
-                                           sizeof (scm_t_char_range) * len,
-                                           sizeof (scm_t_char_range) * (len -
-                                                                        1),
-                                           "character-set");
-              cs->len = len - 1;
-              return;
-            }
+          cs->ranges = char_ranges_delete (cs->ranges, len, i);
+          cs->len = len - 1;
+          return;
         }
       else if (n == cs->ranges[i].lo)
         {
@@ -355,15 +313,8 @@ scm_i_charset_unset (scm_t_char_set *cs, scm_t_wchar n)
       else if (n > cs->ranges[i].lo && n < cs->ranges[i].hi)
         {
           /* Split this range into two pieces.  */
-          cs->ranges = scm_gc_realloc (cs->ranges,
-                                       sizeof (scm_t_char_range) * len,
-                                       sizeof (scm_t_char_range) * (len + 1),
-                                       "character-set");
-          if (i < len - 1)
-            memmove (cs->ranges + (i + 2), cs->ranges + (i + 1),
-                     sizeof (scm_t_char_range) * (len - i - 1));
-          cs->ranges[i + 1].hi = cs->ranges[i].hi;
-          cs->ranges[i + 1].lo = n + 1;
+          cs->ranges = char_ranges_insert (cs->ranges, len, i + 1,
+                                           n + 1, cs->ranges[i].hi);
           cs->ranges[i].hi = n - 1;
           cs->len = len + 1;
           return;

Reply via email to