updated for version 7.0212
This commit is contained in:
126
src/eval.c
126
src/eval.c
@ -409,6 +409,7 @@ static int list_equal __ARGS((list_T *l1, list_T *l2, int ic));
|
|||||||
static int dict_equal __ARGS((dict_T *d1, dict_T *d2, int ic));
|
static int dict_equal __ARGS((dict_T *d1, dict_T *d2, int ic));
|
||||||
static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic));
|
static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic));
|
||||||
static listitem_T *list_find __ARGS((list_T *l, long n));
|
static listitem_T *list_find __ARGS((list_T *l, long n));
|
||||||
|
static long list_find_nr __ARGS((list_T *l, long idx, int *errorp));
|
||||||
static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
|
static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
|
||||||
static void list_append __ARGS((list_T *l, listitem_T *item));
|
static void list_append __ARGS((list_T *l, listitem_T *item));
|
||||||
static int list_append_tv __ARGS((list_T *l, typval_T *tv));
|
static int list_append_tv __ARGS((list_T *l, typval_T *tv));
|
||||||
@ -516,6 +517,7 @@ static void f_getfsize __ARGS((typval_T *argvars, typval_T *rettv));
|
|||||||
static void f_getftime __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_getftime __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_getftype __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_getftype __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_getline __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_getline __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
|
static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv));
|
static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv));
|
||||||
@ -5521,6 +5523,27 @@ list_find(l, n)
|
|||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get list item "l[idx]" as a number.
|
||||||
|
*/
|
||||||
|
static long
|
||||||
|
list_find_nr(l, idx, errorp)
|
||||||
|
list_T *l;
|
||||||
|
long idx;
|
||||||
|
int *errorp; /* set to TRUE when something wrong */
|
||||||
|
{
|
||||||
|
listitem_T *li;
|
||||||
|
|
||||||
|
li = list_find(l, idx);
|
||||||
|
if (li == NULL)
|
||||||
|
{
|
||||||
|
if (errorp != NULL)
|
||||||
|
*errorp = TRUE;
|
||||||
|
return -1L;
|
||||||
|
}
|
||||||
|
return get_tv_number_chk(&li->li_tv, errorp);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Locate "item" list "l" and return its index.
|
* Locate "item" list "l" and return its index.
|
||||||
* Returns -1 when "item" is not in the list.
|
* Returns -1 when "item" is not in the list.
|
||||||
@ -6854,7 +6877,7 @@ static struct fst
|
|||||||
{"copy", 1, 1, f_copy},
|
{"copy", 1, 1, f_copy},
|
||||||
{"count", 2, 4, f_count},
|
{"count", 2, 4, f_count},
|
||||||
{"cscope_connection",0,3, f_cscope_connection},
|
{"cscope_connection",0,3, f_cscope_connection},
|
||||||
{"cursor", 2, 2, f_cursor},
|
{"cursor", 1, 3, f_cursor},
|
||||||
{"deepcopy", 1, 2, f_deepcopy},
|
{"deepcopy", 1, 2, f_deepcopy},
|
||||||
{"delete", 1, 1, f_delete},
|
{"delete", 1, 1, f_delete},
|
||||||
{"did_filetype", 0, 0, f_did_filetype},
|
{"did_filetype", 0, 0, f_did_filetype},
|
||||||
@ -6899,6 +6922,7 @@ static struct fst
|
|||||||
{"getftype", 1, 1, f_getftype},
|
{"getftype", 1, 1, f_getftype},
|
||||||
{"getline", 1, 2, f_getline},
|
{"getline", 1, 2, f_getline},
|
||||||
{"getloclist", 1, 1, f_getqflist},
|
{"getloclist", 1, 1, f_getqflist},
|
||||||
|
{"getpos", 1, 1, f_getpos},
|
||||||
{"getqflist", 0, 0, f_getqflist},
|
{"getqflist", 0, 0, f_getqflist},
|
||||||
{"getreg", 0, 2, f_getreg},
|
{"getreg", 0, 2, f_getreg},
|
||||||
{"getregtype", 0, 1, f_getregtype},
|
{"getregtype", 0, 1, f_getregtype},
|
||||||
@ -8288,17 +8312,46 @@ f_cursor(argvars, rettv)
|
|||||||
typval_T *rettv;
|
typval_T *rettv;
|
||||||
{
|
{
|
||||||
long line, col;
|
long line, col;
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
long coladd = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
line = get_tv_lnum(argvars);
|
if (argvars[1].v_type == VAR_UNKNOWN)
|
||||||
col = get_tv_number_chk(&argvars[1], NULL);
|
{
|
||||||
if (line < 0 || col < 0)
|
list_T *l = argvars->vval.v_list;
|
||||||
|
|
||||||
|
/* Argument can be [lnum, col, coladd]. */
|
||||||
|
if (argvars->v_type != VAR_LIST || l == NULL)
|
||||||
|
return;
|
||||||
|
line = list_find_nr(l, 0L, NULL);
|
||||||
|
col = list_find_nr(l, 1L, NULL);
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
coladd = list_find_nr(l, 2L, NULL);
|
||||||
|
if (coladd < 0)
|
||||||
|
coladd = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line = get_tv_lnum(argvars);
|
||||||
|
col = get_tv_number_chk(&argvars[1], NULL);
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
if (argvars[2].v_type != VAR_UNKNOWN)
|
||||||
|
coladd = get_tv_number_chk(&argvars[2], NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (line < 0 || col < 0
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
|| coladd < 0
|
||||||
|
#endif
|
||||||
|
)
|
||||||
return; /* type error; errmsg already given */
|
return; /* type error; errmsg already given */
|
||||||
if (line > 0)
|
if (line > 0)
|
||||||
curwin->w_cursor.lnum = line;
|
curwin->w_cursor.lnum = line;
|
||||||
if (col > 0)
|
if (col > 0)
|
||||||
curwin->w_cursor.col = col - 1;
|
curwin->w_cursor.col = col - 1;
|
||||||
#ifdef FEAT_VIRTUALEDIT
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
curwin->w_cursor.coladd = 0;
|
curwin->w_cursor.coladd = coladd;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Make sure the cursor is in a valid position. */
|
/* Make sure the cursor is in a valid position. */
|
||||||
@ -9850,6 +9903,35 @@ f_getline(argvars, rettv)
|
|||||||
get_buffer_lines(curbuf, lnum, end, retlist, rettv);
|
get_buffer_lines(curbuf, lnum, end, retlist, rettv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "getpos(string)" function
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
f_getpos(argvars, rettv)
|
||||||
|
typval_T *argvars;
|
||||||
|
typval_T *rettv;
|
||||||
|
{
|
||||||
|
pos_T *fp;
|
||||||
|
list_T *l;
|
||||||
|
|
||||||
|
if (rettv_list_alloc(rettv) == OK)
|
||||||
|
{
|
||||||
|
l = rettv->vval.v_list;
|
||||||
|
fp = var2fpos(&argvars[0], TRUE);
|
||||||
|
list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum
|
||||||
|
: (varnumber_T)0);
|
||||||
|
list_append_number(l, (fp != NULL) ? (varnumber_T)fp->col + 1
|
||||||
|
: (varnumber_T)0);
|
||||||
|
list_append_number(l,
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
(fp != NULL) ? (varnumber_T)fp->coladd :
|
||||||
|
#endif
|
||||||
|
(varnumber_T)0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rettv->vval.v_number = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "getqflist()" and "getloclist()" functions
|
* "getqflist()" and "getloclist()" functions
|
||||||
*/
|
*/
|
||||||
@ -15586,36 +15668,39 @@ var2fpos(varp, lnum)
|
|||||||
static pos_T pos;
|
static pos_T pos;
|
||||||
pos_T *pp;
|
pos_T *pp;
|
||||||
|
|
||||||
/* Argument can be [lnum, col]. */
|
/* Argument can be [lnum, col, coladd]. */
|
||||||
if (varp->v_type == VAR_LIST)
|
if (varp->v_type == VAR_LIST)
|
||||||
{
|
{
|
||||||
list_T *l;
|
list_T *l;
|
||||||
listitem_T *li;
|
|
||||||
int len;
|
int len;
|
||||||
|
int error = FALSE;
|
||||||
|
|
||||||
l = varp->vval.v_list;
|
l = varp->vval.v_list;
|
||||||
if (l == NULL)
|
if (l == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Get the line number */
|
/* Get the line number */
|
||||||
li = list_find(l, 0L);
|
pos.lnum = list_find_nr(l, 0L, &error);
|
||||||
if (li == NULL)
|
if (error || pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count)
|
||||||
return NULL;
|
|
||||||
pos.lnum = get_tv_number(&li->li_tv);
|
|
||||||
if (pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count)
|
|
||||||
return NULL; /* invalid line number */
|
return NULL; /* invalid line number */
|
||||||
|
|
||||||
/* Get the column number */
|
/* Get the column number */
|
||||||
li = list_find(l, 1L);
|
pos.col = list_find_nr(l, 1L, &error);
|
||||||
if (li == NULL)
|
if (error)
|
||||||
return NULL;
|
return NULL;
|
||||||
pos.col = get_tv_number(&li->li_tv);
|
|
||||||
len = (long)STRLEN(ml_get(pos.lnum));
|
len = (long)STRLEN(ml_get(pos.lnum));
|
||||||
if (pos.col <= 0 || ((len == 0 && pos.col > 1)
|
/* Accept a position up to the NUL after the line. */
|
||||||
|| (len > 0 && (int)pos.col > len)))
|
if (pos.col <= 0 || (int)pos.col > len + 1)
|
||||||
return NULL; /* invalid column number */
|
return NULL; /* invalid column number */
|
||||||
|
--pos.col;
|
||||||
|
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
/* Get the virtual offset. Defaults to zero. */
|
||||||
|
pos.coladd = list_find_nr(l, 2L, &error);
|
||||||
|
if (error)
|
||||||
|
pos.coladd = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
pos.col--;
|
|
||||||
return &pos;
|
return &pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15631,6 +15716,11 @@ var2fpos(varp, lnum)
|
|||||||
return NULL;
|
return NULL;
|
||||||
return pp;
|
return pp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
|
pos.coladd = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (name[0] == 'w' && lnum)
|
if (name[0] == 'w' && lnum)
|
||||||
{
|
{
|
||||||
pos.col = 0;
|
pos.col = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user