diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-05-14 10:21:22 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-05-14 10:21:22 +0000 |
commit | 455acb11a4e06f393a6258e735c372be0ce08ea1 (patch) | |
tree | f5ae43d28fbb9a004c46351d712fd55e52089e07 /winsup/cygwin/strfuncs.cc | |
parent | 39ce0b45e94ae9db46608b4fe4eaf83b1c6b9a0f (diff) | |
download | cygnal-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.cc | 14 |
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; |