From: Kenichi Handa Date: Mon, 29 May 2000 11:18:02 +0000 (+0000) Subject: Include composite.h. X-Git-Tag: emacs-pretest-21.0.90~3651 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f0b950cf5a0c6a681d0a93cbea7374e7f8728fc0;p=emacs.git Include composite.h. (Fcall_process): Handle composition correctly. --- diff --git a/src/callproc.c b/src/callproc.c index b23a0bb48e5..046c14a9b40 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -75,6 +75,7 @@ extern int errno; #include "charset.h" #include "ccl.h" #include "coding.h" +#include "composite.h" #include #include "process.h" #include "syssignal.h" @@ -727,6 +728,8 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") struct coding_system saved_coding; saved_coding = process_coding; + if (process_coding.composing != COMPOSITION_DISABLED) + coding_allocate_composition_data (&process_coding, PT); while (1) { @@ -764,9 +767,12 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") insert_1_both (bufptr, nread, nread, 0, 1, 0); else { /* We have to decode the input. */ - int size = decoding_buffer_size (&process_coding, nread); - char *decoding_buf = (char *) xmalloc (size); + int size; + char *decoding_buf; + repeat_decoding: + size = decoding_buffer_size (&process_coding, nread); + decoding_buf = (char *) xmalloc (size); decode_coding (&process_coding, bufptr, decoding_buf, nread, size); if (display_on_the_fly @@ -784,15 +790,30 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") continue; } if (process_coding.produced > 0) - insert_1_both (decoding_buf, process_coding.produced_char, - process_coding.produced, 0, 1, 0); + { + insert_1_both (decoding_buf, process_coding.produced_char, + process_coding.produced, 0, 1, 0); + if (process_coding.cmp_data) + coding_restore_composition (&process_coding, + Fcurrent_buffer ()); + } xfree (decoding_buf); - carryover = nread - process_coding.consumed; + nread -= process_coding.consumed; + carryover = nread; if (carryover > 0) /* 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.result == CODING_FINISH_INSUFFICIENT_CMP) + { + /* The decoding ended because of insufficient data + area to record information about composition. + We must try decoding with additional data area + before reading process output. */ + coding_allocate_composition_data (&process_coding, PT); + goto repeat_decoding; + } } } @@ -819,6 +840,9 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") } give_up: ; + if (process_coding.cmp_data) + coding_free_composition_data (&process_coding); + Vlast_coding_system_used = process_coding.symbol; /* If the caller required, let the buffer inherit the