Mercurial > vim
comparison src/eval.c @ 425:6edf4a4f6cac v7.0110
updated for version 7.0110
author | vimboss |
---|---|
date | Tue, 19 Jul 2005 22:22:13 +0000 |
parents | f713fc55bf7b |
children | d5ec1b42ceb0 |
comparison
equal
deleted
inserted
replaced
424:f7f16f63a19c | 425:6edf4a4f6cac |
---|---|
12763 typval_T *argvars; | 12763 typval_T *argvars; |
12764 typval_T *rettv; | 12764 typval_T *rettv; |
12765 { | 12765 { |
12766 char_u *spat, *mpat, *epat; | 12766 char_u *spat, *mpat, *epat; |
12767 char_u *skip; | 12767 char_u *skip; |
12768 char_u *pat, *pat2 = NULL, *pat3 = NULL; | |
12769 pos_T pos; | |
12770 pos_T firstpos; | |
12771 pos_T foundpos; | |
12772 pos_T save_cursor; | |
12773 pos_T save_pos; | |
12774 int save_p_ws = p_ws; | 12768 int save_p_ws = p_ws; |
12775 char_u *save_cpo; | |
12776 int dir; | 12769 int dir; |
12777 int flags = 0; | 12770 int flags = 0; |
12778 char_u nbuf1[NUMBUFLEN]; | 12771 char_u nbuf1[NUMBUFLEN]; |
12779 char_u nbuf2[NUMBUFLEN]; | 12772 char_u nbuf2[NUMBUFLEN]; |
12780 char_u nbuf3[NUMBUFLEN]; | 12773 char_u nbuf3[NUMBUFLEN]; |
12781 int n; | |
12782 int r; | |
12783 int nest = 1; | |
12784 int err; | |
12785 | 12774 |
12786 rettv->vval.v_number = 0; /* default: FAIL */ | 12775 rettv->vval.v_number = 0; /* default: FAIL */ |
12787 | |
12788 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ | |
12789 save_cpo = p_cpo; | |
12790 p_cpo = (char_u *)""; | |
12791 | 12776 |
12792 /* Get the three pattern arguments: start, middle, end. */ | 12777 /* Get the three pattern arguments: start, middle, end. */ |
12793 spat = get_tv_string_chk(&argvars[0]); | 12778 spat = get_tv_string_chk(&argvars[0]); |
12794 mpat = get_tv_string_buf_chk(&argvars[1], nbuf1); | 12779 mpat = get_tv_string_buf_chk(&argvars[1], nbuf1); |
12795 epat = get_tv_string_buf_chk(&argvars[2], nbuf2); | 12780 epat = get_tv_string_buf_chk(&argvars[2], nbuf2); |
12796 if (spat == NULL || mpat == NULL || epat == NULL) | 12781 if (spat == NULL || mpat == NULL || epat == NULL) |
12797 goto theend; /* type error */ | 12782 goto theend; /* type error */ |
12783 | |
12784 /* Handle the optional fourth argument: flags */ | |
12785 dir = get_search_arg(&argvars[3], &flags); /* may set p_ws */ | |
12786 if (dir == 0) | |
12787 goto theend; | |
12788 | |
12789 /* Optional fifth argument: skip expresion */ | |
12790 if (argvars[3].v_type == VAR_UNKNOWN | |
12791 || argvars[4].v_type == VAR_UNKNOWN) | |
12792 skip = (char_u *)""; | |
12793 else | |
12794 skip = get_tv_string_buf_chk(&argvars[4], nbuf3); | |
12795 if (skip == NULL) | |
12796 goto theend; /* type error */ | |
12797 | |
12798 rettv->vval.v_number = do_searchpair(spat, mpat, epat, dir, skip, flags); | |
12799 | |
12800 theend: | |
12801 p_ws = save_p_ws; | |
12802 } | |
12803 | |
12804 /* | |
12805 * Search for a start/middle/end thing. | |
12806 * Used by searchpair(), see its documentation for the details. | |
12807 * Returns 0 or -1 for no match, | |
12808 */ | |
12809 long | |
12810 do_searchpair(spat, mpat, epat, dir, skip, flags) | |
12811 char_u *spat; /* start pattern */ | |
12812 char_u *mpat; /* middle pattern */ | |
12813 char_u *epat; /* end pattern */ | |
12814 int dir; /* BACKWARD or FORWARD */ | |
12815 char_u *skip; /* skip expression */ | |
12816 int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE */ | |
12817 { | |
12818 char_u *save_cpo; | |
12819 char_u *pat, *pat2 = NULL, *pat3 = NULL; | |
12820 long retval = 0; | |
12821 pos_T pos; | |
12822 pos_T firstpos; | |
12823 pos_T foundpos; | |
12824 pos_T save_cursor; | |
12825 pos_T save_pos; | |
12826 int n; | |
12827 int r; | |
12828 int nest = 1; | |
12829 int err; | |
12830 | |
12831 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ | |
12832 save_cpo = p_cpo; | |
12833 p_cpo = (char_u *)""; | |
12798 | 12834 |
12799 /* Make two search patterns: start/end (pat2, for in nested pairs) and | 12835 /* Make two search patterns: start/end (pat2, for in nested pairs) and |
12800 * start/middle/end (pat3, for the top pair). */ | 12836 * start/middle/end (pat3, for the top pair). */ |
12801 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15)); | 12837 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15)); |
12802 pat3 = alloc((unsigned)(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23)); | 12838 pat3 = alloc((unsigned)(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23)); |
12807 STRCPY(pat3, pat2); | 12843 STRCPY(pat3, pat2); |
12808 else | 12844 else |
12809 sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)", | 12845 sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)", |
12810 spat, epat, mpat); | 12846 spat, epat, mpat); |
12811 | 12847 |
12812 /* Handle the optional fourth argument: flags */ | |
12813 dir = get_search_arg(&argvars[3], &flags); /* may set p_ws */ | |
12814 if (dir == 0) | |
12815 goto theend; | |
12816 | |
12817 /* Optional fifth argument: skip expresion */ | |
12818 if (argvars[3].v_type == VAR_UNKNOWN | |
12819 || argvars[4].v_type == VAR_UNKNOWN) | |
12820 skip = (char_u *)""; | |
12821 else | |
12822 skip = get_tv_string_buf_chk(&argvars[4], nbuf3); | |
12823 if (skip == NULL) | |
12824 goto theend; /* type error */ | |
12825 | |
12826 save_cursor = curwin->w_cursor; | 12848 save_cursor = curwin->w_cursor; |
12827 pos = curwin->w_cursor; | 12849 pos = curwin->w_cursor; |
12828 firstpos.lnum = 0; | 12850 firstpos.lnum = 0; |
12829 foundpos.lnum = 0; | 12851 foundpos.lnum = 0; |
12830 pat = pat3; | 12852 pat = pat3; |
12859 curwin->w_cursor = save_pos; | 12881 curwin->w_cursor = save_pos; |
12860 if (err) | 12882 if (err) |
12861 { | 12883 { |
12862 /* Evaluating {skip} caused an error, break here. */ | 12884 /* Evaluating {skip} caused an error, break here. */ |
12863 curwin->w_cursor = save_cursor; | 12885 curwin->w_cursor = save_cursor; |
12864 rettv->vval.v_number = -1; | 12886 retval = -1; |
12865 break; | 12887 break; |
12866 } | 12888 } |
12867 if (r) | 12889 if (r) |
12868 continue; | 12890 continue; |
12869 } | 12891 } |
12885 | 12907 |
12886 if (nest == 0) | 12908 if (nest == 0) |
12887 { | 12909 { |
12888 /* Found the match: return matchcount or line number. */ | 12910 /* Found the match: return matchcount or line number. */ |
12889 if (flags & SP_RETCOUNT) | 12911 if (flags & SP_RETCOUNT) |
12890 ++rettv->vval.v_number; | 12912 ++retval; |
12891 else | 12913 else |
12892 rettv->vval.v_number = pos.lnum; | 12914 retval = pos.lnum; |
12893 curwin->w_cursor = pos; | 12915 curwin->w_cursor = pos; |
12894 if (!(flags & SP_REPEAT)) | 12916 if (!(flags & SP_REPEAT)) |
12895 break; | 12917 break; |
12896 nest = 1; /* search for next unmatched */ | 12918 nest = 1; /* search for next unmatched */ |
12897 } | 12919 } |
12898 } | 12920 } |
12899 | 12921 |
12900 /* If 'n' flag is used or search failed: restore cursor position. */ | 12922 /* If 'n' flag is used or search failed: restore cursor position. */ |
12901 if ((flags & SP_NOMOVE) || rettv->vval.v_number == 0) | 12923 if ((flags & SP_NOMOVE) || retval == 0) |
12902 curwin->w_cursor = save_cursor; | 12924 curwin->w_cursor = save_cursor; |
12903 | 12925 |
12904 theend: | 12926 theend: |
12905 vim_free(pat2); | 12927 vim_free(pat2); |
12906 vim_free(pat3); | 12928 vim_free(pat3); |
12907 p_ws = save_p_ws; | |
12908 p_cpo = save_cpo; | 12929 p_cpo = save_cpo; |
12930 | |
12931 return retval; | |
12909 } | 12932 } |
12910 | 12933 |
12911 /*ARGSUSED*/ | 12934 /*ARGSUSED*/ |
12912 static void | 12935 static void |
12913 f_server2client(argvars, rettv) | 12936 f_server2client(argvars, rettv) |