bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] Multibyte support for ansic_quote() function


From: Roman Rakus
Subject: [PATCH 2/2] Multibyte support for ansic_quote() function
Date: Tue, 16 Aug 2011 15:42:39 +0200

Correctly check for printable characters using wchar_t* and iswprint().

Signed-off-by: Roman Rakus <address@hidden>
---
 bash-4.2/lib/sh/strtrans.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/bash-4.2/lib/sh/strtrans.c b/bash-4.2/lib/sh/strtrans.c
index 57f9af0..a31bff0 100644
--- a/bash-4.2/lib/sh/strtrans.c
+++ b/bash-4.2/lib/sh/strtrans.c
@@ -212,6 +212,11 @@ ansic_quote (str, flags, rlen)
   if (str == 0 || *str == 0)
     return ((char *)0);
 
+#if defined (HANDLE_MULTIBYTE)
+  wchar_t wcc;
+  size_t wc_len;
+#endif
+
   l = strlen (str);
   rsize = 4 * l + 4;
   r = ret = (char *)xmalloc (rsize);
@@ -222,6 +227,9 @@ ansic_quote (str, flags, rlen)
   for (s = str, l = 0; *s; s++)
     {
       c = *s;
+#if defined (HANDLE_MULTIBYTE)
+      wc_len = 1;
+#endif
       l = 1;           /* 1 == add backslash; 0 == no backslash */
       switch (c)
        {
@@ -243,7 +251,12 @@ ansic_quote (str, flags, rlen)
        case '\'':
          break;
        default:
+#if defined (HANDLE_MULTIBYTE)
+          wc_len = mbrtowc(&wcc, s, MB_CUR_MAX, NULL);
+          if ((int)wc_len < 0 || iswprint(wcc) == 0)
+#else
          if (ISPRINT (c) == 0)
+#endif
            {
              *r++ = '\\';
              *r++ = TOCHAR ((c >> 6) & 07);
@@ -256,7 +269,12 @@ ansic_quote (str, flags, rlen)
        }
       if (l)
        *r++ = '\\';
+#if defined (HANDLE_MULTIBYTE)
+      for (; (int)wc_len > 0; wc_len--, c = wc_len ? *++s : c)
+          *r++ = c;
+#else
       *r++ = c;
+#endif
     }
 
   *r++ = '\'';
-- 
1.7.6




reply via email to

[Prev in Thread] Current Thread [Next in Thread]