summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/strfuncs.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-05-14 10:21:22 +0000
committerCorinna Vinschen <corinna@vinschen.de>2008-05-14 10:21:22 +0000
commit455acb11a4e06f393a6258e735c372be0ce08ea1 (patch)
treef5ae43d28fbb9a004c46351d712fd55e52089e07 /winsup/cygwin/strfuncs.cc
parent39ce0b45e94ae9db46608b4fe4eaf83b1c6b9a0f (diff)
downloadcygnal-455acb11a4e06f393a6258e735c372be0ce08ea1.tar.gz
cygnal-455acb11a4e06f393a6258e735c372be0ce08ea1.tar.bz2
cygnal-455acb11a4e06f393a6258e735c372be0ce08ea1.zip
* fhandler_disk_file.cc (fhandler_disk_file::readdir_helper): Drop
explicit transformation of special DOS chars. * strfuncs.cc (sys_wcstombs): Always transform UNICODE private use area back to ASCII.
Diffstat (limited to 'winsup/cygwin/strfuncs.cc')
-rw-r--r--winsup/cygwin/strfuncs.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/winsup/cygwin/strfuncs.cc b/winsup/cygwin/strfuncs.cc
index 5b05cc962..8c0bbb241 100644
--- a/winsup/cygwin/strfuncs.cc
+++ b/winsup/cygwin/strfuncs.cc
@@ -11,6 +11,7 @@ details. */
#include "winsup.h"
#include <stdlib.h>
+#include <wchar.h>
#include <winnls.h>
#include <ntdll.h>
#include "cygerrno.h"
@@ -39,7 +40,18 @@ sys_wcstombs (char *tgt, int tlen, const PWCHAR src, int slen)
{
int ret;
- ret = WideCharToMultiByte (get_cp (), 0, src, slen, tgt, tlen, NULL, NULL);
+ /* Convert UNICODE private use area. Reverse functionality (only for
+ path names) is transform_chars in path.cc. */
+ if (slen < 0)
+ slen = wcslen (src) + 1;
+ WCHAR sbuf[slen];
+ memcpy (sbuf, src, slen * sizeof (WCHAR));
+ const unsigned char *end = (unsigned char *) (sbuf + slen);
+ for (unsigned char *s = ((unsigned char *) sbuf) + 1; s < end;
+ s += sizeof (WCHAR))
+ if (*s == 0xf0)
+ *s = 0;
+ ret = WideCharToMultiByte (get_cp (), 0, sbuf, slen, tgt, tlen, NULL, NULL);
if (ret && tgt)
{
ret = (ret < tlen) ? ret : tlen - 1;