#include "charset.h"
#include "ccl.h"
#include "coding.h"
+#include "composite.h"
#include <epaths.h>
#include "process.h"
#include "syssignal.h"
#ifdef HAVE_SETPGID
#if !defined (USG) || defined (BSD_PGRPS)
+#undef setpgrp
#define setpgrp setpgid
#endif
#endif
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
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
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;
+ }
}
}
}
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
/* 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,
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);
#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);