summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2013-01-25 12:27:16 +0200
committerEli Zaretskii <eliz@gnu.org>2013-01-25 12:27:16 +0200
commit69bb66c12e42e8196cdf440b83e367635f901bff (patch)
treef2f8bf4358723ce75f39008288950bb110638c5e
parentd8cd7742b31178d670a677debb851b961c0464da (diff)
downloademacs-69bb66c12e42e8196cdf440b83e367635f901bff.tar.gz
emacs-69bb66c12e42e8196cdf440b83e367635f901bff.tar.bz2
emacs-69bb66c12e42e8196cdf440b83e367635f901bff.zip
w32.c (readlink): Support DBCS codepages.
-rw-r--r--src/ChangeLog2
-rw-r--r--src/w32.c24
2 files changed, 22 insertions, 4 deletions
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 <eliz@gnu.org>
+ * w32.c (readlink): Support DBCS codepages.
+
* w32notify.c (Fw32notify_add_watch): Doc fix. (Bug#13540)
2013-01-25 Dmitry Antipov <dmantipov@yandex.ru>
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