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)