# HG changeset patch # User Kenichi Handa # Date 958780270 0 # Node ID f5c7d80ed4dec684cfebfe1953bc462931a75380 # Parent 4c808e415352d34a31eba6971f004d362aa2636d (Fcall_process): Always encode an argument string if it is multibyte. Setup src_multibyte and dst_multibyte members of process_coding properly. diff -r 4c808e415352 -r f5c7d80ed4de src/callproc.c --- a/src/callproc.c Fri May 19 23:50:52 2000 +0000 +++ b/src/callproc.c Fri May 19 23:51:10 2000 +0000 @@ -379,22 +379,23 @@ if (nargs > 4) { register int i; - - if (CODING_REQUIRE_ENCODING (&argument_coding)) - { - /* We must encode the arguments. */ - struct gcpro gcpro1, gcpro2, gcpro3; + struct gcpro gcpro1, gcpro2, gcpro3; - GCPRO3 (infile, buffer, current_dir); - for (i = 4; i < nargs; i++) + GCPRO3 (infile, buffer, current_dir); + argument_coding.dst_multibyte = 0; + for (i = 4; i < nargs; i++) + { + argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]); + if (CODING_REQUIRE_ENCODING (&argument_coding)) { - args[i] = code_convert_string (args[i], &argument_coding, 1, 0); - setup_ccl_program (&(argument_coding.spec.ccl.encoder), Qnil); + /* We must encode this argument. */ + args[i] = encode_coding_string (args[i], &argument_coding, 1); + if (argument_coding.type == coding_type_ccl) + setup_ccl_program (&(argument_coding.spec.ccl.encoder), Qnil); } - UNGCPRO; + new_argv[i - 3] = XSTRING (args[i])->data; } - for (i = 4; i < nargs; i++) - new_argv[i - 3] = XSTRING (args[i])->data; + UNGCPRO; new_argv[nargs - 3] = 0; } else @@ -702,6 +703,11 @@ && !NILP (val)) setup_raw_text_coding_system (&process_coding); } + process_coding.src_multibyte = 0; + process_coding.dst_multibyte + = (BUFFERP (buffer) + ? ! NILP (XBUFFER (buffer)->enable_multibyte_characters) + : ! NILP (current_buffer->enable_multibyte_characters)); immediate_quit = 1; QUIT; @@ -748,8 +754,8 @@ if (!NILP (buffer)) { - if (! CODING_REQUIRE_DECODING (&process_coding)) - insert (bufptr, nread); + if (! CODING_MAY_REQUIRE_DECODING (&process_coding)) + insert_1_both (bufptr, nread, nread, 0, 1, 0); else { /* We have to decode the input. */ int size = decoding_buffer_size (&process_coding, nread); @@ -772,27 +778,20 @@ continue; } if (process_coding.produced > 0) - insert (decoding_buf, process_coding.produced); + insert_1_both (decoding_buf, process_coding.produced_char, + process_coding.produced, 0, 1, 0); xfree (decoding_buf); carryover = nread - process_coding.consumed; if (carryover > 0) - { - /* As CARRYOVER should not be that large, we had - better avoid overhead of bcopy. */ - char *p = bufptr + process_coding.consumed; - char *pend = p + carryover; - char *dst = bufptr; - - while (p < pend) *dst++ = *p++; - } + /* As CARRYOVER should not be that large, we had + better avoid overhead of bcopy. */ + BCOPY_SHORT (bufptr + process_coding.consumed, bufptr, + carryover); } } + if (process_coding.mode & CODING_MODE_LAST_BLOCK) - { - if (carryover > 0) - insert (bufptr, carryover); - break; - } + break; /* Make the buffer bigger as we continue to read more data, but not past 64k. */