emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r111663: Avoid encoding file names ru


From: Eli Zaretskii
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r111663: Avoid encoding file names run through dostounix_filename on MS-Windows.
Date: Sat, 02 Feb 2013 19:14:24 +0200
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 111663
committer: Eli Zaretskii <address@hidden>
branch nick: trunk
timestamp: Sat 2013-02-02 19:14:24 +0200
message:
  Avoid encoding file names run through dostounix_filename on MS-Windows.
  
   src/w32.c (normalize_filename): Accept an additional argument
   MULTIBYTE; if non-zero, traverse the file name by bytes and don't
   downcase it even if w32-downcase-file-names is non-nil.
   (dostounix_filename): Accept an additional argument MULTIBYTE and
   pass it to normalize_filename.
   (emacs_root_dir): Adjust.
   src/msdos.h (dostounix_filename): Adjust prototype.
   src/w32.h (dostounix_filename): Adjust prototype.
   src/msdos.c (dostounix_filename): Accept an additional argument and
   ignore it.
   (init_environment): Adjust callers of dostounix_filename.
   src/fileio.c (Ffile_name_directory, file_name_as_directory)
   (directory_file_name, Fexpand_file_name)
   (Fsubstitute_in_file_name): [DOS_NT] Adjust call to
   dostounix_filename.
   [WINDOWSNT]: Downcase file names if w32-downcase-file-names is
   non-nil.
   (Fsubstitute_in_file_name): [DOS_NT] Don't downcase environment
   variables, as egetenv is case-insensitive for DOS_NT.
   src/dired.c (file_name_completion): Don't call Fdirectory_file_name
   with an encoded file name.
   src/w32proc.c (Fw32_short_file_name, Fw32_long_file_name): Adjust
   calls to dostounix_filename.
   src/w32fns.c (Fx_file_dialog): Adjust call to dostounix_filename.
   src/unexw32.c (unexec): Adjust call to dostounix_filename.
   src/termcap.c (tgetent) [MSDOS]: Adjust call to dostounix_filename.
   src/emacs.c (decode_env_path) [DOS_NT]: Adjust call to
   dostounix_filename.
   src/callproc.c (Fcall_process) [MSDOS]: Adjust call to
   dostounix_filename.
modified:
  src/ChangeLog
  src/callproc.c
  src/dired.c
  src/emacs.c
  src/fileio.c
  src/msdos.c
  src/msdos.h
  src/termcap.c
  src/unexw32.c
  src/w32.c
  src/w32.h
  src/w32fns.c
  src/w32proc.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-02-02 03:38:21 +0000
+++ b/src/ChangeLog     2013-02-02 17:14:24 +0000
@@ -1,5 +1,49 @@
 2013-02-02  Eli Zaretskii  <address@hidden>
 
+       Avoid encoding file names on MS-Windows when they need to be run
+       through dostounix_filename.
+       * w32.c (normalize_filename): Accept an additional argument
+       MULTIBYTE; if non-zero, traverse the file name by bytes and don't
+       downcase it even if w32-downcase-file-names is non-nil.
+       (dostounix_filename): Accept an additional argument MULTIBYTE and
+       pass it to normalize_filename.
+       (emacs_root_dir): Adjust.
+
+       * msdos.h (dostounix_filename): Adjust prototype.
+
+       * w32.h (dostounix_filename): Adjust prototype.
+
+       * msdos.c (dostounix_filename): Accept an additional argument and
+       ignore it.
+       (init_environment): Adjust callers of dostounix_filename.
+
+       * fileio.c (Ffile_name_directory, file_name_as_directory)
+       (directory_file_name, Fexpand_file_name)
+       (Fsubstitute_in_file_name): [DOS_NT] Adjust call to
+       dostounix_filename.
+       [WINDOWSNT]: Downcase file names if w32-downcase-file-names is
+       non-nil.
+       (Fsubstitute_in_file_name): [DOS_NT] Don't downcase environment
+       variables, as egetenv is case-insensitive for DOS_NT.
+
+       * dired.c (file_name_completion): Don't call Fdirectory_file_name
+       with an encoded file name.
+
+       * w32proc.c (Fw32_short_file_name, Fw32_long_file_name): Adjust
+       calls to dostounix_filename.
+
+       * w32fns.c (Fx_file_dialog): Adjust call to dostounix_filename.
+
+       * unexw32.c (unexec): Adjust call to dostounix_filename.
+
+       * termcap.c (tgetent) [MSDOS]: Adjust call to dostounix_filename.
+
+       * emacs.c (decode_env_path) [DOS_NT]: Adjust call to
+       dostounix_filename.
+
+       * callproc.c (Fcall_process) [MSDOS]: Adjust call to
+       dostounix_filename.
+
        * callproc.c (Fcall_process): Make sure program name in PATH and
        new_argv[0] is encoded, if needed.  Otherwise, un-encoded string
        is passed to exec/spawnve, which fails unless the file-name

=== modified file 'src/callproc.c'
--- a/src/callproc.c    2013-02-02 03:38:21 +0000
+++ b/src/callproc.c    2013-02-02 17:14:24 +0000
@@ -487,7 +487,7 @@
          tempfile = alloca (20);
          *tempfile = '\0';
        }
-      dostounix_filename (tempfile);
+      dostounix_filename (tempfile, 0);
       if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/')
        strcat (tempfile, "/");
       strcat (tempfile, "detmp.XXX");

=== modified file 'src/dired.c'
--- a/src/dired.c       2013-02-01 06:30:51 +0000
+++ b/src/dired.c       2013-02-02 17:14:24 +0000
@@ -484,9 +484,9 @@
      on the encoded file name.  */
   encoded_file = STRING_MULTIBYTE (file) ? ENCODE_FILE (file) : file;
 
-  encoded_dir = ENCODE_FILE (dirname);
+  encoded_dir = ENCODE_FILE (Fdirectory_file_name (dirname));
 
-  d = open_directory (SSDATA (Fdirectory_file_name (encoded_dir)), &fd);
+  d = open_directory (SSDATA (encoded_dir), &fd);
   if (!d)
     report_file_error ("Opening directory", Fcons (dirname, Qnil));
 

=== modified file 'src/emacs.c'
--- a/src/emacs.c       2013-01-22 07:48:59 +0000
+++ b/src/emacs.c       2013-02-02 17:14:24 +0000
@@ -2152,7 +2152,7 @@
     {
       char *path_copy = alloca (strlen (path) + 1);
       strcpy (path_copy, path);
-      dostounix_filename (path_copy);
+      dostounix_filename (path_copy, 0);
       path = path_copy;
     }
 #endif

=== modified file 'src/fileio.c'
--- a/src/fileio.c      2013-02-01 20:51:12 +0000
+++ b/src/fileio.c      2013-02-02 17:14:24 +0000
@@ -383,11 +383,13 @@
 
       if (getdefdir (c_toupper (*beg) - 'A' + 1, r))
        {
-         if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
+         size_t l = strlen (res);
+
+         if (l > 3 || !IS_DIRECTORY_SEP (res[l - 1]))
            strcat (res, "/");
          beg = res;
          p = beg + strlen (beg);
-         dostounix_filename (beg);
+         dostounix_filename (beg, 0);
          tem_fn = make_specified_string (beg, -1, p - beg,
                                          STRING_MULTIBYTE (filename));
        }
@@ -397,13 +399,16 @@
     }
   else if (STRING_MULTIBYTE (filename))
     {
-      tem_fn = ENCODE_FILE (make_specified_string (beg, -1, p - beg, 1));
-      dostounix_filename (SSDATA (tem_fn));
-      tem_fn = DECODE_FILE (tem_fn);
+      tem_fn = make_specified_string (beg, -1, p - beg, 1);
+      dostounix_filename (SSDATA (tem_fn), 1);
+#ifdef WINDOWSNT
+      if (!NILP (Vw32_downcase_file_names))
+       tem_fn = Fdowncase (tem_fn);
+#endif
     }
   else
     {
-      dostounix_filename (beg);
+      dostounix_filename (beg, 0);
       tem_fn = make_specified_string (beg, -1, p - beg, 0);
     }
   return tem_fn;
@@ -507,17 +512,7 @@
       srclen++;
     }
 #ifdef DOS_NT
-  if (multibyte)
-    {
-      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);
-    }
-  else
-    dostounix_filename (dst);
+  dostounix_filename (dst, multibyte);
 #endif
   return srclen;
 }
@@ -552,6 +547,10 @@
       error ("Invalid handler in `file-name-handler-alist'");
     }
 
+#ifdef WINDOWSNT
+  if (!NILP (Vw32_downcase_file_names))
+    file = Fdowncase (file);
+#endif
   buf = alloca (SBYTES (file) + 10);
   length = file_name_as_directory (buf, SSDATA (file), SBYTES (file),
                                   STRING_MULTIBYTE (file));
@@ -580,17 +579,7 @@
       srclen--;
     }
 #ifdef DOS_NT
-  if (multibyte)
-    {
-      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);
-    }
-  else
-    dostounix_filename (dst);
+  dostounix_filename (dst, multibyte);
 #endif
   return srclen;
 }
@@ -625,6 +614,10 @@
       error ("Invalid handler in `file-name-handler-alist'");
     }
 
+#ifdef WINDOWSNT
+  if (!NILP (Vw32_downcase_file_names))
+    directory = Fdowncase (directory);
+#endif
   buf = alloca (SBYTES (directory) + 20);
   length = directory_file_name (buf, SSDATA (directory), SBYTES (directory),
                                STRING_MULTIBYTE (directory));
@@ -925,6 +918,11 @@
        }
     }
 
+#ifdef WINDOWSNT
+  if (!NILP (Vw32_downcase_file_names))
+    default_directory = Fdowncase (default_directory);
+#endif
+
   /* Make a local copy of nm[] to protect it from GC in DECODE_FILE below.  */
   nm = alloca (SBYTES (name) + 1);
   memcpy (nm, SSDATA (name), SBYTES (name) + 1);
@@ -1008,18 +1006,7 @@
 #ifdef DOS_NT
          /* Make sure directories are all separated with /, but
             avoid allocation of a new string when not required. */
-         if (multibyte)
-           {
-             Lisp_Object tem_name = make_specified_string (nm, -1, strlen (nm),
-                                                           multibyte);
-
-             tem_name = ENCODE_FILE (tem_name);
-             dostounix_filename (SSDATA (tem_name));
-             tem_name = DECODE_FILE (tem_name);
-             memcpy (nm, SSDATA (tem_name), SBYTES (tem_name) + 1);
-           }
-         else
-           dostounix_filename (nm);
+         dostounix_filename (nm, multibyte);
 #ifdef WINDOWSNT
          if (IS_DIRECTORY_SEP (nm[1]))
            {
@@ -1037,6 +1024,10 @@
              temp[0] = DRIVE_LETTER (drive);
              name = concat2 (build_string (temp), name);
            }
+#ifdef WINDOWSNT
+         if (!NILP (Vw32_downcase_file_names))
+           name = Fdowncase (name);
+#endif
          return name;
 #else /* not DOS_NT */
          if (strcmp (nm, SSDATA (name)) == 0)
@@ -1400,14 +1391,11 @@
        target[1] = ':';
       }
     result = make_specified_string (target, -1, o - target, multibyte);
-    if (multibyte)
-      {
-       result = ENCODE_FILE (result);
-       dostounix_filename (SSDATA (result));
-       result = DECODE_FILE (result);
-      }
-    else
-      dostounix_filename (SSDATA (result));
+    dostounix_filename (SSDATA (result), multibyte);
+#ifdef WINDOWSNT
+    if (!NILP (Vw32_downcase_file_names))
+      result = Fdowncase (result);
+#endif
 #else  /* !DOS_NT */
     result = make_specified_string (target, -1, o - target, multibyte);
 #endif /* !DOS_NT */
@@ -1689,24 +1677,8 @@
   memcpy (nm, SDATA (filename), SBYTES (filename) + 1);
 
 #ifdef DOS_NT
-  if (multibyte)
-    {
-      Lisp_Object encoded_filename = ENCODE_FILE (filename);
-      Lisp_Object tem_fn;
-
-      dostounix_filename (SDATA (encoded_filename));
-      tem_fn = DECODE_FILE (encoded_filename);
-      nm = alloca (SBYTES (tem_fn) + 1);
-      memcpy (nm, SDATA (tem_fn), SBYTES (tem_fn) + 1);
-      substituted = (memcmp (nm, SDATA (filename), SBYTES (filename)) != 0);
-      if (substituted)
-       filename = tem_fn;
-    }
-  else
-    {
-      dostounix_filename (nm);
-      substituted = (memcmp (nm, SDATA (filename), SBYTES (filename)) != 0);
-    }
+  dostounix_filename (nm, multibyte);
+  substituted = (memcmp (nm, SDATA (filename), SBYTES (filename)) != 0);
 #endif
   endp = nm + SBYTES (filename);
 
@@ -1780,7 +1752,13 @@
       }
 
   if (!substituted)
-    return filename;
+    {
+#ifdef WINDOWSNT
+      if (!NILP (Vw32_downcase_file_names))
+       filename = Fdowncase (filename);
+#endif
+      return filename;
+    }
 
   /* If substitution required, recopy the string and do it.  */
   /* Make space in stack frame for the new copy.  */
@@ -1819,9 +1797,6 @@
        target = alloca (s - o + 1);
        memcpy (target, o, s - o);
        target[s - o] = 0;
-#ifdef DOS_NT
-       strupr (target); /* $home == $HOME etc.  */
-#endif /* DOS_NT */
 
        /* Get variable value.  */
        o = egetenv (target);
@@ -1858,6 +1833,16 @@
        need to quote some $ to $$ first.  */
     xnm = p;
 
+#ifdef WINDOWSNT
+  if (!NILP (Vw32_downcase_file_names))
+    {
+      Lisp_Object xname = make_specified_string (xnm, -1, x - xnm, multibyte);
+
+      xname = Fdowncase (xname);
+      return xname;
+    }
+  else
+#endif
   return make_specified_string (xnm, -1, x - xnm, multibyte);
 
  badsubst:

=== modified file 'src/msdos.c'
--- a/src/msdos.c       2013-01-02 16:13:04 +0000
+++ b/src/msdos.c       2013-02-02 17:14:24 +0000
@@ -3339,7 +3339,7 @@
 /* Destructively turn backslashes into slashes.  */
 
 void
-dostounix_filename (char *p)
+dostounix_filename (char *p, int ignore)
 {
   msdos_downcase_filename (p);
 
@@ -3603,7 +3603,7 @@
   if (!s) s = "c:/command.com";
   t = alloca (strlen (s) + 1);
   strcpy (t, s);
-  dostounix_filename (t);
+  dostounix_filename (t, 0);
   setenv ("SHELL", t, 0);
 
   /* PATH is also downcased and backslashes mirrored.  */
@@ -3613,7 +3613,7 @@
   /* Current directory is always considered part of MsDos's path but it is
      not normally mentioned.  Now it is.  */
   strcat (strcpy (t, ".;"), s);
-  dostounix_filename (t); /* Not a single file name, but this should work.  */
+  dostounix_filename (t, 0); /* Not a single file name, but this should work.  
*/
   setenv ("PATH", t, 1);
 
   /* In some sense all dos users have root privileges, so...  */

=== modified file 'src/msdos.h'
--- a/src/msdos.h       2013-01-01 09:11:05 +0000
+++ b/src/msdos.h       2013-02-02 17:14:24 +0000
@@ -29,7 +29,7 @@
 
 int getdefdir (int, char*);
 void unixtodos_filename (char *);
-void dostounix_filename (char *);
+void dostounix_filename (char *, int);
 char *rootrelativepath (char *);
 void init_environment (int, char **, int);
 void internal_terminal_init (void);

=== modified file 'src/termcap.c'
--- a/src/termcap.c     2013-01-01 09:11:05 +0000
+++ b/src/termcap.c     2013-02-02 17:14:24 +0000
@@ -393,7 +393,7 @@
   if (termcap_name && (*termcap_name == '\\'
                       || *termcap_name == '/'
                       || termcap_name[1] == ':'))
-    dostounix_filename (termcap_name);
+    dostounix_filename (termcap_name, 0);
 #endif
 
   filep = termcap_name && valid_filename_p (termcap_name);

=== modified file 'src/unexw32.c'
--- a/src/unexw32.c     2013-01-02 16:13:04 +0000
+++ b/src/unexw32.c     2013-02-02 17:14:24 +0000
@@ -722,7 +722,7 @@
   /* Ignore old_name, and get our actual location from the OS.  */
   if (!GetModuleFileName (NULL, in_filename, MAX_PATH))
     abort ();
-  dostounix_filename (in_filename);
+  dostounix_filename (in_filename, 0);
   strcpy (out_filename, in_filename);
 
   /* Change the base of the output filename to match the requested name.  */

=== modified file 'src/w32.c'
--- a/src/w32.c 2013-02-02 06:04:06 +0000
+++ b/src/w32.c 2013-02-02 17:14:24 +0000
@@ -1598,12 +1598,17 @@
    case path name components to lower case.  */
 
 static void
-normalize_filename (register char *fp, char path_sep)
+normalize_filename (register char *fp, char path_sep, int multibyte)
 {
   char sep;
   char *elem, *p2;
   int dbcs_p = max_filename_mbslen () > 1;
 
+  /* Multibyte file names are in the Emacs internal representation, so
+     we can traverse them by bytes with no problems.  */
+  if (multibyte)
+    dbcs_p = 0;
+
   /* Always lower-case drive letters a-z, even if the filesystem
      preserves case in filenames.
      This is so filenames can be compared by string comparison
@@ -1620,7 +1625,7 @@
       fp += 2;
     }
 
-  if (NILP (Vw32_downcase_file_names))
+  if (multibyte || NILP (Vw32_downcase_file_names))
     {
       while (*fp)
        {
@@ -1668,18 +1673,20 @@
   } while (*fp);
 }
 
-/* Destructively turn backslashes into slashes.  */
+/* Destructively turn backslashes into slashes.  MULTIBYTE non-zero
+   means the file name is a multibyte string in Emacs's internal
+   representation.  */
 void
-dostounix_filename (register char *p)
+dostounix_filename (register char *p, int multibyte)
 {
-  normalize_filename (p, '/');
+  normalize_filename (p, '/', multibyte);
 }
 
 /* Destructively turn slashes into backslashes.  */
 void
 unixtodos_filename (register char *p)
 {
-  normalize_filename (p, '\\');
+  normalize_filename (p, '\\', 0);
 }
 
 /* Remove all CR's that are followed by a LF.
@@ -2222,7 +2229,7 @@
     emacs_abort ();
   strcpy (root_dir, p);
   root_dir[parse_root (root_dir, NULL)] = '\0';
-  dostounix_filename (root_dir);
+  dostounix_filename (root_dir, 0);
   return root_dir;
 }
 

=== modified file 'src/w32.h'
--- a/src/w32.h 2013-01-02 16:13:04 +0000
+++ b/src/w32.h 2013-02-02 17:14:24 +0000
@@ -180,7 +180,7 @@
 extern void check_windows_init_file (void);
 extern void syms_of_ntproc (void);
 extern void syms_of_ntterm (void);
-extern void dostounix_filename (register char *);
+extern void dostounix_filename (register char *, int);
 extern void unixtodos_filename (register char *);
 extern BOOL init_winsock (int load_now);
 extern void srandom (int);

=== modified file 'src/w32fns.c'
--- a/src/w32fns.c      2013-01-24 05:41:28 +0000
+++ b/src/w32fns.c      2013-02-02 17:14:24 +0000
@@ -6254,7 +6254,7 @@
             /* we get one of the two final 0 bytes for free. */
             1 + sizeof (wchar_t) * wcslen (filename_buf)));
 #else /* !NTGUI_UNICODE */
-        dostounix_filename (filename_buf);
+        dostounix_filename (filename_buf, 0);
         filename = DECODE_FILE (build_string (filename_buf));
 #endif /* NTGUI_UNICODE */
 

=== modified file 'src/w32proc.c'
--- a/src/w32proc.c     2013-02-02 03:38:21 +0000
+++ b/src/w32proc.c     2013-02-02 17:14:24 +0000
@@ -2558,8 +2558,9 @@
   if (GetShortPathName (SDATA (ENCODE_FILE (filename)), shortname, MAX_PATH) 
== 0)
     return Qnil;
 
-  dostounix_filename (shortname);
+  dostounix_filename (shortname, 0);
 
+  /* No need to DECODE_FILE, because 8.3 names are pure ASCII.   */
   return build_string (shortname);
 }
 
@@ -2586,7 +2587,7 @@
   if (!w32_get_long_filename (SDATA (ENCODE_FILE (filename)), longname, 
MAX_PATH))
     return Qnil;
 
-  dostounix_filename (longname);
+  dostounix_filename (longname, 0);
 
   /* If we were passed only a drive, make sure that a slash is not appended
      for consistency with directories.  Allow for drive mapping via SUBST


reply via email to

[Prev in Thread] Current Thread [Next in Thread]