]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fexpand_file_name): Decode home directory names.
authorJason Rumney <jasonr@gnu.org>
Wed, 5 Mar 2008 00:20:52 +0000 (00:20 +0000)
committerJason Rumney <jasonr@gnu.org>
Wed, 5 Mar 2008 00:20:52 +0000 (00:20 +0000)
(Fsubstitute_in_file_name): Decode substituted variables.

src/ChangeLog
src/fileio.c

index 6da585c7a1b9da8231c778306ed5fdd65a41cd9e..c6b17b1cb2025a4eb7290df208493a483ca7b9f8 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-05  Jason Rumney  <jasonr@gnu.org>
+
+       * fileio.c (Fexpand_file_name): Decode home directory names.
+       (Fsubstitute_in_file_name): Decode substituted variables.
+
 2008-03-03  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * xdisp.c (handle_single_display_spec): Undo 2007-10-16 changes.
index c5bff5b8153b7ce49d5fd84152e1c3ab8865132f..d869bb0b2b6766d4de51c4d7a1b105b9618d3941 100644 (file)
@@ -1408,6 +1408,19 @@ See also the function `substitute-in-file-name'.  */)
        }
     }
 
+  /* Environment variables and pwnam entries may need decoding.  */
+  if (newdir)
+    {
+      Lisp_Object orig, decoded;
+      orig = make_unibyte_string (newdir, strlen (newdir));
+      decoded = DECODE_FILE (orig);
+      if (decoded != orig)
+        {
+          newdir = SDATA (decoded);
+          multibyte = 1;
+        }
+    }
+
 #ifdef DOS_NT
   /* On DOS and Windows, nm is absolute if a drive name was specified;
      use the drive's current directory as the prefix if needed.  */
@@ -2149,11 +2162,14 @@ duplicates what `expand-file-name' does.  */)
   unsigned char *target = NULL;
   int total = 0;
   int substituted = 0;
+  int multibyte;
   unsigned char *xnm;
   Lisp_Object handler;
 
   CHECK_STRING (filename);
 
+  multibyte = STRING_MULTIBYTE (filename);
+
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
   handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
@@ -2175,8 +2191,7 @@ duplicates what `expand-file-name' does.  */)
        again.  Important with filenames like "/home/foo//:/hello///there"
        which whould substitute to "/:/hello///there" rather than "/there".  */
     return Fsubstitute_in_file_name
-      (make_specified_string (p, -1, endp - p,
-                             STRING_MULTIBYTE (filename)));
+      (make_specified_string (p, -1, endp - p, multibyte));
 
 #ifdef VMS
   return filename;
@@ -2227,7 +2242,10 @@ duplicates what `expand-file-name' does.  */)
        o = (unsigned char *) egetenv (target);
        if (o)
          {
-           total += strlen (o);
+            Lisp_Object orig, decoded;
+            orig = make_unibyte_string (o, strlen (o));
+            decoded = DECODE_FILE (orig);
+           total += SBYTES (decoded);
            substituted = 1;
          }
        else if (*p == '}')
@@ -2285,21 +2303,26 @@ duplicates what `expand-file-name' does.  */)
            *x++ = '$';
            strcpy (x, target); x+= strlen (target);
          }
-       else if (STRING_MULTIBYTE (filename))
+       else
          {
-           /* If the original string is multibyte,
-              convert what we substitute into multibyte.  */
-           while (*o)
-             {
-               int c = unibyte_char_to_multibyte (*o++);
-               x += CHAR_STRING (c, x);
-             }
+            Lisp_Object orig, decoded;
+            orig = make_unibyte_string (o, strlen (o));
+            decoded = DECODE_FILE (orig);
+            strncpy (x, SDATA (decoded), SBYTES (decoded));
+            x += SBYTES (decoded);
+
+            /* If environment variable needed decoding, return value
+               needs to be multibyte.  */
+            if (decoded != orig)
+              multibyte = 1;
          }
+#if 0
        else
          {
            strcpy (x, o);
            x += strlen (o);
          }
+#endif
       }
 
   *x = 0;
@@ -2311,7 +2334,7 @@ duplicates what `expand-file-name' does.  */)
        need to quote some $ to $$ first.  */
     xnm = p;
 
-  return make_specified_string (xnm, -1, x - xnm, STRING_MULTIBYTE (filename));
+  return make_specified_string (xnm, -1, x - xnm, multibyte);
 
  badsubst:
   error ("Bad format environment-variable substitution");