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;