summaryrefslogtreecommitdiff
path: root/src/w32.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2008-03-22 11:53:40 +0000
committerEli Zaretskii <eliz@gnu.org>2008-03-22 11:53:40 +0000
commitb07103dc2b17933e30e1500bce6f9a1471752cc7 (patch)
tree339b5727183d646e5e0724c46724b0ca611bfe74 /src/w32.c
parent51ec3f09e45ca399c95108b6e486535012640743 (diff)
downloademacs-b07103dc2b17933e30e1500bce6f9a1471752cc7.tar.gz
(readdir): If FindFirstFile/FindNextFile return in cFileName a file name that
includes `?' characters, use the 8+3 alias in cAlternateFileName instead.
Diffstat (limited to 'src/w32.c')
-rw-r--r--src/w32.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/w32.c b/src/w32.c
index 3107af8f4a1..24921687c9e 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -1889,6 +1889,8 @@ closedir (DIR *dirp)
struct direct *
readdir (DIR *dirp)
{
+ int downcase = !NILP (Vw32_downcase_file_names);
+
if (wnet_enum_handle != INVALID_HANDLE_VALUE)
{
if (!read_unc_volume (wnet_enum_handle,
@@ -1923,14 +1925,23 @@ readdir (DIR *dirp)
value returned by stat(). */
dir_static.d_ino = 1;
+ strcpy (dir_static.d_name, dir_find_data.cFileName);
+
+ /* If the file name in cFileName[] includes `?' characters, it means
+ the original file name used characters that cannot be represented
+ by the current ANSI codepage. To avoid total lossage, retrieve
+ the short 8+3 alias of the long file name. */
+ if (_mbspbrk (dir_static.d_name, "?"))
+ {
+ strcpy (dir_static.d_name, dir_find_data.cAlternateFileName);
+ downcase = 1; /* 8+3 aliases are returned in all caps */
+ }
+ dir_static.d_namlen = strlen (dir_static.d_name);
dir_static.d_reclen = sizeof (struct direct) - MAXNAMLEN + 3 +
dir_static.d_namlen - dir_static.d_namlen % 4;
-
- dir_static.d_namlen = strlen (dir_find_data.cFileName);
- strcpy (dir_static.d_name, dir_find_data.cFileName);
if (dir_is_fat)
_strlwr (dir_static.d_name);
- else if (!NILP (Vw32_downcase_file_names))
+ else if (downcase)
{
register char *p;
for (p = dir_static.d_name; *p; p++)