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(&current_funccal->l_vars.dv_hashtab, 2041 list_hashtable_vars(&current_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.