1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-24 20:30:28 +02:00

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.
This commit is contained in:
Andy Wingo 2025-04-30 09:58:48 +02:00
parent 53dda2ecec
commit 337eaec77d

View file

@ -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,35 +294,10 @@ 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->ranges = char_ranges_delete (cs->ranges, len, i);
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;
}
}
else if (n == cs->ranges[i].lo)
{
/* Shrink this range from the left. */
@ -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;