Mercurial > vim
comparison src/eval.c @ 833:52d17d53b555 v7.0d05
updated for version 7.0d05
author | vimboss |
---|---|
date | Sat, 15 Apr 2006 20:28:54 +0000 |
parents | dc8197342755 |
children | 8bebcabccc2c |
comparison
equal
deleted
inserted
replaced
832:c76f780d4e05 | 833:52d17d53b555 |
---|---|
526 static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); | 526 static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); |
527 static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); | 527 static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); |
528 static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); | 528 static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); |
529 static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); | 529 static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); |
530 static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv)); | 530 static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv)); |
531 static void f_gettabwinvar __ARGS((typval_T *argvars, typval_T *rettv)); | |
531 static void f_getwinposx __ARGS((typval_T *argvars, typval_T *rettv)); | 532 static void f_getwinposx __ARGS((typval_T *argvars, typval_T *rettv)); |
532 static void f_getwinposy __ARGS((typval_T *argvars, typval_T *rettv)); | 533 static void f_getwinposy __ARGS((typval_T *argvars, typval_T *rettv)); |
533 static void f_getwinvar __ARGS((typval_T *argvars, typval_T *rettv)); | 534 static void f_getwinvar __ARGS((typval_T *argvars, typval_T *rettv)); |
534 static void f_glob __ARGS((typval_T *argvars, typval_T *rettv)); | 535 static void f_glob __ARGS((typval_T *argvars, typval_T *rettv)); |
535 static void f_globpath __ARGS((typval_T *argvars, typval_T *rettv)); | 536 static void f_globpath __ARGS((typval_T *argvars, typval_T *rettv)); |
612 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); | 613 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); |
613 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); | 614 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); |
614 static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv)); | 615 static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv)); |
615 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); | 616 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); |
616 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); | 617 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); |
618 static void f_settabwinvar __ARGS((typval_T *argvars, typval_T *rettv)); | |
617 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv)); | 619 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv)); |
618 static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); | 620 static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); |
619 static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); | 621 static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); |
620 static void f_soundfold __ARGS((typval_T *argvars, typval_T *rettv)); | 622 static void f_soundfold __ARGS((typval_T *argvars, typval_T *rettv)); |
621 static void f_spellbadword __ARGS((typval_T *argvars, typval_T *rettv)); | 623 static void f_spellbadword __ARGS((typval_T *argvars, typval_T *rettv)); |
726 static void func_free __ARGS((ufunc_T *fp)); | 728 static void func_free __ARGS((ufunc_T *fp)); |
727 static void func_unref __ARGS((char_u *name)); | 729 static void func_unref __ARGS((char_u *name)); |
728 static void func_ref __ARGS((char_u *name)); | 730 static void func_ref __ARGS((char_u *name)); |
729 static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict)); | 731 static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict)); |
730 static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)); | 732 static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)); |
731 static win_T *find_win_by_nr __ARGS((typval_T *vp)); | 733 static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp)); |
734 static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); | |
732 static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); | 735 static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); |
733 static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp)); | 736 static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp)); |
737 static void setwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); | |
734 | 738 |
735 /* Character used as separated in autoload function/variable names. */ | 739 /* Character used as separated in autoload function/variable names. */ |
736 #define AUTOLOAD_CHAR '#' | 740 #define AUTOLOAD_CHAR '#' |
737 | 741 |
738 /* | 742 /* |
7033 {"getloclist", 1, 1, f_getqflist}, | 7037 {"getloclist", 1, 1, f_getqflist}, |
7034 {"getpos", 1, 1, f_getpos}, | 7038 {"getpos", 1, 1, f_getpos}, |
7035 {"getqflist", 0, 0, f_getqflist}, | 7039 {"getqflist", 0, 0, f_getqflist}, |
7036 {"getreg", 0, 2, f_getreg}, | 7040 {"getreg", 0, 2, f_getreg}, |
7037 {"getregtype", 0, 1, f_getregtype}, | 7041 {"getregtype", 0, 1, f_getregtype}, |
7042 {"gettabwinvar", 3, 3, f_gettabwinvar}, | |
7038 {"getwinposx", 0, 0, f_getwinposx}, | 7043 {"getwinposx", 0, 0, f_getwinposx}, |
7039 {"getwinposy", 0, 0, f_getwinposy}, | 7044 {"getwinposy", 0, 0, f_getwinposy}, |
7040 {"getwinvar", 2, 2, f_getwinvar}, | 7045 {"getwinvar", 2, 2, f_getwinvar}, |
7041 {"glob", 1, 1, f_glob}, | 7046 {"glob", 1, 1, f_glob}, |
7042 {"globpath", 2, 2, f_globpath}, | 7047 {"globpath", 2, 2, f_globpath}, |
7121 {"setline", 2, 2, f_setline}, | 7126 {"setline", 2, 2, f_setline}, |
7122 {"setloclist", 2, 3, f_setloclist}, | 7127 {"setloclist", 2, 3, f_setloclist}, |
7123 {"setpos", 2, 2, f_setpos}, | 7128 {"setpos", 2, 2, f_setpos}, |
7124 {"setqflist", 1, 2, f_setqflist}, | 7129 {"setqflist", 1, 2, f_setqflist}, |
7125 {"setreg", 2, 3, f_setreg}, | 7130 {"setreg", 2, 3, f_setreg}, |
7131 {"settabwinvar", 4, 4, f_settabwinvar}, | |
7126 {"setwinvar", 3, 3, f_setwinvar}, | 7132 {"setwinvar", 3, 3, f_setwinvar}, |
7127 {"simplify", 1, 1, f_simplify}, | 7133 {"simplify", 1, 1, f_simplify}, |
7128 {"sort", 1, 2, f_sort}, | 7134 {"sort", 1, 2, f_sort}, |
7129 {"soundfold", 1, 1, f_soundfold}, | 7135 {"soundfold", 1, 1, f_soundfold}, |
7130 {"spellbadword", 0, 1, f_spellbadword}, | 7136 {"spellbadword", 0, 1, f_spellbadword}, |
10127 if (rettv_list_alloc(rettv) == OK) | 10133 if (rettv_list_alloc(rettv) == OK) |
10128 { | 10134 { |
10129 wp = NULL; | 10135 wp = NULL; |
10130 if (argvars[0].v_type != VAR_UNKNOWN) /* getloclist() */ | 10136 if (argvars[0].v_type != VAR_UNKNOWN) /* getloclist() */ |
10131 { | 10137 { |
10132 wp = find_win_by_nr(&argvars[0]); | 10138 wp = find_win_by_nr(&argvars[0], NULL); |
10133 if (wp == NULL) | 10139 if (wp == NULL) |
10134 return; | 10140 return; |
10135 } | 10141 } |
10136 | 10142 |
10137 (void)get_errorlist(wp, rettv->vval.v_list); | 10143 (void)get_errorlist(wp, rettv->vval.v_list); |
10217 rettv->v_type = VAR_STRING; | 10223 rettv->v_type = VAR_STRING; |
10218 rettv->vval.v_string = vim_strsave(buf); | 10224 rettv->vval.v_string = vim_strsave(buf); |
10219 } | 10225 } |
10220 | 10226 |
10221 /* | 10227 /* |
10228 * "gettabwinvar()" function | |
10229 */ | |
10230 static void | |
10231 f_gettabwinvar(argvars, rettv) | |
10232 typval_T *argvars; | |
10233 typval_T *rettv; | |
10234 { | |
10235 getwinvar(argvars, rettv, 1); | |
10236 } | |
10237 | |
10238 /* | |
10222 * "getwinposx()" function | 10239 * "getwinposx()" function |
10223 */ | 10240 */ |
10224 /*ARGSUSED*/ | 10241 /*ARGSUSED*/ |
10225 static void | 10242 static void |
10226 f_getwinposx(argvars, rettv) | 10243 f_getwinposx(argvars, rettv) |
10258 rettv->vval.v_number = y; | 10275 rettv->vval.v_number = y; |
10259 } | 10276 } |
10260 #endif | 10277 #endif |
10261 } | 10278 } |
10262 | 10279 |
10280 /* | |
10281 * Find window specifed by "vp" in tabpage "tp". | |
10282 */ | |
10263 static win_T * | 10283 static win_T * |
10264 find_win_by_nr(vp) | 10284 find_win_by_nr(vp, tp) |
10265 typval_T *vp; | 10285 typval_T *vp; |
10286 tabpage_T *tp; /* NULL for current tab page */ | |
10266 { | 10287 { |
10267 #ifdef FEAT_WINDOWS | 10288 #ifdef FEAT_WINDOWS |
10268 win_T *wp; | 10289 win_T *wp; |
10269 #endif | 10290 #endif |
10270 int nr; | 10291 int nr; |
10275 if (nr < 0) | 10296 if (nr < 0) |
10276 return NULL; | 10297 return NULL; |
10277 if (nr == 0) | 10298 if (nr == 0) |
10278 return curwin; | 10299 return curwin; |
10279 | 10300 |
10280 for (wp = firstwin; wp != NULL; wp = wp->w_next) | 10301 for (wp = (tp == NULL || tp == curtab) ? firstwin : tp->tp_firstwin; |
10302 wp != NULL; wp = wp->w_next) | |
10281 if (--nr <= 0) | 10303 if (--nr <= 0) |
10282 break; | 10304 break; |
10283 return wp; | 10305 return wp; |
10284 #else | 10306 #else |
10285 if (nr == 0 || nr == 1) | 10307 if (nr == 0 || nr == 1) |
10294 static void | 10316 static void |
10295 f_getwinvar(argvars, rettv) | 10317 f_getwinvar(argvars, rettv) |
10296 typval_T *argvars; | 10318 typval_T *argvars; |
10297 typval_T *rettv; | 10319 typval_T *rettv; |
10298 { | 10320 { |
10321 getwinvar(argvars, rettv, 0); | |
10322 } | |
10323 | |
10324 /* | |
10325 * getwinvar() and gettabwinvar() | |
10326 */ | |
10327 static void | |
10328 getwinvar(argvars, rettv, off) | |
10329 typval_T *argvars; | |
10330 typval_T *rettv; | |
10331 int off; /* 1 for gettabwinvar() */ | |
10332 { | |
10299 win_T *win, *oldcurwin; | 10333 win_T *win, *oldcurwin; |
10300 char_u *varname; | 10334 char_u *varname; |
10301 dictitem_T *v; | 10335 dictitem_T *v; |
10302 | 10336 tabpage_T *tp; |
10303 win = find_win_by_nr(&argvars[0]); | 10337 |
10304 varname = get_tv_string_chk(&argvars[1]); | 10338 #ifdef FEAT_WINDOWS |
10339 if (off == 1) | |
10340 tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL)); | |
10341 else | |
10342 tp = curtab; | |
10343 #endif | |
10344 win = find_win_by_nr(&argvars[off], tp); | |
10345 varname = get_tv_string_chk(&argvars[off + 1]); | |
10305 ++emsg_off; | 10346 ++emsg_off; |
10306 | 10347 |
10307 rettv->v_type = VAR_STRING; | 10348 rettv->v_type = VAR_STRING; |
10308 rettv->vval.v_string = NULL; | 10349 rettv->vval.v_string = NULL; |
10309 | 10350 |
14243 { | 14284 { |
14244 win_T *win; | 14285 win_T *win; |
14245 | 14286 |
14246 rettv->vval.v_number = -1; | 14287 rettv->vval.v_number = -1; |
14247 | 14288 |
14248 win = find_win_by_nr(&argvars[0]); | 14289 win = find_win_by_nr(&argvars[0], NULL); |
14249 if (win != NULL) | 14290 if (win != NULL) |
14250 set_qf_ll_list(win, &argvars[1], &argvars[2], rettv); | 14291 set_qf_ll_list(win, &argvars[1], &argvars[2], rettv); |
14251 } | 14292 } |
14252 | 14293 |
14253 /* | 14294 /* |
14366 write_reg_contents_ex(regname, strval, -1, | 14407 write_reg_contents_ex(regname, strval, -1, |
14367 append, yank_type, block_len); | 14408 append, yank_type, block_len); |
14368 rettv->vval.v_number = 0; | 14409 rettv->vval.v_number = 0; |
14369 } | 14410 } |
14370 | 14411 |
14371 | 14412 /* |
14372 /* | 14413 * "settabwinvar()" function |
14373 * "setwinvar(expr)" function | 14414 */ |
14374 */ | 14415 static void |
14375 /*ARGSUSED*/ | 14416 f_settabwinvar(argvars, rettv) |
14417 typval_T *argvars; | |
14418 typval_T *rettv; | |
14419 { | |
14420 setwinvar(argvars, rettv, 1); | |
14421 } | |
14422 | |
14423 /* | |
14424 * "setwinvar()" function | |
14425 */ | |
14376 static void | 14426 static void |
14377 f_setwinvar(argvars, rettv) | 14427 f_setwinvar(argvars, rettv) |
14378 typval_T *argvars; | 14428 typval_T *argvars; |
14379 typval_T *rettv; | 14429 typval_T *rettv; |
14430 { | |
14431 setwinvar(argvars, rettv, 0); | |
14432 } | |
14433 | |
14434 /* | |
14435 * "setwinvar()" and "settabwinvar()" functions | |
14436 */ | |
14437 static void | |
14438 setwinvar(argvars, rettv, off) | |
14439 typval_T *argvars; | |
14440 typval_T *rettv; | |
14441 int off; | |
14380 { | 14442 { |
14381 win_T *win; | 14443 win_T *win; |
14382 #ifdef FEAT_WINDOWS | 14444 #ifdef FEAT_WINDOWS |
14383 win_T *save_curwin; | 14445 win_T *save_curwin; |
14446 tabpage_T *save_curtab; | |
14384 #endif | 14447 #endif |
14385 char_u *varname, *winvarname; | 14448 char_u *varname, *winvarname; |
14386 typval_T *varp; | 14449 typval_T *varp; |
14387 char_u nbuf[NUMBUFLEN]; | 14450 char_u nbuf[NUMBUFLEN]; |
14451 tabpage_T *tp; | |
14388 | 14452 |
14389 rettv->vval.v_number = 0; | 14453 rettv->vval.v_number = 0; |
14390 | 14454 |
14391 if (check_restricted() || check_secure()) | 14455 if (check_restricted() || check_secure()) |
14392 return; | 14456 return; |
14393 win = find_win_by_nr(&argvars[0]); | 14457 |
14394 varname = get_tv_string_chk(&argvars[1]); | 14458 #ifdef FEAT_WINDOWS |
14395 varp = &argvars[2]; | 14459 if (off == 1) |
14460 tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL)); | |
14461 else | |
14462 tp = curtab; | |
14463 #endif | |
14464 win = find_win_by_nr(&argvars[off], tp); | |
14465 varname = get_tv_string_chk(&argvars[off + 1]); | |
14466 varp = &argvars[off + 2]; | |
14396 | 14467 |
14397 if (win != NULL && varname != NULL && varp != NULL) | 14468 if (win != NULL && varname != NULL && varp != NULL) |
14398 { | 14469 { |
14399 #ifdef FEAT_WINDOWS | 14470 #ifdef FEAT_WINDOWS |
14400 /* set curwin to be our win, temporarily */ | 14471 /* set curwin to be our win, temporarily */ |
14401 save_curwin = curwin; | 14472 save_curwin = curwin; |
14473 save_curtab = curtab; | |
14474 goto_tabpage_tp(tp); | |
14475 if (!win_valid(win)) | |
14476 return; | |
14402 curwin = win; | 14477 curwin = win; |
14403 curbuf = curwin->w_buffer; | 14478 curbuf = curwin->w_buffer; |
14404 #endif | 14479 #endif |
14405 | 14480 |
14406 if (*varname == '&') | 14481 if (*varname == '&') |
14426 vim_free(winvarname); | 14501 vim_free(winvarname); |
14427 } | 14502 } |
14428 } | 14503 } |
14429 | 14504 |
14430 #ifdef FEAT_WINDOWS | 14505 #ifdef FEAT_WINDOWS |
14431 /* Restore current window, if it's still valid (autocomands can make | 14506 /* Restore current tabpage and window, if still valid (autocomands can |
14432 * it invalid). */ | 14507 * make them invalid). */ |
14508 if (valid_tabpage(save_curtab)) | |
14509 goto_tabpage_tp(save_curtab); | |
14433 if (win_valid(save_curwin)) | 14510 if (win_valid(save_curwin)) |
14434 { | 14511 { |
14435 curwin = save_curwin; | 14512 curwin = save_curwin; |
14436 curbuf = curwin->w_buffer; | 14513 curbuf = curwin->w_buffer; |
14437 } | 14514 } |
15899 typval_T *argvars; | 15976 typval_T *argvars; |
15900 typval_T *rettv; | 15977 typval_T *rettv; |
15901 { | 15978 { |
15902 win_T *wp; | 15979 win_T *wp; |
15903 | 15980 |
15904 wp = find_win_by_nr(&argvars[0]); | 15981 wp = find_win_by_nr(&argvars[0], NULL); |
15905 if (wp == NULL) | 15982 if (wp == NULL) |
15906 rettv->vval.v_number = -1; | 15983 rettv->vval.v_number = -1; |
15907 else | 15984 else |
15908 rettv->vval.v_number = wp->w_buffer->b_fnum; | 15985 rettv->vval.v_number = wp->w_buffer->b_fnum; |
15909 } | 15986 } |
15929 typval_T *argvars; | 16006 typval_T *argvars; |
15930 typval_T *rettv; | 16007 typval_T *rettv; |
15931 { | 16008 { |
15932 win_T *wp; | 16009 win_T *wp; |
15933 | 16010 |
15934 wp = find_win_by_nr(&argvars[0]); | 16011 wp = find_win_by_nr(&argvars[0], NULL); |
15935 if (wp == NULL) | 16012 if (wp == NULL) |
15936 rettv->vval.v_number = -1; | 16013 rettv->vval.v_number = -1; |
15937 else | 16014 else |
15938 rettv->vval.v_number = wp->w_height; | 16015 rettv->vval.v_number = wp->w_height; |
15939 } | 16016 } |
16090 typval_T *argvars; | 16167 typval_T *argvars; |
16091 typval_T *rettv; | 16168 typval_T *rettv; |
16092 { | 16169 { |
16093 win_T *wp; | 16170 win_T *wp; |
16094 | 16171 |
16095 wp = find_win_by_nr(&argvars[0]); | 16172 wp = find_win_by_nr(&argvars[0], NULL); |
16096 if (wp == NULL) | 16173 if (wp == NULL) |
16097 rettv->vval.v_number = -1; | 16174 rettv->vval.v_number = -1; |
16098 else | 16175 else |
16099 #ifdef FEAT_VERTSPLIT | 16176 #ifdef FEAT_VERTSPLIT |
16100 rettv->vval.v_number = wp->w_width; | 16177 rettv->vval.v_number = wp->w_width; |