comparison src/eval.c @ 819:23f82b5d2814 v7.0c10

updated for version 7.0c10
author vimboss
date Wed, 05 Apr 2006 20:41:53 +0000
parents 1f929f3ca806
children 1cdd2661f34c
comparison
equal deleted inserted replaced
818:1f929f3ca806 819:23f82b5d2814
367 static char_u *skip_var_one __ARGS((char_u *arg)); 367 static char_u *skip_var_one __ARGS((char_u *arg));
368 static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty)); 368 static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty));
369 static void list_glob_vars __ARGS((void)); 369 static void list_glob_vars __ARGS((void));
370 static void list_buf_vars __ARGS((void)); 370 static void list_buf_vars __ARGS((void));
371 static void list_win_vars __ARGS((void)); 371 static void list_win_vars __ARGS((void));
372 #ifdef FEAT_WINDOWS
373 static void list_tab_vars __ARGS((void));
374 #endif
372 static void list_vim_vars __ARGS((void)); 375 static void list_vim_vars __ARGS((void));
373 static void list_script_vars __ARGS((void)); 376 static void list_script_vars __ARGS((void));
374 static void list_func_vars __ARGS((void)); 377 static void list_func_vars __ARGS((void));
375 static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg)); 378 static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg));
376 static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op)); 379 static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op));
565 static void f_localtime __ARGS((typval_T *argvars, typval_T *rettv)); 568 static void f_localtime __ARGS((typval_T *argvars, typval_T *rettv));
566 static void f_map __ARGS((typval_T *argvars, typval_T *rettv)); 569 static void f_map __ARGS((typval_T *argvars, typval_T *rettv));
567 static void f_maparg __ARGS((typval_T *argvars, typval_T *rettv)); 570 static void f_maparg __ARGS((typval_T *argvars, typval_T *rettv));
568 static void f_mapcheck __ARGS((typval_T *argvars, typval_T *rettv)); 571 static void f_mapcheck __ARGS((typval_T *argvars, typval_T *rettv));
569 static void f_match __ARGS((typval_T *argvars, typval_T *rettv)); 572 static void f_match __ARGS((typval_T *argvars, typval_T *rettv));
573 static void f_matcharg __ARGS((typval_T *argvars, typval_T *rettv));
570 static void f_matchend __ARGS((typval_T *argvars, typval_T *rettv)); 574 static void f_matchend __ARGS((typval_T *argvars, typval_T *rettv));
571 static void f_matchlist __ARGS((typval_T *argvars, typval_T *rettv)); 575 static void f_matchlist __ARGS((typval_T *argvars, typval_T *rettv));
572 static void f_matchstr __ARGS((typval_T *argvars, typval_T *rettv)); 576 static void f_matchstr __ARGS((typval_T *argvars, typval_T *rettv));
573 static void f_max __ARGS((typval_T *argvars, typval_T *rettv)); 577 static void f_max __ARGS((typval_T *argvars, typval_T *rettv));
574 static void f_min __ARGS((typval_T *argvars, typval_T *rettv)); 578 static void f_min __ARGS((typval_T *argvars, typval_T *rettv));
576 static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv)); 580 static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv));
577 #endif 581 #endif
578 static void f_mode __ARGS((typval_T *argvars, typval_T *rettv)); 582 static void f_mode __ARGS((typval_T *argvars, typval_T *rettv));
579 static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv)); 583 static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv));
580 static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); 584 static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv));
585 static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv));
581 static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv)); 586 static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv));
582 static void f_printf __ARGS((typval_T *argvars, typval_T *rettv)); 587 static void f_printf __ARGS((typval_T *argvars, typval_T *rettv));
583 static void f_pumvisible __ARGS((typval_T *argvars, typval_T *rettv)); 588 static void f_pumvisible __ARGS((typval_T *argvars, typval_T *rettv));
584 static void f_range __ARGS((typval_T *argvars, typval_T *rettv)); 589 static void f_range __ARGS((typval_T *argvars, typval_T *rettv));
585 static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv)); 590 static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv));
1683 { 1688 {
1684 /* ":let" */ 1689 /* ":let" */
1685 list_glob_vars(); 1690 list_glob_vars();
1686 list_buf_vars(); 1691 list_buf_vars();
1687 list_win_vars(); 1692 list_win_vars();
1693 #ifdef FEAT_WINDOWS
1694 list_tab_vars();
1695 #endif
1688 list_script_vars(); 1696 list_script_vars();
1689 list_func_vars(); 1697 list_func_vars();
1690 list_vim_vars(); 1698 list_vim_vars();
1691 } 1699 }
1692 eap->nextcmd = check_nextcmd(arg); 1700 eap->nextcmd = check_nextcmd(arg);
1944 static void 1952 static void
1945 list_win_vars() 1953 list_win_vars()
1946 { 1954 {
1947 list_hashtable_vars(&curwin->w_vars.dv_hashtab, (char_u *)"w:", TRUE); 1955 list_hashtable_vars(&curwin->w_vars.dv_hashtab, (char_u *)"w:", TRUE);
1948 } 1956 }
1957
1958 #ifdef FEAT_WINDOWS
1959 /*
1960 * List tab page variables.
1961 */
1962 static void
1963 list_tab_vars()
1964 {
1965 list_hashtable_vars(&curtab->tp_vars.dv_hashtab, (char_u *)"t:", TRUE);
1966 }
1967 #endif
1949 1968
1950 /* 1969 /*
1951 * List Vim variables. 1970 * List Vim variables.
1952 */ 1971 */
1953 static void 1972 static void
2041 switch (*name) 2060 switch (*name)
2042 { 2061 {
2043 case 'g': list_glob_vars(); break; 2062 case 'g': list_glob_vars(); break;
2044 case 'b': list_buf_vars(); break; 2063 case 'b': list_buf_vars(); break;
2045 case 'w': list_win_vars(); break; 2064 case 'w': list_win_vars(); break;
2065 #ifdef FEAT_WINDOWS
2066 case 't': list_tab_vars(); break;
2067 #endif
2046 case 'v': list_vim_vars(); break; 2068 case 'v': list_vim_vars(); break;
2047 case 's': list_script_vars(); break; 2069 case 's': list_script_vars(); break;
2048 case 'l': list_func_vars(); break; 2070 case 'l': list_func_vars(); break;
2049 default: 2071 default:
2050 EMSG2(_("E738: Can't list variables for %s"), name); 2072 EMSG2(_("E738: Can't list variables for %s"), name);
3575 int idx; 3597 int idx;
3576 { 3598 {
3577 static long_u gdone; 3599 static long_u gdone;
3578 static long_u bdone; 3600 static long_u bdone;
3579 static long_u wdone; 3601 static long_u wdone;
3602 #ifdef FEAT_WINDOWS
3603 static long_u tdone;
3604 #endif
3580 static int vidx; 3605 static int vidx;
3581 static hashitem_T *hi; 3606 static hashitem_T *hi;
3582 hashtab_T *ht; 3607 hashtab_T *ht;
3583 3608
3584 if (idx == 0) 3609 if (idx == 0)
3610 {
3585 gdone = bdone = wdone = vidx = 0; 3611 gdone = bdone = wdone = vidx = 0;
3612 #ifdef FEAT_WINDOWS
3613 tdone = 0;
3614 #endif
3615 }
3586 3616
3587 /* Global variables */ 3617 /* Global variables */
3588 if (gdone < globvarht.ht_used) 3618 if (gdone < globvarht.ht_used)
3589 { 3619 {
3590 if (gdone++ == 0) 3620 if (gdone++ == 0)
3626 ++hi; 3656 ++hi;
3627 while (HASHITEM_EMPTY(hi)) 3657 while (HASHITEM_EMPTY(hi))
3628 ++hi; 3658 ++hi;
3629 return cat_prefix_varname('w', hi->hi_key); 3659 return cat_prefix_varname('w', hi->hi_key);
3630 } 3660 }
3661
3662 #ifdef FEAT_WINDOWS
3663 /* t: variables */
3664 ht = &curtab->tp_vars.dv_hashtab;
3665 if (tdone < ht->ht_used)
3666 {
3667 if (tdone++ == 0)
3668 hi = ht->ht_array;
3669 else
3670 ++hi;
3671 while (HASHITEM_EMPTY(hi))
3672 ++hi;
3673 return cat_prefix_varname('t', hi->hi_key);
3674 }
3675 #endif
3631 3676
3632 /* v: variables */ 3677 /* v: variables */
3633 if (vidx < VV_LEN) 3678 if (vidx < VV_LEN)
3634 return cat_prefix_varname('v', (char_u *)vimvars[vidx++].vv_name); 3679 return cat_prefix_varname('v', (char_u *)vimvars[vidx++].vv_name);
3635 3680
5695 if (li == NULL) 5740 if (li == NULL)
5696 return FAIL; 5741 return FAIL;
5697 list_append(l, li); 5742 list_append(l, li);
5698 li->li_tv.v_type = VAR_STRING; 5743 li->li_tv.v_type = VAR_STRING;
5699 li->li_tv.v_lock = 0; 5744 li->li_tv.v_lock = 0;
5700 if ((li->li_tv.vval.v_string = (len >= 0 ? vim_strnsave(str, len) 5745 if (str == NULL)
5746 li->li_tv.vval.v_string = NULL;
5747 else if ((li->li_tv.vval.v_string = (len >= 0 ? vim_strnsave(str, len)
5701 : vim_strsave(str))) == NULL) 5748 : vim_strsave(str))) == NULL)
5702 return FAIL; 5749 return FAIL;
5703 return OK; 5750 return OK;
5704 } 5751 }
5705 5752
5993 buf_T *buf; 6040 buf_T *buf;
5994 win_T *wp; 6041 win_T *wp;
5995 int i; 6042 int i;
5996 funccall_T *fc; 6043 funccall_T *fc;
5997 int did_free = FALSE; 6044 int did_free = FALSE;
6045 #ifdef FEAT_WINDOWS
6046 tabpage_T *tp;
6047 #endif
5998 6048
5999 /* 6049 /*
6000 * 1. Go through all accessible variables and mark all lists and dicts 6050 * 1. Go through all accessible variables and mark all lists and dicts
6001 * with copyID. 6051 * with copyID.
6002 */ 6052 */
6007 /* buffer-local variables */ 6057 /* buffer-local variables */
6008 for (buf = firstbuf; buf != NULL; buf = buf->b_next) 6058 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
6009 set_ref_in_ht(&buf->b_vars.dv_hashtab, copyID); 6059 set_ref_in_ht(&buf->b_vars.dv_hashtab, copyID);
6010 6060
6011 /* window-local variables */ 6061 /* window-local variables */
6012 FOR_ALL_WINDOWS(wp) 6062 FOR_ALL_TAB_WINDOWS(tp, wp)
6013 set_ref_in_ht(&wp->w_vars.dv_hashtab, copyID); 6063 set_ref_in_ht(&wp->w_vars.dv_hashtab, copyID);
6064
6065 #ifdef FEAT_WINDOWS
6066 /* tabpage-local variables */
6067 for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
6068 set_ref_in_ht(&tp->tp_vars.dv_hashtab, copyID);
6069 #endif
6014 6070
6015 /* global variables */ 6071 /* global variables */
6016 set_ref_in_ht(&globvarht, copyID); 6072 set_ref_in_ht(&globvarht, copyID);
6017 6073
6018 /* function-local variables */ 6074 /* function-local variables */
7019 {"localtime", 0, 0, f_localtime}, 7075 {"localtime", 0, 0, f_localtime},
7020 {"map", 2, 2, f_map}, 7076 {"map", 2, 2, f_map},
7021 {"maparg", 1, 3, f_maparg}, 7077 {"maparg", 1, 3, f_maparg},
7022 {"mapcheck", 1, 3, f_mapcheck}, 7078 {"mapcheck", 1, 3, f_mapcheck},
7023 {"match", 2, 4, f_match}, 7079 {"match", 2, 4, f_match},
7080 {"matcharg", 1, 1, f_matcharg},
7024 {"matchend", 2, 4, f_matchend}, 7081 {"matchend", 2, 4, f_matchend},
7025 {"matchlist", 2, 4, f_matchlist}, 7082 {"matchlist", 2, 4, f_matchlist},
7026 {"matchstr", 2, 4, f_matchstr}, 7083 {"matchstr", 2, 4, f_matchstr},
7027 {"max", 1, 1, f_max}, 7084 {"max", 1, 1, f_max},
7028 {"min", 1, 1, f_min}, 7085 {"min", 1, 1, f_min},
7030 {"mkdir", 1, 3, f_mkdir}, 7087 {"mkdir", 1, 3, f_mkdir},
7031 #endif 7088 #endif
7032 {"mode", 0, 0, f_mode}, 7089 {"mode", 0, 0, f_mode},
7033 {"nextnonblank", 1, 1, f_nextnonblank}, 7090 {"nextnonblank", 1, 1, f_nextnonblank},
7034 {"nr2char", 1, 1, f_nr2char}, 7091 {"nr2char", 1, 1, f_nr2char},
7092 {"pathshorten", 1, 1, f_pathshorten},
7035 {"prevnonblank", 1, 1, f_prevnonblank}, 7093 {"prevnonblank", 1, 1, f_prevnonblank},
7036 {"printf", 2, 19, f_printf}, 7094 {"printf", 2, 19, f_printf},
7037 {"pumvisible", 0, 0, f_pumvisible}, 7095 {"pumvisible", 0, 0, f_pumvisible},
7038 {"range", 1, 3, f_range}, 7096 {"range", 1, 3, f_range},
7039 {"readfile", 1, 3, f_readfile}, 7097 {"readfile", 1, 3, f_readfile},
11482 || tv_islocked(&di->di_tv)); 11540 || tv_islocked(&di->di_tv));
11483 } 11541 }
11484 } 11542 }
11485 } 11543 }
11486 else if (lv.ll_range) 11544 else if (lv.ll_range)
11487 EMSG(_("E745: Range not allowed")); 11545 EMSG(_("E786: Range not allowed"));
11488 else if (lv.ll_newkey != NULL) 11546 else if (lv.ll_newkey != NULL)
11489 EMSG2(_(e_dictkey), lv.ll_newkey); 11547 EMSG2(_(e_dictkey), lv.ll_newkey);
11490 else if (lv.ll_list != NULL) 11548 else if (lv.ll_list != NULL)
11491 /* List item. */ 11549 /* List item. */
11492 rettv->vval.v_number = tv_islocked(&lv.ll_li->li_tv); 11550 rettv->vval.v_number = tv_islocked(&lv.ll_li->li_tv);
12118 { 12176 {
12119 find_some_match(argvars, rettv, 1); 12177 find_some_match(argvars, rettv, 1);
12120 } 12178 }
12121 12179
12122 /* 12180 /*
12181 * "matcharg()" function
12182 */
12183 static void
12184 f_matcharg(argvars, rettv)
12185 typval_T *argvars;
12186 typval_T *rettv;
12187 {
12188 if (rettv_list_alloc(rettv) == OK)
12189 {
12190 #ifdef FEAT_SEARCH_EXTRA
12191 int mi = get_tv_number(&argvars[0]);
12192
12193 if (mi >= 1 && mi <= 3)
12194 {
12195 list_append_string(rettv->vval.v_list,
12196 syn_id2name(curwin->w_match_id[mi - 1]), -1);
12197 list_append_string(rettv->vval.v_list,
12198 curwin->w_match_pat[mi - 1], -1);
12199 }
12200 #endif
12201 }
12202 }
12203
12204 /*
12123 * "matchend()" function 12205 * "matchend()" function
12124 */ 12206 */
12125 static void 12207 static void
12126 f_matchend(argvars, rettv) 12208 f_matchend(argvars, rettv)
12127 typval_T *argvars; 12209 typval_T *argvars;
12387 buf[0] = (char_u)get_tv_number(&argvars[0]); 12469 buf[0] = (char_u)get_tv_number(&argvars[0]);
12388 buf[1] = NUL; 12470 buf[1] = NUL;
12389 } 12471 }
12390 rettv->v_type = VAR_STRING; 12472 rettv->v_type = VAR_STRING;
12391 rettv->vval.v_string = vim_strsave(buf); 12473 rettv->vval.v_string = vim_strsave(buf);
12474 }
12475
12476 /*
12477 * "pathshorten()" function
12478 */
12479 static void
12480 f_pathshorten(argvars, rettv)
12481 typval_T *argvars;
12482 typval_T *rettv;
12483 {
12484 char_u *p;
12485
12486 rettv->v_type = VAR_STRING;
12487 p = get_tv_string_chk(&argvars[0]);
12488 if (p == NULL)
12489 rettv->vval.v_string = NULL;
12490 else
12491 {
12492 p = vim_strsave(p);
12493 rettv->vval.v_string = p;
12494 if (p != NULL)
12495 shorten_dir(p);
12496 }
12392 } 12497 }
12393 12498
12394 /* 12499 /*
12395 * "prevnonblank()" function 12500 * "prevnonblank()" function
12396 */ 12501 */
16656 len = 6; 16761 len = 6;
16657 else if (eap->force_bin == FORCE_NOBIN) 16762 else if (eap->force_bin == FORCE_NOBIN)
16658 len = 8; 16763 len = 8;
16659 else 16764 else
16660 len = 0; 16765 len = 0;
16766
16767 if (eap->read_edit)
16768 len += 7;
16769
16661 if (eap->force_ff != 0) 16770 if (eap->force_ff != 0)
16662 len += (unsigned)STRLEN(eap->cmd + eap->force_ff) + 6; 16771 len += (unsigned)STRLEN(eap->cmd + eap->force_ff) + 6;
16663 # ifdef FEAT_MBYTE 16772 # ifdef FEAT_MBYTE
16664 if (eap->force_enc != 0) 16773 if (eap->force_enc != 0)
16665 len += (unsigned)STRLEN(eap->cmd + eap->force_enc) + 7; 16774 len += (unsigned)STRLEN(eap->cmd + eap->force_enc) + 7;
16675 sprintf((char *)newval, " ++bin"); 16784 sprintf((char *)newval, " ++bin");
16676 else if (eap->force_bin == FORCE_NOBIN) 16785 else if (eap->force_bin == FORCE_NOBIN)
16677 sprintf((char *)newval, " ++nobin"); 16786 sprintf((char *)newval, " ++nobin");
16678 else 16787 else
16679 *newval = NUL; 16788 *newval = NUL;
16789
16790 if (eap->read_edit)
16791 STRCAT(newval, " ++edit");
16792
16680 if (eap->force_ff != 0) 16793 if (eap->force_ff != 0)
16681 sprintf((char *)newval + STRLEN(newval), " ++ff=%s", 16794 sprintf((char *)newval + STRLEN(newval), " ++ff=%s",
16682 eap->cmd + eap->force_ff); 16795 eap->cmd + eap->force_ff);
16683 # ifdef FEAT_MBYTE 16796 # ifdef FEAT_MBYTE
16684 if (eap->force_enc != 0) 16797 if (eap->force_enc != 0)
17142 case 's': return &SCRIPT_SV(current_SID).sv_var; 17255 case 's': return &SCRIPT_SV(current_SID).sv_var;
17143 case 'g': return &globvars_var; 17256 case 'g': return &globvars_var;
17144 case 'v': return &vimvars_var; 17257 case 'v': return &vimvars_var;
17145 case 'b': return &curbuf->b_bufvar; 17258 case 'b': return &curbuf->b_bufvar;
17146 case 'w': return &curwin->w_winvar; 17259 case 'w': return &curwin->w_winvar;
17260 #ifdef FEAT_WINDOWS
17261 case 't': return &curtab->tp_winvar;
17262 #endif
17147 case 'l': return current_funccal == NULL 17263 case 'l': return current_funccal == NULL
17148 ? NULL : &current_funccal->l_vars_var; 17264 ? NULL : &current_funccal->l_vars_var;
17149 case 'a': return current_funccal == NULL 17265 case 'a': return current_funccal == NULL
17150 ? NULL : &current_funccal->l_avars_var; 17266 ? NULL : &current_funccal->l_avars_var;
17151 } 17267 }
17205 return NULL; 17321 return NULL;
17206 if (*name == 'b') /* buffer variable */ 17322 if (*name == 'b') /* buffer variable */
17207 return &curbuf->b_vars.dv_hashtab; 17323 return &curbuf->b_vars.dv_hashtab;
17208 if (*name == 'w') /* window variable */ 17324 if (*name == 'w') /* window variable */
17209 return &curwin->w_vars.dv_hashtab; 17325 return &curwin->w_vars.dv_hashtab;
17326 #ifdef FEAT_WINDOWS
17327 if (*name == 't') /* tab page variable */
17328 return &curtab->tp_vars.dv_hashtab;
17329 #endif
17210 if (*name == 'v') /* v: variable */ 17330 if (*name == 'v') /* v: variable */
17211 return &vimvarht; 17331 return &vimvarht;
17212 if (*name == 'a' && current_funccal != NULL) /* function argument */ 17332 if (*name == 'a' && current_funccal != NULL) /* function argument */
17213 return &current_funccal->l_avars.dv_hashtab; 17333 return &current_funccal->l_avars.dv_hashtab;
17214 if (*name == 'l' && current_funccal != NULL) /* local function variable */ 17334 if (*name == 'l' && current_funccal != NULL) /* local function variable */
18526 clear_tv(&fudi.fd_di->di_tv); 18646 clear_tv(&fudi.fd_di->di_tv);
18527 fudi.fd_di->di_tv.v_type = VAR_FUNC; 18647 fudi.fd_di->di_tv.v_type = VAR_FUNC;
18528 fudi.fd_di->di_tv.v_lock = 0; 18648 fudi.fd_di->di_tv.v_lock = 0;
18529 fudi.fd_di->di_tv.vval.v_string = vim_strsave(name); 18649 fudi.fd_di->di_tv.vval.v_string = vim_strsave(name);
18530 fp->uf_refcount = 1; 18650 fp->uf_refcount = 1;
18651
18652 /* behave like "dict" was used */
18653 flags |= FC_DICT;
18531 } 18654 }
18532 18655
18533 /* insert the new function in the function list */ 18656 /* insert the new function in the function list */
18534 STRCPY(fp->uf_name, name); 18657 STRCPY(fp->uf_name, name);
18535 hash_add(&func_hashtab, UF2HIKEY(fp)); 18658 hash_add(&func_hashtab, UF2HIKEY(fp));