]> code.delx.au - gnu-emacs/blobdiff - src/callproc.c
(Fget_char_property): Update call to overlays_at.
[gnu-emacs] / src / callproc.c
index b23a0bb48e5800cf23fab6166aa4c6fe5cc4e716..103ece304bcb3e61ebc26564a93f1c4572a3636d 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"
@@ -92,6 +93,7 @@ extern char **environ;
 
 #ifdef HAVE_SETPGID
 #if !defined (USG) || defined (BSD_PGRPS)
+#undef setpgrp
 #define setpgrp setpgid
 #endif
 #endif
@@ -725,9 +727,12 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
     int carryover = 0;
     int display_on_the_fly = !NILP (display) && INTERACTIVE;
     struct coding_system saved_coding;
+    int pt_orig = PT, pt_byte_orig = PT_BYTE;
+    int inserted;
 
     saved_coding = process_coding;
-
+    if (process_coding.composing != COMPOSITION_DISABLED)
+      coding_allocate_composition_data (&process_coding, PT);
     while (1)
       {
        /* Repeatedly read until we've filled as much as possible
@@ -764,9 +769,14 @@ 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);
+               if (process_coding.cmp_data)
+                 process_coding.cmp_data->char_offset = PT;
                decode_coding (&process_coding, bufptr, decoding_buf,
                               nread, size);
                if (display_on_the_fly
@@ -787,12 +797,22 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
                  insert_1_both (decoding_buf, process_coding.produced_char,
                                 process_coding.produced, 0, 1, 0);
                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 more output for the process.  */
+                   coding_allocate_composition_data (&process_coding, PT);
+                   goto repeat_decoding;
+                 }
              }
          }
 
@@ -819,6 +839,20 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.")
       }
   give_up: ;
 
+    if (!NILP (buffer)
+       && process_coding.cmp_data)
+      {
+       coding_restore_composition (&process_coding, Fcurrent_buffer ());
+       coding_free_composition_data (&process_coding);
+      }
+
+    record_unwind_protect (save_excursion_restore, save_excursion_save ());
+    inserted = PT - pt_orig;
+    TEMP_SET_PT_BOTH (pt_orig, pt_byte_orig);
+    if (SYMBOLP (process_coding.post_read_conversion)
+       && !NILP (Ffboundp (process_coding.post_read_conversion)))
+      call1 (process_coding.post_read_conversion, make_number (inserted));
+
     Vlast_coding_system_used = process_coding.symbol;
 
     /* If the caller required, let the buffer inherit the
@@ -855,6 +889,7 @@ delete_temp_file (name)
   /* Use Fdelete_file (indirectly) because that runs a file name handler.
      We did that when writing the file, so we should do so when deleting.  */
   internal_delete_file (name);
+  return Qnil;
 }
 
 DEFUN ("call-process-region", Fcall_process_region, Scall_process_region,
@@ -1046,7 +1081,14 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
     register int i;
 
     i = STRING_BYTES (XSTRING (current_dir));
+#ifdef MSDOS
+    /* MSDOS must have all environment variables malloc'ed, because
+       low-level libc functions that launch subsidiary processes rely
+       on that.  */
+    pwd_var = (char *) xmalloc (i + 6);
+#else
     pwd_var = (char *) alloca (i + 6);
+#endif
     temp = pwd_var + 4;
     bcopy ("PWD=", pwd_var, 4);
     bcopy (XSTRING (current_dir)->data, temp, i);
@@ -1186,6 +1228,7 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
 
 #ifdef MSDOS
   pid = run_msdos_command (new_argv, pwd_var + 4, in, out, err, env);
+  xfree (pwd_var);
   if (pid == -1)
     /* An error occurred while trying to run the subprocess.  */
     report_file_error ("Spawning child process", Qnil);