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;