summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1999-07-07 22:48:37 +0000
committerRichard M. Stallman <rms@gnu.org>1999-07-07 22:48:37 +0000
commit09494912d943df127880af3ae64128a9d8bcea1d (patch)
treeffd64fbb5d26ef24164eeb449393f1efbcb9eb4d
parentdf287ddb468cb9c56853bca6076f496b5dc827a9 (diff)
downloademacs-09494912d943df127880af3ae64128a9d8bcea1d.tar.gz
(Fcall_process): Decide coding system for decoding
after we set to the target buffer. If the output goes to a unibyte buffer, suppress character code conversion. (Fcall_process): Don't use initializer on coding_systems. (Fcall_process_region): Likewise.
-rw-r--r--src/callproc.c88
1 files changed, 50 insertions, 38 deletions
diff --git a/src/callproc.c b/src/callproc.c
index 61b25e15e9f..51a4f59e3c3 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -222,6 +222,11 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
#endif
struct coding_system process_coding; /* coding-system of process output */
struct coding_system argument_coding; /* coding-system of arguments */
+ /* Set to the return value of Ffind_operation_coding_system. */
+ Lisp_Object coding_systems;
+
+ /* Qt denotes that Ffind_operation_coding_system is not yet called. */
+ coding_systems = Qt;
CHECK_STRING (args[0], 0);
@@ -234,12 +239,9 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
error ("Operating system cannot handle asynchronous subprocesses");
#endif /* subprocesses */
- /* Decide the coding-system for giving arguments and reading process
- output. */
+ /* Decide the coding-system for giving arguments. */
{
Lisp_Object val, *args2;
- /* Qt denotes we have not yet called Ffind_operation_coding_system. */
- Lisp_Object coding_systems = Qt;
int i;
/* If arguments are supplied, we may have to encode them. */
@@ -273,39 +275,6 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
}
setup_coding_system (Fcheck_coding_system (val), &argument_coding);
}
-
- /* If BUFFER is nil, we must read process output once and then
- discard it, so setup coding system but with nil. If BUFFER is
- an integer, we can discard it without reading. */
- if (nargs < 3 || NILP (args[2])
- || (CONSP (args[2]) && NILP (XCAR (args[2]))))
- setup_coding_system (Qnil, &process_coding);
- else if (!INTEGERP (CONSP (args[2]) ? XCAR (args[2]) : args[2]))
- {
- val = Qnil;
- if (!NILP (Vcoding_system_for_read))
- val = Vcoding_system_for_read;
- else if (NILP (current_buffer->enable_multibyte_characters))
- val = Qraw_text;
- else
- {
- if (EQ (coding_systems, Qt))
- {
- args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
- args2[0] = Qcall_process;
- for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
- coding_systems
- = Ffind_operation_coding_system (nargs + 1, args2);
- }
- if (CONSP (coding_systems))
- val = XCONS (coding_systems)->car;
- else if (CONSP (Vdefault_process_coding_system))
- val = XCONS (Vdefault_process_coding_system)->car;
- else
- val = Qnil;
- }
- setup_coding_system (Fcheck_coding_system (val), &process_coding);
- }
}
if (nargs >= 2 && ! NILP (args[1]))
@@ -634,6 +603,47 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
if (BUFFERP (buffer))
Fset_buffer (buffer);
+ if (NILP (buffer))
+ {
+ /* If BUFFER is nil, we must read process output once and then
+ discard it, so setup coding system but with nil. */
+ setup_coding_system (Qnil, &process_coding);
+ }
+ else
+ {
+ Lisp_Object val, *args2;
+
+ val = Qnil;
+ if (!NILP (Vcoding_system_for_read))
+ val = Vcoding_system_for_read;
+ else
+ {
+ if (EQ (coding_systems, Qt))
+ {
+ int i;
+
+ args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2);
+ args2[0] = Qcall_process;
+ for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
+ coding_systems
+ = Ffind_operation_coding_system (nargs + 1, args2);
+ }
+ if (CONSP (coding_systems))
+ val = XCONS (coding_systems)->car;
+ else if (CONSP (Vdefault_process_coding_system))
+ val = XCONS (Vdefault_process_coding_system)->car;
+ else
+ val = Qnil;
+ }
+ setup_coding_system (Fcheck_coding_system (val), &process_coding);
+ /* In unibyte mode, character code conversion should not take
+ place but EOL conversion should. So, setup raw-text or one
+ of the subsidiary according to the information just setup. */
+ if (NILP (current_buffer->enable_multibyte_characters)
+ && !NILP (val))
+ setup_raw_text_coding_system (&process_coding);
+ }
+
immediate_quit = 1;
QUIT;
@@ -811,7 +821,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
register Lisp_Object start, end;
int count = specpdl_ptr - specpdl;
/* Qt denotes we have not yet called Ffind_operation_coding_system. */
- Lisp_Object coding_systems = Qt;
+ Lisp_Object coding_systems;
Lisp_Object val, *args2;
int i;
#ifdef DOS_NT
@@ -844,6 +854,8 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
#endif /* not DOS_NT */
+ coding_systems = Qt;
+
mktemp (tempfile);
filename_string = build_string (tempfile);