diff options
| author | Kenichi Handa | 2002-03-01 01:11:12 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2002-03-01 01:11:12 +0000 |
| commit | 91183bfd93d103383d05b017f4686408fda954d3 (patch) | |
| tree | 045f95050a83a44dbda3960d01cdcf720093a02d /src | |
| parent | d6af5f0c1148acfdcddc0b084240efc5802c5175 (diff) | |
| download | emacs-91183bfd93d103383d05b017f4686408fda954d3.tar.gz emacs-91183bfd93d103383d05b017f4686408fda954d3.zip | |
Include "character.h" instead of "charset.h".
(Fcall_process): Big change for the new code-conversion APIs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/callproc.c | 152 |
1 files changed, 22 insertions, 130 deletions
diff --git a/src/callproc.c b/src/callproc.c index f35485f9fe8..bb3df43d433 100644 --- a/src/callproc.c +++ b/src/callproc.c | |||
| @@ -75,7 +75,7 @@ extern int errno; | |||
| 75 | #include "lisp.h" | 75 | #include "lisp.h" |
| 76 | #include "commands.h" | 76 | #include "commands.h" |
| 77 | #include "buffer.h" | 77 | #include "buffer.h" |
| 78 | #include "charset.h" | 78 | #include "character.h" |
| 79 | #include "ccl.h" | 79 | #include "ccl.h" |
| 80 | #include "coding.h" | 80 | #include "coding.h" |
| 81 | #include "composite.h" | 81 | #include "composite.h" |
| @@ -401,12 +401,8 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 401 | { | 401 | { |
| 402 | argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]); | 402 | argument_coding.src_multibyte = STRING_MULTIBYTE (args[i]); |
| 403 | if (CODING_REQUIRE_ENCODING (&argument_coding)) | 403 | if (CODING_REQUIRE_ENCODING (&argument_coding)) |
| 404 | { | 404 | /* We must encode this argument. */ |
| 405 | /* We must encode this argument. */ | 405 | args[i] = encode_coding_string (&argument_coding, args[i], 1); |
| 406 | args[i] = encode_coding_string (args[i], &argument_coding, 1); | ||
| 407 | if (argument_coding.type == coding_type_ccl) | ||
| 408 | setup_ccl_program (&(argument_coding.spec.ccl.encoder), Qnil); | ||
| 409 | } | ||
| 410 | new_argv[i - 3] = XSTRING (args[i])->data; | 406 | new_argv[i - 3] = XSTRING (args[i])->data; |
| 411 | } | 407 | } |
| 412 | UNGCPRO; | 408 | UNGCPRO; |
| @@ -714,19 +710,15 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 714 | else | 710 | else |
| 715 | val = Qnil; | 711 | val = Qnil; |
| 716 | } | 712 | } |
| 717 | setup_coding_system (Fcheck_coding_system (val), &process_coding); | 713 | Fcheck_coding_system (val); |
| 718 | /* In unibyte mode, character code conversion should not take | 714 | /* In unibyte mode, character code conversion should not take |
| 719 | place but EOL conversion should. So, setup raw-text or one | 715 | place but EOL conversion should. So, setup raw-text or one |
| 720 | of the subsidiary according to the information just setup. */ | 716 | of the subsidiary according to the information just setup. */ |
| 721 | if (NILP (current_buffer->enable_multibyte_characters) | 717 | if (NILP (current_buffer->enable_multibyte_characters) |
| 722 | && !NILP (val)) | 718 | && !NILP (val)) |
| 723 | setup_raw_text_coding_system (&process_coding); | 719 | val = raw_text_coding_system (val); |
| 720 | setup_coding_system (val, &process_coding); | ||
| 724 | } | 721 | } |
| 725 | process_coding.src_multibyte = 0; | ||
| 726 | process_coding.dst_multibyte | ||
| 727 | = (BUFFERP (buffer) | ||
| 728 | ? ! NILP (XBUFFER (buffer)->enable_multibyte_characters) | ||
| 729 | : ! NILP (current_buffer->enable_multibyte_characters)); | ||
| 730 | 722 | ||
| 731 | immediate_quit = 1; | 723 | immediate_quit = 1; |
| 732 | QUIT; | 724 | QUIT; |
| @@ -742,8 +734,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 742 | int inserted; | 734 | int inserted; |
| 743 | 735 | ||
| 744 | saved_coding = process_coding; | 736 | saved_coding = process_coding; |
| 745 | if (process_coding.composing != COMPOSITION_DISABLED) | ||
| 746 | coding_allocate_composition_data (&process_coding, PT); | ||
| 747 | while (1) | 737 | while (1) |
| 748 | { | 738 | { |
| 749 | /* Repeatedly read until we've filled as much as possible | 739 | /* Repeatedly read until we've filled as much as possible |
| @@ -780,97 +770,29 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 780 | insert_1_both (bufptr, nread, nread, 0, 1, 0); | 770 | insert_1_both (bufptr, nread, nread, 0, 1, 0); |
| 781 | else | 771 | else |
| 782 | { /* We have to decode the input. */ | 772 | { /* We have to decode the input. */ |
| 783 | int size; | 773 | decode_coding_c_string (&process_coding, bufptr, nread, |
| 784 | char *decoding_buf; | 774 | buffer); |
| 785 | |||
| 786 | repeat_decoding: | ||
| 787 | size = decoding_buffer_size (&process_coding, nread); | ||
| 788 | decoding_buf = (char *) xmalloc (size); | ||
| 789 | |||
| 790 | if (process_coding.cmp_data) | ||
| 791 | process_coding.cmp_data->char_offset = PT; | ||
| 792 | |||
| 793 | decode_coding (&process_coding, bufptr, decoding_buf, | ||
| 794 | nread, size); | ||
| 795 | |||
| 796 | if (display_on_the_fly | 775 | if (display_on_the_fly |
| 797 | && saved_coding.type == coding_type_undecided | 776 | && CODING_REQUIRE_DETECTION (&saved_coding) |
| 798 | && process_coding.type != coding_type_undecided) | 777 | && ! CODING_REQUIRE_DETECTION (&process_coding)) |
| 799 | { | 778 | { |
| 800 | /* We have detected some coding system. But, | 779 | /* We have detected some coding system. But, |
| 801 | there's a possibility that the detection was | 780 | there's a possibility that the detection was |
| 802 | done by insufficient data. So, we give up | 781 | done by insufficient data. So, we give up |
| 803 | displaying on the fly. */ | 782 | displaying on the fly. */ |
| 804 | xfree (decoding_buf); | 783 | if (process_coding.produced > 0) |
| 784 | del_range_2 (process_coding.dst_pos, | ||
| 785 | process_coding.dst_pos_byte, | ||
| 786 | process_coding.dst_pos | ||
| 787 | + process_coding.produced_char, | ||
| 788 | process_coding.dst_pos_byte | ||
| 789 | + process_coding.produced, 0); | ||
| 805 | display_on_the_fly = 0; | 790 | display_on_the_fly = 0; |
| 806 | process_coding = saved_coding; | 791 | process_coding = saved_coding; |
| 807 | carryover = nread; | 792 | carryover = nread; |
| 808 | continue; | 793 | continue; |
| 809 | } | 794 | } |
| 810 | 795 | ||
| 811 | if (process_coding.produced > 0) | ||
| 812 | insert_1_both (decoding_buf, process_coding.produced_char, | ||
| 813 | process_coding.produced, 0, 1, 0); | ||
| 814 | xfree (decoding_buf); | ||
| 815 | |||
| 816 | if (process_coding.result == CODING_FINISH_INCONSISTENT_EOL) | ||
| 817 | { | ||
| 818 | Lisp_Object eol_type, coding; | ||
| 819 | |||
| 820 | if (process_coding.eol_type == CODING_EOL_CR) | ||
| 821 | { | ||
| 822 | /* CRs have been replaced with LFs. Undo | ||
| 823 | that in the text inserted above. */ | ||
| 824 | unsigned char *p; | ||
| 825 | |||
| 826 | move_gap_both (PT, PT_BYTE); | ||
| 827 | |||
| 828 | p = BYTE_POS_ADDR (pt_byte_orig); | ||
| 829 | for (; p < GPT_ADDR; ++p) | ||
| 830 | if (*p == '\n') | ||
| 831 | *p = '\r'; | ||
| 832 | } | ||
| 833 | else if (process_coding.eol_type == CODING_EOL_CRLF) | ||
| 834 | { | ||
| 835 | /* CR LFs have been replaced with LFs. Undo | ||
| 836 | that by inserting CRs in front of LFs in | ||
| 837 | the text inserted above. */ | ||
| 838 | EMACS_INT bytepos, old_pt, old_pt_byte, nCR; | ||
| 839 | |||
| 840 | old_pt = PT; | ||
| 841 | old_pt_byte = PT_BYTE; | ||
| 842 | nCR = 0; | ||
| 843 | |||
| 844 | for (bytepos = PT_BYTE - 1; | ||
| 845 | bytepos >= pt_byte_orig; | ||
| 846 | --bytepos) | ||
| 847 | if (FETCH_BYTE (bytepos) == '\n') | ||
| 848 | { | ||
| 849 | EMACS_INT charpos = BYTE_TO_CHAR (bytepos); | ||
| 850 | TEMP_SET_PT_BOTH (charpos, bytepos); | ||
| 851 | insert_1_both ("\r", 1, 1, 0, 1, 0); | ||
| 852 | ++nCR; | ||
| 853 | } | ||
| 854 | |||
| 855 | TEMP_SET_PT_BOTH (old_pt + nCR, old_pt_byte + nCR); | ||
| 856 | } | ||
| 857 | |||
| 858 | /* Set the coding system symbol to that for | ||
| 859 | Unix-like EOL. */ | ||
| 860 | eol_type = Fget (saved_coding.symbol, Qeol_type); | ||
| 861 | if (VECTORP (eol_type) | ||
| 862 | && ASIZE (eol_type) == 3 | ||
| 863 | && SYMBOLP (AREF (eol_type, CODING_EOL_LF))) | ||
| 864 | coding = AREF (eol_type, CODING_EOL_LF); | ||
| 865 | else | ||
| 866 | coding = saved_coding.symbol; | ||
| 867 | |||
| 868 | process_coding.symbol = coding; | ||
| 869 | process_coding.eol_type = CODING_EOL_LF; | ||
| 870 | process_coding.mode | ||
| 871 | &= ~CODING_MODE_INHIBIT_INCONSISTENT_EOL; | ||
| 872 | } | ||
| 873 | |||
| 874 | nread -= process_coding.consumed; | 796 | nread -= process_coding.consumed; |
| 875 | carryover = nread; | 797 | carryover = nread; |
| 876 | if (carryover > 0) | 798 | if (carryover > 0) |
| @@ -878,15 +800,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 878 | better avoid overhead of bcopy. */ | 800 | better avoid overhead of bcopy. */ |
| 879 | BCOPY_SHORT (bufptr + process_coding.consumed, bufptr, | 801 | BCOPY_SHORT (bufptr + process_coding.consumed, bufptr, |
| 880 | carryover); | 802 | carryover); |
| 881 | if (process_coding.result == CODING_FINISH_INSUFFICIENT_CMP) | ||
| 882 | { | ||
| 883 | /* The decoding ended because of insufficient data | ||
| 884 | area to record information about composition. | ||
| 885 | We must try decoding with additional data area | ||
| 886 | before reading more output for the process. */ | ||
| 887 | coding_allocate_composition_data (&process_coding, PT); | ||
| 888 | goto repeat_decoding; | ||
| 889 | } | ||
| 890 | } | 803 | } |
| 891 | } | 804 | } |
| 892 | 805 | ||
| @@ -917,33 +830,12 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) | |||
| 917 | } | 830 | } |
| 918 | give_up: ; | 831 | give_up: ; |
| 919 | 832 | ||
| 920 | if (!NILP (buffer) | 833 | Vlast_coding_system_used = CODING_ID_NAME (process_coding.id); |
| 921 | && process_coding.cmp_data) | 834 | /* If the caller required, let the buffer inherit the |
| 922 | { | 835 | coding-system used to decode the process output. */ |
| 923 | coding_restore_composition (&process_coding, Fcurrent_buffer ()); | 836 | if (inherit_process_coding_system) |
| 924 | coding_free_composition_data (&process_coding); | 837 | call1 (intern ("after-insert-file-set-buffer-file-coding-system"), |
| 925 | } | ||
| 926 | |||
| 927 | { | ||
| 928 | int post_read_count = specpdl_ptr - specpdl; | ||
| 929 | |||
| 930 | record_unwind_protect (save_excursion_restore, save_excursion_save ()); | ||
| 931 | inserted = PT - pt_orig; | ||
| 932 | TEMP_SET_PT_BOTH (pt_orig, pt_byte_orig); | ||
| 933 | if (SYMBOLP (process_coding.post_read_conversion) | ||
| 934 | && !NILP (Ffboundp (process_coding.post_read_conversion))) | ||
| 935 | call1 (process_coding.post_read_conversion, make_number (inserted)); | ||
| 936 | |||
| 937 | Vlast_coding_system_used = process_coding.symbol; | ||
| 938 | |||
| 939 | /* If the caller required, let the buffer inherit the | ||
| 940 | coding-system used to decode the process output. */ | ||
| 941 | if (inherit_process_coding_system) | ||
| 942 | call1 (intern ("after-insert-file-set-buffer-file-coding-system"), | ||
| 943 | make_number (total_read)); | 838 | make_number (total_read)); |
| 944 | |||
| 945 | unbind_to (post_read_count, Qnil); | ||
| 946 | } | ||
| 947 | } | 839 | } |
| 948 | 840 | ||
| 949 | /* Wait for it to terminate, unless it already has. */ | 841 | /* Wait for it to terminate, unless it already has. */ |