From: Eli Zaretskii Date: Fri, 25 Jan 2013 10:27:16 +0000 (+0200) Subject: w32.c (readlink): Support DBCS codepages. X-Git-Tag: emacs-24.3.90~173^2~7^2~220 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=69bb66c12e42e8196cdf440b83e367635f901bff;p=emacs.git w32.c (readlink): Support DBCS codepages. --- diff --git a/src/ChangeLog b/src/ChangeLog index c6152668a22..66eb75adca7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,7 @@ 2013-01-25 Eli Zaretskii + * w32.c (readlink): Support DBCS codepages. + * w32notify.c (Fw32notify_add_watch): Doc fix. (Bug#13540) 2013-01-25 Dmitry Antipov diff --git a/src/w32.c b/src/w32.c index f722bc5f397..dc9233ee001 100644 --- a/src/w32.c +++ b/src/w32.c @@ -4639,18 +4639,34 @@ readlink (const char *name, char *buf, size_t buf_size) else { size_t size_to_copy = buf_size; - BYTE *p = lname; + BYTE *p = lname, *p2; BYTE *pend = p + lname_len; + int dbcs_p = max_filename_mbslen () > 1; /* Normalize like dostounix_filename does, but we don't want to assume that lname is null-terminated. */ - if (*p && p[1] == ':' && *p >= 'A' && *p <= 'Z') - *p += 'a' - 'A'; + if (dbcs_p) + p2 = CharNextExA (file_name_codepage, p, 0); + else + p2 = p + 1; + if (*p && *p2 == ':' && *p >= 'A' && *p <= 'Z') + { + *p += 'a' - 'A'; + p += 2; + } while (p <= pend) { if (*p == '\\') *p = '/'; - ++p; + if (dbcs_p) + { + p = CharNextExA (file_name_codepage, p, 0); + /* CharNextExA doesn't advance at null character. */ + if (!*p) + break; + } + else + ++p; } /* Testing for null-terminated LNAME is paranoia: WideCharToMultiByte should always return a