diff options
author | Bram Moolenaar <Bram@vim.org> | 2006-03-06 23:29:24 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2006-03-06 23:29:24 +0000 |
commit | 362e1a30c6f3527d5d0efc328c2fb448290cd6fc (patch) | |
tree | 91c408352947bec09aee2032949ef1acef606d15 /src/eval.c | |
parent | 768b8c4dbcb3cdaccab87daa833ab176a438cc3c (diff) | |
download | vim-362e1a30c6f3527d5d0efc328c2fb448290cd6fc.zip |
updated for version 7.0216
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/eval.c b/src/eval.c index 1c7d0f8c1..4336a2633 100644 --- a/src/eval.c +++ b/src/eval.c @@ -11,7 +11,7 @@ * eval.c: Expression evaluation. */ #if defined(MSDOS) || defined(MSWIN) -# include <io.h> /* for mch_open(), must be before vim.h */ +# include "vimio.h" /* for mch_open(), must be before vim.h */ #endif #include "vim.h" @@ -718,7 +718,7 @@ static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)); static win_T *find_win_by_nr __ARGS((typval_T *vp)); static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); -static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); +static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp)); /* Character used as separated in autoload function/variable names. */ #define AUTOLOAD_CHAR '#' @@ -1171,18 +1171,28 @@ skip_expr(pp) * Return pointer to allocated memory, or NULL for failure. */ char_u * -eval_to_string(arg, nextcmd) +eval_to_string(arg, nextcmd, dolist) char_u *arg; char_u **nextcmd; + int dolist; /* turn List into sequence of lines */ { typval_T tv; char_u *retval; + garray_T ga; if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) retval = NULL; else { - retval = vim_strsave(get_tv_string(&tv)); + if (dolist && tv.v_type == VAR_LIST) + { + ga_init2(&ga, (int)sizeof(char), 80); + list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, 0); + ga_append(&ga, NUL); + retval = (char_u *)ga.ga_data; + } + else + retval = vim_strsave(get_tv_string(&tv)); clear_tv(&tv); } @@ -1206,7 +1216,7 @@ eval_to_string_safe(arg, nextcmd, use_sandbox) if (use_sandbox) ++sandbox; ++textlock; - retval = eval_to_string(arg, nextcmd); + retval = eval_to_string(arg, nextcmd, FALSE); if (use_sandbox) --sandbox; --textlock; @@ -13273,25 +13283,27 @@ get_search_arg(varp, flagsp) * Shared by search() and searchpos() functions */ static int -search_cmn(argvars, match_pos) +search_cmn(argvars, match_pos, flagsp) typval_T *argvars; pos_T *match_pos; + int *flagsp; { + int flags; char_u *pat; pos_T pos; pos_T save_cursor; int save_p_ws = p_ws; int dir; - int flags = 0; int retval = 0; /* default: FAIL */ long lnum_stop = 0; int options = SEARCH_KEEP; int subpatnum; pat = get_tv_string(&argvars[0]); - dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */ + dir = get_search_arg(&argvars[1], flagsp); /* may set p_ws */ if (dir == 0) goto theend; + flags = *flagsp; if (flags & SP_START) options |= SEARCH_START; if (flags & SP_END) @@ -13359,7 +13371,9 @@ f_search(argvars, rettv) typval_T *argvars; typval_T *rettv; { - rettv->vval.v_number = search_cmn(argvars, NULL); + int flags = 0; + + rettv->vval.v_number = search_cmn(argvars, NULL, &flags); } /* @@ -13649,13 +13663,16 @@ f_searchpos(argvars, rettv) pos_T match_pos; int lnum = 0; int col = 0; + int n; + int flags = 0; rettv->vval.v_number = 0; if (rettv_list_alloc(rettv) == FAIL) return; - if (search_cmn(argvars, &match_pos) > 0) + n = search_cmn(argvars, &match_pos, &flags); + if (n > 0) { lnum = match_pos.lnum; col = match_pos.col; @@ -13663,7 +13680,8 @@ f_searchpos(argvars, rettv) list_append_number(rettv->vval.v_list, (varnumber_T)lnum); list_append_number(rettv->vval.v_list, (varnumber_T)col); - + if (flags & SP_SUBPAT) + list_append_number(rettv->vval.v_list, (varnumber_T)n); } @@ -15675,6 +15693,7 @@ f_winrestview(argvars, rettv) curwin->w_cursor.coladd = get_dict_number(dict, (char_u *)"coladd"); #endif curwin->w_curswant = get_dict_number(dict, (char_u *)"curswant"); + curwin->w_set_curswant = FALSE; curwin->w_topline = get_dict_number(dict, (char_u *)"topline"); #ifdef FEAT_DIFF @@ -16208,7 +16227,7 @@ make_expanded_name(in_start, expr_start, expr_end, in_end) c1 = *in_end; *in_end = NUL; - temp_result = eval_to_string(expr_start + 1, &nextcmd); + temp_result = eval_to_string(expr_start + 1, &nextcmd, FALSE); if (temp_result != NULL && nextcmd == NULL) { retval = alloc((unsigned)(STRLEN(temp_result) + (expr_start - in_start) |