[libvirt PATCH 07/32] tools: replace wcwidth() with g_unichar_* APIs

Daniel P. Berrangé berrange at redhat.com
Thu Jan 23 11:43:00 UTC 2020


The combination of g_unichar_iszerowidth and
g_unichar_iswide is sufficient to replicate the logic
of wcwidth() for libvirt.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 tests/vshtabletest.c | 8 ++------
 tools/vsh-table.c    | 2 +-
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/tests/vshtabletest.c b/tests/vshtabletest.c
index f2e0554f0a..54498b8a5a 100644
--- a/tests/vshtabletest.c
+++ b/tests/vshtabletest.c
@@ -155,14 +155,12 @@ testUnicodeArabic(const void *opaque G_GNUC_UNUSED)
         " 1              ﻉﺪﻴﻟ ﺎﻠﺜﻘﻴﻟ ﻕﺎﻣ ﻊﻧ, ٣٠ ﻎﻴﻨﻳﺍ ﻮﺘﻧﺎﻤﺗ ﺎﻠﺛﺎﻠﺛ، ﺄﺳﺭ, ﺩﻮﻟ   ﺩﻮﻟ. ﺄﻣﺎﻣ ﺍ ﺎﻧ ﻲﻜﻧ\n"
         " ﺺﻔﺣﺓ           ﺖﻜﺘﻴﻛﺍً ﻊﻟ, ﺎﻠﺠﻧﻭﺩ ﻭﺎﻠﻌﺗﺍﺩ                              ﺵﺭ\n";
     vshTablePtr table;
-    wchar_t wc;
 
     /* If this char is not classed as printable, the actual
      * output won't match what this test expects. The code
      * is still operating correctly, but we have different
      * layout */
-    mbrtowc(&wc, "،", MB_CUR_MAX, NULL);
-    if (!iswprint(wc))
+    if (!g_unichar_isprint(g_utf8_get_char(",")))
         return EXIT_AM_SKIP;
 
     table = vshTableNew("ﻡﺍ ﻢﻣﺍ ﻕﺎﺌﻣﺓ", "ﺓ ﺎﻠﺼﻋ", "ﺍﻸﺜﻧﺎﻧ", NULL);
@@ -197,14 +195,12 @@ testUnicodeZeroWidthChar(const void *opaque G_GNUC_UNUSED)
         " 1\u200B    fedora28   run\u200Bning\n"
         " 2    rhel7.5    running\n";
     char *act = NULL;
-    wchar_t wc;
 
     /* If this char is not classed as printable, the actual
      * output won't match what this test expects. The code
      * is still operating correctly, but we have different
      * layout */
-    mbrtowc(&wc, "\u200B", MB_CUR_MAX, NULL);
-    if (!iswprint(wc))
+    if (!g_unichar_isprint(g_utf8_get_char("\u200B")))
         return EXIT_AM_SKIP;
 
     table = vshTableNew("I\u200Bd", "Name", "\u200BStatus", NULL);
diff --git a/tools/vsh-table.c b/tools/vsh-table.c
index a2365b2c32..e21514e86f 100644
--- a/tools/vsh-table.c
+++ b/tools/vsh-table.c
@@ -261,7 +261,7 @@ vshTableSafeEncode(const char *s, size_t *width)
             } else {
                 memcpy(buf, p, len);
                 buf += len;
-                *width += wcwidth(wc);
+                *width += g_unichar_iszerowidth(wc) ? 0 : (g_unichar_iswide(wc) ? 2 : 1);
             }
             p += len;
         }
-- 
2.24.1




More information about the libvir-list mailing list