[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 <rrakus@redhat.com>
---
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