From 455acb11a4e06f393a6258e735c372be0ce08ea1 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 14 May 2008 10:21:22 +0000 Subject: * 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. --- winsup/cygwin/strfuncs.cc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'winsup/cygwin/strfuncs.cc') 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 +#include #include #include #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; -- cgit v1.2.3