mirror of
https://github.com/masscollaborationlabs/emacs.git
synced 2025-07-03 19:03:24 +00:00
Fix bug #15260 with building and installing Emacs in non-ASCII directories.
src/xdisp.c (message3_nolog, message_with_string): Encode the string before writing it to the terminal in a non-interactive session. src/lread.c (openp): If both FILENAME and SUFFIX are unibyte, make sure we concatenate them into a unibyte string. src/fileio.c (make_temp_name): Encode PREFIX, and decode the resulting temporary name before returning it to the caller. (Fexpand_file_name): If NAME is pure-ASCII and DEFAULT_DIRECTORY is a unibyte string, convert NAME to a unibyte string to ensure that the result is also a unibyte string. src/emacs.c (init_cmdargs): Use build_unibyte_string to make sure we create unibyte strings from default paths and directory/file names. src/coding.h (ENCODE_FILE): Do not attempt to encode a unibyte string. src/callproc.c (init_callproc): Use build_unibyte_string to make sure we create unibyte strings from default paths and directory/file names. src/buffer.c (init_buffer): Don't store default-directory of *scratch* in multibyte form. The original problem which led to that is described in http://lists.gnu.org/archive/html/emacs-pretest-bug/2004-11/msg00532.html, but it was solved long ago. lisp/startup.el (normal-top-level): Move setting eol-mnemonic-unix, eol-mnemonic-mac, eol-mnemonic-dos, and also setup of the locale environment and decoding all of the default-directory's to here from command-line. (command-line): Decode also argv[0]. lisp/loadup.el: Error out if default-directory is a multibyte string when we are dumping. lisp/Makefile.in (emacs): Don't set LC_ALL=C. leim/Makefile.in (RUN_EMACS): Don't set LC_ALL=C. configure.ac: Don't disallow builds in non-ASCII directories.
This commit is contained in:
parent
7397c58760
commit
d0065ff124
16 changed files with 213 additions and 87 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2013-11-04 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
|
* configure.ac: Don't disallow builds in non-ASCII directories.
|
||||||
|
(Bug#15260)
|
||||||
|
|
||||||
2013-11-04 Paul Eggert <eggert@cs.ucla.edu>
|
2013-11-04 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
Port to stricter C99 platforms.
|
Port to stricter C99 platforms.
|
||||||
|
|
24
configure.ac
24
configure.ac
|
@ -73,30 +73,6 @@ dnl Support for --program-prefix, --program-suffix and
|
||||||
dnl --program-transform-name options
|
dnl --program-transform-name options
|
||||||
AC_ARG_PROGRAM
|
AC_ARG_PROGRAM
|
||||||
|
|
||||||
dnl http://debbugs.gnu.org/15260
|
|
||||||
dnl I think we have to check, eg, both exec_prefix and bindir,
|
|
||||||
dnl because the latter by default is not yet expanded, but the user
|
|
||||||
dnl may have specified a value for it via --bindir.
|
|
||||||
dnl At first glance, _installing_ in non-ASCII seems ok, but in fact
|
|
||||||
dnl it is not; see http://debbugs.gnu.org/15260#61
|
|
||||||
dnl Note that abs_srcdir and abs_builddir are not yet defined. :(
|
|
||||||
|
|
||||||
dnl "`cd \"$srcdir\"`" is not portable.
|
|
||||||
dnl See autoconf manual "Shell Substitutions":
|
|
||||||
dnl "There is just no portable way to use double-quoted strings inside
|
|
||||||
dnl double-quoted back-quoted expressions (pfew!)."
|
|
||||||
temp_srcdir=`cd "$srcdir"; pwd`
|
|
||||||
|
|
||||||
for var in "`pwd`" "$temp_srcdir" "$prefix" "$exec_prefix" \
|
|
||||||
"$datarootdir" "$bindir" "$datadir" "$sharedstatedir" "$libexecdir"; do
|
|
||||||
|
|
||||||
dnl configure sets LC_ALL=C early on, so this range should work.
|
|
||||||
case "$var" in
|
|
||||||
*[[!\ -~]]*) AC_MSG_ERROR([Emacs cannot be built or installed in a directory whose name contains non-ASCII characters: $var]) ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
dnl It is important that variables on the RHS not be expanded here,
|
dnl It is important that variables on the RHS not be expanded here,
|
||||||
dnl hence the single quotes. This is per the GNU coding standards, see
|
dnl hence the single quotes. This is per the GNU coding standards, see
|
||||||
dnl (autoconf) Installation Directory Variables
|
dnl (autoconf) Installation Directory Variables
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2013-11-04 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
|
* Makefile.in (RUN_EMACS): Don't set LC_ALL=C. (Bug#15260)
|
||||||
|
|
||||||
2013-11-03 Glenn Morris <rgm@gnu.org>
|
2013-11-03 Glenn Morris <rgm@gnu.org>
|
||||||
|
|
||||||
* Makefile.in (abs_srcdir): Remove.
|
* Makefile.in (abs_srcdir): Remove.
|
||||||
|
|
|
@ -32,7 +32,7 @@ EMACS = ../src/emacs
|
||||||
|
|
||||||
# How to run Emacs.
|
# How to run Emacs.
|
||||||
# Prevent any setting of EMACSLOADPATH in user environment causing problems.
|
# Prevent any setting of EMACSLOADPATH in user environment causing problems.
|
||||||
RUN_EMACS = unset EMACSLOADPATH; LC_ALL=C "${EMACS}" -batch \
|
RUN_EMACS = unset EMACSLOADPATH; "${EMACS}" -batch \
|
||||||
--no-site-file --no-site-lisp
|
--no-site-file --no-site-lisp
|
||||||
|
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
2013-11-04 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
|
* startup.el (normal-top-level): Move setting eol-mnemonic-unix,
|
||||||
|
eol-mnemonic-mac, eol-mnemonic-dos, and also setup of the locale
|
||||||
|
environment and decoding all of the default-directory's to here
|
||||||
|
from command-line.
|
||||||
|
(command-line): Decode also argv[0].
|
||||||
|
|
||||||
|
* loadup.el: Error out if default-directory is a multibyte string
|
||||||
|
when we are dumping.
|
||||||
|
|
||||||
|
* Makefile.in (emacs): Don't set LC_ALL=C. (Bug#15260)
|
||||||
|
|
||||||
2013-11-04 Teodor Zlatanov <tzz@lifelogs.com>
|
2013-11-04 Teodor Zlatanov <tzz@lifelogs.com>
|
||||||
|
|
||||||
* emacs-lisp/package.el (package-menu-mode)
|
* emacs-lisp/package.el (package-menu-mode)
|
||||||
|
|
|
@ -106,7 +106,7 @@ COMPILE_FIRST = \
|
||||||
|
|
||||||
# The actual Emacs command run in the targets below.
|
# The actual Emacs command run in the targets below.
|
||||||
# Prevent any setting of EMACSLOADPATH in user environment causing problems.
|
# Prevent any setting of EMACSLOADPATH in user environment causing problems.
|
||||||
emacs = unset EMACSLOADPATH; LC_ALL=C "$(EMACS)" $(EMACSOPT)
|
emacs = unset EMACSLOADPATH; "$(EMACS)" $(EMACSOPT)
|
||||||
|
|
||||||
# Common command to find subdirectories
|
# Common command to find subdirectories
|
||||||
setwins=subdirs=`find . -type d -print`; \
|
setwins=subdirs=`find . -type d -print`; \
|
||||||
|
|
|
@ -286,6 +286,20 @@
|
||||||
;For other systems, you must edit ../src/Makefile.in.
|
;For other systems, you must edit ../src/Makefile.in.
|
||||||
(load "site-load" t)
|
(load "site-load" t)
|
||||||
|
|
||||||
|
;; Make sure default-directory is unibyte when dumping. This is
|
||||||
|
;; because we cannot decode and encode it correctly (since the locale
|
||||||
|
;; environment is not, and should not be, set up). default-directory
|
||||||
|
;; is used every time we call expand-file-name, which we do in every
|
||||||
|
;; file primitive. So the only workable solution to support building
|
||||||
|
;; in non-ASCII directories is to manipulate unibyte strings in the
|
||||||
|
;; current locale's encoding.
|
||||||
|
(if (and (or (equal (nth 3 command-line-args) "dump")
|
||||||
|
(equal (nth 4 command-line-args) "dump")
|
||||||
|
(equal (nth 3 command-line-args) "bootstrap")
|
||||||
|
(equal (nth 4 command-line-args) "bootstrap"))
|
||||||
|
(multibyte-string-p default-directory))
|
||||||
|
(error "default-directory must be unibyte when dumping Emacs!"))
|
||||||
|
|
||||||
;; Determine which last version number to use
|
;; Determine which last version number to use
|
||||||
;; based on the executables that now exist.
|
;; based on the executables that now exist.
|
||||||
(if (and (or (equal (nth 3 command-line-args) "dump")
|
(if (and (or (equal (nth 3 command-line-args) "dump")
|
||||||
|
|
|
@ -489,6 +489,63 @@ It is the default value of the variable `top-level'."
|
||||||
(if command-line-processed
|
(if command-line-processed
|
||||||
(message "Back to top level.")
|
(message "Back to top level.")
|
||||||
(setq command-line-processed t)
|
(setq command-line-processed t)
|
||||||
|
|
||||||
|
;; Set the default strings to display in mode line for end-of-line
|
||||||
|
;; formats that aren't native to this platform. This should be
|
||||||
|
;; done before calling set-locale-environment, as the latter might
|
||||||
|
;; use these mnemonics.
|
||||||
|
(cond
|
||||||
|
((memq system-type '(ms-dos windows-nt))
|
||||||
|
(setq eol-mnemonic-unix "(Unix)"
|
||||||
|
eol-mnemonic-mac "(Mac)"))
|
||||||
|
(t ; this is for Unix/GNU/Linux systems
|
||||||
|
(setq eol-mnemonic-dos "(DOS)"
|
||||||
|
eol-mnemonic-mac "(Mac)")))
|
||||||
|
|
||||||
|
(set-locale-environment nil)
|
||||||
|
;; Decode all default-directory's (probably, only *scratch* exists
|
||||||
|
;; at this point). default-directory of *scratch* is the basis
|
||||||
|
;; for many other file-name variables and directory lists, so it
|
||||||
|
;; is important to decode it ASAP.
|
||||||
|
(when locale-coding-system
|
||||||
|
(save-excursion
|
||||||
|
(dolist (elt (buffer-list))
|
||||||
|
(set-buffer elt)
|
||||||
|
(if default-directory
|
||||||
|
(setq default-directory
|
||||||
|
(decode-coding-string default-directory
|
||||||
|
locale-coding-system t)))))
|
||||||
|
|
||||||
|
;; Decode all the important variables and directory lists, now
|
||||||
|
;; that we know the locale's encoding. This is because the
|
||||||
|
;; values of these variables are until here unibyte undecoded
|
||||||
|
;; strings created by build_unibyte_string. data-directory in
|
||||||
|
;; particular is used to construct many other standard directory
|
||||||
|
;; names, so it must be decoded ASAP.
|
||||||
|
;; Note that charset-map-path cannot be decoded here, since we
|
||||||
|
;; could then be trapped in infinite recursion below, when we
|
||||||
|
;; load subdirs.el, because encoding a directory name might need
|
||||||
|
;; to load a charset map, which will want to encode
|
||||||
|
;; charset-map-path, which will want to load the same charset
|
||||||
|
;; map... So decoding of charset-map-path is delayed until
|
||||||
|
;; further down below.
|
||||||
|
(dolist (pathsym '(load-path exec-path))
|
||||||
|
(let ((path (symbol-value pathsym)))
|
||||||
|
(if (listp path)
|
||||||
|
(set pathsym (mapcar (lambda (dir)
|
||||||
|
(decode-coding-string
|
||||||
|
dir
|
||||||
|
locale-coding-system t))
|
||||||
|
path)))))
|
||||||
|
(dolist (filesym '(data-directory doc-directory exec-directory
|
||||||
|
installation-directory
|
||||||
|
invocation-directory invocation-name
|
||||||
|
source-directory
|
||||||
|
shared-game-score-directory))
|
||||||
|
(let ((file (symbol-value filesym)))
|
||||||
|
(if (stringp file)
|
||||||
|
(set filesym (decode-coding-string file locale-coding-system t))))))
|
||||||
|
|
||||||
(let ((dir default-directory))
|
(let ((dir default-directory))
|
||||||
(with-current-buffer "*Messages*"
|
(with-current-buffer "*Messages*"
|
||||||
(messages-buffer-mode)
|
(messages-buffer-mode)
|
||||||
|
@ -536,6 +593,16 @@ It is the default value of the variable `top-level'."
|
||||||
(setq process-environment
|
(setq process-environment
|
||||||
(delete (concat "PWD=" pwd)
|
(delete (concat "PWD=" pwd)
|
||||||
process-environment)))))
|
process-environment)))))
|
||||||
|
;; Now, that other directories were searched, and any charsets we
|
||||||
|
;; need for encoding them are already loaded, we are ready to
|
||||||
|
;; decode charset-map-path.
|
||||||
|
(if (listp charset-map-path)
|
||||||
|
(setq charset-map-path
|
||||||
|
(mapcar (lambda (dir)
|
||||||
|
(decode-coding-string
|
||||||
|
dir
|
||||||
|
locale-coding-system t))
|
||||||
|
charset-map-path)))
|
||||||
(setq default-directory (abbreviate-file-name default-directory))
|
(setq default-directory (abbreviate-file-name default-directory))
|
||||||
(let ((old-face-font-rescale-alist face-font-rescale-alist))
|
(let ((old-face-font-rescale-alist face-font-rescale-alist))
|
||||||
(unwind-protect
|
(unwind-protect
|
||||||
|
@ -756,18 +823,6 @@ Amongst another things, it parses the command-line arguments."
|
||||||
;;! ;; Choose a good default value for split-window-keep-point.
|
;;! ;; Choose a good default value for split-window-keep-point.
|
||||||
;;! (setq split-window-keep-point (> baud-rate 2400))
|
;;! (setq split-window-keep-point (> baud-rate 2400))
|
||||||
|
|
||||||
;; Set the default strings to display in mode line for
|
|
||||||
;; end-of-line formats that aren't native to this platform.
|
|
||||||
(cond
|
|
||||||
((memq system-type '(ms-dos windows-nt))
|
|
||||||
(setq eol-mnemonic-unix "(Unix)"
|
|
||||||
eol-mnemonic-mac "(Mac)"))
|
|
||||||
(t ; this is for Unix/GNU/Linux systems
|
|
||||||
(setq eol-mnemonic-dos "(DOS)"
|
|
||||||
eol-mnemonic-mac "(Mac)")))
|
|
||||||
|
|
||||||
(set-locale-environment nil)
|
|
||||||
|
|
||||||
;; Convert preloaded file names in load-history to absolute.
|
;; Convert preloaded file names in load-history to absolute.
|
||||||
(let ((simple-file-name
|
(let ((simple-file-name
|
||||||
;; Look for simple.el or simple.elc and use their directory
|
;; Look for simple.el or simple.elc and use their directory
|
||||||
|
@ -801,7 +856,7 @@ please check its value")
|
||||||
load-history))))
|
load-history))))
|
||||||
|
|
||||||
;; Convert the arguments to Emacs internal representation.
|
;; Convert the arguments to Emacs internal representation.
|
||||||
(let ((args (cdr command-line-args)))
|
(let ((args command-line-args))
|
||||||
(while args
|
(while args
|
||||||
(setcar args
|
(setcar args
|
||||||
(decode-coding-string (car args) locale-coding-system t))
|
(decode-coding-string (car args) locale-coding-system t))
|
||||||
|
@ -1211,19 +1266,6 @@ the `--debug-init' option to view a complete error backtrace."
|
||||||
(setq after-init-time (current-time))
|
(setq after-init-time (current-time))
|
||||||
(run-hooks 'after-init-hook)
|
(run-hooks 'after-init-hook)
|
||||||
|
|
||||||
;; Decode all default-directory.
|
|
||||||
(if (and (default-value 'enable-multibyte-characters) locale-coding-system)
|
|
||||||
(save-excursion
|
|
||||||
(dolist (elt (buffer-list))
|
|
||||||
(set-buffer elt)
|
|
||||||
(if default-directory
|
|
||||||
(setq default-directory
|
|
||||||
(decode-coding-string default-directory
|
|
||||||
locale-coding-system t))))
|
|
||||||
(setq command-line-default-directory
|
|
||||||
(decode-coding-string command-line-default-directory
|
|
||||||
locale-coding-system t))))
|
|
||||||
|
|
||||||
;; If *scratch* exists and init file didn't change its mode, initialize it.
|
;; If *scratch* exists and init file didn't change its mode, initialize it.
|
||||||
(if (get-buffer "*scratch*")
|
(if (get-buffer "*scratch*")
|
||||||
(with-current-buffer "*scratch*"
|
(with-current-buffer "*scratch*"
|
||||||
|
|
|
@ -1,3 +1,34 @@
|
||||||
|
2013-11-04 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
|
* xdisp.c (message3_nolog, message_with_string): Encode the string
|
||||||
|
before writing it to the terminal in a non-interactive session.
|
||||||
|
|
||||||
|
* lread.c (openp): If both FILENAME and SUFFIX are unibyte, make
|
||||||
|
sure we concatenate them into a unibyte string.
|
||||||
|
|
||||||
|
* fileio.c (make_temp_name): Encode PREFIX, and decode the
|
||||||
|
resulting temporary name before returning it to the caller.
|
||||||
|
(Fexpand_file_name): If NAME is pure-ASCII and DEFAULT_DIRECTORY
|
||||||
|
is a unibyte string, convert NAME to a unibyte string to ensure
|
||||||
|
that the result is also a unibyte string.
|
||||||
|
|
||||||
|
* emacs.c (init_cmdargs): Use build_unibyte_string to make sure we
|
||||||
|
create unibyte strings from default paths and directory/file
|
||||||
|
names.
|
||||||
|
|
||||||
|
* coding.h (ENCODE_FILE): Do not attempt to encode a unibyte
|
||||||
|
string.
|
||||||
|
|
||||||
|
* callproc.c (init_callproc): Use build_unibyte_string to make
|
||||||
|
sure we create unibyte strings from default paths and
|
||||||
|
directory/file names.
|
||||||
|
|
||||||
|
* buffer.c (init_buffer): Don't store default-directory of
|
||||||
|
8scratch* in multibyte form. The original problem which led to
|
||||||
|
that is described in
|
||||||
|
http://lists.gnu.org/archive/html/emacs-pretest-bug/2004-11/msg00532.html,
|
||||||
|
but it was solved long ago. (Bug#15260)
|
||||||
|
|
||||||
2013-11-04 Paul Eggert <eggert@cs.ucla.edu>
|
2013-11-04 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
Port to stricter C99 platforms.
|
Port to stricter C99 platforms.
|
||||||
|
|
|
@ -5349,13 +5349,10 @@ init_buffer (void)
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* At this moment, we still don't know how to decode the directory
|
||||||
|
name. So, we keep the bytes in unibyte form so that file I/O
|
||||||
|
routines correctly get the original bytes. */
|
||||||
bset_directory (current_buffer, make_unibyte_string (pwd, len));
|
bset_directory (current_buffer, make_unibyte_string (pwd, len));
|
||||||
if (! NILP (BVAR (&buffer_defaults, enable_multibyte_characters)))
|
|
||||||
/* At this moment, we still don't know how to decode the
|
|
||||||
directory name. So, we keep the bytes in multibyte form so
|
|
||||||
that ENCODE_FILE correctly gets the original bytes. */
|
|
||||||
bset_directory
|
|
||||||
(current_buffer, string_to_multibyte (BVAR (current_buffer, directory)));
|
|
||||||
|
|
||||||
/* Add /: to the front of the name
|
/* Add /: to the front of the name
|
||||||
if it would otherwise be treated as magic. */
|
if it would otherwise be treated as magic. */
|
||||||
|
|
|
@ -1612,14 +1612,14 @@ init_callproc (void)
|
||||||
Lisp_Object tem, tem1, srcdir;
|
Lisp_Object tem, tem1, srcdir;
|
||||||
|
|
||||||
srcdir = Fexpand_file_name (build_string ("../src/"),
|
srcdir = Fexpand_file_name (build_string ("../src/"),
|
||||||
build_string (PATH_DUMPLOADSEARCH));
|
build_unibyte_string (PATH_DUMPLOADSEARCH));
|
||||||
tem = Fexpand_file_name (build_string ("GNU"), Vdata_directory);
|
tem = Fexpand_file_name (build_string ("GNU"), Vdata_directory);
|
||||||
tem1 = Ffile_exists_p (tem);
|
tem1 = Ffile_exists_p (tem);
|
||||||
if (!NILP (Fequal (srcdir, Vinvocation_directory)) || NILP (tem1))
|
if (!NILP (Fequal (srcdir, Vinvocation_directory)) || NILP (tem1))
|
||||||
{
|
{
|
||||||
Lisp_Object newdir;
|
Lisp_Object newdir;
|
||||||
newdir = Fexpand_file_name (build_string ("../etc/"),
|
newdir = Fexpand_file_name (build_string ("../etc/"),
|
||||||
build_string (PATH_DUMPLOADSEARCH));
|
build_unibyte_string (PATH_DUMPLOADSEARCH));
|
||||||
tem = Fexpand_file_name (build_string ("GNU"), newdir);
|
tem = Fexpand_file_name (build_string ("GNU"), newdir);
|
||||||
tem1 = Ffile_exists_p (tem);
|
tem1 = Ffile_exists_p (tem);
|
||||||
if (!NILP (tem1))
|
if (!NILP (tem1))
|
||||||
|
@ -1646,7 +1646,7 @@ init_callproc (void)
|
||||||
#ifdef DOS_NT
|
#ifdef DOS_NT
|
||||||
Vshared_game_score_directory = Qnil;
|
Vshared_game_score_directory = Qnil;
|
||||||
#else
|
#else
|
||||||
Vshared_game_score_directory = build_string (PATH_GAME);
|
Vshared_game_score_directory = build_unibyte_string (PATH_GAME);
|
||||||
if (NILP (Ffile_accessible_directory_p (Vshared_game_score_directory)))
|
if (NILP (Ffile_accessible_directory_p (Vshared_game_score_directory)))
|
||||||
Vshared_game_score_directory = Qnil;
|
Vshared_game_score_directory = Qnil;
|
||||||
#endif
|
#endif
|
||||||
|
|
18
src/coding.h
18
src/coding.h
|
@ -670,14 +670,16 @@ struct coding_system
|
||||||
(code) = (s1 << 8) | s2; \
|
(code) = (s1 << 8) | s2; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Encode the file name NAME using the specified coding system
|
/* Encode the file name NAME using the specified coding system for
|
||||||
for file names, if any. */
|
file names, if any. If NAME is a unibyte string, return NAME. */
|
||||||
#define ENCODE_FILE(name) \
|
#define ENCODE_FILE(name) \
|
||||||
(! NILP (Vfile_name_coding_system) \
|
(! STRING_MULTIBYTE (name) \
|
||||||
? code_convert_string_norecord (name, Vfile_name_coding_system, 1) \
|
? name \
|
||||||
: (! NILP (Vdefault_file_name_coding_system) \
|
: (! NILP (Vfile_name_coding_system) \
|
||||||
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \
|
? code_convert_string_norecord (name, Vfile_name_coding_system, 1) \
|
||||||
: name))
|
: (! NILP (Vdefault_file_name_coding_system) \
|
||||||
|
? code_convert_string_norecord (name, Vdefault_file_name_coding_system, 1) \
|
||||||
|
: name)))
|
||||||
|
|
||||||
|
|
||||||
/* Decode the file name NAME using the specified coding system
|
/* Decode the file name NAME using the specified coding system
|
||||||
|
|
10
src/emacs.c
10
src/emacs.c
|
@ -393,7 +393,7 @@ init_cmdargs (int argc, char **argv, int skip_args, char *original_pwd)
|
||||||
initial_argv = argv;
|
initial_argv = argv;
|
||||||
initial_argc = argc;
|
initial_argc = argc;
|
||||||
|
|
||||||
raw_name = build_string (argv[0]);
|
raw_name = build_unibyte_string (argv[0]);
|
||||||
|
|
||||||
/* Add /: to the front of the name
|
/* Add /: to the front of the name
|
||||||
if it would otherwise be treated as magic. */
|
if it would otherwise be treated as magic. */
|
||||||
|
@ -427,7 +427,9 @@ init_cmdargs (int argc, char **argv, int skip_args, char *original_pwd)
|
||||||
/* Emacs was started with relative path, like ./emacs.
|
/* Emacs was started with relative path, like ./emacs.
|
||||||
Make it absolute. */
|
Make it absolute. */
|
||||||
{
|
{
|
||||||
Lisp_Object odir = original_pwd ? build_string (original_pwd) : Qnil;
|
Lisp_Object odir =
|
||||||
|
original_pwd ? build_unibyte_string (original_pwd) : Qnil;
|
||||||
|
|
||||||
Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, odir);
|
Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, odir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2206,7 +2208,7 @@ decode_env_path (const char *evarname, const char *defalt)
|
||||||
p = strchr (path, SEPCHAR);
|
p = strchr (path, SEPCHAR);
|
||||||
if (!p)
|
if (!p)
|
||||||
p = path + strlen (path);
|
p = path + strlen (path);
|
||||||
element = (p - path ? make_string (path, p - path)
|
element = (p - path ? make_unibyte_string (path, p - path)
|
||||||
: build_string ("."));
|
: build_string ("."));
|
||||||
#ifdef WINDOWSNT
|
#ifdef WINDOWSNT
|
||||||
/* Relative file names in the default path are interpreted as
|
/* Relative file names in the default path are interpreted as
|
||||||
|
@ -2216,7 +2218,7 @@ decode_env_path (const char *evarname, const char *defalt)
|
||||||
element = Fexpand_file_name (Fsubstring (element,
|
element = Fexpand_file_name (Fsubstring (element,
|
||||||
make_number (emacs_dir_len),
|
make_number (emacs_dir_len),
|
||||||
Qnil),
|
Qnil),
|
||||||
build_string (emacs_dir));
|
build_unibyte_string (emacs_dir));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Add /: to the front of the name
|
/* Add /: to the front of the name
|
||||||
|
|
36
src/fileio.c
36
src/fileio.c
|
@ -732,8 +732,8 @@ static unsigned make_temp_name_count, make_temp_name_count_initialized_p;
|
||||||
Lisp_Object
|
Lisp_Object
|
||||||
make_temp_name (Lisp_Object prefix, bool base64_p)
|
make_temp_name (Lisp_Object prefix, bool base64_p)
|
||||||
{
|
{
|
||||||
Lisp_Object val;
|
Lisp_Object val, encoded_prefix;
|
||||||
int len, clen;
|
int len;
|
||||||
printmax_t pid;
|
printmax_t pid;
|
||||||
char *p, *data;
|
char *p, *data;
|
||||||
char pidbuf[INT_BUFSIZE_BOUND (printmax_t)];
|
char pidbuf[INT_BUFSIZE_BOUND (printmax_t)];
|
||||||
|
@ -767,12 +767,11 @@ make_temp_name (Lisp_Object prefix, bool base64_p)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
len = SBYTES (prefix); clen = SCHARS (prefix);
|
encoded_prefix = ENCODE_FILE (prefix);
|
||||||
val = make_uninit_multibyte_string (clen + 3 + pidlen, len + 3 + pidlen);
|
len = SBYTES (encoded_prefix);
|
||||||
if (!STRING_MULTIBYTE (prefix))
|
val = make_uninit_string (len + 3 + pidlen);
|
||||||
STRING_SET_UNIBYTE (val);
|
|
||||||
data = SSDATA (val);
|
data = SSDATA (val);
|
||||||
memcpy (data, SSDATA (prefix), len);
|
memcpy (data, SSDATA (encoded_prefix), len);
|
||||||
p = data + len;
|
p = data + len;
|
||||||
|
|
||||||
memcpy (p, pidbuf, pidlen);
|
memcpy (p, pidbuf, pidlen);
|
||||||
|
@ -810,7 +809,7 @@ make_temp_name (Lisp_Object prefix, bool base64_p)
|
||||||
{
|
{
|
||||||
/* We want to return only if errno is ENOENT. */
|
/* We want to return only if errno is ENOENT. */
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
return val;
|
return DECODE_FILE (val);
|
||||||
else
|
else
|
||||||
/* The error here is dubious, but there is little else we
|
/* The error here is dubious, but there is little else we
|
||||||
can do. The alternatives are to return nil, which is
|
can do. The alternatives are to return nil, which is
|
||||||
|
@ -987,7 +986,26 @@ filesystem tree, not (expand-file-name ".." dirname). */)
|
||||||
if (multibyte != STRING_MULTIBYTE (default_directory))
|
if (multibyte != STRING_MULTIBYTE (default_directory))
|
||||||
{
|
{
|
||||||
if (multibyte)
|
if (multibyte)
|
||||||
default_directory = string_to_multibyte (default_directory);
|
{
|
||||||
|
unsigned char *p = SDATA (name);
|
||||||
|
|
||||||
|
while (*p && ASCII_BYTE_P (*p))
|
||||||
|
p++;
|
||||||
|
if (*p == '\0')
|
||||||
|
{
|
||||||
|
/* NAME is a pure ASCII string, and DEFAULT_DIRECTORY is
|
||||||
|
unibyte. Do not convert DEFAULT_DIRECTORY to
|
||||||
|
multibyte; instead, convert NAME to a unibyte string,
|
||||||
|
so that the result of this function is also a unibyte
|
||||||
|
string. This is needed during bootstraping and
|
||||||
|
dumping, when Emacs cannot decode file names, because
|
||||||
|
the locale environment is not set up. */
|
||||||
|
name = make_unibyte_string (SSDATA (name), SBYTES (name));
|
||||||
|
multibyte = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
default_directory = string_to_multibyte (default_directory);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
name = string_to_multibyte (name);
|
name = string_to_multibyte (name);
|
||||||
|
|
18
src/lread.c
18
src/lread.c
|
@ -1500,7 +1500,8 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes,
|
||||||
for (tail = NILP (suffixes) ? list1 (empty_unibyte_string) : suffixes;
|
for (tail = NILP (suffixes) ? list1 (empty_unibyte_string) : suffixes;
|
||||||
CONSP (tail); tail = XCDR (tail))
|
CONSP (tail); tail = XCDR (tail))
|
||||||
{
|
{
|
||||||
ptrdiff_t fnlen, lsuffix = SBYTES (XCAR (tail));
|
Lisp_Object suffix = XCAR (tail);
|
||||||
|
ptrdiff_t fnlen, lsuffix = SBYTES (suffix);
|
||||||
Lisp_Object handler;
|
Lisp_Object handler;
|
||||||
|
|
||||||
/* Concatenate path element/specified name with the suffix.
|
/* Concatenate path element/specified name with the suffix.
|
||||||
|
@ -1511,7 +1512,7 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes,
|
||||||
? 2 : 0);
|
? 2 : 0);
|
||||||
fnlen = SBYTES (filename) - prefixlen;
|
fnlen = SBYTES (filename) - prefixlen;
|
||||||
memcpy (fn, SDATA (filename) + prefixlen, fnlen);
|
memcpy (fn, SDATA (filename) + prefixlen, fnlen);
|
||||||
memcpy (fn + fnlen, SDATA (XCAR (tail)), lsuffix + 1);
|
memcpy (fn + fnlen, SDATA (suffix), lsuffix + 1);
|
||||||
fnlen += lsuffix;
|
fnlen += lsuffix;
|
||||||
/* Check that the file exists and is not a directory. */
|
/* Check that the file exists and is not a directory. */
|
||||||
/* We used to only check for handlers on non-absolute file names:
|
/* We used to only check for handlers on non-absolute file names:
|
||||||
|
@ -1521,7 +1522,18 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes,
|
||||||
handler = Ffind_file_name_handler (filename, Qfile_exists_p);
|
handler = Ffind_file_name_handler (filename, Qfile_exists_p);
|
||||||
It's not clear why that was the case and it breaks things like
|
It's not clear why that was the case and it breaks things like
|
||||||
(load "/bar.el") where the file is actually "/bar.el.gz". */
|
(load "/bar.el") where the file is actually "/bar.el.gz". */
|
||||||
string = make_string (fn, fnlen);
|
/* make_string has its own ideas on when to return a unibyte
|
||||||
|
string and when a multibyte string, but we know better.
|
||||||
|
We must have a unibyte string when dumping, since
|
||||||
|
file-name encoding is shaky at best at that time, and in
|
||||||
|
particular default-file-name-coding-system is reset
|
||||||
|
several times during loadup. We therefore don't want to
|
||||||
|
encode the file before passing it to file I/O library
|
||||||
|
functions. */
|
||||||
|
if (!STRING_MULTIBYTE (filename) && !STRING_MULTIBYTE (suffix))
|
||||||
|
string = make_unibyte_string (fn, fnlen);
|
||||||
|
else
|
||||||
|
string = make_string (fn, fnlen);
|
||||||
handler = Ffind_file_name_handler (string, Qfile_exists_p);
|
handler = Ffind_file_name_handler (string, Qfile_exists_p);
|
||||||
if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
|
if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
|
||||||
{
|
{
|
||||||
|
|
14
src/xdisp.c
14
src/xdisp.c
|
@ -9728,7 +9728,11 @@ message3_nolog (Lisp_Object m)
|
||||||
putc ('\n', stderr);
|
putc ('\n', stderr);
|
||||||
noninteractive_need_newline = 0;
|
noninteractive_need_newline = 0;
|
||||||
if (STRINGP (m))
|
if (STRINGP (m))
|
||||||
fwrite (SDATA (m), SBYTES (m), 1, stderr);
|
{
|
||||||
|
Lisp_Object s = ENCODE_SYSTEM (m);
|
||||||
|
|
||||||
|
fwrite (SDATA (s), SBYTES (s), 1, stderr);
|
||||||
|
}
|
||||||
if (cursor_in_echo_area == 0)
|
if (cursor_in_echo_area == 0)
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
|
@ -9803,13 +9807,19 @@ message_with_string (const char *m, Lisp_Object string, int log)
|
||||||
{
|
{
|
||||||
if (m)
|
if (m)
|
||||||
{
|
{
|
||||||
|
/* ENCODE_SYSTEM below can GC and/or relocate the Lisp
|
||||||
|
String whose data pointer might be passed to us in M. So
|
||||||
|
we use a local copy. */
|
||||||
|
char *fmt = xstrdup (m);
|
||||||
|
|
||||||
if (noninteractive_need_newline)
|
if (noninteractive_need_newline)
|
||||||
putc ('\n', stderr);
|
putc ('\n', stderr);
|
||||||
noninteractive_need_newline = 0;
|
noninteractive_need_newline = 0;
|
||||||
fprintf (stderr, m, SDATA (string));
|
fprintf (stderr, fmt, SDATA (ENCODE_SYSTEM (string)));
|
||||||
if (!cursor_in_echo_area)
|
if (!cursor_in_echo_area)
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
|
xfree (fmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (INTERACTIVE)
|
else if (INTERACTIVE)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue