static int get_wrapped_width (const char *t, size_t wid) { wchar_t wc; size_t k; size_t m, n; size_t len = mutt_strlen (t); const char *s = t; mbstate_t mbstate; memset (&mbstate, 0, sizeof (mbstate)); for (m = wid, n = 0; len && (k = mbrtowc (&wc, s, len, &mbstate)) && (n <= wid); s += k, len -= k) { if (*s == ' ') m = n; if (k == (size_t)(-1) || k == (size_t)(-2)) { k = (k == (size_t)(-1)) ? 1 : len; wc = replacement_char (); } if (!IsWPrint (wc)) wc = '?'; n += wcwidth (wc); } if (n > wid) n = m; else n = wid; return n; }
static int print_macro (FILE *f, int maxwidth, const char **macro) { int n = maxwidth; wchar_t wc; 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 (; len && (k = mbrtowc (&wc, *macro, len, &mbstate1)); *macro += k, len -= k) { if (k == (size_t)(-1) || k == (size_t)(-2)) { k = (k == (size_t)(-1)) ? 1 : len; wc = replacement_char (); } /* glibc-2.1.3's wcwidth() returns 1 for unprintable chars! */ if (IsWPrint (wc) && (w = wcwidth (wc)) >= 0) { if (w > n) break; n -= w; { 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) { if (2 > n) break; n -= 2; if (wc == '\033') fprintf (f, "\\e"); else if (wc == '\n') fprintf (f, "\\n"); else if (wc == '\r') fprintf (f, "\\r"); else if (wc == '\t') fprintf (f, "\\t"); else fprintf (f, "^%c", (char)((wc + '@') & 0x7f)); } else { if (1 > n) break; n -= 1; fprintf (f, "?"); } } return (maxwidth - n); }
static size_t my_mbstowcs(wchar_t **pwbuf, size_t *pwbuflen, size_t i, char *buf) { wchar_t wc; mbstate_t st; size_t k; wchar_t *wbuf; size_t wbuflen; wbuf = *pwbuf, wbuflen = *pwbuflen; while(*buf) { memset(&st, 0, sizeof(st)); for(;(k = mbrtowc(&wc, buf, MB_LEN_MAX, &st)) && k !=(size_t)(-1) && k !=(size_t)(-2); buf += k) { if (i >= wbuflen) { wbuflen = i + 20; safe_realloc(&wbuf, wbuflen * sizeof(*wbuf)); } wbuf[i++] = wc; } if (*buf &&(k ==(size_t) -1 || k ==(size_t) -2)) { if (i >= wbuflen) { wbuflen = i + 20; safe_realloc(&wbuf, wbuflen * sizeof(*wbuf)); } wbuf[i++] = replacement_char(); buf++; } } *pwbuf = wbuf, *pwbuflen = wbuflen; return i; }