Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
Arquivo: enter.c Projeto: 0xAX/muttx
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;
}