comparison src/eval.c @ 709:ecee28dd16d2 v7.0213

updated for version 7.0213
author vimboss
date Fri, 03 Mar 2006 23:00:03 +0000
parents 69e8006af734
children 0c381fb7846c
comparison
equal deleted inserted replaced
708:7cf327ccb632 709:ecee28dd16d2
598 static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv)); 598 static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv));
599 static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv)); 599 static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv));
600 static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv)); 600 static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv));
601 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); 601 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv));
602 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); 602 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv));
603 static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv));
603 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); 604 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv));
604 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); 605 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv));
605 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv)); 606 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv));
606 static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); 607 static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv));
607 static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); 608 static void f_sort __ARGS((typval_T *argvars, typval_T *rettv));
645 static void f_winnr __ARGS((typval_T *argvars, typval_T *rettv)); 646 static void f_winnr __ARGS((typval_T *argvars, typval_T *rettv));
646 static void f_winrestcmd __ARGS((typval_T *argvars, typval_T *rettv)); 647 static void f_winrestcmd __ARGS((typval_T *argvars, typval_T *rettv));
647 static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv)); 648 static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv));
648 static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); 649 static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv));
649 650
650 static pos_T *var2fpos __ARGS((typval_T *varp, int lnum)); 651 static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump));
652 static pos_T *var2fpos __ARGS((typval_T *varp, int lnum, int *fnum));
651 static int get_env_len __ARGS((char_u **arg)); 653 static int get_env_len __ARGS((char_u **arg));
652 static int get_id_len __ARGS((char_u **arg)); 654 static int get_id_len __ARGS((char_u **arg));
653 static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose)); 655 static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose));
654 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int flags)); 656 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int flags));
655 #define FNE_INCL_BR 1 /* find_name_end(): include [] in name */ 657 #define FNE_INCL_BR 1 /* find_name_end(): include [] in name */
6859 {"buffer_name", 1, 1, f_bufname}, /* obsolete */ 6861 {"buffer_name", 1, 1, f_bufname}, /* obsolete */
6860 {"buffer_number", 1, 1, f_bufnr}, /* obsolete */ 6862 {"buffer_number", 1, 1, f_bufnr}, /* obsolete */
6861 {"buflisted", 1, 1, f_buflisted}, 6863 {"buflisted", 1, 1, f_buflisted},
6862 {"bufloaded", 1, 1, f_bufloaded}, 6864 {"bufloaded", 1, 1, f_bufloaded},
6863 {"bufname", 1, 1, f_bufname}, 6865 {"bufname", 1, 1, f_bufname},
6864 {"bufnr", 1, 1, f_bufnr}, 6866 {"bufnr", 1, 2, f_bufnr},
6865 {"bufwinnr", 1, 1, f_bufwinnr}, 6867 {"bufwinnr", 1, 1, f_bufwinnr},
6866 {"byte2line", 1, 1, f_byte2line}, 6868 {"byte2line", 1, 1, f_byte2line},
6867 {"byteidx", 2, 2, f_byteidx}, 6869 {"byteidx", 2, 2, f_byteidx},
6868 {"call", 2, 3, f_call}, 6870 {"call", 2, 3, f_call},
6869 {"char2nr", 1, 1, f_char2nr}, 6871 {"char2nr", 1, 1, f_char2nr},
7005 {"serverlist", 0, 0, f_serverlist}, 7007 {"serverlist", 0, 0, f_serverlist},
7006 {"setbufvar", 3, 3, f_setbufvar}, 7008 {"setbufvar", 3, 3, f_setbufvar},
7007 {"setcmdpos", 1, 1, f_setcmdpos}, 7009 {"setcmdpos", 1, 1, f_setcmdpos},
7008 {"setline", 2, 2, f_setline}, 7010 {"setline", 2, 2, f_setline},
7009 {"setloclist", 2, 3, f_setloclist}, 7011 {"setloclist", 2, 3, f_setloclist},
7012 {"setpos", 2, 2, f_setpos},
7010 {"setqflist", 1, 2, f_setqflist}, 7013 {"setqflist", 1, 2, f_setqflist},
7011 {"setreg", 2, 3, f_setreg}, 7014 {"setreg", 2, 3, f_setreg},
7012 {"setwinvar", 3, 3, f_setwinvar}, 7015 {"setwinvar", 3, 3, f_setwinvar},
7013 {"simplify", 1, 1, f_simplify}, 7016 {"simplify", 1, 1, f_simplify},
7014 {"sort", 1, 2, f_sort}, 7017 {"sort", 1, 2, f_sort},
7808 f_bufnr(argvars, rettv) 7811 f_bufnr(argvars, rettv)
7809 typval_T *argvars; 7812 typval_T *argvars;
7810 typval_T *rettv; 7813 typval_T *rettv;
7811 { 7814 {
7812 buf_T *buf; 7815 buf_T *buf;
7816 int error = FALSE;
7817 char_u *name;
7813 7818
7814 (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ 7819 (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
7815 ++emsg_off; 7820 ++emsg_off;
7816 buf = get_buf_tv(&argvars[0]); 7821 buf = get_buf_tv(&argvars[0]);
7822 --emsg_off;
7823
7824 /* If the buffer isn't found and the second argument is not zero create a
7825 * new buffer. */
7826 if (buf == NULL
7827 && argvars[1].v_type != VAR_UNKNOWN
7828 && get_tv_number_chk(&argvars[1], &error) != 0
7829 && !error
7830 && (name = get_tv_string_chk(&argvars[0])) != NULL
7831 && !error)
7832 buf = buflist_new(name, NULL, (linenr_T)1, 0);
7833
7817 if (buf != NULL) 7834 if (buf != NULL)
7818 rettv->vval.v_number = buf->b_fnum; 7835 rettv->vval.v_number = buf->b_fnum;
7819 else 7836 else
7820 rettv->vval.v_number = -1; 7837 rettv->vval.v_number = -1;
7821 --emsg_off;
7822 } 7838 }
7823 7839
7824 /* 7840 /*
7825 * "bufwinnr(nr)" function 7841 * "bufwinnr(nr)" function
7826 */ 7842 */
8025 typval_T *argvars; 8041 typval_T *argvars;
8026 typval_T *rettv; 8042 typval_T *rettv;
8027 { 8043 {
8028 colnr_T col = 0; 8044 colnr_T col = 0;
8029 pos_T *fp; 8045 pos_T *fp;
8030 8046 int fnum = curbuf->b_fnum;
8031 fp = var2fpos(&argvars[0], FALSE); 8047
8032 if (fp != NULL) 8048 fp = var2fpos(&argvars[0], FALSE, &fnum);
8049 if (fp != NULL && fnum == curbuf->b_fnum)
8033 { 8050 {
8034 if (fp->col == MAXCOL) 8051 if (fp->col == MAXCOL)
8035 { 8052 {
8036 /* '> can be MAXCOL, get the length of the line then */ 8053 /* '> can be MAXCOL, get the length of the line then */
8037 if (fp->lnum <= curbuf->b_ml.ml_line_count) 8054 if (fp->lnum <= curbuf->b_ml.ml_line_count)
8316 long coladd = 0; 8333 long coladd = 0;
8317 #endif 8334 #endif
8318 8335
8319 if (argvars[1].v_type == VAR_UNKNOWN) 8336 if (argvars[1].v_type == VAR_UNKNOWN)
8320 { 8337 {
8321 list_T *l = argvars->vval.v_list; 8338 pos_T pos;
8322 8339
8323 /* Argument can be [lnum, col, coladd]. */ 8340 if (list2fpos(argvars, &pos, NULL) == FAIL)
8324 if (argvars->v_type != VAR_LIST || l == NULL)
8325 return; 8341 return;
8326 line = list_find_nr(l, 0L, NULL); 8342 line = pos.lnum;
8327 col = list_find_nr(l, 1L, NULL); 8343 col = pos.col;
8328 #ifdef FEAT_VIRTUALEDIT 8344 #ifdef FEAT_VIRTUALEDIT
8329 coladd = list_find_nr(l, 2L, NULL); 8345 coladd = pos.coladd;
8330 if (coladd < 0)
8331 coladd = 0;
8332 #endif 8346 #endif
8333 } 8347 }
8334 else 8348 else
8335 { 8349 {
8336 line = get_tv_lnum(argvars); 8350 line = get_tv_lnum(argvars);
9911 typval_T *argvars; 9925 typval_T *argvars;
9912 typval_T *rettv; 9926 typval_T *rettv;
9913 { 9927 {
9914 pos_T *fp; 9928 pos_T *fp;
9915 list_T *l; 9929 list_T *l;
9930 int fnum = -1;
9916 9931
9917 if (rettv_list_alloc(rettv) == OK) 9932 if (rettv_list_alloc(rettv) == OK)
9918 { 9933 {
9919 l = rettv->vval.v_list; 9934 l = rettv->vval.v_list;
9920 fp = var2fpos(&argvars[0], TRUE); 9935 fp = var2fpos(&argvars[0], TRUE, &fnum);
9936 if (fnum != -1)
9937 list_append_number(l, (varnumber_T)fnum);
9938 else
9939 list_append_number(l, (varnumber_T)0);
9921 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum 9940 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum
9922 : (varnumber_T)0); 9941 : (varnumber_T)0);
9923 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->col + 1 9942 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->col + 1
9924 : (varnumber_T)0); 9943 : (varnumber_T)0);
9925 list_append_number(l, 9944 list_append_number(l,
11643 typval_T *argvars; 11662 typval_T *argvars;
11644 typval_T *rettv; 11663 typval_T *rettv;
11645 { 11664 {
11646 linenr_T lnum = 0; 11665 linenr_T lnum = 0;
11647 pos_T *fp; 11666 pos_T *fp;
11648 11667 int fnum;
11649 fp = var2fpos(&argvars[0], TRUE); 11668
11669 fp = var2fpos(&argvars[0], TRUE, &fnum);
11650 if (fp != NULL) 11670 if (fp != NULL)
11651 lnum = fp->lnum; 11671 lnum = fp->lnum;
11652 rettv->vval.v_number = lnum; 11672 rettv->vval.v_number = lnum;
11653 } 11673 }
11654 11674
11868 { 11888 {
11869 if (start < 0) 11889 if (start < 0)
11870 start = 0; 11890 start = 0;
11871 if (start > (long)STRLEN(str)) 11891 if (start > (long)STRLEN(str))
11872 goto theend; 11892 goto theend;
11873 str += start; 11893 /* When "count" argument is there ignore matches before "start",
11894 * otherwise skip part of the string. Differs when pattern is "^"
11895 * or "\<". */
11896 if (argvars[3].v_type != VAR_UNKNOWN)
11897 startcol = start;
11898 else
11899 str += start;
11874 } 11900 }
11875 11901
11876 if (argvars[3].v_type != VAR_UNKNOWN) 11902 if (argvars[3].v_type != VAR_UNKNOWN)
11877 nth = get_tv_number_chk(&argvars[3], &error); 11903 nth = get_tv_number_chk(&argvars[3], &error);
11878 if (error) 11904 if (error)
13176 13202
13177 #define SP_NOMOVE 1 /* don't move cursor */ 13203 #define SP_NOMOVE 1 /* don't move cursor */
13178 #define SP_REPEAT 2 /* repeat to find outer pair */ 13204 #define SP_REPEAT 2 /* repeat to find outer pair */
13179 #define SP_RETCOUNT 4 /* return matchcount */ 13205 #define SP_RETCOUNT 4 /* return matchcount */
13180 #define SP_SETPCMARK 8 /* set previous context mark */ 13206 #define SP_SETPCMARK 8 /* set previous context mark */
13207 #define SP_START 16 /* accept match at start position */
13181 13208
13182 static int get_search_arg __ARGS((typval_T *varp, int *flagsp)); 13209 static int get_search_arg __ARGS((typval_T *varp, int *flagsp));
13183 13210
13184 /* 13211 /*
13185 * Get flags for a search function. 13212 * Get flags for a search function.
13214 { 13241 {
13215 case 'n': mask = SP_NOMOVE; break; 13242 case 'n': mask = SP_NOMOVE; break;
13216 case 'r': mask = SP_REPEAT; break; 13243 case 'r': mask = SP_REPEAT; break;
13217 case 'm': mask = SP_RETCOUNT; break; 13244 case 'm': mask = SP_RETCOUNT; break;
13218 case 's': mask = SP_SETPCMARK; break; 13245 case 's': mask = SP_SETPCMARK; break;
13246 case 'c': mask = SP_START; break;
13219 } 13247 }
13220 if (mask == 0) 13248 if (mask == 0)
13221 { 13249 {
13222 EMSG2(_(e_invarg2), flags); 13250 EMSG2(_(e_invarg2), flags);
13223 dir = 0; 13251 dir = 0;
13247 int save_p_ws = p_ws; 13275 int save_p_ws = p_ws;
13248 int dir; 13276 int dir;
13249 int flags = 0; 13277 int flags = 0;
13250 int retval = 0; /* default: FAIL */ 13278 int retval = 0; /* default: FAIL */
13251 long lnum_stop = 0; 13279 long lnum_stop = 0;
13280 int options = SEARCH_KEEP;
13252 13281
13253 pat = get_tv_string(&argvars[0]); 13282 pat = get_tv_string(&argvars[0]);
13254 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */ 13283 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */
13255 if (dir == 0) 13284 if (dir == 0)
13256 goto theend; 13285 goto theend;
13286 if (flags & SP_START)
13287 options |= SEARCH_START;
13257 13288
13258 /* Optional extra argument: line number to stop searching. */ 13289 /* Optional extra argument: line number to stop searching. */
13259 if (argvars[1].v_type != VAR_UNKNOWN 13290 if (argvars[1].v_type != VAR_UNKNOWN
13260 && argvars[2].v_type != VAR_UNKNOWN) 13291 && argvars[2].v_type != VAR_UNKNOWN)
13261 { 13292 {
13263 if (lnum_stop < 0) 13294 if (lnum_stop < 0)
13264 goto theend; 13295 goto theend;
13265 } 13296 }
13266 13297
13267 /* 13298 /*
13268 * This function accepts only SP_NOMOVE and SP_SETPCMARK flags. 13299 * This function accepts only SP_NOMOVE, SP_START and SP_SETPCMARK flags.
13269 * Check to make sure only those flags are set. 13300 * Check to make sure only those flags are set.
13270 * Also, Only the SP_NOMOVE or the SP_SETPCMARK flag can be set. Both 13301 * Also, Only the SP_NOMOVE or the SP_SETPCMARK flag can be set. Both
13271 * flags cannot be set. Check for that condition also. 13302 * flags cannot be set. Check for that condition also.
13272 */ 13303 */
13273 if (((flags & ~(SP_NOMOVE | SP_SETPCMARK)) != 0) || 13304 if (((flags & ~(SP_NOMOVE | SP_SETPCMARK | SP_START)) != 0)
13274 ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK))) 13305 || ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK)))
13275 { 13306 {
13276 EMSG2(_(e_invarg2), get_tv_string(&argvars[1])); 13307 EMSG2(_(e_invarg2), get_tv_string(&argvars[1]));
13277 goto theend; 13308 goto theend;
13278 } 13309 }
13279 13310
13280 pos = save_cursor = curwin->w_cursor; 13311 pos = save_cursor = curwin->w_cursor;
13281 if (searchit(curwin, curbuf, &pos, dir, pat, 1L, 13312 if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
13282 SEARCH_KEEP, RE_SEARCH, (linenr_T)lnum_stop) != FAIL) 13313 options, RE_SEARCH, (linenr_T)lnum_stop) != FAIL)
13283 { 13314 {
13284 retval = pos.lnum; 13315 retval = pos.lnum;
13285 if (flags & SP_SETPCMARK) 13316 if (flags & SP_SETPCMARK)
13286 setpcmark(); 13317 setpcmark();
13287 curwin->w_cursor = pos; 13318 curwin->w_cursor = pos;
13456 char_u *spat; /* start pattern */ 13487 char_u *spat; /* start pattern */
13457 char_u *mpat; /* middle pattern */ 13488 char_u *mpat; /* middle pattern */
13458 char_u *epat; /* end pattern */ 13489 char_u *epat; /* end pattern */
13459 int dir; /* BACKWARD or FORWARD */ 13490 int dir; /* BACKWARD or FORWARD */
13460 char_u *skip; /* skip expression */ 13491 char_u *skip; /* skip expression */
13461 int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE */ 13492 int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE, SP_START */
13462 pos_T *match_pos; 13493 pos_T *match_pos;
13463 linenr_T lnum_stop; /* stop at this line if not zero */ 13494 linenr_T lnum_stop; /* stop at this line if not zero */
13464 { 13495 {
13465 char_u *save_cpo; 13496 char_u *save_cpo;
13466 char_u *pat, *pat2 = NULL, *pat3 = NULL; 13497 char_u *pat, *pat2 = NULL, *pat3 = NULL;
13472 pos_T save_pos; 13503 pos_T save_pos;
13473 int n; 13504 int n;
13474 int r; 13505 int r;
13475 int nest = 1; 13506 int nest = 1;
13476 int err; 13507 int err;
13508 int options = SEARCH_KEEP;
13477 13509
13478 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ 13510 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
13479 save_cpo = p_cpo; 13511 save_cpo = p_cpo;
13480 p_cpo = (char_u *)""; 13512 p_cpo = (char_u *)"";
13481 13513
13489 if (*mpat == NUL) 13521 if (*mpat == NUL)
13490 STRCPY(pat3, pat2); 13522 STRCPY(pat3, pat2);
13491 else 13523 else
13492 sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)", 13524 sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)",
13493 spat, epat, mpat); 13525 spat, epat, mpat);
13526 if (flags & SP_START)
13527 options |= SEARCH_START;
13494 13528
13495 save_cursor = curwin->w_cursor; 13529 save_cursor = curwin->w_cursor;
13496 pos = curwin->w_cursor; 13530 pos = curwin->w_cursor;
13497 clearpos(&firstpos); 13531 clearpos(&firstpos);
13498 clearpos(&foundpos); 13532 clearpos(&foundpos);
13499 pat = pat3; 13533 pat = pat3;
13500 for (;;) 13534 for (;;)
13501 { 13535 {
13502 n = searchit(curwin, curbuf, &pos, dir, pat, 1L, 13536 n = searchit(curwin, curbuf, &pos, dir, pat, 1L,
13503 SEARCH_KEEP, RE_SEARCH, lnum_stop); 13537 options, RE_SEARCH, lnum_stop);
13504 if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos))) 13538 if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos)))
13505 /* didn't find it or found the first match again: FAIL */ 13539 /* didn't find it or found the first match again: FAIL */
13506 break; 13540 break;
13507 13541
13508 if (firstpos.lnum == 0) 13542 if (firstpos.lnum == 0)
13874 rettv->vval.v_number = -1; 13908 rettv->vval.v_number = -1;
13875 13909
13876 win = find_win_by_nr(&argvars[0]); 13910 win = find_win_by_nr(&argvars[0]);
13877 if (win != NULL) 13911 if (win != NULL)
13878 set_qf_ll_list(win, &argvars[1], &argvars[2], rettv); 13912 set_qf_ll_list(win, &argvars[1], &argvars[2], rettv);
13913 }
13914
13915 /*
13916 * "setpos()" function
13917 */
13918 /*ARGSUSED*/
13919 static void
13920 f_setpos(argvars, rettv)
13921 typval_T *argvars;
13922 typval_T *rettv;
13923 {
13924 pos_T pos;
13925 int fnum;
13926 char_u *name;
13927
13928 name = get_tv_string_chk(argvars);
13929 if (name != NULL)
13930 {
13931 if (list2fpos(&argvars[1], &pos, &fnum) == OK)
13932 {
13933 --pos.col;
13934 if (name[0] == '.') /* cursor */
13935 {
13936 if (fnum == curbuf->b_fnum)
13937 {
13938 curwin->w_cursor = pos;
13939 check_cursor();
13940 }
13941 else
13942 EMSG(_(e_invarg));
13943 }
13944 else if (name[0] == '\'') /* mark */
13945 (void)setmark_pos(name[1], &pos, fnum);
13946 else
13947 EMSG(_(e_invarg));
13948 }
13949 }
13879 } 13950 }
13880 13951
13881 /* 13952 /*
13882 * "setqflist()" function 13953 * "setqflist()" function
13883 */ 13954 */
15410 typval_T *argvars; 15481 typval_T *argvars;
15411 typval_T *rettv; 15482 typval_T *rettv;
15412 { 15483 {
15413 colnr_T vcol = 0; 15484 colnr_T vcol = 0;
15414 pos_T *fp; 15485 pos_T *fp;
15415 15486 int fnum = curbuf->b_fnum;
15416 fp = var2fpos(&argvars[0], FALSE); 15487
15417 if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count) 15488 fp = var2fpos(&argvars[0], FALSE, &fnum);
15489 if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count
15490 && fnum == curbuf->b_fnum)
15418 { 15491 {
15419 getvvcol(curwin, fp, NULL, NULL, &vcol); 15492 getvvcol(curwin, fp, NULL, NULL, &vcol);
15420 ++vcol; 15493 ++vcol;
15421 } 15494 }
15422 15495
15658 /* 15731 /*
15659 * Translate a String variable into a position. 15732 * Translate a String variable into a position.
15660 * Returns NULL when there is an error. 15733 * Returns NULL when there is an error.
15661 */ 15734 */
15662 static pos_T * 15735 static pos_T *
15663 var2fpos(varp, lnum) 15736 var2fpos(varp, lnum, fnum)
15664 typval_T *varp; 15737 typval_T *varp;
15665 int lnum; /* TRUE when $ is last line */ 15738 int lnum; /* TRUE when $ is last line */
15739 int *fnum; /* set to fnum for '0, 'A, etc. */
15666 { 15740 {
15667 char_u *name; 15741 char_u *name;
15668 static pos_T pos; 15742 static pos_T pos;
15669 pos_T *pp; 15743 pos_T *pp;
15670 15744
15709 return NULL; 15783 return NULL;
15710 if (name[0] == '.') /* cursor */ 15784 if (name[0] == '.') /* cursor */
15711 return &curwin->w_cursor; 15785 return &curwin->w_cursor;
15712 if (name[0] == '\'') /* mark */ 15786 if (name[0] == '\'') /* mark */
15713 { 15787 {
15714 pp = getmark(name[1], FALSE); 15788 pp = getmark_fnum(name[1], FALSE, fnum);
15715 if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) 15789 if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
15716 return NULL; 15790 return NULL;
15717 return pp; 15791 return pp;
15718 } 15792 }
15719 15793
15750 pos.col = (colnr_T)STRLEN(ml_get_curline()); 15824 pos.col = (colnr_T)STRLEN(ml_get_curline());
15751 } 15825 }
15752 return &pos; 15826 return &pos;
15753 } 15827 }
15754 return NULL; 15828 return NULL;
15829 }
15830
15831 /*
15832 * Convert list in "arg" into a position and optional file number.
15833 * When "fnump" is NULL there is no file number, only 3 items.
15834 * Note that the column is passed on as-is, the caller may want to decrement
15835 * it to use 1 for the first column.
15836 * Return FAIL when conversion is not possible, doesn't check the position for
15837 * validity.
15838 */
15839 static int
15840 list2fpos(arg, posp, fnump)
15841 typval_T *arg;
15842 pos_T *posp;
15843 int *fnump;
15844 {
15845 list_T *l = arg->vval.v_list;
15846 long i = 0;
15847 long n;
15848
15849 /* List must be: [fnum, lnum, col, coladd] */
15850 if (arg->v_type != VAR_LIST || l == NULL
15851 || l->lv_len != (fnump == NULL ? 3 : 4))
15852 return FAIL;
15853
15854 if (fnump != NULL)
15855 {
15856 n = list_find_nr(l, i++, NULL); /* fnum */
15857 if (n < 0)
15858 return FAIL;
15859 if (n == 0)
15860 n = curbuf->b_fnum; /* current buffer */
15861 *fnump = n;
15862 }
15863
15864 n = list_find_nr(l, i++, NULL); /* lnum */
15865 if (n < 0)
15866 return FAIL;
15867 posp->lnum = n;
15868
15869 n = list_find_nr(l, i++, NULL); /* col */
15870 if (n < 0)
15871 return FAIL;
15872 posp->col = n;
15873
15874 #ifdef FEAT_VIRTUALEDIT
15875 n = list_find_nr(l, i, NULL);
15876 if (n < 0)
15877 return FAIL;
15878 posp->coladd = n;
15879 #endif
15880
15881 return OK;
15755 } 15882 }
15756 15883
15757 /* 15884 /*
15758 * Get the length of an environment variable name. 15885 * Get the length of an environment variable name.
15759 * Advance "arg" to the first character after the name. 15886 * Advance "arg" to the first character after the name.