]> granicus.if.org Git - mutt/commitdiff
Clean up mutt_wstr_trunc() some more.
authorKevin McCarthy <kevin@8t8.us>
Wed, 23 Mar 2016 01:00:13 +0000 (18:00 -0700)
committerKevin McCarthy <kevin@8t8.us>
Wed, 23 Mar 2016 01:00:13 +0000 (18:00 -0700)
* Change return type to size_t.
  The return value is the cumulation of values from mbrtowc(), which
  returns size_t.  All callers already assign the return value to a
  size_t, requiring no external changes.

* Change the local variables n, w, l, and cl to size_t.
  n is the strlen of the src parameter.  l and cl are used for the
  return value.  w is assigned to the *width parameter, which is
  size_t.

  cw is kept as an int, because wcwidth returns type int.

* Change error handling of mbrtowc to be the same as other functions
  in mutt: only reset mbstate when the retval==-1.  When retvat==-2,
  set cl=n to break out of the loop.  Also, set wc to replacement_char
  and allow the logic below to determine the width instead of
  hardcoding to 1.

curs_lib.c
protos.h

index b400db0aece8591fc35ca22f49d5537e361337d8..3178f22100ef32dd87d03226602e81513a5ae471 100644 (file)
@@ -949,11 +949,11 @@ void mutt_paddstr (int n, const char *s)
 
 /* See how many bytes to copy from string so its at most maxlen bytes
  * long and maxwid columns wide */
-int mutt_wstr_trunc (const char *src, size_t maxlen, size_t maxwid, size_t *width)
+size_t mutt_wstr_trunc (const char *src, size_t maxlen, size_t maxwid, size_t *width)
 {
   wchar_t wc;
-  int w = 0, l = 0, cl;
-  int cw, n;
+  size_t n, w = 0, l = 0, cl;
+  int cw;
   mbstate_t mbstate;
 
   if (!src)
@@ -964,20 +964,20 @@ int mutt_wstr_trunc (const char *src, size_t maxlen, size_t maxwid, size_t *widt
   memset (&mbstate, 0, sizeof (mbstate));
   for (w = 0; n && (cl = mbrtowc (&wc, src, n, &mbstate)); src += cl, n -= cl)
   {
-    if (cl == (size_t)(-1) || cl == (size_t)(-2)) {
-      cw = cl = 1;
-      memset(&mbstate, 0, sizeof (mbstate));
-    }
-    else
+    if (cl == (size_t)(-1) || cl == (size_t)(-2))
     {
-      cw = wcwidth (wc);
-      /* hack because M_TREE symbols aren't turned into characters
-       * until rendered by print_enriched_string (#3364) */
-      if (cw < 0 && cl == 1 && src[0] && src[0] < M_TREE_MAX)
-       cw = 1;
-      else if (cw < 0)
-       cw = 0;                 /* unprintable wchar */
+      if (cl == (size_t)(-1))
+        memset (&mbstate, 0, sizeof (mbstate));
+      cl = (cl == (size_t)(-1)) ? 1 : n;
+      wc = replacement_char ();
     }
+    cw = wcwidth (wc);
+    /* hack because M_TREE symbols aren't turned into characters
+     * until rendered by print_enriched_string (#3364) */
+    if (cw < 0 && cl == 1 && src[0] && src[0] < M_TREE_MAX)
+      cw = 1;
+    else if (cw < 0)
+      cw = 0;                  /* unprintable wchar */
     if (cl + l > maxlen || cw + w > maxwid)
       break;
     l += cl;
index 33e514f73cf0e2580e1d25596c5f693afc3ae40d..8e5f7aa9d6ba86bdfb531680103eee1d40ca7ef9 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -356,7 +356,7 @@ int mutt_search_command (int, int);
 int mutt_smtp_send (const ADDRESS *, const ADDRESS *, const ADDRESS *,
                     const ADDRESS *, const char *, int);
 #endif
-int mutt_wstr_trunc (const char *, size_t, size_t, size_t *);
+size_t mutt_wstr_trunc (const char *, size_t, size_t, size_t *);
 int mutt_charlen (const char *s, int *);
 int mutt_strwidth (const char *);
 int mutt_compose_menu (HEADER *, char *, size_t, HEADER *, int);