int mutt_addwch (wchar_t wc)
{
- char buf[MB_LEN_MAX];
- int n;
-
- n = wctomb (buf, wc);
- if (n == -1)
- return n;
+ char buf[MB_LEN_MAX*2];
+ mbstate_t mbstate;
+ size_t n1, n2;
+
+ memset (&mbstate, 0, sizeof (mbstate));
+ if ((n1 = wcrtomb (buf, wc, &mbstate)) == (size_t)(-1) ||
+ (n2 = wcrtomb (buf + n1, 0, &mbstate)) == (size_t)(-1))
+ return -1; /* ERR */
else
- return addnstr (buf, n);
+ return addstr (buf);
}
/*
{
char *p;
wchar_t wc;
- int w, k;
+ int w;
+ size_t k;
char scratch[MB_LEN_MAX];
+ mbstate_t mbstate1, mbstate2;
+ memset(&mbstate1, 0, sizeof (mbstate1));
+ memset(&mbstate2, 0, sizeof (mbstate2));
--destlen;
p = dest;
- while ((k = mbtowc (&wc, s, n)))
+ for (; n && (k = mbrtowc (&wc, s, n, &mbstate1)); s += k, n -= k)
{
- if (k == -1 && n > 0)
+ if (k == (size_t)(-1) || k == (size_t)(-2))
{
k = 1;
wc = replacement_char ();
}
- s += k, n -= k;
w = wc < M_TREE_MAX ? 1 : wcwidth (wc); /* hack */
if (w >= 0)
{
- if (w > max_width || (k = wctomb (scratch, wc)) > destlen)
+ if (w > max_width || (k = wcrtomb (scratch, wc, &mbstate2)) > destlen)
break;
min_width -= w;
max_width -= w;
destlen -= k;
}
}
- k = (int)destlen < min_width ? destlen : min_width;
- if (k <= 0)
+ w = (int)destlen < min_width ? destlen : min_width;
+ if (w <= 0)
*p = '\0';
else if (right_justify)
{
- p[k] = '\0';
+ p[w] = '\0';
while (--p >= dest)
- p[k] = *p;
- while (--k >= 0)
- dest[k] = pad_char;
+ p[w] = *p;
+ while (--w >= 0)
+ dest[w] = pad_char;
}
else
{
- while (--k >= 0)
+ while (--w >= 0)
*p++ = pad_char;
*p = '\0';
}
}
/*
- * mutt_paddstr (n, s) is equivalent to
+ * mutt_paddstr (n, s) is almost equivalent to
* mutt_format_string (bigbuf, big, n, n, 0, ' ', s, big), addstr (bigbuf)
*/
void mutt_paddstr (int n, const char *s)
{
wchar_t wc;
- int k, w;
+ int w;
+ size_t k;
+ size_t len = mutt_strlen (s);
+ mbstate_t mbstate;
- while ((k = mbtowc (&wc, s, -1)))
+ memset (&mbstate, 0, sizeof (mbstate));
+ while (len && (k = mbrtowc (&wc, s, len, &mbstate)))
{
- if (k == -1)
+ if (k == (size_t)(-1) || k == (size_t)(-2))
{
- ++s; /* skip ill-formed character */
+ ++s, --len; /* skip ill-formed character */
continue;
}
if ((w = wcwidth (wc)) >= 0)
addnstr ((char *)s, k);
n -= w;
}
- s += k;
+ s += k, len -= k;
}
while (n-- > 0)
addch (' ');
}
mutt_format_string (dest, destlen, min_width, max_width,
- right_justify, ' ', s, -1);
+ right_justify, ' ', s, mutt_strlen (s));
}
static const char *
{
int n = maxwidth;
wchar_t wc;
- int k, w;
-
- for (;;)
+ int w;
+ size_t k;
+ size_t len = mutt_strlen (*macro);
+ mbstate_t mbstate1, mbstate2;
+
+ memset (&mbstate1, 0, sizeof (mbstate1));
+ memset (&mbstate2, 0, sizeof (mbstate2));
+ for (; (k = mbrtowc (&wc, *macro, len, &mbstate1)); *macro += k, len -= k)
{
- if ((k = mbtowc (&wc, *macro, -1)) <= 0)
+ if (k == (size_t)(-1) || k == (size_t)(-2))
break;
if ((w = wcwidth (wc)) >= 0)
{
break;
n -= w;
{
- char tb[7];
- int m = wctomb (tb, wc);
- if (0 < m && m < 7)
- tb[m] = '\0', fprintf (f, "%s", tb);
+ char buf[MB_LEN_MAX*2];
+ size_t n1, n2;
+ if ((n1 = wcrtomb (buf, wc, &mbstate2)) != (size_t)(-1) &&
+ (n2 = wcrtomb (buf + n1, 0, &mbstate2)) != (size_t)(-1))
+ fputs (buf, f);
}
}
else if (wc < 0x20 || wc == 0x7f)
n -= 1;
fprintf (f, "?");
}
- *macro += k;
}
return (maxwidth - n);
}
#ifndef HAVE_WC_FUNCS
-int wctomb (char *s, wchar_t wc)
+size_t wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
{
+ static mbstate_t mbstate;
+
+ if (!ps)
+ ps = &mbstate;
+
if (!s)
- return 0;
+ {
+ memset (ps, 0, sizeof (*ps));
+ return 1;
+ }
+ if (!wc)
+ {
+ memset (ps, 0, sizeof (*ps));
+ *s = 0;
+ return 1;
+ }
if (Charset_is_utf8)
return mutt_wctoutf8 (s, wc);
else if (wc < 0x100)
return 1;
}
else
- return -1;
-}
-
-int mbtowc (wchar_t *pwc, const char *s, size_t n)
-{
- mbstate_t state;
- int result;
- memset(&state, 0, sizeof(state));
- result = mbrtowc (pwc, s, n, &state);
- if (result >= 0)
- return result;
- else
- return -1;
+ {
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
}
size_t mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
size_t utf8rtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *_ps);
#ifndef HAVE_WC_FUNCS
-int wctomb (char *s, wchar_t wc);
-int mbtowc (wchar_t *pwc, const char *s, size_t n);
+size_t wcrtomb (char *s, wchar_t wc, mbstate_t *ps);
size_t mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps);
int iswprint (wint_t wc);
int wcwidth (wchar_t wc);
static void print_enriched_string (int attr, unsigned char *s, int do_color)
{
wchar_t wc;
- int k;
+ size_t k;
+ size_t n = mutt_strlen ((char *)s);
+ mbstate_t mbstate;
+ memset (&mbstate, 0, sizeof (mbstate));
while (*s)
{
if (*s < M_TREE_MAX)
addch ('&');
break;
}
- s++;
+ s++, n--;
}
if (do_color) attrset(attr);
}
- else if ((k = mbtowc (&wc, (char *)s, -1)) > 0)
+ else if ((k = mbrtowc (&wc, (char *)s, n, &mbstate)) > 0)
{
addnstr ((char *)s, k);
- s += k;
+ s += k, n-= k;
}
else
break;
void menu_pad_string (char *s, size_t l)
{
-#if !defined(HAVE_BKGDSET) && !defined (USE_SLANG_CURSES)
- int n = mutt_strlen (s);
-#endif
+ size_t n = mutt_strlen (s);
int shift = option (OPTARROWCURSOR) ? 3 : 0;
l--; /* save room for the terminal \0 */
l = COLS - shift;
/* Let's just pad the string anyway ... */
- mutt_format_string (s, INT_MAX, l, l, 0, ' ', s, INT_MAX);
+ mutt_format_string (s, INT_MAX, l, l, 0, ' ', s, n);
return;
#if !defined (HAVE_BKGDSET) && !defined (USE_SLANG_CURSES)