Mercurial > emacs
comparison src/process.c @ 89483:2f877ed80fa6
*** empty log message ***
| author | Kenichi Handa <handa@m17n.org> |
|---|---|
| date | Mon, 08 Sep 2003 12:53:41 +0000 |
| parents | 375f2633d815 3e4c75be8383 |
| children | 8c02d5cc8f27 |
comparison
equal
deleted
inserted
replaced
| 88123:375f2633d815 | 89483:2f877ed80fa6 |
|---|---|
| 110 #include "systty.h" | 110 #include "systty.h" |
| 111 | 111 |
| 112 #include "lisp.h" | 112 #include "lisp.h" |
| 113 #include "window.h" | 113 #include "window.h" |
| 114 #include "buffer.h" | 114 #include "buffer.h" |
| 115 #include "charset.h" | 115 #include "character.h" |
| 116 #include "coding.h" | 116 #include "coding.h" |
| 117 #include "process.h" | 117 #include "process.h" |
| 118 #include "termhooks.h" | 118 #include "termhooks.h" |
| 119 #include "termopts.h" | 119 #include "termopts.h" |
| 120 #include "commands.h" | 120 #include "commands.h" |
| 598 Lisp_Object process; | 598 Lisp_Object process; |
| 599 { | 599 { |
| 600 struct Lisp_Process *p = XPROCESS (process); | 600 struct Lisp_Process *p = XPROCESS (process); |
| 601 int inch = XINT (p->infd); | 601 int inch = XINT (p->infd); |
| 602 int outch = XINT (p->outfd); | 602 int outch = XINT (p->outfd); |
| 603 Lisp_Object coding_system; | |
| 603 | 604 |
| 604 if (inch < 0 || outch < 0) | 605 if (inch < 0 || outch < 0) |
| 605 return; | 606 return; |
| 606 | 607 |
| 607 if (!proc_decode_coding_system[inch]) | 608 if (!proc_decode_coding_system[inch]) |
| 608 proc_decode_coding_system[inch] | 609 proc_decode_coding_system[inch] |
| 609 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); | 610 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); |
| 610 setup_coding_system (p->decode_coding_system, | 611 coding_system = p->decode_coding_system; |
| 611 proc_decode_coding_system[inch]); | |
| 612 if (! NILP (p->filter)) | 612 if (! NILP (p->filter)) |
| 613 { | 613 { |
| 614 if (NILP (p->filter_multibyte)) | 614 if (NILP (p->filter_multibyte)) |
| 615 setup_raw_text_coding_system (proc_decode_coding_system[inch]); | 615 coding_system = raw_text_coding_system (coding_system); |
| 616 } | 616 } |
| 617 else if (BUFFERP (p->buffer)) | 617 else if (BUFFERP (p->buffer)) |
| 618 { | 618 { |
| 619 if (NILP (XBUFFER (p->buffer)->enable_multibyte_characters)) | 619 if (NILP (XBUFFER (p->buffer)->enable_multibyte_characters)) |
| 620 setup_raw_text_coding_system (proc_decode_coding_system[inch]); | 620 coding_system = raw_text_coding_system (coding_system); |
| 621 } | 621 } |
| 622 setup_coding_system (coding_system, proc_decode_coding_system[inch]); | |
| 622 | 623 |
| 623 if (!proc_encode_coding_system[outch]) | 624 if (!proc_encode_coding_system[outch]) |
| 624 proc_encode_coding_system[outch] | 625 proc_encode_coding_system[outch] |
| 625 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); | 626 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); |
| 626 setup_coding_system (p->encode_coding_system, | 627 setup_coding_system (p->encode_coding_system, |
| 4398 int | 4399 int |
| 4399 read_process_output (proc, channel) | 4400 read_process_output (proc, channel) |
| 4400 Lisp_Object proc; | 4401 Lisp_Object proc; |
| 4401 register int channel; | 4402 register int channel; |
| 4402 { | 4403 { |
| 4403 register int nchars, nbytes; | 4404 register int nbytes; |
| 4404 char *chars; | 4405 char *chars; |
| 4405 register Lisp_Object outstream; | 4406 register Lisp_Object outstream; |
| 4406 register struct buffer *old = current_buffer; | 4407 register struct buffer *old = current_buffer; |
| 4407 register struct Lisp_Process *p = XPROCESS (proc); | 4408 register struct Lisp_Process *p = XPROCESS (proc); |
| 4408 register int opoint; | 4409 register int opoint; |
| 4532 | 4533 |
| 4533 /* For speed, if a search happens within this code, | 4534 /* For speed, if a search happens within this code, |
| 4534 save the match data in a special nonrecursive fashion. */ | 4535 save the match data in a special nonrecursive fashion. */ |
| 4535 running_asynch_code = 1; | 4536 running_asynch_code = 1; |
| 4536 | 4537 |
| 4537 text = decode_coding_string (make_unibyte_string (chars, nbytes), | 4538 decode_coding_c_string (coding, chars, nbytes, Qt); |
| 4538 coding, 0); | 4539 text = coding->dst_object; |
| 4539 Vlast_coding_system_used = coding->symbol; | 4540 Vlast_coding_system_used = CODING_ID_NAME (coding->id); |
| 4540 /* A new coding system might be found. */ | 4541 /* A new coding system might be found. */ |
| 4541 if (!EQ (p->decode_coding_system, coding->symbol)) | 4542 if (!EQ (p->decode_coding_system, Vlast_coding_system_used)) |
| 4542 { | 4543 { |
| 4543 p->decode_coding_system = coding->symbol; | 4544 p->decode_coding_system = Vlast_coding_system_used; |
| 4544 | 4545 |
| 4545 /* Don't call setup_coding_system for | 4546 /* Don't call setup_coding_system for |
| 4546 proc_decode_coding_system[channel] here. It is done in | 4547 proc_decode_coding_system[channel] here. It is done in |
| 4547 detect_coding called via decode_coding above. */ | 4548 detect_coding called via decode_coding above. */ |
| 4548 | 4549 |
| 4554 valid memory because p->outfd will be changed once EOF is | 4555 valid memory because p->outfd will be changed once EOF is |
| 4555 sent to the process. */ | 4556 sent to the process. */ |
| 4556 if (NILP (p->encode_coding_system) | 4557 if (NILP (p->encode_coding_system) |
| 4557 && proc_encode_coding_system[XINT (p->outfd)]) | 4558 && proc_encode_coding_system[XINT (p->outfd)]) |
| 4558 { | 4559 { |
| 4559 p->encode_coding_system = coding->symbol; | 4560 p->encode_coding_system = Vlast_coding_system_used; |
| 4560 setup_coding_system (coding->symbol, | 4561 setup_coding_system (p->encode_coding_system, |
| 4561 proc_encode_coding_system[XINT (p->outfd)]); | 4562 proc_encode_coding_system[XINT (p->outfd)]); |
| 4562 } | 4563 } |
| 4563 } | 4564 } |
| 4564 | 4565 |
| 4565 carryover = nbytes - coding->consumed; | 4566 if (coding->carryover_bytes > 0) |
| 4566 bcopy (chars + coding->consumed, SDATA (p->decoding_buf), | 4567 { |
| 4567 carryover); | 4568 bcopy (coding->carryover, SDATA (p->decoding_buf), |
| 4568 XSETINT (p->decoding_carryover, carryover); | 4569 coding->carryover_bytes); |
| 4570 XSETINT (p->decoding_carryover, coding->carryover_bytes); | |
| 4571 } | |
| 4569 /* Adjust the multibyteness of TEXT to that of the filter. */ | 4572 /* Adjust the multibyteness of TEXT to that of the filter. */ |
| 4570 if (NILP (p->filter_multibyte) != ! STRING_MULTIBYTE (text)) | 4573 if (NILP (p->filter_multibyte) != ! STRING_MULTIBYTE (text)) |
| 4571 text = (STRING_MULTIBYTE (text) | 4574 text = (STRING_MULTIBYTE (text) |
| 4572 ? Fstring_as_unibyte (text) | 4575 ? Fstring_as_unibyte (text) |
| 4573 : Fstring_to_multibyte (text)); | 4576 : Fstring_to_multibyte (text)); |
| 4648 /* If the output marker is outside of the visible region, save | 4651 /* If the output marker is outside of the visible region, save |
| 4649 the restriction and widen. */ | 4652 the restriction and widen. */ |
| 4650 if (! (BEGV <= PT && PT <= ZV)) | 4653 if (! (BEGV <= PT && PT <= ZV)) |
| 4651 Fwiden (); | 4654 Fwiden (); |
| 4652 | 4655 |
| 4653 text = decode_coding_string (make_unibyte_string (chars, nbytes), | 4656 decode_coding_c_string (coding, chars, nbytes, Qt); |
| 4654 coding, 0); | 4657 text = coding->dst_object; |
| 4655 Vlast_coding_system_used = coding->symbol; | 4658 Vlast_coding_system_used = CODING_ID_NAME (coding->id); |
| 4656 /* A new coding system might be found. See the comment in the | 4659 /* A new coding system might be found. See the comment in the |
| 4657 similar code in the previous `if' block. */ | 4660 similar code in the previous `if' block. */ |
| 4658 if (!EQ (p->decode_coding_system, coding->symbol)) | 4661 if (!EQ (p->decode_coding_system, Vlast_coding_system_used)) |
| 4659 { | 4662 { |
| 4660 p->decode_coding_system = coding->symbol; | 4663 p->decode_coding_system = Vlast_coding_system_used; |
| 4661 if (NILP (p->encode_coding_system) | 4664 if (NILP (p->encode_coding_system) |
| 4662 && proc_encode_coding_system[XINT (p->outfd)]) | 4665 && proc_encode_coding_system[XINT (p->outfd)]) |
| 4663 { | 4666 { |
| 4664 p->encode_coding_system = coding->symbol; | 4667 p->encode_coding_system = Vlast_coding_system_used; |
| 4665 setup_coding_system (coding->symbol, | 4668 setup_coding_system (p->encode_coding_system, |
| 4666 proc_encode_coding_system[XINT (p->outfd)]); | 4669 proc_encode_coding_system[XINT (p->outfd)]); |
| 4667 } | 4670 } |
| 4668 } | 4671 } |
| 4669 carryover = nbytes - coding->consumed; | 4672 if (coding->carryover_bytes > 0) |
| 4670 bcopy (chars + coding->consumed, SDATA (p->decoding_buf), | 4673 { |
| 4671 carryover); | 4674 bcopy (coding->carryover, SDATA (p->decoding_buf), |
| 4672 XSETINT (p->decoding_carryover, carryover); | 4675 coding->carryover_bytes); |
| 4676 XSETINT (p->decoding_carryover, coding->carryover_bytes); | |
| 4677 } | |
| 4673 /* Adjust the multibyteness of TEXT to that of the buffer. */ | 4678 /* Adjust the multibyteness of TEXT to that of the buffer. */ |
| 4674 if (NILP (current_buffer->enable_multibyte_characters) | 4679 if (NILP (current_buffer->enable_multibyte_characters) |
| 4675 != ! STRING_MULTIBYTE (text)) | 4680 != ! STRING_MULTIBYTE (text)) |
| 4676 text = (STRING_MULTIBYTE (text) | 4681 text = (STRING_MULTIBYTE (text) |
| 4677 ? Fstring_as_unibyte (text) | 4682 ? Fstring_as_unibyte (text) |
| 4788 if (XINT (XPROCESS (proc)->outfd) < 0) | 4793 if (XINT (XPROCESS (proc)->outfd) < 0) |
| 4789 error ("Output file descriptor of %s is closed", | 4794 error ("Output file descriptor of %s is closed", |
| 4790 SDATA (XPROCESS (proc)->name)); | 4795 SDATA (XPROCESS (proc)->name)); |
| 4791 | 4796 |
| 4792 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; | 4797 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; |
| 4793 Vlast_coding_system_used = coding->symbol; | 4798 Vlast_coding_system_used = CODING_ID_NAME (coding->id); |
| 4794 | 4799 |
| 4795 if ((STRINGP (object) && STRING_MULTIBYTE (object)) | 4800 if ((STRINGP (object) && STRING_MULTIBYTE (object)) |
| 4796 || (BUFFERP (object) | 4801 || (BUFFERP (object) |
| 4797 && !NILP (XBUFFER (object)->enable_multibyte_characters)) | 4802 && !NILP (XBUFFER (object)->enable_multibyte_characters)) |
| 4798 || EQ (object, Qt)) | 4803 || EQ (object, Qt)) |
| 4799 { | 4804 { |
| 4800 if (!EQ (coding->symbol, XPROCESS (proc)->encode_coding_system)) | 4805 if (!EQ (Vlast_coding_system_used, |
| 4806 XPROCESS (proc)->encode_coding_system)) | |
| 4801 /* The coding system for encoding was changed to raw-text | 4807 /* The coding system for encoding was changed to raw-text |
| 4802 because we sent a unibyte text previously. Now we are | 4808 because we sent a unibyte text previously. Now we are |
| 4803 sending a multibyte text, thus we must encode it by the | 4809 sending a multibyte text, thus we must encode it by the |
| 4804 original coding system specified for the current | 4810 original coding system specified for the current |
| 4805 process. */ | 4811 process. */ |
| 4806 setup_coding_system (XPROCESS (proc)->encode_coding_system, coding); | 4812 setup_coding_system (XPROCESS (proc)->encode_coding_system, coding); |
| 4807 /* src_multibyte should be set to 1 _after_ a call to | |
| 4808 setup_coding_system, since it resets src_multibyte to | |
| 4809 zero. */ | |
| 4810 coding->src_multibyte = 1; | |
| 4811 } | 4813 } |
| 4812 else | 4814 else |
| 4813 { | 4815 { |
| 4814 /* For sending a unibyte text, character code conversion should | 4816 /* For sending a unibyte text, character code conversion should |
| 4815 not take place but EOL conversion should. So, setup raw-text | 4817 not take place but EOL conversion should. So, setup raw-text |
| 4816 or one of the subsidiary if we have not yet done it. */ | 4818 or one of the subsidiary if we have not yet done it. */ |
| 4817 if (coding->type != coding_type_raw_text) | 4819 if (CODING_REQUIRE_ENCODING (coding)) |
| 4818 { | 4820 { |
| 4819 if (CODING_REQUIRE_FLUSHING (coding)) | 4821 if (CODING_REQUIRE_FLUSHING (coding)) |
| 4820 { | 4822 { |
| 4821 /* But, before changing the coding, we must flush out data. */ | 4823 /* But, before changing the coding, we must flush out data. */ |
| 4822 coding->mode |= CODING_MODE_LAST_BLOCK; | 4824 coding->mode |= CODING_MODE_LAST_BLOCK; |
| 4823 send_process (proc, "", 0, Qt); | 4825 send_process (proc, "", 0, Qt); |
| 4826 coding->mode &= CODING_MODE_LAST_BLOCK; | |
| 4824 } | 4827 } |
| 4825 coding->src_multibyte = 0; | 4828 coding->src_multibyte = 0; |
| 4826 setup_raw_text_coding_system (coding); | 4829 setup_coding_system (raw_text_coding_system |
| 4830 (Vlast_coding_system_used), | |
| 4831 coding); | |
| 4827 } | 4832 } |
| 4828 } | 4833 } |
| 4829 coding->dst_multibyte = 0; | 4834 coding->dst_multibyte = 0; |
| 4830 | 4835 |
| 4831 if (CODING_REQUIRE_ENCODING (coding)) | 4836 if (CODING_REQUIRE_ENCODING (coding)) |
| 4832 { | 4837 { |
| 4833 int require = encoding_buffer_size (coding, len); | 4838 coding->dst_object = Qt; |
| 4834 int from_byte = -1, from = -1, to = -1; | |
| 4835 unsigned char *temp_buf = NULL; | |
| 4836 | |
| 4837 if (BUFFERP (object)) | 4839 if (BUFFERP (object)) |
| 4838 { | 4840 { |
| 4839 from_byte = BUF_PTR_BYTE_POS (XBUFFER (object), buf); | 4841 int from_byte, from, to; |
| 4840 from = buf_bytepos_to_charpos (XBUFFER (object), from_byte); | 4842 int save_pt, save_pt_byte; |
| 4841 to = buf_bytepos_to_charpos (XBUFFER (object), from_byte + len); | 4843 struct buffer *cur = current_buffer; |
| 4844 | |
| 4845 set_buffer_internal (XBUFFER (object)); | |
| 4846 save_pt = PT, save_pt_byte = PT_BYTE; | |
| 4847 | |
| 4848 from_byte = PTR_BYTE_POS (buf); | |
| 4849 from = BYTE_TO_CHAR (from_byte); | |
| 4850 to = BYTE_TO_CHAR (from_byte + len); | |
| 4851 TEMP_SET_PT_BOTH (from, from_byte); | |
| 4852 encode_coding_object (coding, object, from, from_byte, | |
| 4853 to, from_byte + len, Qt); | |
| 4854 TEMP_SET_PT_BOTH (save_pt, save_pt_byte); | |
| 4855 set_buffer_internal (cur); | |
| 4842 } | 4856 } |
| 4843 else if (STRINGP (object)) | 4857 else if (STRINGP (object)) |
| 4844 { | 4858 { |
| 4845 from_byte = buf - SDATA (object); | 4859 encode_coding_string (coding, object, 1); |
| 4846 from = string_byte_to_char (object, from_byte); | 4860 } |
| 4847 to = string_byte_to_char (object, from_byte + len); | 4861 else |
| 4848 } | 4862 { |
| 4849 | 4863 coding->dst_object = make_unibyte_string (buf, len); |
| 4850 if (coding->composing != COMPOSITION_DISABLED) | 4864 coding->produced = len; |
| 4851 { | 4865 } |
| 4852 if (from_byte >= 0) | 4866 |
| 4853 coding_save_composition (coding, from, to, object); | |
| 4854 else | |
| 4855 coding->composing = COMPOSITION_DISABLED; | |
| 4856 } | |
| 4857 | |
| 4858 if (SBYTES (XPROCESS (proc)->encoding_buf) < require) | |
| 4859 XPROCESS (proc)->encoding_buf = make_uninit_string (require); | |
| 4860 | |
| 4861 if (from_byte >= 0) | |
| 4862 buf = (BUFFERP (object) | |
| 4863 ? BUF_BYTE_ADDRESS (XBUFFER (object), from_byte) | |
| 4864 : SDATA (object) + from_byte); | |
| 4865 | |
| 4866 object = XPROCESS (proc)->encoding_buf; | |
| 4867 encode_coding (coding, (char *) buf, SDATA (object), | |
| 4868 len, SBYTES (object)); | |
| 4869 len = coding->produced; | 4867 len = coding->produced; |
| 4870 buf = SDATA (object); | 4868 buf = SDATA (coding->dst_object); |
| 4871 if (temp_buf) | |
| 4872 xfree (temp_buf); | |
| 4873 } | 4869 } |
| 4874 | 4870 |
| 4875 #ifdef VMS | 4871 #ifdef VMS |
| 4876 vs = get_vms_process_pointer (p->pid); | 4872 vs = get_vms_process_pointer (p->pid); |
| 4877 if (vs == 0) | 4873 if (vs == 0) |
| 6497 #include <sys/types.h> | 6493 #include <sys/types.h> |
| 6498 #include <errno.h> | 6494 #include <errno.h> |
| 6499 | 6495 |
| 6500 #include "lisp.h" | 6496 #include "lisp.h" |
| 6501 #include "systime.h" | 6497 #include "systime.h" |
| 6502 #include "charset.h" | 6498 #include "character.h" |
| 6503 #include "coding.h" | 6499 #include "coding.h" |
| 6504 #include "termopts.h" | 6500 #include "termopts.h" |
| 6505 #include "sysselect.h" | 6501 #include "sysselect.h" |
| 6506 | 6502 |
| 6507 extern int frame_garbaged; | 6503 extern int frame_garbaged; |
