Mercurial > emacs
changeset 17110:3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
character code conversion if enable-multibyte-characters is nil.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Thu, 27 Feb 1997 07:48:21 +0000 |
parents | dfe4f98935c4 |
children | 60ad27660a65 |
files | src/process.c |
diffstat | 1 files changed, 109 insertions(+), 81 deletions(-) [+] |
line wrap: on
line diff
--- a/src/process.c Thu Feb 27 07:47:24 1997 +0000 +++ b/src/process.c Thu Feb 27 07:48:21 1997 +0000 @@ -249,8 +249,8 @@ int proc_buffered_char[MAXDESC]; /* Table of `struct coding-system' for each process. */ -static struct coding_system proc_decode_coding_system[MAXDESC]; -static struct coding_system proc_encode_coding_system[MAXDESC]; +static struct coding_system *proc_decode_coding_system[MAXDESC]; +static struct coding_system *proc_encode_coding_system[MAXDESC]; static Lisp_Object get_process (); @@ -1154,42 +1154,49 @@ Fset_marker (XPROCESS (proc)->mark, make_number (BUF_ZV (XBUFFER (buffer))), buffer); - /* Setup coding systems for communicating with the process. */ - { - /* Qt denotes that we have not yet called Ffind_coding_system. */ - Lisp_Object coding_systems = Qt; - Lisp_Object val, *args2; - struct gcpro gcpro1; - - if (NILP (val = Vcoding_system_for_read)) - { - args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2); - args2[0] = Qstart_process; - for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; - GCPRO1 (proc); - coding_systems = Ffind_coding_system (nargs + 1, args2); - UNGCPRO; - if (CONSP (coding_systems)) - val = XCONS (coding_systems)->car; - } - XPROCESS (proc)->decode_coding_system = val; - - if (NILP (val = Vcoding_system_for_write)) - { - if (EQ (coding_systems, Qt)) - { - args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof args2); - args2[0] = Qstart_process; - for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; - GCPRO1 (proc); - coding_systems = Ffind_coding_system (nargs + 1, args2); - UNGCPRO; - } - if (CONSP (coding_systems)) - val = XCONS (coding_systems)->cdr; - } - XPROCESS (proc)->encode_coding_system = val; - } + if (!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters) + || NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters)) + { + XPROCESS (proc)->decode_coding_system = Qnil; + XPROCESS (proc)->encode_coding_system = Qnil; + } + else + { + /* Setup coding systems for communicating with the process. */ + /* Qt denotes that we have not yet called Ffind_coding_system. */ + Lisp_Object coding_systems = Qt; + Lisp_Object val, *args2; + struct gcpro gcpro1; + + if (NILP (val = Vcoding_system_for_read)) + { + args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2); + args2[0] = Qstart_process; + for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; + GCPRO1 (proc); + coding_systems = Ffind_coding_system (nargs + 1, args2); + UNGCPRO; + if (CONSP (coding_systems)) + val = XCONS (coding_systems)->car; + } + XPROCESS (proc)->decode_coding_system = val; + + if (NILP (val = Vcoding_system_for_write)) + { + if (EQ (coding_systems, Qt)) + { + args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof args2); + args2[0] = Qstart_process; + for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; + GCPRO1 (proc); + coding_systems = Ffind_coding_system (nargs + 1, args2); + UNGCPRO; + } + if (CONSP (coding_systems)) + val = XCONS (coding_systems)->cdr; + } + XPROCESS (proc)->encode_coding_system = val; + } XPROCESS (proc)->decoding_buf = make_uninit_string (0); XPROCESS (proc)->encoding_buf = make_uninit_string (0); @@ -1356,10 +1363,16 @@ XSETFASTINT (XPROCESS (process)->subtty, forkin); XPROCESS (process)->pty_flag = (pty_flag ? Qt : Qnil); XPROCESS (process)->status = Qrun; + if (!proc_decode_coding_system[inchannel]) + proc_decode_coding_system[inchannel] + = (struct coding_system *) xmalloc (sizeof (struct coding_system)); setup_coding_system (XPROCESS (process)->decode_coding_system, - &proc_decode_coding_system[inchannel]); + proc_decode_coding_system[inchannel]); + if (!proc_encode_coding_system[outchannel]) + proc_encode_coding_system[outchannel] + = (struct coding_system *) xmalloc (sizeof (struct coding_system)); setup_coding_system (XPROCESS (process)->encode_coding_system, - &proc_encode_coding_system[outchannel]); + proc_encode_coding_system[outchannel]); /* Delay interrupts until we have a chance to store the new fork's pid in its process structure */ @@ -1871,43 +1884,56 @@ if (inch > max_process_desc) max_process_desc = inch; - /* Setup coding systems for communicating with the network stream. */ - { - struct gcpro gcpro1; - /* Qt denotes that we have not yet called Ffind_coding_system. */ - Lisp_Object coding_systems = Qt; - Lisp_Object args[5], val; - - if (NILP (val = Vcoding_system_for_read)) - { - args[0] = Qopen_network_stream, args[1] = name, - args[2] = buffer, args[3] = host, args[4] = service; - GCPRO1 (proc); - coding_systems = Ffind_coding_system (5, args); - UNGCPRO; - val = (CONSP (coding_systems) ? XCONS (coding_systems)->car : Qnil); - } - XPROCESS (proc)->decode_coding_system = val; - - if (NILP (val = Vcoding_system_for_write)) - { - if (EQ (coding_systems, Qt)) - { - args[0] = Qopen_network_stream, args[1] = name, - args[2] = buffer, args[3] = host, args[4] = service; - GCPRO1 (proc); - coding_systems = Ffind_coding_system (5, args); - UNGCPRO; - } - val = (CONSP (coding_systems) ? XCONS (coding_systems)->cdr : Qnil); - } - XPROCESS (proc)->encode_coding_system = val; - } - + if (!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters) + || NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters)) + { + XPROCESS (proc)->decode_coding_system = Qnil; + XPROCESS (proc)->encode_coding_system = Qnil; + } + else + { + /* Setup coding systems for communicating with the network stream. */ + struct gcpro gcpro1; + /* Qt denotes that we have not yet called Ffind_coding_system. */ + Lisp_Object coding_systems = Qt; + Lisp_Object args[5], val; + + if (NILP (val = Vcoding_system_for_read)) + { + args[0] = Qopen_network_stream, args[1] = name, + args[2] = buffer, args[3] = host, args[4] = service; + GCPRO1 (proc); + coding_systems = Ffind_coding_system (5, args); + UNGCPRO; + val = (CONSP (coding_systems) ? XCONS (coding_systems)->car : Qnil); + } + XPROCESS (proc)->decode_coding_system = val; + + if (NILP (val = Vcoding_system_for_write)) + { + if (EQ (coding_systems, Qt)) + { + args[0] = Qopen_network_stream, args[1] = name, + args[2] = buffer, args[3] = host, args[4] = service; + GCPRO1 (proc); + coding_systems = Ffind_coding_system (5, args); + UNGCPRO; + } + val = (CONSP (coding_systems) ? XCONS (coding_systems)->cdr : Qnil); + } + XPROCESS (proc)->encode_coding_system = val; + } + + if (!proc_decode_coding_system[inch]) + proc_decode_coding_system[inch] + = (struct coding_system *) xmalloc (sizeof (struct coding_system)); setup_coding_system (XPROCESS (proc)->decode_coding_system, - &proc_decode_coding_system[inch]); + proc_decode_coding_system[inch]); + if (!proc_encode_coding_system[outch]) + proc_encode_coding_system[outch] + = (struct coding_system *) xmalloc (sizeof (struct coding_system)); setup_coding_system (XPROCESS (proc)->encode_coding_system, - &proc_encode_coding_system[outch]); + proc_encode_coding_system[outch]); XPROCESS (proc)->decoding_buf = make_uninit_string (0); XPROCESS (proc)->encoding_buf = make_uninit_string (0); @@ -2570,7 +2596,7 @@ register struct buffer *old = current_buffer; register struct Lisp_Process *p = XPROCESS (proc); register int opoint; - struct coding_system *coding = &proc_decode_coding_system[channel]; + struct coding_system *coding = proc_decode_coding_system[channel]; int chars_in_decoding_buf = 0; /* If 1, `chars' points XSTRING (p->decoding_buf)->data. */ @@ -2652,14 +2678,14 @@ { p->decode_coding_system = coding->symbol; setup_coding_system (coding->symbol, - &proc_decode_coding_system[channel]); + proc_decode_coding_system[channel]); /* If coding-system for encoding is not yet decided, we set it as the same as coding-system for decoding. */ if (NILP (p->encode_coding_system)) { p->encode_coding_system = coding->symbol; setup_coding_system (coding->symbol, - &proc_encode_coding_system[channel]); + proc_encode_coding_system[channel]); } } #ifdef VMS @@ -2888,7 +2914,7 @@ if (XINT (XPROCESS (proc)->outfd) < 0) error ("Output file descriptor of %s is closed", procname); - coding = &proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; + coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; if (CODING_REQUIRE_CONVERSION (coding)) { int require = encoding_buffer_size (coding, len); @@ -3982,9 +4008,9 @@ p->decode_coding_system = Fcheck_coding_system (decoding); p->encode_coding_system = Fcheck_coding_system (encoding); setup_coding_system (decoding, - &proc_decode_coding_system[XINT (p->infd)]); + proc_decode_coding_system[XINT (p->infd)]); setup_coding_system (encoding, - &proc_encode_coding_system[XINT (p->outfd)]); + proc_encode_coding_system[XINT (p->outfd)]); return Qnil; } @@ -4077,6 +4103,8 @@ chan_process[i] = Qnil; proc_buffered_char[i] = -1; } + bzero (proc_decode_coding_system, sizeof proc_decode_coding_system); + bzero (proc_encode_coding_system, sizeof proc_encode_coding_system); } syms_of_process ()