]> code.delx.au - gnu-emacs/commitdiff
Fix another instance of bug #12933 with non-ASCII file names on Windows.
authorEli Zaretskii <eliz@gnu.org>
Tue, 4 Dec 2012 18:48:01 +0000 (20:48 +0200)
committerEli Zaretskii <eliz@gnu.org>
Tue, 4 Dec 2012 18:48:01 +0000 (20:48 +0200)
 src/fileio.c (file_name_as_directory, directory_file_name) [DOS_NT]:
 Encode the file name before passing it to dostounix_filename, in
 case it will downcase it (under w32-downcase-file-names).

src/ChangeLog
src/fileio.c

index d3d6d3969c8a6f70ea6eed6c37472b156b6648c2..6d2cd720672cbc75e2f5cf776eea348a097955be 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-04  Eli Zaretskii  <eliz@gnu.org>
+
+       * fileio.c (file_name_as_directory, directory_file_name) [DOS_NT]:
+       Encode the file name before passing it to dostounix_filename, in
+       case it will downcase it (under w32-downcase-file-names).
+       (Bug#12933)
+
 2012-12-01  Chong Yidong  <cyd@gnu.org>
 
        * fileio.c (Vauto_save_list_file_name): Doc fix.
index 490116dbc5cd1f014453ac84beeb5e12940c29e3..77700ff5a5f82edac66287e6768b86162600d4f0 100644 (file)
@@ -455,7 +455,7 @@ get a current directory to run processes in.  */)
 
 /* Convert from file name SRC of length SRCLEN to directory name
    in DST.  On UNIX, just make sure there is a terminating /.
-   Return the length of DST.  */
+   Return the length of DST in bytes.  */
 
 static ptrdiff_t
 file_name_as_directory (char *dst, const char *src, ptrdiff_t srclen)
@@ -477,7 +477,14 @@ file_name_as_directory (char *dst, const char *src, ptrdiff_t srclen)
       srclen++;
     }
 #ifdef DOS_NT
-  dostounix_filename (dst);
+  {
+    Lisp_Object tem_fn = make_specified_string (dst, -1, srclen, 1);
+
+    tem_fn = ENCODE_FILE (tem_fn);
+    dostounix_filename (SSDATA (tem_fn));
+    tem_fn = DECODE_FILE (tem_fn);
+    memcpy (dst, SSDATA (tem_fn), (srclen = SBYTES (tem_fn)) + 1);
+  }
 #endif
   return srclen;
 }
@@ -519,7 +526,7 @@ For a Unix-syntax file name, just appends a slash.  */)
 \f
 /* Convert from directory name SRC of length SRCLEN to
    file name in DST.  On UNIX, just make sure there isn't
-   a terminating /.  Return the length of DST.  */
+   a terminating /.  Return the length of DST in bytes.  */
 
 static ptrdiff_t
 directory_file_name (char *dst, char *src, ptrdiff_t srclen)
@@ -538,7 +545,14 @@ directory_file_name (char *dst, char *src, ptrdiff_t srclen)
       srclen--;
     }
 #ifdef DOS_NT
-  dostounix_filename (dst);
+  {
+    Lisp_Object tem_fn = make_specified_string (dst, -1, srclen, 1);
+
+    tem_fn = ENCODE_FILE (tem_fn);
+    dostounix_filename (SSDATA (tem_fn));
+    tem_fn = DECODE_FILE (tem_fn);
+    memcpy (dst, SSDATA (tem_fn), (srclen = SBYTES (tem_fn)) + 1);
+  }
 #endif
   return srclen;
 }