summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Rumney <jasonr@gnu.org>2008-03-05 00:20:52 +0000
committerJason Rumney <jasonr@gnu.org>2008-03-05 00:20:52 +0000
commit4e5a6f83a89701b3868a37ded7882d62398120d8 (patch)
tree900b8078a32f447b435495e6d205250ba949bde6
parentbbcedd051459ad914807c097884d70ed871690ce (diff)
downloademacs-4e5a6f83a89701b3868a37ded7882d62398120d8.tar.gz
(Fexpand_file_name): Decode home directory names.
(Fsubstitute_in_file_name): Decode substituted variables.
-rw-r--r--src/ChangeLog5
-rw-r--r--src/fileio.c47
2 files changed, 40 insertions, 12 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6da585c7a1b..c6b17b1cb20 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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.
diff --git a/src/fileio.c b/src/fileio.c
index c5bff5b8153..d869bb0b2b6 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -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");