Mercurial > emacs
changeset 29273:d9e38a948951
Include composite.h.
(Fcall_process): Handle composition correctly.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Mon, 29 May 2000 11:18:02 +0000 |
parents | 0d519872e966 |
children | 05e83ef9e129 |
files | src/callproc.c |
diffstat | 1 files changed, 29 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/callproc.c Mon May 29 11:16:46 2000 +0000 +++ b/src/callproc.c Mon May 29 11:18:02 2000 +0000 @@ -75,6 +75,7 @@ #include "charset.h" #include "ccl.h" #include "coding.h" +#include "composite.h" #include <epaths.h> #include "process.h" #include "syssignal.h" @@ -727,6 +728,8 @@ 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 @@ 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 @@ 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 @@ } 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