mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 12:20:20 +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:
parent
53dda2ecec
commit
337eaec77d
1 changed files with 45 additions and 94 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue