aboutsummaryrefslogtreecommitdiffstats
path: root/src/process.c
diff options
context:
space:
mode:
authorKaroly Lorentey2007-02-24 19:26:54 +0000
committerKaroly Lorentey2007-02-24 19:26:54 +0000
commitf65f7603312547e51230192daf34349b8ac569a0 (patch)
treecbc5877854d00bbdd5ecd4906d130ab8fbb44430 /src/process.c
parent9440b75fccbf763e3fb23a31a128d97eb4debdf5 (diff)
parent735895f1fa28f88c559e73910ea0ff0bda0f228c (diff)
downloademacs-f65f7603312547e51230192daf34349b8ac569a0.tar.gz
emacs-f65f7603312547e51230192daf34349b8ac569a0.zip
Merged from emacs@sv.gnu.org
Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-619 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-620 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-621 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-622 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-623 Remove RCS keywords * emacs@sv.gnu.org/emacs--devo--0--patch-624 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-625 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-626 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-627 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-628 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-629 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-630 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-631 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-632 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-633 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-634 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-635 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-636 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-637 Remove RCS keywords * emacs@sv.gnu.org/emacs--devo--0--patch-638 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-639 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-640 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-641 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-642 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-643 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-644 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-645 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-646 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-647 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-648 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-649 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-197 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-198 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-199 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-200 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-201 Update from CVS: lisp/nnweb.el (nnweb-google-parse-1): Update parser. * emacs@sv.gnu.org/gnus--rel--5.10--patch-202 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-596
Diffstat (limited to 'src/process.c')
-rw-r--r--src/process.c91
1 files changed, 79 insertions, 12 deletions
diff --git a/src/process.c b/src/process.c
index 38a5c8341cf..d11a300363d 100644
--- a/src/process.c
+++ b/src/process.c
@@ -5665,6 +5665,83 @@ send_process (proc, buf, len, object)
5665 UNGCPRO; 5665 UNGCPRO;
5666} 5666}
5667 5667
5668static Lisp_Object
5669send_process_object_unwind (buf)
5670 Lisp_Object buf;
5671{
5672 Lisp_Object tembuf;
5673
5674 if (XBUFFER (buf) == current_buffer)
5675 return Qnil;
5676 tembuf = Fcurrent_buffer ();
5677 Fset_buffer (buf);
5678 Fkill_buffer (tembuf);
5679 return Qnil;
5680}
5681
5682/* Send current contents of region between START and END to PROC.
5683 If START is a string, send it instead.
5684 This function can evaluate Lisp code and can garbage collect. */
5685
5686static void
5687send_process_object (proc, start, end)
5688 Lisp_Object proc, start, end;
5689{
5690 int count = SPECPDL_INDEX ();
5691 Lisp_Object object = STRINGP (start) ? start : Fcurrent_buffer ();
5692 struct buffer *given_buffer = current_buffer;
5693 unsigned char *buf;
5694 int len;
5695
5696 record_unwind_protect (send_process_object_unwind, Fcurrent_buffer ());
5697
5698 if (STRINGP (object) ? STRING_MULTIBYTE (object)
5699 : ! NILP (XBUFFER (object)->enable_multibyte_characters))
5700 {
5701 struct Lisp_Process *p = XPROCESS (proc);
5702 struct coding_system *coding = proc_encode_coding_system[XINT (p->outfd)];
5703
5704 if (! EQ (coding->symbol, p->encode_coding_system))
5705 /* The coding system for encoding was changed to raw-text
5706 because we sent a unibyte text previously. Now we are
5707 sending a multibyte text, thus we must encode it by the
5708 original coding system specified for the current process. */
5709 setup_coding_system (p->encode_coding_system, coding);
5710 if (! NILP (coding->pre_write_conversion))
5711 {
5712 struct gcpro gcpro1, gcpro2;
5713
5714 GCPRO2 (proc, object);
5715 call2 (coding->pre_write_conversion, start, end);
5716 UNGCPRO;
5717 if (given_buffer != current_buffer)
5718 {
5719 start = make_number (BEGV), end = make_number (ZV);
5720 object = Fcurrent_buffer ();
5721 }
5722 }
5723 }
5724
5725 if (BUFFERP (object))
5726 {
5727 EMACS_INT start_byte;
5728
5729 if (XINT (start) < GPT && XINT (end) > GPT)
5730 move_gap (XINT (end));
5731 start_byte = CHAR_TO_BYTE (XINT (start));
5732 buf = BYTE_POS_ADDR (start_byte);
5733 len = CHAR_TO_BYTE (XINT (end)) - start_byte;
5734 }
5735 else
5736 {
5737 buf = SDATA (object);
5738 len = SBYTES (object);
5739 }
5740 send_process (proc, buf, len, object);
5741
5742 unbind_to (count, Qnil);
5743}
5744
5668DEFUN ("process-send-region", Fprocess_send_region, Sprocess_send_region, 5745DEFUN ("process-send-region", Fprocess_send_region, Sprocess_send_region,
5669 3, 3, 0, 5746 3, 3, 0,
5670 doc: /* Send current contents of region as input to PROCESS. 5747 doc: /* Send current contents of region as input to PROCESS.
@@ -5678,19 +5755,10 @@ Output from processes can arrive in between bunches. */)
5678 Lisp_Object process, start, end; 5755 Lisp_Object process, start, end;
5679{ 5756{
5680 Lisp_Object proc; 5757 Lisp_Object proc;
5681 int start1, end1;
5682 5758
5683 proc = get_process (process); 5759 proc = get_process (process);
5684 validate_region (&start, &end); 5760 validate_region (&start, &end);
5685 5761 send_process_object (proc, start, end);
5686 if (XINT (start) < GPT && XINT (end) > GPT)
5687 move_gap (XINT (start));
5688
5689 start1 = CHAR_TO_BYTE (XINT (start));
5690 end1 = CHAR_TO_BYTE (XINT (end));
5691 send_process (proc, BYTE_POS_ADDR (start1), end1 - start1,
5692 Fcurrent_buffer ());
5693
5694 return Qnil; 5762 return Qnil;
5695} 5763}
5696 5764
@@ -5708,8 +5776,7 @@ Output from processes can arrive in between bunches. */)
5708 Lisp_Object proc; 5776 Lisp_Object proc;
5709 CHECK_STRING (string); 5777 CHECK_STRING (string);
5710 proc = get_process (process); 5778 proc = get_process (process);
5711 send_process (proc, SDATA (string), 5779 send_process_object (proc, string, Qnil);
5712 SBYTES (string), string);
5713 return Qnil; 5780 return Qnil;
5714} 5781}
5715 5782