diff options
| author | Richard M. Stallman | 1997-04-15 04:52:38 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1997-04-15 04:52:38 +0000 |
| commit | 8bb43c28a30734966e16c7968baafb469a0a3f18 (patch) | |
| tree | cdb8692f5b8c286ee1369755e93c8fd17dff80f8 /src | |
| parent | add1fffcee69f7fefe5770d05ad0f5e3371617fd (diff) | |
| download | emacs-8bb43c28a30734966e16c7968baafb469a0a3f18.tar.gz emacs-8bb43c28a30734966e16c7968baafb469a0a3f18.zip | |
(looking_at_1): Set re_match_object.
(string_match_1): Set re_match_object.
(fast_string_match): Set re_match_object.
(Fskip_chars_forward): Move to syntax.c.
(Fskip_chars_backward): Move to syntax.c.
(Fskip_syntax_forward): Move to syntax.c.
(Fskip_syntax_backward): Move to syntax.c.
(skip_chars): Move to syntax.c.
(search_buffer): Set re_match_object.
(syms_of_search): Move initialization of skip* to syntax.c.
Diffstat (limited to 'src')
| -rw-r--r-- | src/search.c | 305 |
1 files changed, 8 insertions, 297 deletions
diff --git a/src/search.c b/src/search.c index 7c8e58aa01c..fde9a8a1d0d 100644 --- a/src/search.c +++ b/src/search.c | |||
| @@ -249,6 +249,8 @@ looking_at_1 (string, posix) | |||
| 249 | s1 = ZV - BEGV; | 249 | s1 = ZV - BEGV; |
| 250 | s2 = 0; | 250 | s2 = 0; |
| 251 | } | 251 | } |
| 252 | |||
| 253 | re_match_object = Qnil; | ||
| 252 | 254 | ||
| 253 | i = re_match_2 (bufp, (char *) p1, s1, (char *) p2, s2, | 255 | i = re_match_2 (bufp, (char *) p1, s1, (char *) p2, s2, |
| 254 | PT - BEGV, &search_regs, | 256 | PT - BEGV, &search_regs, |
| @@ -325,6 +327,8 @@ string_match_1 (regexp, string, start, posix) | |||
| 325 | ? DOWNCASE_TABLE : 0), | 327 | ? DOWNCASE_TABLE : 0), |
| 326 | posix); | 328 | posix); |
| 327 | immediate_quit = 1; | 329 | immediate_quit = 1; |
| 330 | re_match_object = string; | ||
| 331 | |||
| 328 | val = re_search (bufp, (char *) XSTRING (string)->data, | 332 | val = re_search (bufp, (char *) XSTRING (string)->data, |
| 329 | XSTRING (string)->size, s, XSTRING (string)->size - s, | 333 | XSTRING (string)->size, s, XSTRING (string)->size - s, |
| 330 | &search_regs); | 334 | &search_regs); |
| @@ -374,6 +378,8 @@ fast_string_match (regexp, string) | |||
| 374 | 378 | ||
| 375 | bufp = compile_pattern (regexp, 0, 0, 0); | 379 | bufp = compile_pattern (regexp, 0, 0, 0); |
| 376 | immediate_quit = 1; | 380 | immediate_quit = 1; |
| 381 | re_match_object = string; | ||
| 382 | |||
| 377 | val = re_search (bufp, (char *) XSTRING (string)->data, | 383 | val = re_search (bufp, (char *) XSTRING (string)->data, |
| 378 | XSTRING (string)->size, 0, XSTRING (string)->size, | 384 | XSTRING (string)->size, 0, XSTRING (string)->size, |
| 379 | 0); | 385 | 0); |
| @@ -671,299 +677,6 @@ find_before_next_newline (from, to, cnt) | |||
| 671 | return pos; | 677 | return pos; |
| 672 | } | 678 | } |
| 673 | 679 | ||
| 674 | Lisp_Object skip_chars (); | ||
| 675 | |||
| 676 | DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0, | ||
| 677 | "Move point forward, stopping before a char not in STRING, or at pos LIM.\n\ | ||
| 678 | STRING is like the inside of a `[...]' in a regular expression\n\ | ||
| 679 | except that `]' is never special and `\\' quotes `^', `-' or `\\'.\n\ | ||
| 680 | Thus, with arg \"a-zA-Z\", this skips letters stopping before first nonletter.\n\ | ||
| 681 | With arg \"^a-zA-Z\", skips nonletters stopping before first letter.\n\ | ||
| 682 | Returns the distance traveled, either zero or positive.") | ||
| 683 | (string, lim) | ||
| 684 | Lisp_Object string, lim; | ||
| 685 | { | ||
| 686 | return skip_chars (1, 0, string, lim); | ||
| 687 | } | ||
| 688 | |||
| 689 | DEFUN ("skip-chars-backward", Fskip_chars_backward, Sskip_chars_backward, 1, 2, 0, | ||
| 690 | "Move point backward, stopping after a char not in STRING, or at pos LIM.\n\ | ||
| 691 | See `skip-chars-forward' for details.\n\ | ||
| 692 | Returns the distance traveled, either zero or negative.") | ||
| 693 | (string, lim) | ||
| 694 | Lisp_Object string, lim; | ||
| 695 | { | ||
| 696 | return skip_chars (0, 0, string, lim); | ||
| 697 | } | ||
| 698 | |||
| 699 | DEFUN ("skip-syntax-forward", Fskip_syntax_forward, Sskip_syntax_forward, 1, 2, 0, | ||
| 700 | "Move point forward across chars in specified syntax classes.\n\ | ||
| 701 | SYNTAX is a string of syntax code characters.\n\ | ||
| 702 | Stop before a char whose syntax is not in SYNTAX, or at position LIM.\n\ | ||
| 703 | If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\ | ||
| 704 | This function returns the distance traveled, either zero or positive.") | ||
| 705 | (syntax, lim) | ||
| 706 | Lisp_Object syntax, lim; | ||
| 707 | { | ||
| 708 | return skip_chars (1, 1, syntax, lim); | ||
| 709 | } | ||
| 710 | |||
| 711 | DEFUN ("skip-syntax-backward", Fskip_syntax_backward, Sskip_syntax_backward, 1, 2, 0, | ||
| 712 | "Move point backward across chars in specified syntax classes.\n\ | ||
| 713 | SYNTAX is a string of syntax code characters.\n\ | ||
| 714 | Stop on reaching a char whose syntax is not in SYNTAX, or at position LIM.\n\ | ||
| 715 | If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\ | ||
| 716 | This function returns the distance traveled, either zero or negative.") | ||
| 717 | (syntax, lim) | ||
| 718 | Lisp_Object syntax, lim; | ||
| 719 | { | ||
| 720 | return skip_chars (0, 1, syntax, lim); | ||
| 721 | } | ||
| 722 | |||
| 723 | Lisp_Object | ||
| 724 | skip_chars (forwardp, syntaxp, string, lim) | ||
| 725 | int forwardp, syntaxp; | ||
| 726 | Lisp_Object string, lim; | ||
| 727 | { | ||
| 728 | register unsigned char *p, *pend; | ||
| 729 | register unsigned int c; | ||
| 730 | register int ch; | ||
| 731 | unsigned char fastmap[0400]; | ||
| 732 | /* If SYNTAXP is 0, STRING may contain multi-byte form of characters | ||
| 733 | of which codes don't fit in FASTMAP. In that case, we set the | ||
| 734 | first byte of multibyte form (i.e. base leading-code) in FASTMAP | ||
| 735 | and set the actual ranges of characters in CHAR_RANGES. In the | ||
| 736 | form "X-Y" of STRING, both X and Y must belong to the same | ||
| 737 | character set because a range striding across character sets is | ||
| 738 | meaningless. */ | ||
| 739 | int *char_ranges | ||
| 740 | = (int *) alloca (XSTRING (string)->size * (sizeof (int)) * 2); | ||
| 741 | int n_char_ranges = 0; | ||
| 742 | int negate = 0; | ||
| 743 | register int i; | ||
| 744 | int multibyte = !NILP (current_buffer->enable_multibyte_characters); | ||
| 745 | |||
| 746 | CHECK_STRING (string, 0); | ||
| 747 | |||
| 748 | if (NILP (lim)) | ||
| 749 | XSETINT (lim, forwardp ? ZV : BEGV); | ||
| 750 | else | ||
| 751 | CHECK_NUMBER_COERCE_MARKER (lim, 1); | ||
| 752 | |||
| 753 | /* In any case, don't allow scan outside bounds of buffer. */ | ||
| 754 | /* jla turned this off, for no known reason. | ||
| 755 | bfox turned the ZV part on, and rms turned the | ||
| 756 | BEGV part back on. */ | ||
| 757 | if (XINT (lim) > ZV) | ||
| 758 | XSETFASTINT (lim, ZV); | ||
| 759 | if (XINT (lim) < BEGV) | ||
| 760 | XSETFASTINT (lim, BEGV); | ||
| 761 | |||
| 762 | p = XSTRING (string)->data; | ||
| 763 | pend = p + XSTRING (string)->size; | ||
| 764 | bzero (fastmap, sizeof fastmap); | ||
| 765 | |||
| 766 | if (p != pend && *p == '^') | ||
| 767 | { | ||
| 768 | negate = 1; p++; | ||
| 769 | } | ||
| 770 | |||
| 771 | /* Find the characters specified and set their elements of fastmap. | ||
| 772 | If syntaxp, each character counts as itself. | ||
| 773 | Otherwise, handle backslashes and ranges specially. */ | ||
| 774 | |||
| 775 | while (p != pend) | ||
| 776 | { | ||
| 777 | c = *p; | ||
| 778 | if (multibyte) | ||
| 779 | { | ||
| 780 | ch = STRING_CHAR (p, pend - p); | ||
| 781 | p += BYTES_BY_CHAR_HEAD (*p); | ||
| 782 | } | ||
| 783 | else | ||
| 784 | { | ||
| 785 | ch = c; | ||
| 786 | p++; | ||
| 787 | } | ||
| 788 | if (syntaxp) | ||
| 789 | fastmap[syntax_spec_code[c]] = 1; | ||
| 790 | else | ||
| 791 | { | ||
| 792 | if (c == '\\') | ||
| 793 | { | ||
| 794 | if (p == pend) break; | ||
| 795 | c = *p++; | ||
| 796 | } | ||
| 797 | if (p != pend && *p == '-') | ||
| 798 | { | ||
| 799 | unsigned int ch2; | ||
| 800 | |||
| 801 | p++; | ||
| 802 | if (p == pend) break; | ||
| 803 | if (SINGLE_BYTE_CHAR_P (ch)) | ||
| 804 | while (c <= *p) | ||
| 805 | { | ||
| 806 | fastmap[c] = 1; | ||
| 807 | c++; | ||
| 808 | } | ||
| 809 | else | ||
| 810 | { | ||
| 811 | fastmap[c] = 1; /* C is the base leading-code. */ | ||
| 812 | ch2 = STRING_CHAR (p, pend - p); | ||
| 813 | if (ch <= ch2) | ||
| 814 | char_ranges[n_char_ranges++] = ch, | ||
| 815 | char_ranges[n_char_ranges++] = ch2; | ||
| 816 | } | ||
| 817 | p += multibyte ? BYTES_BY_CHAR_HEAD (*p) : 1; | ||
| 818 | } | ||
| 819 | else | ||
| 820 | { | ||
| 821 | fastmap[c] = 1; | ||
| 822 | if (!SINGLE_BYTE_CHAR_P (ch)) | ||
| 823 | char_ranges[n_char_ranges++] = ch, | ||
| 824 | char_ranges[n_char_ranges++] = ch; | ||
| 825 | } | ||
| 826 | } | ||
| 827 | } | ||
| 828 | |||
| 829 | /* If ^ was the first character, complement the fastmap. In | ||
| 830 | addition, as all multibyte characters have possibility of | ||
| 831 | matching, set all entries for base leading codes, which is | ||
| 832 | harmless even if SYNTAXP is 1. */ | ||
| 833 | |||
| 834 | if (negate) | ||
| 835 | for (i = 0; i < sizeof fastmap; i++) | ||
| 836 | { | ||
| 837 | if (!multibyte || !BASE_LEADING_CODE_P (i)) | ||
| 838 | fastmap[i] ^= 1; | ||
| 839 | else | ||
| 840 | fastmap[i] = 1; | ||
| 841 | } | ||
| 842 | |||
| 843 | { | ||
| 844 | int start_point = PT; | ||
| 845 | int pos = PT; | ||
| 846 | |||
| 847 | immediate_quit = 1; | ||
| 848 | if (syntaxp) | ||
| 849 | { | ||
| 850 | if (forwardp) | ||
| 851 | { | ||
| 852 | if (multibyte) | ||
| 853 | while (pos < XINT (lim) | ||
| 854 | && fastmap[(int) SYNTAX (FETCH_CHAR (pos))]) | ||
| 855 | INC_POS (pos); | ||
| 856 | else | ||
| 857 | while (pos < XINT (lim) | ||
| 858 | && fastmap[(int) SYNTAX (FETCH_BYTE (pos))]) | ||
| 859 | pos++; | ||
| 860 | } | ||
| 861 | else | ||
| 862 | { | ||
| 863 | if (multibyte) | ||
| 864 | while (pos > XINT (lim)) | ||
| 865 | { | ||
| 866 | int savepos = pos; | ||
| 867 | DEC_POS (pos); | ||
| 868 | if (!fastmap[(int) SYNTAX (FETCH_CHAR (pos))]) | ||
| 869 | { | ||
| 870 | pos = savepos; | ||
| 871 | break; | ||
| 872 | } | ||
| 873 | } | ||
| 874 | else | ||
| 875 | while (pos > XINT (lim) | ||
| 876 | && fastmap[(int) SYNTAX (FETCH_BYTE (pos - 1))]) | ||
| 877 | pos--; | ||
| 878 | } | ||
| 879 | } | ||
| 880 | else | ||
| 881 | { | ||
| 882 | if (forwardp) | ||
| 883 | { | ||
| 884 | if (multibyte) | ||
| 885 | while (pos < XINT (lim) && fastmap[(c = FETCH_BYTE (pos))]) | ||
| 886 | { | ||
| 887 | if (!BASE_LEADING_CODE_P (c)) | ||
| 888 | pos++; | ||
| 889 | else if (n_char_ranges) | ||
| 890 | { | ||
| 891 | /* We much check CHAR_RANGES for a multibyte | ||
| 892 | character. */ | ||
| 893 | ch = FETCH_MULTIBYTE_CHAR (pos); | ||
| 894 | for (i = 0; i < n_char_ranges; i += 2) | ||
| 895 | if ((ch >= char_ranges[i] && ch <= char_ranges[i + 1])) | ||
| 896 | break; | ||
| 897 | if (!(negate ^ (i < n_char_ranges))) | ||
| 898 | break; | ||
| 899 | |||
| 900 | INC_POS (pos); | ||
| 901 | } | ||
| 902 | else | ||
| 903 | { | ||
| 904 | if (!negate) break; | ||
| 905 | INC_POS (pos); | ||
| 906 | } | ||
| 907 | } | ||
| 908 | else | ||
| 909 | while (pos < XINT (lim) && fastmap[FETCH_BYTE (pos)]) | ||
| 910 | pos++; | ||
| 911 | } | ||
| 912 | else | ||
| 913 | { | ||
| 914 | if (multibyte) | ||
| 915 | while (pos > XINT (lim)) | ||
| 916 | { | ||
| 917 | int savepos = pos; | ||
| 918 | DEC_POS (pos); | ||
| 919 | if (fastmap[(c = FETCH_BYTE (pos))]) | ||
| 920 | { | ||
| 921 | if (!BASE_LEADING_CODE_P (c)) | ||
| 922 | ; | ||
| 923 | else if (n_char_ranges) | ||
| 924 | { | ||
| 925 | /* We much check CHAR_RANGES for a multibyte | ||
| 926 | character. */ | ||
| 927 | ch = FETCH_MULTIBYTE_CHAR (pos); | ||
| 928 | for (i = 0; i < n_char_ranges; i += 2) | ||
| 929 | if (ch >= char_ranges[i] && ch <= char_ranges[i + 1]) | ||
| 930 | break; | ||
| 931 | if (!(negate ^ (i < n_char_ranges))) | ||
| 932 | { | ||
| 933 | pos = savepos; | ||
| 934 | break; | ||
| 935 | } | ||
| 936 | } | ||
| 937 | else | ||
| 938 | if (!negate) | ||
| 939 | { | ||
| 940 | pos = savepos; | ||
| 941 | break; | ||
| 942 | } | ||
| 943 | } | ||
| 944 | else | ||
| 945 | { | ||
| 946 | pos = savepos; | ||
| 947 | break; | ||
| 948 | } | ||
| 949 | } | ||
| 950 | else | ||
| 951 | while (pos > XINT (lim) && fastmap[FETCH_BYTE (pos - 1)]) | ||
| 952 | pos--; | ||
| 953 | } | ||
| 954 | } | ||
| 955 | if (multibyte | ||
| 956 | /* INC_POS or DEC_POS might have moved POS over LIM. */ | ||
| 957 | && (forwardp ? (pos > XINT (lim)) : (pos < XINT (lim)))) | ||
| 958 | pos = XINT (lim); | ||
| 959 | |||
| 960 | SET_PT (pos); | ||
| 961 | immediate_quit = 0; | ||
| 962 | |||
| 963 | return make_number (PT - start_point); | ||
| 964 | } | ||
| 965 | } | ||
| 966 | |||
| 967 | /* Subroutines of Lisp buffer search functions. */ | 680 | /* Subroutines of Lisp buffer search functions. */ |
| 968 | 681 | ||
| 969 | static Lisp_Object | 682 | static Lisp_Object |
| @@ -1145,6 +858,8 @@ search_buffer (string, pos, lim, n, RE, trt, inverse_trt, posix) | |||
| 1145 | s1 = ZV - BEGV; | 858 | s1 = ZV - BEGV; |
| 1146 | s2 = 0; | 859 | s2 = 0; |
| 1147 | } | 860 | } |
| 861 | re_match_object = Qnil; | ||
| 862 | |||
| 1148 | while (n < 0) | 863 | while (n < 0) |
| 1149 | { | 864 | { |
| 1150 | int val; | 865 | int val; |
| @@ -2273,10 +1988,6 @@ syms_of_search () | |||
| 2273 | defsubr (&Sposix_looking_at); | 1988 | defsubr (&Sposix_looking_at); |
| 2274 | defsubr (&Sstring_match); | 1989 | defsubr (&Sstring_match); |
| 2275 | defsubr (&Sposix_string_match); | 1990 | defsubr (&Sposix_string_match); |
| 2276 | defsubr (&Sskip_chars_forward); | ||
| 2277 | defsubr (&Sskip_chars_backward); | ||
| 2278 | defsubr (&Sskip_syntax_forward); | ||
| 2279 | defsubr (&Sskip_syntax_backward); | ||
| 2280 | defsubr (&Ssearch_forward); | 1991 | defsubr (&Ssearch_forward); |
| 2281 | defsubr (&Ssearch_backward); | 1992 | defsubr (&Ssearch_backward); |
| 2282 | defsubr (&Sword_search_forward); | 1993 | defsubr (&Sword_search_forward); |