]> git.eshelyaron.com Git - emacs.git/commitdiff
Include composite.h.
authorKenichi Handa <handa@m17n.org>
Mon, 29 May 2000 11:18:02 +0000 (11:18 +0000)
committerKenichi Handa <handa@m17n.org>
Mon, 29 May 2000 11:18:02 +0000 (11:18 +0000)
(Fcall_process): Handle composition correctly.

src/callproc.c

index b23a0bb48e5800cf23fab6166aa4c6fe5cc4e716..046c14a9b40cc03b814794681333311f6efa2f52 100644 (file)
@@ -75,6 +75,7 @@ extern int errno;
 #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 @@ 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