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:
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;
|
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. */
|
/* Put N into charset CS. */
|
||||||
void
|
void
|
||||||
scm_i_charset_set (scm_t_char_set *cs, scm_t_wchar n)
|
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. */
|
/* It is also one below the next range, so combine them. */
|
||||||
cs->ranges[i].hi = cs->ranges[i + 1].hi;
|
cs->ranges[i].hi = cs->ranges[i + 1].hi;
|
||||||
if (i < len - 2)
|
cs->ranges = char_ranges_delete (cs->ranges, len, i + 1);
|
||||||
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->len = len - 1;
|
cs->len = len - 1;
|
||||||
return;
|
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)
|
else if (n < cs->ranges[i].lo - 1)
|
||||||
{
|
{
|
||||||
/* This is a new range below the current one. */
|
/* This is a new range below the current one. */
|
||||||
cs->ranges = scm_gc_realloc (cs->ranges,
|
cs->ranges = char_ranges_insert (cs->ranges, len, i, n, n);
|
||||||
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->len = len + 1;
|
cs->len = len + 1;
|
||||||
return;
|
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. */
|
/* This is a new range above all previous ranges. */
|
||||||
if (len == 0)
|
cs->ranges = char_ranges_insert (cs->ranges, len, len, n, n);
|
||||||
{
|
|
||||||
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->len = len + 1;
|
cs->len = len + 1;
|
||||||
|
|
||||||
return;
|
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)
|
if (cs->ranges[i].lo - 1 > hi)
|
||||||
{
|
{
|
||||||
/* Add a new range below the current one. */
|
/* Add a new range below the current one. */
|
||||||
cs->ranges = scm_gc_realloc (cs->ranges,
|
cs->ranges = char_ranges_insert (cs->ranges, cs->len, i, lo, hi);
|
||||||
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->len += 1;
|
cs->len += 1;
|
||||||
return;
|
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. */
|
/* Combine this range with the previous one. */
|
||||||
if (cs->ranges[i + 1].hi > hi)
|
if (cs->ranges[i + 1].hi > hi)
|
||||||
cs->ranges[i].hi = cs->ranges[i + 1].hi;
|
cs->ranges[i].hi = cs->ranges[i + 1].hi;
|
||||||
if (i + 1 < cs->len)
|
cs->ranges = char_ranges_delete (cs->ranges, cs->len, i + 1);
|
||||||
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->len -= 1;
|
cs->len -= 1;
|
||||||
}
|
}
|
||||||
return;
|
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. */
|
/* This is a new range above all previous ranges. */
|
||||||
if (cs->len == 0)
|
cs->ranges = char_ranges_insert (cs->ranges, cs->len, cs->len, lo, hi);
|
||||||
{
|
|
||||||
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->len += 1;
|
cs->len += 1;
|
||||||
cs->ranges[cs->len - 1].lo = lo;
|
|
||||||
cs->ranges[cs->len - 1].hi = hi;
|
|
||||||
|
|
||||||
return;
|
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)
|
if (n == cs->ranges[i].lo && n == cs->ranges[i].hi)
|
||||||
{
|
{
|
||||||
/* Remove this one-character range. */
|
/* Remove this one-character range. */
|
||||||
if (len == 1)
|
cs->ranges = char_ranges_delete (cs->ranges, len, i);
|
||||||
{
|
cs->len = len - 1;
|
||||||
cs->ranges = NULL;
|
return;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (n == cs->ranges[i].lo)
|
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)
|
else if (n > cs->ranges[i].lo && n < cs->ranges[i].hi)
|
||||||
{
|
{
|
||||||
/* Split this range into two pieces. */
|
/* Split this range into two pieces. */
|
||||||
cs->ranges = scm_gc_realloc (cs->ranges,
|
cs->ranges = char_ranges_insert (cs->ranges, len, i + 1,
|
||||||
sizeof (scm_t_char_range) * len,
|
n + 1, cs->ranges[i].hi);
|
||||||
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[i].hi = n - 1;
|
cs->ranges[i].hi = n - 1;
|
||||||
cs->len = len + 1;
|
cs->len = len + 1;
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue