Mercurial > vim
comparison src/eval.c @ 1374:e1336150cfcf v7.1.089
updated for version 7.1-089
author | vimboss |
---|---|
date | Thu, 30 Aug 2007 09:12:23 +0000 |
parents | 55e117ed6872 |
children | 99a9e42e5688 |
comparison
equal
deleted
inserted
replaced
1373:88c68e59d39c | 1374:e1336150cfcf |
---|---|
367 static int call_vim_function __ARGS((char_u *func, int argc, char_u **argv, int safe, typval_T *rettv)); | 367 static int call_vim_function __ARGS((char_u *func, int argc, char_u **argv, int safe, typval_T *rettv)); |
368 #endif | 368 #endif |
369 static int ex_let_vars __ARGS((char_u *arg, typval_T *tv, int copy, int semicolon, int var_count, char_u *nextchars)); | 369 static int ex_let_vars __ARGS((char_u *arg, typval_T *tv, int copy, int semicolon, int var_count, char_u *nextchars)); |
370 static char_u *skip_var_list __ARGS((char_u *arg, int *var_count, int *semicolon)); | 370 static char_u *skip_var_list __ARGS((char_u *arg, int *var_count, int *semicolon)); |
371 static char_u *skip_var_one __ARGS((char_u *arg)); | 371 static char_u *skip_var_one __ARGS((char_u *arg)); |
372 static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty)); | 372 static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty, int *first)); |
373 static void list_glob_vars __ARGS((void)); | 373 static void list_glob_vars __ARGS((int *first)); |
374 static void list_buf_vars __ARGS((void)); | 374 static void list_buf_vars __ARGS((int *first)); |
375 static void list_win_vars __ARGS((void)); | 375 static void list_win_vars __ARGS((int *first)); |
376 #ifdef FEAT_WINDOWS | 376 #ifdef FEAT_WINDOWS |
377 static void list_tab_vars __ARGS((void)); | 377 static void list_tab_vars __ARGS((int *first)); |
378 #endif | 378 #endif |
379 static void list_vim_vars __ARGS((void)); | 379 static void list_vim_vars __ARGS((int *first)); |
380 static void list_script_vars __ARGS((void)); | 380 static void list_script_vars __ARGS((int *first)); |
381 static void list_func_vars __ARGS((void)); | 381 static void list_func_vars __ARGS((int *first)); |
382 static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg)); | 382 static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg, int *first)); |
383 static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op)); | 383 static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op)); |
384 static int check_changedtick __ARGS((char_u *arg)); | 384 static int check_changedtick __ARGS((char_u *arg)); |
385 static char_u *get_lval __ARGS((char_u *name, typval_T *rettv, lval_T *lp, int unlet, int skip, int quiet, int fne_flags)); | 385 static char_u *get_lval __ARGS((char_u *name, typval_T *rettv, lval_T *lp, int unlet, int skip, int quiet, int fne_flags)); |
386 static void clear_lval __ARGS((lval_T *lp)); | 386 static void clear_lval __ARGS((lval_T *lp)); |
387 static void set_var_lval __ARGS((lval_T *lp, char_u *endp, typval_T *rettv, int copy, char_u *op)); | 387 static void set_var_lval __ARGS((lval_T *lp, char_u *endp, typval_T *rettv, int copy, char_u *op)); |
702 static dictitem_T *find_var __ARGS((char_u *name, hashtab_T **htp)); | 702 static dictitem_T *find_var __ARGS((char_u *name, hashtab_T **htp)); |
703 static dictitem_T *find_var_in_ht __ARGS((hashtab_T *ht, char_u *varname, int writing)); | 703 static dictitem_T *find_var_in_ht __ARGS((hashtab_T *ht, char_u *varname, int writing)); |
704 static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); | 704 static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); |
705 static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); | 705 static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); |
706 static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); | 706 static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); |
707 static void list_one_var __ARGS((dictitem_T *v, char_u *prefix)); | 707 static void list_one_var __ARGS((dictitem_T *v, char_u *prefix, int *first)); |
708 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string)); | 708 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first)); |
709 static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); | 709 static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); |
710 static int var_check_ro __ARGS((int flags, char_u *name)); | 710 static int var_check_ro __ARGS((int flags, char_u *name)); |
711 static int var_check_fixed __ARGS((int flags, char_u *name)); | 711 static int var_check_fixed __ARGS((int flags, char_u *name)); |
712 static int tv_check_lock __ARGS((int lock, char_u *name)); | 712 static int tv_check_lock __ARGS((int lock, char_u *name)); |
713 static void copy_tv __ARGS((typval_T *from, typval_T *to)); | 713 static void copy_tv __ARGS((typval_T *from, typval_T *to)); |
1697 int i; | 1697 int i; |
1698 int var_count = 0; | 1698 int var_count = 0; |
1699 int semicolon = 0; | 1699 int semicolon = 0; |
1700 char_u op[2]; | 1700 char_u op[2]; |
1701 char_u *argend; | 1701 char_u *argend; |
1702 int first = TRUE; | |
1702 | 1703 |
1703 argend = skip_var_list(arg, &var_count, &semicolon); | 1704 argend = skip_var_list(arg, &var_count, &semicolon); |
1704 if (argend == NULL) | 1705 if (argend == NULL) |
1705 return; | 1706 return; |
1706 if (argend > arg && argend[-1] == '.') /* for var.='str' */ | 1707 if (argend > arg && argend[-1] == '.') /* for var.='str' */ |
1713 */ | 1714 */ |
1714 if (*arg == '[') | 1715 if (*arg == '[') |
1715 EMSG(_(e_invarg)); | 1716 EMSG(_(e_invarg)); |
1716 else if (!ends_excmd(*arg)) | 1717 else if (!ends_excmd(*arg)) |
1717 /* ":let var1 var2" */ | 1718 /* ":let var1 var2" */ |
1718 arg = list_arg_vars(eap, arg); | 1719 arg = list_arg_vars(eap, arg, &first); |
1719 else if (!eap->skip) | 1720 else if (!eap->skip) |
1720 { | 1721 { |
1721 /* ":let" */ | 1722 /* ":let" */ |
1722 list_glob_vars(); | 1723 list_glob_vars(&first); |
1723 list_buf_vars(); | 1724 list_buf_vars(&first); |
1724 list_win_vars(); | 1725 list_win_vars(&first); |
1725 #ifdef FEAT_WINDOWS | 1726 #ifdef FEAT_WINDOWS |
1726 list_tab_vars(); | 1727 list_tab_vars(&first); |
1727 #endif | 1728 #endif |
1728 list_script_vars(); | 1729 list_script_vars(&first); |
1729 list_func_vars(); | 1730 list_func_vars(&first); |
1730 list_vim_vars(); | 1731 list_vim_vars(&first); |
1731 } | 1732 } |
1732 eap->nextcmd = check_nextcmd(arg); | 1733 eap->nextcmd = check_nextcmd(arg); |
1733 } | 1734 } |
1734 else | 1735 else |
1735 { | 1736 { |
1930 /* | 1931 /* |
1931 * List variables for hashtab "ht" with prefix "prefix". | 1932 * List variables for hashtab "ht" with prefix "prefix". |
1932 * If "empty" is TRUE also list NULL strings as empty strings. | 1933 * If "empty" is TRUE also list NULL strings as empty strings. |
1933 */ | 1934 */ |
1934 static void | 1935 static void |
1935 list_hashtable_vars(ht, prefix, empty) | 1936 list_hashtable_vars(ht, prefix, empty, first) |
1936 hashtab_T *ht; | 1937 hashtab_T *ht; |
1937 char_u *prefix; | 1938 char_u *prefix; |
1938 int empty; | 1939 int empty; |
1940 int *first; | |
1939 { | 1941 { |
1940 hashitem_T *hi; | 1942 hashitem_T *hi; |
1941 dictitem_T *di; | 1943 dictitem_T *di; |
1942 int todo; | 1944 int todo; |
1943 | 1945 |
1948 { | 1950 { |
1949 --todo; | 1951 --todo; |
1950 di = HI2DI(hi); | 1952 di = HI2DI(hi); |
1951 if (empty || di->di_tv.v_type != VAR_STRING | 1953 if (empty || di->di_tv.v_type != VAR_STRING |
1952 || di->di_tv.vval.v_string != NULL) | 1954 || di->di_tv.vval.v_string != NULL) |
1953 list_one_var(di, prefix); | 1955 list_one_var(di, prefix, first); |
1954 } | 1956 } |
1955 } | 1957 } |
1956 } | 1958 } |
1957 | 1959 |
1958 /* | 1960 /* |
1959 * List global variables. | 1961 * List global variables. |
1960 */ | 1962 */ |
1961 static void | 1963 static void |
1962 list_glob_vars() | 1964 list_glob_vars(first) |
1963 { | 1965 int *first; |
1964 list_hashtable_vars(&globvarht, (char_u *)"", TRUE); | 1966 { |
1967 list_hashtable_vars(&globvarht, (char_u *)"", TRUE, first); | |
1965 } | 1968 } |
1966 | 1969 |
1967 /* | 1970 /* |
1968 * List buffer variables. | 1971 * List buffer variables. |
1969 */ | 1972 */ |
1970 static void | 1973 static void |
1971 list_buf_vars() | 1974 list_buf_vars(first) |
1975 int *first; | |
1972 { | 1976 { |
1973 char_u numbuf[NUMBUFLEN]; | 1977 char_u numbuf[NUMBUFLEN]; |
1974 | 1978 |
1975 list_hashtable_vars(&curbuf->b_vars.dv_hashtab, (char_u *)"b:", TRUE); | 1979 list_hashtable_vars(&curbuf->b_vars.dv_hashtab, (char_u *)"b:", |
1980 TRUE, first); | |
1976 | 1981 |
1977 sprintf((char *)numbuf, "%ld", (long)curbuf->b_changedtick); | 1982 sprintf((char *)numbuf, "%ld", (long)curbuf->b_changedtick); |
1978 list_one_var_a((char_u *)"b:", (char_u *)"changedtick", VAR_NUMBER, numbuf); | 1983 list_one_var_a((char_u *)"b:", (char_u *)"changedtick", VAR_NUMBER, |
1984 numbuf, first); | |
1979 } | 1985 } |
1980 | 1986 |
1981 /* | 1987 /* |
1982 * List window variables. | 1988 * List window variables. |
1983 */ | 1989 */ |
1984 static void | 1990 static void |
1985 list_win_vars() | 1991 list_win_vars(first) |
1986 { | 1992 int *first; |
1987 list_hashtable_vars(&curwin->w_vars.dv_hashtab, (char_u *)"w:", TRUE); | 1993 { |
1994 list_hashtable_vars(&curwin->w_vars.dv_hashtab, | |
1995 (char_u *)"w:", TRUE, first); | |
1988 } | 1996 } |
1989 | 1997 |
1990 #ifdef FEAT_WINDOWS | 1998 #ifdef FEAT_WINDOWS |
1991 /* | 1999 /* |
1992 * List tab page variables. | 2000 * List tab page variables. |
1993 */ | 2001 */ |
1994 static void | 2002 static void |
1995 list_tab_vars() | 2003 list_tab_vars(first) |
1996 { | 2004 int *first; |
1997 list_hashtable_vars(&curtab->tp_vars.dv_hashtab, (char_u *)"t:", TRUE); | 2005 { |
2006 list_hashtable_vars(&curtab->tp_vars.dv_hashtab, | |
2007 (char_u *)"t:", TRUE, first); | |
1998 } | 2008 } |
1999 #endif | 2009 #endif |
2000 | 2010 |
2001 /* | 2011 /* |
2002 * List Vim variables. | 2012 * List Vim variables. |
2003 */ | 2013 */ |
2004 static void | 2014 static void |
2005 list_vim_vars() | 2015 list_vim_vars(first) |
2006 { | 2016 int *first; |
2007 list_hashtable_vars(&vimvarht, (char_u *)"v:", FALSE); | 2017 { |
2018 list_hashtable_vars(&vimvarht, (char_u *)"v:", FALSE, first); | |
2008 } | 2019 } |
2009 | 2020 |
2010 /* | 2021 /* |
2011 * List script-local variables, if there is a script. | 2022 * List script-local variables, if there is a script. |
2012 */ | 2023 */ |
2013 static void | 2024 static void |
2014 list_script_vars() | 2025 list_script_vars(first) |
2026 int *first; | |
2015 { | 2027 { |
2016 if (current_SID > 0 && current_SID <= ga_scripts.ga_len) | 2028 if (current_SID > 0 && current_SID <= ga_scripts.ga_len) |
2017 list_hashtable_vars(&SCRIPT_VARS(current_SID), (char_u *)"s:", FALSE); | 2029 list_hashtable_vars(&SCRIPT_VARS(current_SID), |
2030 (char_u *)"s:", FALSE, first); | |
2018 } | 2031 } |
2019 | 2032 |
2020 /* | 2033 /* |
2021 * List function variables, if there is a function. | 2034 * List function variables, if there is a function. |
2022 */ | 2035 */ |
2023 static void | 2036 static void |
2024 list_func_vars() | 2037 list_func_vars(first) |
2038 int *first; | |
2025 { | 2039 { |
2026 if (current_funccal != NULL) | 2040 if (current_funccal != NULL) |
2027 list_hashtable_vars(¤t_funccal->l_vars.dv_hashtab, | 2041 list_hashtable_vars(¤t_funccal->l_vars.dv_hashtab, |
2028 (char_u *)"l:", FALSE); | 2042 (char_u *)"l:", FALSE, first); |
2029 } | 2043 } |
2030 | 2044 |
2031 /* | 2045 /* |
2032 * List variables in "arg". | 2046 * List variables in "arg". |
2033 */ | 2047 */ |
2034 static char_u * | 2048 static char_u * |
2035 list_arg_vars(eap, arg) | 2049 list_arg_vars(eap, arg, first) |
2036 exarg_T *eap; | 2050 exarg_T *eap; |
2037 char_u *arg; | 2051 char_u *arg; |
2052 int *first; | |
2038 { | 2053 { |
2039 int error = FALSE; | 2054 int error = FALSE; |
2040 int len; | 2055 int len; |
2041 char_u *name; | 2056 char_u *name; |
2042 char_u *name_start; | 2057 char_u *name_start; |
2089 { | 2104 { |
2090 if (arg == arg_subsc && len == 2 && name[1] == ':') | 2105 if (arg == arg_subsc && len == 2 && name[1] == ':') |
2091 { | 2106 { |
2092 switch (*name) | 2107 switch (*name) |
2093 { | 2108 { |
2094 case 'g': list_glob_vars(); break; | 2109 case 'g': list_glob_vars(first); break; |
2095 case 'b': list_buf_vars(); break; | 2110 case 'b': list_buf_vars(first); break; |
2096 case 'w': list_win_vars(); break; | 2111 case 'w': list_win_vars(first); break; |
2097 #ifdef FEAT_WINDOWS | 2112 #ifdef FEAT_WINDOWS |
2098 case 't': list_tab_vars(); break; | 2113 case 't': list_tab_vars(first); break; |
2099 #endif | 2114 #endif |
2100 case 'v': list_vim_vars(); break; | 2115 case 'v': list_vim_vars(first); break; |
2101 case 's': list_script_vars(); break; | 2116 case 's': list_script_vars(first); break; |
2102 case 'l': list_func_vars(); break; | 2117 case 'l': list_func_vars(first); break; |
2103 default: | 2118 default: |
2104 EMSG2(_("E738: Can't list variables for %s"), name); | 2119 EMSG2(_("E738: Can't list variables for %s"), name); |
2105 } | 2120 } |
2106 } | 2121 } |
2107 else | 2122 else |
2114 s = echo_string(&tv, &tf, numbuf, 0); | 2129 s = echo_string(&tv, &tf, numbuf, 0); |
2115 c = *arg; | 2130 c = *arg; |
2116 *arg = NUL; | 2131 *arg = NUL; |
2117 list_one_var_a((char_u *)"", | 2132 list_one_var_a((char_u *)"", |
2118 arg == arg_subsc ? name : name_start, | 2133 arg == arg_subsc ? name : name_start, |
2119 tv.v_type, s == NULL ? (char_u *)"" : s); | 2134 tv.v_type, |
2135 s == NULL ? (char_u *)"" : s, | |
2136 first); | |
2120 *arg = c; | 2137 *arg = c; |
2121 vim_free(tf); | 2138 vim_free(tf); |
2122 } | 2139 } |
2123 clear_tv(&tv); | 2140 clear_tv(&tv); |
2124 } | 2141 } |
17999 | 18016 |
18000 /* | 18017 /* |
18001 * List the value of one internal variable. | 18018 * List the value of one internal variable. |
18002 */ | 18019 */ |
18003 static void | 18020 static void |
18004 list_one_var(v, prefix) | 18021 list_one_var(v, prefix, first) |
18005 dictitem_T *v; | 18022 dictitem_T *v; |
18006 char_u *prefix; | 18023 char_u *prefix; |
18024 int *first; | |
18007 { | 18025 { |
18008 char_u *tofree; | 18026 char_u *tofree; |
18009 char_u *s; | 18027 char_u *s; |
18010 char_u numbuf[NUMBUFLEN]; | 18028 char_u numbuf[NUMBUFLEN]; |
18011 | 18029 |
18012 s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID); | 18030 s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID); |
18013 list_one_var_a(prefix, v->di_key, v->di_tv.v_type, | 18031 list_one_var_a(prefix, v->di_key, v->di_tv.v_type, |
18014 s == NULL ? (char_u *)"" : s); | 18032 s == NULL ? (char_u *)"" : s, first); |
18015 vim_free(tofree); | 18033 vim_free(tofree); |
18016 } | 18034 } |
18017 | 18035 |
18018 static void | 18036 static void |
18019 list_one_var_a(prefix, name, type, string) | 18037 list_one_var_a(prefix, name, type, string, first) |
18020 char_u *prefix; | 18038 char_u *prefix; |
18021 char_u *name; | 18039 char_u *name; |
18022 int type; | 18040 int type; |
18023 char_u *string; | 18041 char_u *string; |
18042 int *first; /* when TRUE clear rest of screen and set to FALSE */ | |
18024 { | 18043 { |
18025 /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */ | 18044 /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */ |
18026 msg_start(); | 18045 msg_start(); |
18027 msg_puts(prefix); | 18046 msg_puts(prefix); |
18028 if (name != NULL) /* "a:" vars don't have a name stored */ | 18047 if (name != NULL) /* "a:" vars don't have a name stored */ |
18050 | 18069 |
18051 msg_outtrans(string); | 18070 msg_outtrans(string); |
18052 | 18071 |
18053 if (type == VAR_FUNC) | 18072 if (type == VAR_FUNC) |
18054 msg_puts((char_u *)"()"); | 18073 msg_puts((char_u *)"()"); |
18074 if (*first) | |
18075 { | |
18076 msg_clr_eos(); | |
18077 *first = FALSE; | |
18078 } | |
18055 } | 18079 } |
18056 | 18080 |
18057 /* | 18081 /* |
18058 * Set variable "name" to value in "tv". | 18082 * Set variable "name" to value in "tv". |
18059 * If the variable already exists, the value is updated. | 18083 * If the variable already exists, the value is updated. |