diff options
| author | Eli Zaretskii | 2013-01-25 12:27:16 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2013-01-25 12:27:16 +0200 |
| commit | 69bb66c12e42e8196cdf440b83e367635f901bff (patch) | |
| tree | f2f8bf4358723ce75f39008288950bb110638c5e | |
| parent | d8cd7742b31178d670a677debb851b961c0464da (diff) | |
| download | emacs-69bb66c12e42e8196cdf440b83e367635f901bff.tar.gz emacs-69bb66c12e42e8196cdf440b83e367635f901bff.zip | |
w32.c (readlink): Support DBCS codepages.
| -rw-r--r-- | src/ChangeLog | 2 | ||||
| -rw-r--r-- | src/w32.c | 24 |
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 @@ | |||
| 1 | 2013-01-25 Eli Zaretskii <eliz@gnu.org> | 1 | 2013-01-25 Eli Zaretskii <eliz@gnu.org> |
| 2 | 2 | ||
| 3 | * w32.c (readlink): Support DBCS codepages. | ||
| 4 | |||
| 3 | * w32notify.c (Fw32notify_add_watch): Doc fix. (Bug#13540) | 5 | * w32notify.c (Fw32notify_add_watch): Doc fix. (Bug#13540) |
| 4 | 6 | ||
| 5 | 2013-01-25 Dmitry Antipov <dmantipov@yandex.ru> | 7 | 2013-01-25 Dmitry Antipov <dmantipov@yandex.ru> |
| @@ -4639,18 +4639,34 @@ readlink (const char *name, char *buf, size_t buf_size) | |||
| 4639 | else | 4639 | else |
| 4640 | { | 4640 | { |
| 4641 | size_t size_to_copy = buf_size; | 4641 | size_t size_to_copy = buf_size; |
| 4642 | BYTE *p = lname; | 4642 | BYTE *p = lname, *p2; |
| 4643 | BYTE *pend = p + lname_len; | 4643 | BYTE *pend = p + lname_len; |
| 4644 | int dbcs_p = max_filename_mbslen () > 1; | ||
| 4644 | 4645 | ||
| 4645 | /* Normalize like dostounix_filename does, but we don't | 4646 | /* Normalize like dostounix_filename does, but we don't |
| 4646 | want to assume that lname is null-terminated. */ | 4647 | want to assume that lname is null-terminated. */ |
| 4647 | if (*p && p[1] == ':' && *p >= 'A' && *p <= 'Z') | 4648 | if (dbcs_p) |
| 4648 | *p += 'a' - 'A'; | 4649 | p2 = CharNextExA (file_name_codepage, p, 0); |
| 4650 | else | ||
| 4651 | p2 = p + 1; | ||
| 4652 | if (*p && *p2 == ':' && *p >= 'A' && *p <= 'Z') | ||
| 4653 | { | ||
| 4654 | *p += 'a' - 'A'; | ||
| 4655 | p += 2; | ||
| 4656 | } | ||
| 4649 | while (p <= pend) | 4657 | while (p <= pend) |
| 4650 | { | 4658 | { |
| 4651 | if (*p == '\\') | 4659 | if (*p == '\\') |
| 4652 | *p = '/'; | 4660 | *p = '/'; |
| 4653 | ++p; | 4661 | if (dbcs_p) |
| 4662 | { | ||
| 4663 | p = CharNextExA (file_name_codepage, p, 0); | ||
| 4664 | /* CharNextExA doesn't advance at null character. */ | ||
| 4665 | if (!*p) | ||
| 4666 | break; | ||
| 4667 | } | ||
| 4668 | else | ||
| 4669 | ++p; | ||
| 4654 | } | 4670 | } |
| 4655 | /* Testing for null-terminated LNAME is paranoia: | 4671 | /* Testing for null-terminated LNAME is paranoia: |
| 4656 | WideCharToMultiByte should always return a | 4672 | WideCharToMultiByte should always return a |