diff options
author | Bram Moolenaar <Bram@vim.org> | 2005-01-03 21:06:01 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2005-01-03 21:06:01 +0000 |
commit | 49cd957922488b6745ba023fa381af605b068121 (patch) | |
tree | 13b3f9880d65b151971a667cda718e2d72bc140d | |
parent | d7ee7ce2318d5739a325dce2b86eb526d46015f4 (diff) |
updated for version 7.0029v7.0029
-rw-r--r-- | runtime/doc/starting.txt | 4 | ||||
-rw-r--r-- | runtime/doc/tagsrch.txt | 4 | ||||
-rw-r--r-- | runtime/doc/todo.txt | 31 | ||||
-rw-r--r-- | runtime/doc/version7.txt | 7 | ||||
-rw-r--r-- | src/eval.c | 3778 |
5 files changed, 2397 insertions, 1427 deletions
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index cc6abf63ce..61e65a1cdd 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -1,4 +1,4 @@ -*starting.txt* For Vim version 7.0aa. Last change: 2004 Dec 29 +*starting.txt* For Vim version 7.0aa. Last change: 2005 Jan 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1264,7 +1264,7 @@ The viminfo file is used to store: - The command line history. - The search string history. - The input-line history. -- Contents of registers. +- Contents of non-empty registers. - Marks for several files. - File marks, pointing to locations in files. - Last search/substitute pattern (for 'n' and '&'). diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt index e148bff2a6..326ec3edcb 100644 --- a/runtime/doc/tagsrch.txt +++ b/runtime/doc/tagsrch.txt @@ -1,4 +1,4 @@ -*tagsrch.txt* For Vim version 7.0aa. Last change: 2004 Jul 23 +*tagsrch.txt* For Vim version 7.0aa. Last change: 2005 Jan 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -60,7 +60,7 @@ tag, you will get the telnet prompt instead. Most versions of telnet allow changing or disabling the default escape key. See the telnet man page. You can 'telnet -E {Hostname}' to disable the escape character, or 'telnet -e {EscapeCharacter} {Hostname}' to specify another escape character. If -possible, try to use "rsh" instead of "telnet" to avoid this problem. +possible, try to use "ssh" instead of "telnet" to avoid this problem. *tag-priority* When there are multiple matches for a tag, this priority is used: diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 9e1116adf5..6f83a5add5 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2005 Jan 01 +*todo.txt* For Vim version 7.0aa. Last change: 2005 Jan 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -30,10 +30,34 @@ be worked on, but only if you sponsor Vim development. See |sponsor|. *known-bugs* -------------------- Known bugs and current work ----------------------- +List data type: +- ":let list[expr] = expr" +- ":let [a, b] = [1, 2]" +- ":let [a, b; rest] = [1, 2, 3, 4]" +- "for a in list" +- "for [a, b] in [[1, 2], [3, 4]]" +- == (same value) and "is" (same list) +- add many functions: + call(func, list) call function + keys(list) list of all indexes 0 - len(list) + repeat(list, count) return list concatenated count times + concat(list1, list2) return list1 and list2 concatenated + extend(list1, list2) concatenate list2 to list 1 + extend(list1, list2, idx) prepend list2 before idx in list1 + count(list, item) nr of times item appears in list + index(list, item) lowest index of item in list + pop(list[, idx]) removes item at idx (default: last) + pop(list, idx1, idx2) removes items idx1 to idx2, returns them + reverse(list) reverses order + sort(list[, func]) sort; func compares items + getval(list, idx[, default]) get value at idx or default + file2lines() + file2words() + patch for QuickFixCmdPre and QuickFixCmdPost autocommands. (Ciaran McCreesh, 2005 Jan 1) -New toolbar button from Martin Dalecki: +New Motif toolbar button from Martin Dalecki: - add remark in version7.txt - check if it works for pixmap loaded from a file. @@ -60,11 +84,10 @@ PLANNED FOR VERSION 7.0: + can include NUL characters - setline() will have problems with NL vs NUL. Can use list of numbers instead (inefficient though). + Also: for strings up to 3 bytes don't allocate memory, VAR_STRINGX. - new DATA TYPES: - None? (or use empty string?) - - list - dictionary - - function reference Check old patch from Robert Webb for array support. Add type checking? See ~/vim/ideas.txt. - Add SPELLCHECKER, with easy to add support for many languages. diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt index 79a35e1dd4..fd8d33b094 100644 --- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2005 Jan 01 +*version7.txt* For Vim version 7.0aa. Last change: 2005 Jan 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -381,6 +381,8 @@ Included a few improvements for Motif from Martin Dalecki. Draw label contents ourselves to make them handle fonts in a way configurable by Vim and a bit less dependent on the X11 font management. +When a register is empty it is not stored in the viminfo file. + ============================================================================== COMPILE TIME CHANGES *compile-changes-7* @@ -627,6 +629,9 @@ break, resulting in "selected 202 of 201 bytes". Motif: fonts were not used for dialog components. (Martin Dalecki) +Motif: After using a toolbar button the keyboard focus would be on the toolbar +(Lesstif problem). (Martin Dalecki) + When using "y<C-V>`x" where mark x is in the first column, the last line was not included. diff --git a/src/eval.c b/src/eval.c index 8a2c2052e5..82d1c69c52 100644 --- a/src/eval.c +++ b/src/eval.c @@ -37,26 +37,66 @@ typedef int varnumber_T; #endif /* - * Structure to hold an internal variable. + * Structure to hold an internal variable without a name. */ typedef struct { - char_u *var_name; /* name of variable */ - char var_type; /* VAR_NUMBER or VAR_STRING */ + char v_type; /* see below: VAR_NUMBER, VAR_STRING, etc. */ union { - varnumber_T var_number; /* number value */ - char_u *var_string; /* string value (Careful: can be NULL!) */ - } var_val; -} var; + varnumber_T v_number; /* number value */ + char_u *v_string; /* string value (can be NULL!) */ + struct listvar_S *v_list; /* list value (can be NULL!) */ + } vval; +} typeval; +/* Values for "v_type". */ #define VAR_UNKNOWN 0 -#define VAR_NUMBER 1 -#define VAR_STRING 2 +#define VAR_NUMBER 1 /* "v_number" is used */ +#define VAR_STRING 2 /* "v_string" is used */ +#define VAR_FUNC 3 /* "v_string" is function name */ +#define VAR_LIST 4 /* "v_list" is used */ + +/* + * Structure to hold an internal variable with a name. + * The "tv" must come first, so that this can be used as a "typeval" as well. + */ +typedef struct +{ + typeval tv; /* type and value of the variable */ + char_u *v_name; /* name of variable */ +} var; typedef var * VAR; /* + * Structure to hold an item of a list: an internal variable without a name. + */ +struct listitem_S +{ + struct listitem_S *li_next; /* next item in list */ + struct listitem_S *li_prev; /* previous item in list */ + typeval li_tv; /* type and value of the variable */ +}; + +typedef struct listitem_S listitem; + +/* + * Structure to hold the info about a list. + */ +struct listvar_S +{ + int lv_refcount; /* reference count */ + listitem *lv_first; /* first item, NULL if none */ + listitem *lv_last; /* last item, NULL if none */ +}; + +typedef struct listvar_S listvar; + +#define VAR_LIST_MAXNEST 100 /* maximum nesting of lists */ +static char_u *e_listidx = (char_u *)N_("E999: list index out of range: %ld"); + +/* * All user-defined global variables are stored in "variables". */ garray_T variables = {0, 0, sizeof(var), 4, NULL}; @@ -114,12 +154,12 @@ struct funccall int linenr; /* next line to be executed */ int returned; /* ":return" used */ int argcount; /* nr of arguments */ - VAR argvars; /* arguments */ + typeval *argvars; /* arguments */ var a0_var; /* "a:0" variable */ var firstline; /* "a:firstline" variable */ var lastline; /* "a:lastline" variable */ garray_T l_vars; /* local function variables */ - VAR retvar; /* return value variable */ + typeval *retvar; /* return value variable */ linenr_T breakpoint; /* next line with breakpoint or zero */ int dbg_tick; /* debug_tick when breakpoint was set */ int level; /* top nesting level of executed function */ @@ -236,190 +276,214 @@ struct vimvar }; static int eval0 __ARGS((char_u *arg, VAR retvar, char_u **nextcmd, int evaluate)); -static int eval1 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int eval2 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int eval3 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int eval4 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int eval5 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int eval6 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int eval7 __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int get_option_var __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int get_string_var __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int get_lit_string_var __ARGS((char_u **arg, VAR retvar, int evaluate)); -static int get_env_var __ARGS((char_u **arg, VAR retvar, int evaluate)); +static int eval1 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval2 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval3 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval4 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval5 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval6 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval7 __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int eval_index __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int get_option_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int get_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int get_lit_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static int get_list_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); +static listvar *list_alloc __ARGS((void)); +static void list_unref __ARGS((listvar *l)); +static void list_free __ARGS((listvar *l)); +static listitem *listitem_alloc __ARGS((void)); +static void listitem_free __ARGS((listitem *item)); +static long list_len __ARGS((listvar *l)); +static listitem *list_find __ARGS((listvar *l, long n)); +static void list_append __ARGS((listvar *l, listitem *item)); +static int list_append_tv __ARGS((listvar *l, typeval *tv)); +static listvar *list_copy __ARGS((listvar *orig, int deep)); +static listitem *list_getrem __ARGS((listvar *l, long n)); +static char_u *list2string __ARGS((typeval *tv)); +static char_u *tv2string __ARGS((typeval *tv, char_u **tofree)); +static int get_env_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); static int find_internal_func __ARGS((char_u *name)); -static int get_func_var __ARGS((char_u *name, int len, VAR retvar, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate)); -static int call_func __ARGS((char_u *name, int len, VAR retvar, int argcount, VAR argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate)); -static void f_append __ARGS((VAR argvars, VAR retvar)); -static void f_argc __ARGS((VAR argvars, VAR retvar)); -static void f_argidx __ARGS((VAR argvars, VAR retvar)); -static void f_argv __ARGS((VAR argvars, VAR retvar)); -static void f_browse __ARGS((VAR argvars, VAR retvar)); -static void f_browsedir __ARGS((VAR argvars, VAR retvar)); -static buf_T *find_buffer __ARGS((VAR avar)); -static void f_bufexists __ARGS((VAR argvars, VAR retvar)); -static void f_buflisted __ARGS((VAR argvars, VAR retvar)); -static void f_bufloaded __ARGS((VAR argvars, VAR retvar)); -static buf_T *get_buf_var __ARGS((VAR avar)); -static void f_bufname __ARGS((VAR argvars, VAR retvar)); -static void f_bufnr __ARGS((VAR argvars, VAR retvar)); -static void f_bufwinnr __ARGS((VAR argvars, VAR retvar)); -static void f_byte2line __ARGS((VAR argvars, VAR retvar)); -static void f_byteidx __ARGS((VAR argvars, VAR retvar)); -static void f_char2nr __ARGS((VAR argvars, VAR retvar)); -static void f_cindent __ARGS((VAR argvars, VAR retvar)); -static void f_col __ARGS((VAR argvars, VAR retvar)); -static void f_confirm __ARGS((VAR argvars, VAR retvar)); -static void f_cscope_connection __ARGS((VAR argvars, VAR retvar)); -static void f_cursor __ARGS((VAR argsvars, VAR retvar)); -static void f_delete __ARGS((VAR argvars, VAR retvar)); -static void f_did_filetype __ARGS((VAR argvars, VAR retvar)); -static void f_diff_filler __ARGS((VAR argvars, VAR retvar)); -static void f_diff_hlID __ARGS((VAR argvars, VAR retvar)); -static void f_escape __ARGS((VAR argvars, VAR retvar)); -static void f_eventhandler __ARGS((VAR argvars, VAR retvar)); -static void f_executable __ARGS((VAR argvars, VAR retvar)); -static void f_exists __ARGS((VAR argvars, VAR retvar)); -static void f_expand __ARGS((VAR argvars, VAR retvar)); -static void f_filereadable __ARGS((VAR argvars, VAR retvar)); -static void f_filewritable __ARGS((VAR argvars, VAR retvar)); -static void f_finddir __ARGS((VAR argvars, VAR retvar)); -static void f_findfile __ARGS((VAR argvars, VAR retvar)); -static void f_findfilendir __ARGS((VAR argvars, VAR retvar, int dir)); -static void f_fnamemodify __ARGS((VAR argvars, VAR retvar)); -static void f_foldclosed __ARGS((VAR argvars, VAR retvar)); -static void f_foldclosedend __ARGS((VAR argvars, VAR retvar)); -static void foldclosed_both __ARGS((VAR argvars, VAR retvar, int end)); -static void f_foldlevel __ARGS((VAR argvars, VAR retvar)); -static void f_foldtext __ARGS((VAR argvars, VAR retvar)); -static void f_foldtextresult __ARGS((VAR argvars, VAR retvar)); -static void f_foreground __ARGS((VAR argvars, VAR retvar)); -static void f_getbufvar __ARGS((VAR argvars, VAR retvar)); -static void f_getchar __ARGS((VAR argvars, VAR retvar)); -static void f_getcharmod __ARGS((VAR argvars, VAR retvar)); -static void f_getcmdline __ARGS((VAR argvars, VAR retvar)); -static void f_getcmdpos __ARGS((VAR argvars, VAR retvar)); -static void f_getcwd __ARGS((VAR argvars, VAR retvar)); -static void f_getfontname __ARGS((VAR argvars, VAR retvar)); -static void f_getfperm __ARGS((VAR argvars, VAR retvar)); -static void f_getfsize __ARGS((VAR argvars, VAR retvar)); -static void f_getftime __ARGS((VAR argvars, VAR retvar)); -static void f_getftype __ARGS((VAR argvars, VAR retvar)); -static void f_getline __ARGS((VAR argvars, VAR retvar)); -static void f_getreg __ARGS((VAR argvars, VAR retvar)); -static void f_getregtype __ARGS((VAR argvars, VAR retvar)); -static void f_getwinposx __ARGS((VAR argvars, VAR retvar)); -static void f_getwinposy __ARGS((VAR argvars, VAR retvar)); -static void f_getwinvar __ARGS((VAR argvars, VAR retvar)); -static void f_glob __ARGS((VAR argvars, VAR retvar)); -static void f_globpath __ARGS((VAR argvars, VAR retvar)); -static void f_has __ARGS((VAR argvars, VAR retvar)); -static void f_hasmapto __ARGS((VAR argvars, VAR retvar)); -static void f_histadd __ARGS((VAR argvars, VAR retvar)); -static void f_histdel __ARGS((VAR argvars, VAR retvar)); -static void f_histget __ARGS((VAR argvars, VAR retvar)); -static void f_histnr __ARGS((VAR argvars, VAR retvar)); -static void f_hlexists __ARGS((VAR argvars, VAR retvar)); -static void f_hlID __ARGS((VAR argvars, VAR retvar)); -static void f_hostname __ARGS((VAR argvars, VAR retvar)); -static void f_iconv __ARGS((VAR argvars, VAR retvar)); -static void f_indent __ARGS((VAR argvars, VAR retvar)); -static void f_isdirectory __ARGS((VAR argvars, VAR retvar)); -static void f_input __ARGS((VAR argvars, VAR retvar)); -static void f_inputdialog __ARGS((VAR argvars, VAR retvar)); -static void f_inputrestore __ARGS((VAR argvars, VAR retvar)); -static void f_inputsave __ARGS((VAR argvars, VAR retvar)); -static void f_inputsecret __ARGS((VAR argvars, VAR retvar)); -static void f_last_buffer_nr __ARGS((VAR argvars, VAR retvar)); -static void f_libcall __ARGS((VAR argvars, VAR retvar)); -static void f_libcallnr __ARGS((VAR argvars, VAR retvar)); -static void libcall_common __ARGS((VAR argvars, VAR retvar, int type)); -static void f_line __ARGS((VAR argvars, VAR retvar)); -static void f_line2byte __ARGS((VAR argvars, VAR retvar)); -static void f_lispindent __ARGS((VAR argvars, VAR retvar)); -static void f_localtime __ARGS((VAR argvars, VAR retvar)); -static void f_maparg __ARGS((VAR argvars, VAR retvar)); -static void f_mapcheck __ARGS((VAR argvars, VAR retvar)); -static void get_maparg __ARGS((VAR argvars, VAR retvar, int exact)); -static void f_match __ARGS((VAR argvars, VAR retvar)); -static void f_matchend __ARGS((VAR argvars, VAR retvar)); -static void f_matchstr __ARGS((VAR argvars, VAR retvar)); -static void f_mode __ARGS((VAR argvars, VAR retvar)); -static void f_nextnonblank __ARGS((VAR argvars, VAR retvar)); -static void f_nr2char __ARGS((VAR argvars, VAR retvar)); -static void f_prevnonblank __ARGS((VAR argvars, VAR retvar)); -static void f_setbufvar __ARGS((VAR argvars, VAR retvar)); -static void f_setcmdpos __ARGS((VAR argvars, VAR retvar)); -static void f_setwinvar __ARGS((VAR argvars, VAR retvar)); -static void f_rename __ARGS((VAR argvars, VAR retvar)); -static void f_resolve __ARGS((VAR argvars, VAR retvar)); -static void f_search __ARGS((VAR argvars, VAR retvar)); -static void f_searchpair __ARGS((VAR argvars, VAR retvar)); -static int get_search_arg __ARGS((VAR varp, int *flagsp)); -static void f_remote_expr __ARGS((VAR argvars, VAR retvar)); -static void f_remote_foreground __ARGS((VAR argvars, VAR retvar)); -static void f_remote_peek __ARGS((VAR argvars, VAR retvar)); -static void f_remote_read __ARGS((VAR argvars, VAR retvar)); -static void f_remote_send __ARGS((VAR argvars, VAR retvar)); -static void f_repeat __ARGS((VAR argvars, VAR retvar)); -static void f_server2client __ARGS((VAR argvars, VAR retvar)); -static void f_serverlist __ARGS((VAR argvars, VAR retvar)); -static void f_setline __ARGS((VAR argvars, VAR retvar)); -static void f_setreg __ARGS((VAR argvars, VAR retvar)); -static void f_simplify __ARGS((VAR argvars, VAR retvar)); -static void find_some_match __ARGS((VAR argvars, VAR retvar, int start)); -static void f_strftime __ARGS((VAR argvars, VAR retvar)); -static void f_stridx __ARGS((VAR argvars, VAR retvar)); -static void f_strlen __ARGS((VAR argvars, VAR retvar)); -static void f_strpart __ARGS((VAR argvars, VAR retvar)); -static void f_strridx __ARGS((VAR argvars, VAR retvar)); -static void f_strtrans __ARGS((VAR argvars, VAR retvar)); -static void f_synID __ARGS((VAR argvars, VAR retvar)); -static void f_synIDattr __ARGS((VAR argvars, VAR retvar)); -static void f_synIDtrans __ARGS((VAR argvars, VAR retvar)); -static void f_system __ARGS((VAR argvars, VAR retvar)); -static void f_submatch __ARGS((VAR argvars, VAR retvar)); -static void f_substitute __ARGS((VAR argvars, VAR retvar)); -static void f_tempname __ARGS((VAR argvars, VAR retvar)); -static void f_tolower __ARGS((VAR argvars, VAR retvar)); -static void f_toupper __ARGS((VAR argvars, VAR retvar)); -static void f_tr __ARGS((VAR argvars, VAR retvar)); -static void f_type __ARGS((VAR argvars, VAR retvar)); -static void f_virtcol __ARGS((VAR argvars, VAR retvar)); -static void f_visualmode __ARGS((VAR argvars, VAR retvar)); -static void f_winbufnr __ARGS((VAR argvars, VAR retvar)); -static void f_wincol __ARGS((VAR argvars, VAR retvar)); -static void f_winheight __ARGS((VAR argvars, VAR retvar)); -static void f_winline __ARGS((VAR argvars, VAR retvar)); -static void f_winnr __ARGS((VAR argvars, VAR retvar)); -static void f_winrestcmd __ARGS((VAR argvars, VAR retvar)); -static void f_winwidth __ARGS((VAR argvars, VAR retvar)); -static win_T *find_win_by_nr __ARGS((VAR vp)); -static pos_T *var2fpos __ARGS((VAR varp, int lnum)); +static char_u *deref_func_name __ARGS((char_u *name, int *lenp)); +static int get_func_vartv __ARGS((char_u *name, int len, typeval *retvar, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate)); +static int call_func __ARGS((char_u *name, int len, typeval *retvar, int argcount, typeval *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate)); +static void f_append __ARGS((typeval *argvars, typeval *retvar)); +static void f_argc __ARGS((typeval *argvars, typeval *retvar)); +static void f_argidx __ARGS((typeval *argvars, typeval *retvar)); +static void f_argv __ARGS((typeval *argvars, typeval *retvar)); +static void f_browse __ARGS((typeval *argvars, typeval *retvar)); +static void f_browsedir __ARGS((typeval *argvars, typeval *retvar)); +static buf_T *find_buffer __ARGS((typeval *avar)); +static void f_bufexists __ARGS((typeval *argvars, typeval *retvar)); +static void f_buflisted __ARGS((typeval *argvars, typeval *retvar)); +static void f_bufloaded __ARGS((typeval *argvars, typeval *retvar)); +static buf_T *get_buf_vartv __ARGS((typeval *avar)); +static void f_bufname __ARGS((typeval *argvars, typeval *retvar)); +static void f_bufnr __ARGS((typeval *argvars, typeval *retvar)); +static void f_bufwinnr __ARGS((typeval *argvars, typeval *retvar)); +static void f_byte2line __ARGS((typeval *argvars, typeval *retvar)); +static void f_byteidx __ARGS((typeval *argvars, typeval *retvar)); +static void f_char2nr __ARGS((typeval *argvars, typeval *retvar)); +static void f_cindent __ARGS((typeval *argvars, typeval *retvar)); +static void f_col __ARGS((typeval *argvars, typeval *retvar)); +static void f_confirm __ARGS((typeval *argvars, typeval *retvar)); +static void f_copy __ARGS((typeval *argvars, typeval *retvar)); +static void f_cscope_connection __ARGS((typeval *argvars, typeval *retvar)); +static void f_cursor __ARGS((typeval *argsvars, typeval *retvar)); +static void f_deepcopy __ARGS((typeval *argvars, typeval *retvar)); +static void f_delete __ARGS((typeval *argvars, typeval *retvar)); +static void f_did_filetype __ARGS((typeval *argvars, typeval *retvar)); +static void f_diff_filler __ARGS((typeval *argvars, typeval *retvar)); +static void f_diff_hlID __ARGS((typeval *argvars, typeval *retvar)); +static void f_escape __ARGS((typeval *argvars, typeval *retvar)); +static void f_eventhandler __ARGS((typeval *argvars, typeval *retvar)); +static void f_executable __ARGS((typeval *argvars, typeval *retvar)); +static void f_exists __ARGS((typeval *argvars, typeval *retvar)); +static void f_expand __ARGS((typeval *argvars, typeval *retvar)); +static void f_filereadable __ARGS((typeval *argvars, typeval *retvar)); +static void f_filewritable __ARGS((typeval *argvars, typeval *retvar)); +static void f_finddir __ARGS((typeval *argvars, typeval *retvar)); +static void f_findfile __ARGS((typeval *argvars, typeval *retvar)); +static void f_findfilendir __ARGS((typeval *argvars, typeval *retvar, int dir)); +static void f_fnamemodify __ARGS((typeval *argvars, typeval *retvar)); +static void f_foldclosed __ARGS((typeval *argvars, typeval *retvar)); +static void f_foldclosedend __ARGS((typeval *argvars, typeval *retvar)); +static void foldclosed_both __ARGS((typeval *argvars, typeval *retvar, int end)); +static void f_foldlevel __ARGS((typeval *argvars, typeval *retvar)); +static void f_foldtext __ARGS((typeval *argvars, typeval *retvar)); +static void f_foldtextresult __ARGS((typeval *argvars, typeval *retvar)); +static void f_foreground __ARGS((typeval *argvars, typeval *retvar)); +static void f_function __ARGS((typeval *argvars, typeval *retvar)); +static void f_getbufvar __ARGS((typeval *argvars, typeval *retvar)); +static void f_getchar __ARGS((typeval *argvars, typeval *retvar)); +static void f_getcharmod __ARGS((typeval *argvars, typeval *retvar)); +static void f_getcmdline __ARGS((typeval *argvars, typeval *retvar)); +static void f_getcmdpos __ARGS((typeval *argvars, typeval *retvar)); +static void f_getcwd __ARGS((typeval *argvars, typeval *retvar)); +static void f_getfontname __ARGS((typeval *argvars, typeval *retvar)); +static void f_getfperm __ARGS((typeval *argvars, typeval *retvar)); +static void f_getfsize __ARGS((typeval *argvars, typeval *retvar)); +static void f_getftime __ARGS((typeval *argvars, typeval *retvar)); +static void f_getftype __ARGS((typeval *argvars, typeval *retvar)); +static void f_getline __ARGS((typeval *argvars, typeval *retvar)); +static void f_getreg __ARGS((typeval *argvars, typeval *retvar)); +static void f_getregtype __ARGS((typeval *argvars, typeval *retvar)); +static void f_getwinposx __ARGS((typeval *argvars, typeval *retvar)); +static void f_getwinposy __ARGS((typeval *argvars, typeval *retvar)); +static void f_getwinvar __ARGS((typeval *argvars, typeval *retvar)); +static void f_glob __ARGS((typeval *argvars, typeval *retvar)); +static void f_globpath __ARGS((typeval *argvars, typeval *retvar)); +static void f_has __ARGS((typeval *argvars, typeval *retvar)); +static void f_hasmapto __ARGS((typeval *argvars, typeval *retvar)); +static void f_histadd __ARGS((typeval *argvars, typeval *retvar)); +static void f_histdel __ARGS((typeval *argvars, typeval *retvar)); +static void f_histget __ARGS((typeval *argvars, typeval *retvar)); +static void f_histnr __ARGS((typeval *argvars, typeval *retvar)); +static void f_hlexists __ARGS((typeval *argvars, typeval *retvar)); +static void f_hlID __ARGS((typeval *argvars, typeval *retvar)); +static void f_hostname __ARGS((typeval *argvars, typeval *retvar)); +static void f_iconv __ARGS((typeval *argvars, typeval *retvar)); +static void f_indent __ARGS((typeval *argvars, typeval *retvar)); +static void f_insert __ARGS((typeval *argvars, typeval *retvar)); +static void f_isdirectory __ARGS((typeval *argvars, typeval *retvar)); +static void f_input __ARGS((typeval *argvars, typeval *retvar)); +static void f_inputdialog __ARGS((typeval *argvars, typeval *retvar)); +static void f_inputrestore __ARGS((typeval *argvars, typeval *retvar)); +static void f_inputsave __ARGS((typeval *argvars, typeval *retvar)); +static void f_inputsecret __ARGS((typeval *argvars, typeval *retvar)); +static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *retvar)); +static void f_len __ARGS((typeval *argvars, typeval *retvar)); +static void f_libcall __ARGS((typeval *argvars, typeval *retvar)); +static void f_libcallnr __ARGS((typeval *argvars, typeval *retvar)); +static void libcall_common __ARGS((typeval *argvars, typeval *retvar, int type)); +static void f_line __ARGS((typeval *argvars, typeval *retvar)); +static void f_line2byte __ARGS((typeval *argvars, typeval *retvar)); +static void f_lispindent __ARGS((typeval *argvars, typeval *retvar)); +static void f_localtime __ARGS((typeval *argvars, typeval *retvar)); +static void f_maparg __ARGS((typeval *argvars, typeval *retvar)); +static void f_mapcheck __ARGS((typeval *argvars, typeval *retvar)); +static void get_maparg __ARGS((typeval *argvars, typeval *retvar, int exact)); +static void f_match __ARGS((typeval *argvars, typeval *retvar)); +static void f_matchend __ARGS((typeval *argvars, typeval *retvar)); +static void f_matchstr __ARGS((typeval *argvars, typeval *retvar)); +static void f_mode __ARGS((typeval *argvars, typeval *retvar)); +static void f_nextnonblank __ARGS((typeval *argvars, typeval *retvar)); +static void f_nr2char __ARGS((typeval *argvars, typeval *retvar)); +static void f_prevnonblank __ARGS((typeval *argvars, typeval *retvar)); +static void f_setbufvar __ARGS((typeval *argvars, typeval *retvar)); +static void f_setcmdpos __ARGS((typeval *argvars, typeval *retvar)); +static void f_setwinvar __ARGS((typeval *argvars, typeval *retvar)); +static void f_remove __ARGS((typeval *argvars, typeval *retvar)); +static void f_rename __ARGS((typeval *argvars, typeval *retvar)); +static void f_resolve __ARGS((typeval *argvars, typeval *retvar)); +static void f_search __ARGS((typeval *argvars, typeval *retvar)); +static void f_searchpair __ARGS((typeval *argvars, typeval *retvar)); +static int get_search_arg __ARGS((typeval *varp, int *flagsp)); +static void f_remote_expr __ARGS((typeval *argvars, typeval *retvar)); +static void f_remote_foreground __ARGS((typeval *argvars, typeval *retvar)); +static void f_remote_peek __ARGS((typeval *argvars, typeval *retvar)); +static void f_remote_read __ARGS((typeval *argvars, typeval *retvar)); +static void f_remote_send __ARGS((typeval *argvars, typeval *retvar)); +static void f_repeat __ARGS((typeval *argvars, typeval *retvar)); +static void f_server2client __ARGS((typeval *argvars, typeval *retvar)); +static void f_serverlist __ARGS((typeval *argvars, typeval *retvar)); +static void f_setline __ARGS((typeval *argvars, typeval *retvar)); +static void f_setreg __ARGS((typeval *argvars, typeval *retvar)); +static void f_simplify __ARGS((typeval *argvars, typeval *retvar)); +static void find_some_match __ARGS((typeval *argvars, typeval *retvar, int start)); +static void f_strftime __ARGS((typeval *argvars, typeval *retvar)); +static void f_stridx __ARGS((typeval *argvars, typeval *retvar)); +static void f_string __ARGS((typeval *argvars, typeval *retvar)); +static void f_strlen __ARGS((typeval *argvars, typeval *retvar)); +static void f_strpart __ARGS((typeval *argvars, typeval *retvar)); +static void f_strridx __ARGS((typeval *argvars, typeval *retvar)); +static void f_strtrans __ARGS((typeval *argvars, typeval *retvar)); +static void f_synID __ARGS((typeval *argvars, typeval *retvar)); +static void f_synIDattr __ARGS((typeval *argvars, typeval *retvar)); +static void f_synIDtrans __ARGS((typeval *argvars, typeval *retvar)); +static void f_system __ARGS((typeval *argvars, typeval *retvar)); +static void f_submatch __ARGS((typeval *argvars, typeval *retvar)); +static void f_substitute __ARGS((typeval *argvars, typeval *retvar)); +static void f_tempname __ARGS((typeval *argvars, typeval *retvar)); +static void f_tolower __ARGS((typeval *argvars, typeval *retvar)); +static void f_toupper __ARGS((typeval *argvars, typeval *retvar)); +static void f_tr __ARGS((typeval *argvars, typeval *retvar)); +static void f_type __ARGS((typeval *argvars, typeval *retvar)); +static void f_virtcol __ARGS((typeval *argvars, typeval *retvar)); +static void f_visualmode __ARGS((typeval *argvars, typeval *retvar)); +static void f_winbufnr __ARGS((typeval *argvars, typeval *retvar)); +static void f_wincol __ARGS((typeval *argvars, typeval *retvar)); +static void f_winheight __ARGS((typeval *argvars, typeval *retvar)); +static void f_winline __ARGS((typeval *argvars, typeval *retvar)); +static void f_winnr __ARGS((typeval *argvars, typeval *retvar)); +static void f_winrestcmd __ARGS((typeval *argvars, typeval *retvar)); +static void f_winwidth __ARGS((typeval *argvars, typeval *retvar)); +static win_T *find_win_by_nr __ARGS((typeval *vp)); +static pos_T *var2fpos __ARGS((typeval *varp, int lnum)); static int get_env_len __ARGS((char_u **arg)); static int get_id_len __ARGS((char_u **arg)); static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate)); static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end)); static int eval_isnamec __ARGS((int c)); static int find_vim_var __ARGS((char_u *name, int len)); -static int get_var_var __ARGS((char_u *name, int len, VAR retvar)); +static int get_var_vartv __ARGS((char_u *name, int len, typeval *retvar)); static VAR alloc_var __ARGS((void)); -static VAR alloc_string_var __ARGS((char_u *string)); -static void free_var __ARGS((VAR varp)); -static void clear_var __ARGS((VAR varp)); -static long get_var_number __ARGS((VAR varp)); -static linenr_T get_var_lnum __ARGS((VAR argvars)); -static char_u *get_var_string __ARGS((VAR varp)); -static char_u *get_var_string_buf __ARGS((VAR varp, char_u *buf)); +static typeval *alloc_vartv __ARGS((void)); +static typeval *alloc_string_vartv __ARGS((char_u *string)); +static void free_vartv __ARGS((typeval *varp)); +static void clear_vartv __ARGS((typeval *varp)); +static long get_vartv_number __ARGS((typeval *varp)); +static linenr_T get_vartv_lnum __ARGS((typeval *argvars)); +static char_u *get_vartv_string __ARGS((typeval *varp)); +static char_u *get_vartv_string_buf __ARGS((typeval *varp, char_u *buf)); static VAR find_var __ARGS((char_u *name, int writing)); static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname)); static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname)); -static void var_free_one __ARGS((VAR v)); +static void clear_var __ARGS((VAR v)); static void list_one_var __ARGS((VAR v, char_u *prefix)); static void list_vim_var __ARGS((int i)); static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string)); -static void set_var __ARGS((char_u *name, VAR varp, int copy)); -static void copy_var __ARGS((VAR from, VAR to)); +static void set_var __ARGS((char_u *name, typeval *varp, int copy)); +static void copy_vartv __ARGS((typeval *from, typeval *to)); static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags)); static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal)); static int eval_fname_script __ARGS((char_u *p)); @@ -427,7 +491,12 @@ static int eval_fname_sid __ARGS((char_u *p)); static void list_func_head __ARGS((ufunc_T *fp, int indent)); static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); static ufunc_T *find_func __ARGS((char_u *name)); -static void call_user_func __ARGS((ufunc_T *fp, int argcount, VAR argvars, VAR retvar, linenr_T firstline, linenr_T lastline)); +static int function_exists __ARGS((char_u *name)); +static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *retvar, linenr_T firstline, linenr_T lastline)); + +#define get_var_string(p) get_vartv_string(&(p)->tv) +#define get_var_string_buf(p, b) get_vartv_string_buf(&(p)->tv, (b)) +#define get_var_number(p) get_vartv_number(&((p)->tv)) /* Magic braces are always enabled, otherwise Vim scripts would not be * portable. */ @@ -446,17 +515,17 @@ set_internal_string_var(name, value) char_u *name; char_u *value; { - char_u *val; - VAR varp; + char_u *val; + typeval *tvp; val = vim_strsave(value); if (val != NULL) { - varp = alloc_string_var(val); - if (varp != NULL) + tvp = alloc_string_vartv(val); + if (tvp != NULL) { - set_var(name, varp, FALSE); - free_var(varp); + set_var(name, tvp, FALSE); + free_vartv(tvp); } } } @@ -575,7 +644,7 @@ eval_to_bool(arg, error, nextcmd, skip) if (!skip) { retval = (get_var_number(&retvar) != 0); - clear_var(&retvar); + clear_vartv(&retvar.tv); } } if (skip) @@ -605,7 +674,7 @@ eval_to_string_skip(arg, nextcmd, skip) else { retval = vim_strsave(get_var_string(&retvar)); - clear_var(&retvar); + clear_vartv(&retvar.tv); } if (skip) --emsg_skip; @@ -621,7 +690,7 @@ eval_to_string_skip(arg, nextcmd, skip) skip_expr(pp) char_u **pp; { - var retvar; + typeval retvar; *pp = skipwhite(*pp); return eval1(pp, &retvar, FALSE); @@ -644,7 +713,7 @@ eval_to_string(arg, nextcmd) else { retval = vim_strsave(get_var_string(&retvar)); - clear_var(&retvar); + clear_vartv(&retvar.tv); } return retval; @@ -680,7 +749,7 @@ eval_to_string_safe(arg, nextcmd) eval_arg_to_string(arg) char_u **arg; { - var retvar; + typeval retvar; char_u *retval; int ret; @@ -691,8 +760,8 @@ eval_arg_to_string(arg) retval = NULL; else { - retval = vim_strsave(get_var_string(&retvar)); - clear_var(&retvar); + retval = vim_strsave(get_vartv_string(&retvar)); + clear_vartv(&retvar); } --emsg_off; @@ -710,7 +779,7 @@ eval_arg_to_string(arg) eval_to_number(expr) char_u *expr; { - var retvar; + typeval retvar; int retval; char_u *p = expr; @@ -720,8 +789,8 @@ eval_to_number(expr) retval = -1; else { - retval = get_var_number(&retvar); - clear_var(&retvar); + retval = get_vartv_number(&retvar); + clear_vartv(&retvar); } --emsg_off; @@ -742,14 +811,14 @@ call_vim_function(func, argc, argv, safe) { char_u *retval = NULL; var retvar; - VAR argvars; + typeval *argvars; long n; int len; int i; int doesrange; void *save_funccalp = NULL; - argvars = (VAR)alloc((unsigned)(argc * sizeof(var))); + argvars = (typeval *)alloc((unsigned)(argc * sizeof(typeval))); if (argvars == NULL) return NULL; @@ -758,8 +827,8 @@ call_vim_function(func, argc, argv, safe) /* Pass a NULL or empty argument as an empty string */ if (argv[i] == NULL || *argv[i] == NUL) { - argvars[i].var_type = VAR_STRING; - argvars[i].var_val.var_string = (char_u *)""; + argvars[i].v_type = VAR_STRING; + argvars[i].vval.v_string = (char_u *)""; continue; } @@ -767,13 +836,13 @@ call_vim_function(func, argc, argv, safe) vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL); if (len != 0 && len == (int)STRLEN(argv[i])) { - argvars[i].var_type = VAR_NUMBER; - argvars[i].var_val.var_number = n; + argvars[i].v_type = VAR_NUMBER; + argvars[i].vval.v_number = n; } else { - argvars[i].var_type = VAR_STRING; - argvars[i].var_val.var_string = argv[i]; + argvars[i].v_type = VAR_STRING; + argvars[i].vval.v_string = argv[i]; } } @@ -783,13 +852,13 @@ call_vim_function(func, argc, argv, safe) ++sandbox; } - retvar.var_type = VAR_UNKNOWN; /* clear_var() uses this */ - if (call_func(func, (int)STRLEN(func), &retvar, argc, argvars, + retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */ + if (call_func(func, (int)STRLEN(func), &retvar.tv, argc, argvars, curwin->w_cursor.lnum, curwin->w_cursor.lnum, &doesrange, TRUE) == OK) retval = vim_strsave(get_var_string(&retvar)); - clear_var(&retvar); + clear_vartv(&retvar.tv); vim_free(argvars); if (safe) @@ -844,21 +913,21 @@ eval_foldexpr(arg, cp) else { /* If the result is a number, just return the number. */ - if (retvar.var_type == VAR_NUMBER) - retval = retvar.var_val.var_number; - else if (retvar.var_type == VAR_UNKNOWN - || retvar.var_val.var_string == NULL) + if (retvar.tv.v_type == VAR_NUMBER) + retval = retvar.tv.vval.v_number; + else if (retvar.tv.v_type == VAR_UNKNOWN + || retvar.tv.vval.v_string == NULL) retval = 0; else { /* If the result is a string, check if there is a non-digit before * the number. */ - s = retvar.var_val.var_string; + s = retvar.tv.vval.v_string; if (!VIM_ISDIGIT(*s) && *s != '-') *cp = *s++; retval = atol((char *)s); } - clear_var(&retvar); + clear_vartv(&retvar.tv); } --emsg_off; --sandbox; @@ -970,13 +1039,13 @@ ex_let(eap) * List all variables. */ for (i = 0; i < variables.ga_len && !got_int; ++i) - if (VAR_ENTRY(i).var_name != NULL) + if (VAR_ENTRY(i).v_name != NULL) list_one_var(&VAR_ENTRY(i), (char_u *)""); |