--- a/sed/execute.c 2015-12-28 07:36:47.000000000 +0100
+++ b/sed/execute.c 2019-07-30 10:37:49.369052072 +0200
@@ -213,58 +220,42 @@
while (length)
{
wchar_t wc;
- size_t n = MBRTOWC (&wc, string, length, &from_stat);
+ int n = MBRTOWC (&wc, string, length, &from_stat);
- /* Treat an invalid sequence like a single-byte character. */
- if (n == (size_t) -1)
+ /* An invalid sequence is treated like a singlebyte character. */
+ if (n == -1)
{
- type &= ~(REPL_LOWERCASE_FIRST | REPL_UPPERCASE_FIRST);
- if (type == REPL_ASIS)
- {
- str_append(to, string, length);
- return;
- }
-
- str_append (to, string, 1);
memset (&to->mbstate, 0, sizeof (from_stat));
n = 1;
- string += n, length -= n;
- continue;
- }
-
- if (n == 0 || n == (size_t) -2)
- {
- /* L'\0' or an incomplete sequence: copy it manually. */
- str_append(to, string, length);
- return;
}
- string += n, length -= n;
+ if (n > 0)
+ string += n, length -= n;
+ else
+ {
+ /* Incomplete sequence, copy it manually. */
+ str_append(to, string, length);
+ return;
+ }
/* Convert the first character specially... */
if (type & (REPL_UPPERCASE_FIRST | REPL_LOWERCASE_FIRST))
- {
+ {
if (type & REPL_UPPERCASE_FIRST)
wc = towupper(wc);
else
wc = towlower(wc);
type &= ~(REPL_LOWERCASE_FIRST | REPL_UPPERCASE_FIRST);
- if (type == REPL_ASIS)
- {
- /* Copy the new wide character to the end of the string. */
- n = WCRTOMB (to->active + to->length, wc, &to->mbstate);
- to->length += n;
- if (n == (size_t) -1 || n == (size_t) -2)
- {
- fprintf (stderr,
- _("case conversion produced an invalid character"));
- abort ();
- }
- str_append(to, string, length);
- return;
- }
+ if (type == REPL_ASIS)
+ {
+ n = WCRTOMB (to->active + to->length, wc, &to->mbstate);
+ to->length += n;
+ str_append(to, string, length);
+ return;
+ }
}
+
else if (type & REPL_UPPERCASE)
wc = towupper(wc);
else
@@ -274,10 +265,10 @@
n = WCRTOMB (to->active + to->length, wc, &to->mbstate);
to->length += n;
if (n == -1 || n == -2)
- {
- fprintf (stderr, _("case conversion produced an invalid character"));
- abort ();
- }
+ {
+ fprintf (stderr, "Case conversion produced an invalid character!");
+ abort ();
+ }
}
}