comparison src/eval.c @ 56:dbf53ece2e23 v7.0029

updated for version 7.0029
author vimboss
date Mon, 03 Jan 2005 21:06:01 +0000
parents 8c25f10d49e7
children 7557b6ea0fb1
comparison
equal deleted inserted replaced
55:225cc00b2eda 56:dbf53ece2e23
35 #else 35 #else
36 typedef int varnumber_T; 36 typedef int varnumber_T;
37 #endif 37 #endif
38 38
39 /* 39 /*
40 * Structure to hold an internal variable. 40 * Structure to hold an internal variable without a name.
41 */ 41 */
42 typedef struct 42 typedef struct
43 { 43 {
44 char_u *var_name; /* name of variable */ 44 char v_type; /* see below: VAR_NUMBER, VAR_STRING, etc. */
45 char var_type; /* VAR_NUMBER or VAR_STRING */
46 union 45 union
47 { 46 {
48 varnumber_T var_number; /* number value */ 47 varnumber_T v_number; /* number value */
49 char_u *var_string; /* string value (Careful: can be NULL!) */ 48 char_u *v_string; /* string value (can be NULL!) */
50 } var_val; 49 struct listvar_S *v_list; /* list value (can be NULL!) */
50 } vval;
51 } typeval;
52
53 /* Values for "v_type". */
54 #define VAR_UNKNOWN 0
55 #define VAR_NUMBER 1 /* "v_number" is used */
56 #define VAR_STRING 2 /* "v_string" is used */
57 #define VAR_FUNC 3 /* "v_string" is function name */
58 #define VAR_LIST 4 /* "v_list" is used */
59
60 /*
61 * Structure to hold an internal variable with a name.
62 * The "tv" must come first, so that this can be used as a "typeval" as well.
63 */
64 typedef struct
65 {
66 typeval tv; /* type and value of the variable */
67 char_u *v_name; /* name of variable */
51 } var; 68 } var;
52 69
53 #define VAR_UNKNOWN 0
54 #define VAR_NUMBER 1
55 #define VAR_STRING 2
56
57 typedef var * VAR; 70 typedef var * VAR;
71
72 /*
73 * Structure to hold an item of a list: an internal variable without a name.
74 */
75 struct listitem_S
76 {
77 struct listitem_S *li_next; /* next item in list */
78 struct listitem_S *li_prev; /* previous item in list */
79 typeval li_tv; /* type and value of the variable */
80 };
81
82 typedef struct listitem_S listitem;
83
84 /*
85 * Structure to hold the info about a list.
86 */
87 struct listvar_S
88 {
89 int lv_refcount; /* reference count */
90 listitem *lv_first; /* first item, NULL if none */
91 listitem *lv_last; /* last item, NULL if none */
92 };
93
94 typedef struct listvar_S listvar;
95
96 #define VAR_LIST_MAXNEST 100 /* maximum nesting of lists */
97 static char_u *e_listidx = (char_u *)N_("E999: list index out of range: %ld");
58 98
59 /* 99 /*
60 * All user-defined global variables are stored in "variables". 100 * All user-defined global variables are stored in "variables".
61 */ 101 */
62 garray_T variables = {0, 0, sizeof(var), 4, NULL}; 102 garray_T variables = {0, 0, sizeof(var), 4, NULL};
112 { 152 {
113 ufunc_T *func; /* function being called */ 153 ufunc_T *func; /* function being called */
114 int linenr; /* next line to be executed */ 154 int linenr; /* next line to be executed */
115 int returned; /* ":return" used */ 155 int returned; /* ":return" used */
116 int argcount; /* nr of arguments */ 156 int argcount; /* nr of arguments */
117 VAR argvars; /* arguments */ 157 typeval *argvars; /* arguments */
118 var a0_var; /* "a:0" variable */ 158 var a0_var; /* "a:0" variable */
119 var firstline; /* "a:firstline" variable */ 159 var firstline; /* "a:firstline" variable */
120 var lastline; /* "a:lastline" variable */ 160 var lastline; /* "a:lastline" variable */
121 garray_T l_vars; /* local function variables */ 161 garray_T l_vars; /* local function variables */
122 VAR retvar; /* return value variable */ 162 typeval *retvar; /* return value variable */
123 linenr_T breakpoint; /* next line with breakpoint or zero */ 163 linenr_T breakpoint; /* next line with breakpoint or zero */
124 int dbg_tick; /* debug_tick when breakpoint was set */ 164 int dbg_tick; /* debug_tick when breakpoint was set */
125 int level; /* top nesting level of executed function */ 165 int level; /* top nesting level of executed function */
126 }; 166 };
127 167
234 {"cmdbang", sizeof("cmdbang") - 1, NULL, VAR_NUMBER, VV_RO}, 274 {"cmdbang", sizeof("cmdbang") - 1, NULL, VAR_NUMBER, VV_RO},
235 {"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO}, 275 {"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO},
236 }; 276 };
237 277
238 static int eval0 __ARGS((char_u *arg, VAR retvar, char_u **nextcmd, int evaluate)); 278 static int eval0 __ARGS((char_u *arg, VAR retvar, char_u **nextcmd, int evaluate));
239 static int eval1 __ARGS((char_u **arg, VAR retvar, int evaluate)); 279 static int eval1 __ARGS((char_u **arg, typeval *retvar, int evaluate));
240 static int eval2 __ARGS((char_u **arg, VAR retvar, int evaluate)); 280 static int eval2 __ARGS((char_u **arg, typeval *retvar, int evaluate));
241 static int eval3 __ARGS((char_u **arg, VAR retvar, int evaluate)); 281 static int eval3 __ARGS((char_u **arg, typeval *retvar, int evaluate));
242 static int eval4 __ARGS((char_u **arg, VAR retvar, int evaluate)); 282 static int eval4 __ARGS((char_u **arg, typeval *retvar, int evaluate));
243 static int eval5 __ARGS((char_u **arg, VAR retvar, int evaluate)); 283 static int eval5 __ARGS((char_u **arg, typeval *retvar, int evaluate));
244 static int eval6 __ARGS((char_u **arg, VAR retvar, int evaluate)); 284 static int eval6 __ARGS((char_u **arg, typeval *retvar, int evaluate));
245 static int eval7 __ARGS((char_u **arg, VAR retvar, int evaluate)); 285 static int eval7 __ARGS((char_u **arg, typeval *retvar, int evaluate));
246 static int get_option_var __ARGS((char_u **arg, VAR retvar, int evaluate)); 286 static int eval_index __ARGS((char_u **arg, typeval *retvar, int evaluate));
247 static int get_string_var __ARGS((char_u **arg, VAR retvar, int evaluate)); 287 static int get_option_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
248 static int get_lit_string_var __ARGS((char_u **arg, VAR retvar, int evaluate)); 288 static int get_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
249 static int get_env_var __ARGS((char_u **arg, VAR retvar, int evaluate)); 289 static int get_lit_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
290 static int get_list_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
291 static listvar *list_alloc __ARGS((void));
292 static void list_unref __ARGS((listvar *l));
293 static void list_free __ARGS((listvar *l));
294 static listitem *listitem_alloc __ARGS((void));
295 static void listitem_free __ARGS((listitem *item));
296 static long list_len __ARGS((listvar *l));
297 static listitem *list_find __ARGS((listvar *l, long n));
298 static void list_append __ARGS((listvar *l, listitem *item));
299 static int list_append_tv __ARGS((listvar *l, typeval *tv));
300 static listvar *list_copy __ARGS((listvar *orig, int deep));
301 static listitem *list_getrem __ARGS((listvar *l, long n));
302 static char_u *list2string __ARGS((typeval *tv));
303 static char_u *tv2string __ARGS((typeval *tv, char_u **tofree));
304 static int get_env_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
250 static int find_internal_func __ARGS((char_u *name)); 305 static int find_internal_func __ARGS((char_u *name));
251 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)); 306 static char_u *deref_func_name __ARGS((char_u *name, int *lenp));
252 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)); 307 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));
253 static void f_append __ARGS((VAR argvars, VAR retvar)); 308 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));
254 static void f_argc __ARGS((VAR argvars, VAR retvar)); 309 static void f_append __ARGS((typeval *argvars, typeval *retvar));
255 static void f_argidx __ARGS((VAR argvars, VAR retvar)); 310 static void f_argc __ARGS((typeval *argvars, typeval *retvar));
256 static void f_argv __ARGS((VAR argvars, VAR retvar)); 311 static void f_argidx __ARGS((typeval *argvars, typeval *retvar));
257 static void f_browse __ARGS((VAR argvars, VAR retvar)); 312 static void f_argv __ARGS((typeval *argvars, typeval *retvar));
258 static void f_browsedir __ARGS((VAR argvars, VAR retvar)); 313 static void f_browse __ARGS((typeval *argvars, typeval *retvar));
259 static buf_T *find_buffer __ARGS((VAR avar)); 314 static void f_browsedir __ARGS((typeval *argvars, typeval *retvar));
260 static void f_bufexists __ARGS((VAR argvars, VAR retvar)); 315 static buf_T *find_buffer __ARGS((typeval *avar));
261 static void f_buflisted __ARGS((VAR argvars, VAR retvar)); 316 static void f_bufexists __ARGS((typeval *argvars, typeval *retvar));
262 static void f_bufloaded __ARGS((VAR argvars, VAR retvar)); 317 static void f_buflisted __ARGS((typeval *argvars, typeval *retvar));
263 static buf_T *get_buf_var __ARGS((VAR avar)); 318 static void f_bufloaded __ARGS((typeval *argvars, typeval *retvar));
264 static void f_bufname __ARGS((VAR argvars, VAR retvar)); 319 static buf_T *get_buf_vartv __ARGS((typeval *avar));
265 static void f_bufnr __ARGS((VAR argvars, VAR retvar)); 320 static void f_bufname __ARGS((typeval *argvars, typeval *retvar));
266 static void f_bufwinnr __ARGS((VAR argvars, VAR retvar)); 321 static void f_bufnr __ARGS((typeval *argvars, typeval *retvar));
267 static void f_byte2line __ARGS((VAR argvars, VAR retvar)); 322 static void f_bufwinnr __ARGS((typeval *argvars, typeval *retvar));
268 static void f_byteidx __ARGS((VAR argvars, VAR retvar)); 323 static void f_byte2line __ARGS((typeval *argvars, typeval *retvar));
269 static void f_char2nr __ARGS((VAR argvars, VAR retvar)); 324 static void f_byteidx __ARGS((typeval *argvars, typeval *retvar));
270 static void f_cindent __ARGS((VAR argvars, VAR retvar)); 325 static void f_char2nr __ARGS((typeval *argvars, typeval *retvar));
271 static void f_col __ARGS((VAR argvars, VAR retvar)); 326 static void f_cindent __ARGS((typeval *argvars, typeval *retvar));
272 static void f_confirm __ARGS((VAR argvars, VAR retvar)); 327 static void f_col __ARGS((typeval *argvars, typeval *retvar));
273 static void f_cscope_connection __ARGS((VAR argvars, VAR retvar)); 328 static void f_confirm __ARGS((typeval *argvars, typeval *retvar));
274 static void f_cursor __ARGS((VAR argsvars, VAR retvar)); 329 static void f_copy __ARGS((typeval *argvars, typeval *retvar));
275 static void f_delete __ARGS((VAR argvars, VAR retvar)); 330 static void f_cscope_connection __ARGS((typeval *argvars, typeval *retvar));
276 static void f_did_filetype __ARGS((VAR argvars, VAR retvar)); 331 static void f_cursor __ARGS((typeval *argsvars, typeval *retvar));
277 static void f_diff_filler __ARGS((VAR argvars, VAR retvar)); 332 static void f_deepcopy __ARGS((typeval *argvars, typeval *retvar));
278 static void f_diff_hlID __ARGS((VAR argvars, VAR retvar)); 333 static void f_delete __ARGS((typeval *argvars, typeval *retvar));
279 static void f_escape __ARGS((VAR argvars, VAR retvar)); 334 static void f_did_filetype __ARGS((typeval *argvars, typeval *retvar));
280 static void f_eventhandler __ARGS((VAR argvars, VAR retvar)); 335 static void f_diff_filler __ARGS((typeval *argvars, typeval *retvar));
281 static void f_executable __ARGS((VAR argvars, VAR retvar)); 336 static void f_diff_hlID __ARGS((typeval *argvars, typeval *retvar));
282 static void f_exists __ARGS((VAR argvars, VAR retvar)); 337 static void f_escape __ARGS((typeval *argvars, typeval *retvar));
283 static void f_expand __ARGS((VAR argvars, VAR retvar)); 338 static void f_eventhandler __ARGS((typeval *argvars, typeval *retvar));
284 static void f_filereadable __ARGS((VAR argvars, VAR retvar)); 339 static void f_executable __ARGS((typeval *argvars, typeval *retvar));
285 static void f_filewritable __ARGS((VAR argvars, VAR retvar)); 340 static void f_exists __ARGS((typeval *argvars, typeval *retvar));
286 static void f_finddir __ARGS((VAR argvars, VAR retvar)); 341 static void f_expand __ARGS((typeval *argvars, typeval *retvar));
287 static void f_findfile __ARGS((VAR argvars, VAR retvar)); 342 static void f_filereadable __ARGS((typeval *argvars, typeval *retvar));
288 static void f_findfilendir __ARGS((VAR argvars, VAR retvar, int dir)); 343 static void f_filewritable __ARGS((typeval *argvars, typeval *retvar));
289 static void f_fnamemodify __ARGS((VAR argvars, VAR retvar)); 344 static void f_finddir __ARGS((typeval *argvars, typeval *retvar));
290 static void f_foldclosed __ARGS((VAR argvars, VAR retvar)); 345 static void f_findfile __ARGS((typeval *argvars, typeval *retvar));
291 static void f_foldclosedend __ARGS((VAR argvars, VAR retvar)); 346 static void f_findfilendir __ARGS((typeval *argvars, typeval *retvar, int dir));
292 static void foldclosed_both __ARGS((VAR argvars, VAR retvar, int end)); 347 static void f_fnamemodify __ARGS((typeval *argvars, typeval *retvar));
293 static void f_foldlevel __ARGS((VAR argvars, VAR retvar)); 348 static void f_foldclosed __ARGS((typeval *argvars, typeval *retvar));
294 static void f_foldtext __ARGS((VAR argvars, VAR retvar)); 349 static void f_foldclosedend __ARGS((typeval *argvars, typeval *retvar));
295 static void f_foldtextresult __ARGS((VAR argvars, VAR retvar)); 350 static void foldclosed_both __ARGS((typeval *argvars, typeval *retvar, int end));
296 static void f_foreground __ARGS((VAR argvars, VAR retvar)); 351 static void f_foldlevel __ARGS((typeval *argvars, typeval *retvar));
297 static void f_getbufvar __ARGS((VAR argvars, VAR retvar)); 352 static void f_foldtext __ARGS((typeval *argvars, typeval *retvar));
298 static void f_getchar __ARGS((VAR argvars, VAR retvar)); 353 static void f_foldtextresult __ARGS((typeval *argvars, typeval *retvar));
299 static void f_getcharmod __ARGS((VAR argvars, VAR retvar)); 354 static void f_foreground __ARGS((typeval *argvars, typeval *retvar));
300 static void f_getcmdline __ARGS((VAR argvars, VAR retvar)); 355 static void f_function __ARGS((typeval *argvars, typeval *retvar));
301 static void f_getcmdpos __ARGS((VAR argvars, VAR retvar)); 356 static void f_getbufvar __ARGS((typeval *argvars, typeval *retvar));
302 static void f_getcwd __ARGS((VAR argvars, VAR retvar)); 357 static void f_getchar __ARGS((typeval *argvars, typeval *retvar));
303 static void f_getfontname __ARGS((VAR argvars, VAR retvar)); 358 static void f_getcharmod __ARGS((typeval *argvars, typeval *retvar));
304 static void f_getfperm __ARGS((VAR argvars, VAR retvar)); 359 static void f_getcmdline __ARGS((typeval *argvars, typeval *retvar));
305 static void f_getfsize __ARGS((VAR argvars, VAR retvar)); 360 static void f_getcmdpos __ARGS((typeval *argvars, typeval *retvar));
306 static void f_getftime __ARGS((VAR argvars, VAR retvar)); 361 static void f_getcwd __ARGS((typeval *argvars, typeval *retvar));
307 static void f_getftype __ARGS((VAR argvars, VAR retvar)); 362 static void f_getfontname __ARGS((typeval *argvars, typeval *retvar));
308 static void f_getline __ARGS((VAR argvars, VAR retvar)); 363 static void f_getfperm __ARGS((typeval *argvars, typeval *retvar));
309 static void f_getreg __ARGS((VAR argvars, VAR retvar)); 364 static void f_getfsize __ARGS((typeval *argvars, typeval *retvar));
310 static void f_getregtype __ARGS((VAR argvars, VAR retvar)); 365 static void f_getftime __ARGS((typeval *argvars, typeval *retvar));
311 static void f_getwinposx __ARGS((VAR argvars, VAR retvar)); 366 static void f_getftype __ARGS((typeval *argvars, typeval *retvar));
312 static void f_getwinposy __ARGS((VAR argvars, VAR retvar)); 367 static void f_getline __ARGS((typeval *argvars, typeval *retvar));
313 static void f_getwinvar __ARGS((VAR argvars, VAR retvar)); 368 static void f_getreg __ARGS((typeval *argvars, typeval *retvar));
314 static void f_glob __ARGS((VAR argvars, VAR retvar)); 369 static void f_getregtype __ARGS((typeval *argvars, typeval *retvar));
315 static void f_globpath __ARGS((VAR argvars, VAR retvar)); 370 static void f_getwinposx __ARGS((typeval *argvars, typeval *retvar));
316 static void f_has __ARGS((VAR argvars, VAR retvar)); 371 static void f_getwinposy __ARGS((typeval *argvars, typeval *retvar));
317 static void f_hasmapto __ARGS((VAR argvars, VAR retvar)); 372 static void f_getwinvar __ARGS((typeval *argvars, typeval *retvar));
318 static void f_histadd __ARGS((VAR argvars, VAR retvar)); 373 static void f_glob __ARGS((typeval *argvars, typeval *retvar));
319 static void f_histdel __ARGS((VAR argvars, VAR retvar)); 374 static void f_globpath __ARGS((typeval *argvars, typeval *retvar));
320 static void f_histget __ARGS((VAR argvars, VAR retvar)); 375 static void f_has __ARGS((typeval *argvars, typeval *retvar));
321 static void f_histnr __ARGS((VAR argvars, VAR retvar)); 376 static void f_hasmapto __ARGS((typeval *argvars, typeval *retvar));
322 static void f_hlexists __ARGS((VAR argvars, VAR retvar)); 377 static void f_histadd __ARGS((typeval *argvars, typeval *retvar));
323 static void f_hlID __ARGS((VAR argvars, VAR retvar)); 378 static void f_histdel __ARGS((typeval *argvars, typeval *retvar));
324 static void f_hostname __ARGS((VAR argvars, VAR retvar)); 379 static void f_histget __ARGS((typeval *argvars, typeval *retvar));
325 static void f_iconv __ARGS((VAR argvars, VAR retvar)); 380 static void f_histnr __ARGS((typeval *argvars, typeval *retvar));
326 static void f_indent __ARGS((VAR argvars, VAR retvar)); 381 static void f_hlexists __ARGS((typeval *argvars, typeval *retvar));
327 static void f_isdirectory __ARGS((VAR argvars, VAR retvar)); 382 static void f_hlID __ARGS((typeval *argvars, typeval *retvar));
328 static void f_input __ARGS((VAR argvars, VAR retvar)); 383 static void f_hostname __ARGS((typeval *argvars, typeval *retvar));
329 static void f_inputdialog __ARGS((VAR argvars, VAR retvar)); 384 static void f_iconv __ARGS((typeval *argvars, typeval *retvar));
330 static void f_inputrestore __ARGS((VAR argvars, VAR retvar)); 385 static void f_indent __ARGS((typeval *argvars, typeval *retvar));
331 static void f_inputsave __ARGS((VAR argvars, VAR retvar)); 386 static void f_insert __ARGS((typeval *argvars, typeval *retvar));
332 static void f_inputsecret __ARGS((VAR argvars, VAR retvar)); 387 static void f_isdirectory __ARGS((typeval *argvars, typeval *retvar));
333 static void f_last_buffer_nr __ARGS((VAR argvars, VAR retvar)); 388 static void f_input __ARGS((typeval *argvars, typeval *retvar));
334 static void f_libcall __ARGS((VAR argvars, VAR retvar)); 389 static void f_inputdialog __ARGS((typeval *argvars, typeval *retvar));
335 static void f_libcallnr __ARGS((VAR argvars, VAR retvar)); 390 static void f_inputrestore __ARGS((typeval *argvars, typeval *retvar));
336 static void libcall_common __ARGS((VAR argvars, VAR retvar, int type)); 391 static void f_inputsave __ARGS((typeval *argvars, typeval *retvar));
337 static void f_line __ARGS((VAR argvars, VAR retvar)); 392 static void f_inputsecret __ARGS((typeval *argvars, typeval *retvar));
338 static void f_line2byte __ARGS((VAR argvars, VAR retvar)); 393 static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *retvar));
339 static void f_lispindent __ARGS((VAR argvars, VAR retvar)); 394 static void f_len __ARGS((typeval *argvars, typeval *retvar));
340 static void f_localtime __ARGS((VAR argvars, VAR retvar)); 395 static void f_libcall __ARGS((typeval *argvars, typeval *retvar));
341 static void f_maparg __ARGS((VAR argvars, VAR retvar)); 396 static void f_libcallnr __ARGS((typeval *argvars, typeval *retvar));
342 static void f_mapcheck __ARGS((VAR argvars, VAR retvar)); 397 static void libcall_common __ARGS((typeval *argvars, typeval *retvar, int type));
343 static void get_maparg __ARGS((VAR argvars, VAR retvar, int exact)); 398 static void f_line __ARGS((typeval *argvars, typeval *retvar));
344 static void f_match __ARGS((VAR argvars, VAR retvar)); 399 static void f_line2byte __ARGS((typeval *argvars, typeval *retvar));
345 static void f_matchend __ARGS((VAR argvars, VAR retvar)); 400 static void f_lispindent __ARGS((typeval *argvars, typeval *retvar));
346 static void f_matchstr __ARGS((VAR argvars, VAR retvar)); 401 static void f_localtime __ARGS((typeval *argvars, typeval *retvar));
347 static void f_mode __ARGS((VAR argvars, VAR retvar)); 402 static void f_maparg __ARGS((typeval *argvars, typeval *retvar));
348 static void f_nextnonblank __ARGS((VAR argvars, VAR retvar)); 403 static void f_mapcheck __ARGS((typeval *argvars, typeval *retvar));
349 static void f_nr2char __ARGS((VAR argvars, VAR retvar)); 404 static void get_maparg __ARGS((typeval *argvars, typeval *retvar, int exact));
350 static void f_prevnonblank __ARGS((VAR argvars, VAR retvar)); 405 static void f_match __ARGS((typeval *argvars, typeval *retvar));
351 static void f_setbufvar __ARGS((VAR argvars, VAR retvar)); 406 static void f_matchend __ARGS((typeval *argvars, typeval *retvar));
352 static void f_setcmdpos __ARGS((VAR argvars, VAR retvar)); 407 static void f_matchstr __ARGS((typeval *argvars, typeval *retvar));
353 static void f_setwinvar __ARGS((VAR argvars, VAR retvar)); 408 static void f_mode __ARGS((typeval *argvars, typeval *retvar));
354 static void f_rename __ARGS((VAR argvars, VAR retvar)); 409 static void f_nextnonblank __ARGS((typeval *argvars, typeval *retvar));
355 static void f_resolve __ARGS((VAR argvars, VAR retvar)); 410 static void f_nr2char __ARGS((typeval *argvars, typeval *retvar));
356 static void f_search __ARGS((VAR argvars, VAR retvar)); 411 static void f_prevnonblank __ARGS((typeval *argvars, typeval *retvar));
357 static void f_searchpair __ARGS((VAR argvars, VAR retvar)); 412 static void f_setbufvar __ARGS((typeval *argvars, typeval *retvar));
358 static int get_search_arg __ARGS((VAR varp, int *flagsp)); 413 static void f_setcmdpos __ARGS((typeval *argvars, typeval *retvar));
359 static void f_remote_expr __ARGS((VAR argvars, VAR retvar)); 414 static void f_setwinvar __ARGS((typeval *argvars, typeval *retvar));
360 static void f_remote_foreground __ARGS((VAR argvars, VAR retvar)); 415 static void f_remove __ARGS((typeval *argvars, typeval *retvar));
361 static void f_remote_peek __ARGS((VAR argvars, VAR retvar)); 416 static void f_rename __ARGS((typeval *argvars, typeval *retvar));
362 static void f_remote_read __ARGS((VAR argvars, VAR retvar)); 417 static void f_resolve __ARGS((typeval *argvars, typeval *retvar));
363 static void f_remote_send __ARGS((VAR argvars, VAR retvar)); 418 static void f_search __ARGS((typeval *argvars, typeval *retvar));
364 static void f_repeat __ARGS((VAR argvars, VAR retvar)); 419 static void f_searchpair __ARGS((typeval *argvars, typeval *retvar));
365 static void f_server2client __ARGS((VAR argvars, VAR retvar)); 420 static int get_search_arg __ARGS((typeval *varp, int *flagsp));
366 static void f_serverlist __ARGS((VAR argvars, VAR retvar)); 421 static void f_remote_expr __ARGS((typeval *argvars, typeval *retvar));
367 static void f_setline __ARGS((VAR argvars, VAR retvar)); 422 static void f_remote_foreground __ARGS((typeval *argvars, typeval *retvar));
368 static void f_setreg __ARGS((VAR argvars, VAR retvar)); 423 static void f_remote_peek __ARGS((typeval *argvars, typeval *retvar));
369 static void f_simplify __ARGS((VAR argvars, VAR retvar)); 424 static void f_remote_read __ARGS((typeval *argvars, typeval *retvar));
370 static void find_some_match __ARGS((VAR argvars, VAR retvar, int start)); 425 static void f_remote_send __ARGS((typeval *argvars, typeval *retvar));
371 static void f_strftime __ARGS((VAR argvars, VAR retvar)); 426 static void f_repeat __ARGS((typeval *argvars, typeval *retvar));
372 static void f_stridx __ARGS((VAR argvars, VAR retvar)); 427 static void f_server2client __ARGS((typeval *argvars, typeval *retvar));
373 static void f_strlen __ARGS((VAR argvars, VAR retvar)); 428 static void f_serverlist __ARGS((typeval *argvars, typeval *retvar));
374 static void f_strpart __ARGS((VAR argvars, VAR retvar)); 429 static void f_setline __ARGS((typeval *argvars, typeval *retvar));
375 static void f_strridx __ARGS((VAR argvars, VAR retvar)); 430 static void f_setreg __ARGS((typeval *argvars, typeval *retvar));
376 static void f_strtrans __ARGS((VAR argvars, VAR retvar)); 431 static void f_simplify __ARGS((typeval *argvars, typeval *retvar));
377 static void f_synID __ARGS((VAR argvars, VAR retvar)); 432 static void find_some_match __ARGS((typeval *argvars, typeval *retvar, int start));
378 static void f_synIDattr __ARGS((VAR argvars, VAR retvar)); 433 static void f_strftime __ARGS((typeval *argvars, typeval *retvar));
379 static void f_synIDtrans __ARGS((VAR argvars, VAR retvar)); 434 static void f_stridx __ARGS((typeval *argvars, typeval *retvar));
380 static void f_system __ARGS((VAR argvars, VAR retvar)); 435 static void f_string __ARGS((typeval *argvars, typeval *retvar));
381 static void f_submatch __ARGS((VAR argvars, VAR retvar)); 436 static void f_strlen __ARGS((typeval *argvars, typeval *retvar));
382 static void f_substitute __ARGS((VAR argvars, VAR retvar)); 437 static void f_strpart __ARGS((typeval *argvars, typeval *retvar));
383 static void f_tempname __ARGS((VAR argvars, VAR retvar)); 438 static void f_strridx __ARGS((typeval *argvars, typeval *retvar));
384 static void f_tolower __ARGS((VAR argvars, VAR retvar)); 439 static void f_strtrans __ARGS((typeval *argvars, typeval *retvar));
385 static void f_toupper __ARGS((VAR argvars, VAR retvar)); 440 static void f_synID __ARGS((typeval *argvars, typeval *retvar));
386 static void f_tr __ARGS((VAR argvars, VAR retvar)); 441 static void f_synIDattr __ARGS((typeval *argvars, typeval *retvar));
387 static void f_type __ARGS((VAR argvars, VAR retvar)); 442 static void f_synIDtrans __ARGS((typeval *argvars, typeval *retvar));
388 static void f_virtcol __ARGS((VAR argvars, VAR retvar)); 443 static void f_system __ARGS((typeval *argvars, typeval *retvar));
389 static void f_visualmode __ARGS((VAR argvars, VAR retvar)); 444 static void f_submatch __ARGS((typeval *argvars, typeval *retvar));
390 static void f_winbufnr __ARGS((VAR argvars, VAR retvar)); 445 static void f_substitute __ARGS((typeval *argvars, typeval *retvar));
391 static void f_wincol __ARGS((VAR argvars, VAR retvar)); 446 static void f_tempname __ARGS((typeval *argvars, typeval *retvar));
392 static void f_winheight __ARGS((VAR argvars, VAR retvar)); 447 static void f_tolower __ARGS((typeval *argvars, typeval *retvar));
393 static void f_winline __ARGS((VAR argvars, VAR retvar)); 448 static void f_toupper __ARGS((typeval *argvars, typeval *retvar));
394 static void f_winnr __ARGS((VAR argvars, VAR retvar)); 449 static void f_tr __ARGS((typeval *argvars, typeval *retvar));
395 static void f_winrestcmd __ARGS((VAR argvars, VAR retvar)); 450 static void f_type __ARGS((typeval *argvars, typeval *retvar));
396 static void f_winwidth __ARGS((VAR argvars, VAR retvar)); 451 static void f_virtcol __ARGS((typeval *argvars, typeval *retvar));
397 static win_T *find_win_by_nr __ARGS((VAR vp)); 452 static void f_visualmode __ARGS((typeval *argvars, typeval *retvar));
398 static pos_T *var2fpos __ARGS((VAR varp, int lnum)); 453 static void f_winbufnr __ARGS((typeval *argvars, typeval *retvar));
454 static void f_wincol __ARGS((typeval *argvars, typeval *retvar));
455 static void f_winheight __ARGS((typeval *argvars, typeval *retvar));
456 static void f_winline __ARGS((typeval *argvars, typeval *retvar));
457 static void f_winnr __ARGS((typeval *argvars, typeval *retvar));
458 static void f_winrestcmd __ARGS((typeval *argvars, typeval *retvar));
459 static void f_winwidth __ARGS((typeval *argvars, typeval *retvar));
460 static win_T *find_win_by_nr __ARGS((typeval *vp));
461 static pos_T *var2fpos __ARGS((typeval *varp, int lnum));
399 static int get_env_len __ARGS((char_u **arg)); 462 static int get_env_len __ARGS((char_u **arg));
400 static int get_id_len __ARGS((char_u **arg)); 463 static int get_id_len __ARGS((char_u **arg));
401 static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate)); 464 static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate));
402 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end)); 465 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end));
403 static int eval_isnamec __ARGS((int c)); 466 static int eval_isnamec __ARGS((int c));
404 static int find_vim_var __ARGS((char_u *name, int len)); 467 static int find_vim_var __ARGS((char_u *name, int len));
405 static int get_var_var __ARGS((char_u *name, int len, VAR retvar)); 468 static int get_var_vartv __ARGS((char_u *name, int len, typeval *retvar));
406 static VAR alloc_var __ARGS((void)); 469 static VAR alloc_var __ARGS((void));
407 static VAR alloc_string_var __ARGS((char_u *string)); 470 static typeval *alloc_vartv __ARGS((void));
408 static void free_var __ARGS((VAR varp)); 471 static typeval *alloc_string_vartv __ARGS((char_u *string));
409 static void clear_var __ARGS((VAR varp)); 472 static void free_vartv __ARGS((typeval *varp));
410 static long get_var_number __ARGS((VAR varp)); 473 static void clear_vartv __ARGS((typeval *varp));
411 static linenr_T get_var_lnum __ARGS((VAR argvars)); 474 static long get_vartv_number __ARGS((typeval *varp));
412 static char_u *get_var_string __ARGS((VAR varp)); 475 static linenr_T get_vartv_lnum __ARGS((typeval *argvars));
413 static char_u *get_var_string_buf __ARGS((VAR varp, char_u *buf)); 476 static char_u *get_vartv_string __ARGS((typeval *varp));
477 static char_u *get_vartv_string_buf __ARGS((typeval *varp, char_u *buf));
414 static VAR find_var __ARGS((char_u *name, int writing)); 478 static VAR find_var __ARGS((char_u *name, int writing));
415 static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname)); 479 static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname));
416 static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname)); 480 static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname));
417 static void var_free_one __ARGS((VAR v)); 481 static void clear_var __ARGS((VAR v));
418 static void list_one_var __ARGS((VAR v, char_u *prefix)); 482 static void list_one_var __ARGS((VAR v, char_u *prefix));
419 static void list_vim_var __ARGS((int i)); 483 static void list_vim_var __ARGS((int i));
420 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string)); 484 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string));
421 static void set_var __ARGS((char_u *name, VAR varp, int copy)); 485 static void set_var __ARGS((char_u *name, typeval *varp, int copy));
422 static void copy_var __ARGS((VAR from, VAR to)); 486 static void copy_vartv __ARGS((typeval *from, typeval *to));
423 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags)); 487 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
424 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal)); 488 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal));
425 static int eval_fname_script __ARGS((char_u *p)); 489 static int eval_fname_script __ARGS((char_u *p));
426 static int eval_fname_sid __ARGS((char_u *p)); 490 static int eval_fname_sid __ARGS((char_u *p));
427 static void list_func_head __ARGS((ufunc_T *fp, int indent)); 491 static void list_func_head __ARGS((ufunc_T *fp, int indent));
428 static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); 492 static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp));
429 static ufunc_T *find_func __ARGS((char_u *name)); 493 static ufunc_T *find_func __ARGS((char_u *name));
430 static void call_user_func __ARGS((ufunc_T *fp, int argcount, VAR argvars, VAR retvar, linenr_T firstline, linenr_T lastline)); 494 static int function_exists __ARGS((char_u *name));
495 static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *retvar, linenr_T firstline, linenr_T lastline));
496
497 #define get_var_string(p) get_vartv_string(&(p)->tv)
498 #define get_var_string_buf(p, b) get_vartv_string_buf(&(p)->tv, (b))
499 #define get_var_number(p) get_vartv_number(&((p)->tv))
431 500
432 /* Magic braces are always enabled, otherwise Vim scripts would not be 501 /* Magic braces are always enabled, otherwise Vim scripts would not be
433 * portable. */ 502 * portable. */
434 #define FEAT_MAGIC_BRACES 503 #define FEAT_MAGIC_BRACES
435 504
444 void 513 void
445 set_internal_string_var(name, value) 514 set_internal_string_var(name, value)
446 char_u *name; 515 char_u *name;
447 char_u *value; 516 char_u *value;
448 { 517 {
449 char_u *val; 518 char_u *val;
450 VAR varp; 519 typeval *tvp;
451 520
452 val = vim_strsave(value); 521 val = vim_strsave(value);
453 if (val != NULL) 522 if (val != NULL)
454 { 523 {
455 varp = alloc_string_var(val); 524 tvp = alloc_string_vartv(val);
456 if (varp != NULL) 525 if (tvp != NULL)
457 { 526 {
458 set_var(name, varp, FALSE); 527 set_var(name, tvp, FALSE);
459 free_var(varp); 528 free_vartv(tvp);
460 } 529 }
461 } 530 }
462 } 531 }
463 532
464 # if defined(FEAT_MBYTE) || defined(PROTO) 533 # if defined(FEAT_MBYTE) || defined(PROTO)
573 { 642 {
574 *error = FALSE; 643 *error = FALSE;
575 if (!skip) 644 if (!skip)
576 { 645 {
577 retval = (get_var_number(&retvar) != 0); 646 retval = (get_var_number(&retvar) != 0);
578 clear_var(&retvar); 647 clear_vartv(&retvar.tv);
579 } 648 }
580 } 649 }
581 if (skip) 650 if (skip)
582 --emsg_skip; 651 --emsg_skip;
583 652
603 if (eval0(arg, &retvar, nextcmd, !skip) == FAIL || skip) 672 if (eval0(arg, &retvar, nextcmd, !skip) == FAIL || skip)
604 retval = NULL; 673 retval = NULL;
605 else 674 else
606 { 675 {
607 retval = vim_strsave(get_var_string(&retvar)); 676 retval = vim_strsave(get_var_string(&retvar));
608 clear_var(&retvar); 677 clear_vartv(&retvar.tv);
609 } 678 }
610 if (skip) 679 if (skip)
611 --emsg_skip; 680 --emsg_skip;
612 681
613 return retval; 682 return retval;
619 */ 688 */
620 int 689 int
621 skip_expr(pp) 690 skip_expr(pp)
622 char_u **pp; 691 char_u **pp;
623 { 692 {
624 var retvar; 693 typeval retvar;
625 694
626 *pp = skipwhite(*pp); 695 *pp = skipwhite(*pp);
627 return eval1(pp, &retvar, FALSE); 696 return eval1(pp, &retvar, FALSE);
628 } 697 }
629 698
642 if (eval0(arg, &retvar, nextcmd, TRUE) == FAIL) 711 if (eval0(arg, &retvar, nextcmd, TRUE) == FAIL)
643 retval = NULL; 712 retval = NULL;
644 else 713 else
645 { 714 {
646 retval = vim_strsave(get_var_string(&retvar)); 715 retval = vim_strsave(get_var_string(&retvar));
647 clear_var(&retvar); 716 clear_vartv(&retvar.tv);
648 } 717 }
649 718
650 return retval; 719 return retval;
651 } 720 }
652 721
678 */ 747 */
679 char_u * 748 char_u *
680 eval_arg_to_string(arg) 749 eval_arg_to_string(arg)
681 char_u **arg; 750 char_u **arg;
682 { 751 {
683 var retvar; 752 typeval retvar;
684 char_u *retval; 753 char_u *retval;
685 int ret; 754 int ret;
686 755
687 ++emsg_off; 756 ++emsg_off;
688 757
689 ret = eval1(arg, &retvar, TRUE); 758 ret = eval1(arg, &retvar, TRUE);
690 if (ret == FAIL) 759 if (ret == FAIL)
691 retval = NULL; 760 retval = NULL;
692 else 761 else
693 { 762 {
694 retval = vim_strsave(get_var_string(&retvar)); 763 retval = vim_strsave(get_vartv_string(&retvar));
695 clear_var(&retvar); 764 clear_vartv(&retvar);
696 } 765 }
697 766
698 --emsg_off; 767 --emsg_off;
699 768
700 return retval; 769 return retval;
708 */ 777 */
709 int 778 int
710 eval_to_number(expr) 779 eval_to_number(expr)
711 char_u *expr; 780 char_u *expr;
712 { 781 {
713 var retvar; 782 typeval retvar;
714 int retval; 783 int retval;
715 char_u *p = expr; 784 char_u *p = expr;
716 785
717 ++emsg_off; 786 ++emsg_off;
718 787
719 if (eval1(&p, &retvar, TRUE) == FAIL) 788 if (eval1(&p, &retvar, TRUE) == FAIL)
720 retval = -1; 789 retval = -1;
721 else 790 else
722 { 791 {
723 retval = get_var_number(&retvar); 792 retval = get_vartv_number(&retvar);
724 clear_var(&retvar); 793 clear_vartv(&retvar);
725 } 794 }
726 --emsg_off; 795 --emsg_off;
727 796
728 return retval; 797 return retval;
729 } 798 }
740 char_u **argv; 809 char_u **argv;
741 int safe; /* use the sandbox */ 810 int safe; /* use the sandbox */
742 { 811 {
743 char_u *retval = NULL; 812 char_u *retval = NULL;
744 var retvar; 813 var retvar;
745 VAR argvars; 814 typeval *argvars;
746 long n; 815 long n;
747 int len; 816 int len;
748 int i; 817 int i;
749 int doesrange; 818 int doesrange;
750 void *save_funccalp = NULL; 819 void *save_funccalp = NULL;
751 820
752 argvars = (VAR)alloc((unsigned)(argc * sizeof(var))); 821 argvars = (typeval *)alloc((unsigned)(argc * sizeof(typeval)));
753 if (argvars == NULL) 822 if (argvars == NULL)
754 return NULL; 823 return NULL;
755 824
756 for (i = 0; i < argc; i++) 825 for (i = 0; i < argc; i++)
757 { 826 {
758 /* Pass a NULL or empty argument as an empty string */ 827 /* Pass a NULL or empty argument as an empty string */
759 if (argv[i] == NULL || *argv[i] == NUL) 828 if (argv[i] == NULL || *argv[i] == NUL)
760 { 829 {
761 argvars[i].var_type = VAR_STRING; 830 argvars[i].v_type = VAR_STRING;
762 argvars[i].var_val.var_string = (char_u *)""; 831 argvars[i].vval.v_string = (char_u *)"";
763 continue; 832 continue;
764 } 833 }
765 834
766 /* Recognize a number argument, the others must be strings. */ 835 /* Recognize a number argument, the others must be strings. */
767 vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL); 836 vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL);
768 if (len != 0 && len == (int)STRLEN(argv[i])) 837 if (len != 0 && len == (int)STRLEN(argv[i]))
769 { 838 {
770 argvars[i].var_type = VAR_NUMBER; 839 argvars[i].v_type = VAR_NUMBER;
771 argvars[i].var_val.var_number = n; 840 argvars[i].vval.v_number = n;
772 } 841 }
773 else 842 else
774 { 843 {
775 argvars[i].var_type = VAR_STRING; 844 argvars[i].v_type = VAR_STRING;
776 argvars[i].var_val.var_string = argv[i]; 845 argvars[i].vval.v_string = argv[i];
777 } 846 }
778 } 847 }
779 848
780 if (safe) 849 if (safe)
781 { 850 {
782 save_funccalp = save_funccal(); 851 save_funccalp = save_funccal();
783 ++sandbox; 852 ++sandbox;
784 } 853 }
785 854
786 retvar.var_type = VAR_UNKNOWN; /* clear_var() uses this */ 855 retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */
787 if (call_func(func, (int)STRLEN(func), &retvar, argc, argvars, 856 if (call_func(func, (int)STRLEN(func), &retvar.tv, argc, argvars,
788 curwin->w_cursor.lnum, curwin->w_cursor.lnum, 857 curwin->w_cursor.lnum, curwin->w_cursor.lnum,
789 &doesrange, TRUE) == OK) 858 &doesrange, TRUE) == OK)
790 retval = vim_strsave(get_var_string(&retvar)); 859 retval = vim_strsave(get_var_string(&retvar));
791 860
792 clear_var(&retvar); 861 clear_vartv(&retvar.tv);
793 vim_free(argvars); 862 vim_free(argvars);
794 863
795 if (safe) 864 if (safe)
796 { 865 {
797 --sandbox; 866 --sandbox;
842 if (eval0(arg, &retvar, NULL, TRUE) == FAIL) 911 if (eval0(arg, &retvar, NULL, TRUE) == FAIL)
843 retval = 0; 912 retval = 0;
844 else 913 else
845 { 914 {
846 /* If the result is a number, just return the number. */ 915 /* If the result is a number, just return the number. */
847 if (retvar.var_type == VAR_NUMBER) 916 if (retvar.tv.v_type == VAR_NUMBER)
848 retval = retvar.var_val.var_number; 917 retval = retvar.tv.vval.v_number;
849 else if (retvar.var_type == VAR_UNKNOWN 918 else if (retvar.tv.v_type == VAR_UNKNOWN
850 || retvar.var_val.var_string == NULL) 919 || retvar.tv.vval.v_string == NULL)
851 retval = 0; 920 retval = 0;
852 else 921 else
853 { 922 {
854 /* If the result is a string, check if there is a non-digit before 923 /* If the result is a string, check if there is a non-digit before
855 * the number. */ 924 * the number. */
856 s = retvar.var_val.var_string; 925 s = retvar.tv.vval.v_string;
857 if (!VIM_ISDIGIT(*s) && *s != '-') 926 if (!VIM_ISDIGIT(*s) && *s != '-')
858 *cp = *s++; 927 *cp = *s++;
859 retval = atol((char *)s); 928 retval = atol((char *)s);
860 } 929 }
861 clear_var(&retvar); 930 clear_vartv(&retvar.tv);
862 } 931 }
863 --emsg_off; 932 --emsg_off;
864 --sandbox; 933 --sandbox;
865 934
866 return retval; 935 return retval;
968 { 1037 {
969 /* 1038 /*
970 * List all variables. 1039 * List all variables.
971 */ 1040 */
972 for (i = 0; i < variables.ga_len && !got_int; ++i) 1041 for (i = 0; i < variables.ga_len && !got_int; ++i)
973 if (VAR_ENTRY(i).var_name != NULL) 1042 if (VAR_ENTRY(i).v_name != NULL)
974 list_one_var(&VAR_ENTRY(i), (char_u *)""); 1043 list_one_var(&VAR_ENTRY(i), (char_u *)"");
975 for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i) 1044 for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i)
976 if (BVAR_ENTRY(i).var_name != NULL) 1045 if (BVAR_ENTRY(i).v_name != NULL)
977 list_one_var(&BVAR_ENTRY(i), (char_u *)"b:"); 1046 list_one_var(&BVAR_ENTRY(i), (char_u *)"b:");
978 for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i) 1047 for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i)
979 if (WVAR_ENTRY(i).var_name != NULL) 1048 if (WVAR_ENTRY(i).v_name != NULL)
980 list_one_var(&WVAR_ENTRY(i), (char_u *)"w:"); 1049 list_one_var(&WVAR_ENTRY(i), (char_u *)"w:");
981 for (i = 0; i < VV_LEN && !got_int; ++i) 1050 for (i = 0; i < VV_LEN && !got_int; ++i)
982 if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL) 1051 if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL)
983 list_vim_var(i); 1052 list_vim_var(i);
984 } 1053 }
1101 ++emsg_skip; 1170 ++emsg_skip;
1102 i = eval0(expr + 1, &retvar, &eap->nextcmd, !eap->skip); 1171 i = eval0(expr + 1, &retvar, &eap->nextcmd, !eap->skip);
1103 if (eap->skip) 1172 if (eap->skip)
1104 { 1173 {
1105 if (i != FAIL) 1174 if (i != FAIL)
1106 clear_var(&retvar); 1175 clear_vartv(&retvar.tv);
1107 --emsg_skip; 1176 --emsg_skip;
1108 } 1177 }
1109 else if (i != FAIL) 1178 else if (i != FAIL)
1110 { 1179 {
1111 /* 1180 /*
1212 if (!aborting()) 1281 if (!aborting())
1213 EMSG2(_(e_invarg2), arg); 1282 EMSG2(_(e_invarg2), arg);
1214 } 1283 }
1215 else 1284 else
1216 { 1285 {
1217 set_var(temp_string, &retvar, TRUE); 1286 set_var(temp_string, &retvar.tv, TRUE);
1218 vim_free(temp_string); 1287 vim_free(temp_string);
1219 } 1288 }
1220 } 1289 }
1221 #endif 1290 #endif
1222 else 1291 else
1223 { 1292 {
1224 c1 = *p; 1293 c1 = *p;
1225 *p = NUL; 1294 *p = NUL;
1226 set_var(arg, &retvar, TRUE); 1295 set_var(arg, &retvar.tv, TRUE);
1227 *p = c1; /* put char back for error messages */ 1296 *p = c1; /* put char back for error messages */
1228 } 1297 }
1229 } 1298 }
1230 1299
1231 else 1300 else
1232 { 1301 {
1233 EMSG2(_(e_invarg2), arg); 1302 EMSG2(_(e_invarg2), arg);
1234 } 1303 }
1235 1304
1236 clear_var(&retvar); 1305 clear_vartv(&retvar.tv);
1237 } 1306 }
1238 } 1307 }
1239 } 1308 }
1240 1309
1241 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) 1310 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
1348 goto end; 1417 goto end;
1349 if (alias != NULL) 1418 if (alias != NULL)
1350 name = alias; 1419 name = alias;
1351 1420
1352 startarg = arg; 1421 startarg = arg;
1353 retvar.var_type = VAR_UNKNOWN; /* clear_var() uses this */ 1422 retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */
1354 1423
1355 if (*startarg != '(') 1424 if (*startarg != '(')
1356 { 1425 {
1357 EMSG2(_("E107: Missing braces: %s"), name); 1426 EMSG2(_("E107: Missing braces: %s"), name);
1358 goto end; 1427 goto end;
1377 { 1446 {
1378 curwin->w_cursor.lnum = lnum; 1447 curwin->w_cursor.lnum = lnum;
1379 curwin->w_cursor.col = 0; 1448 curwin->w_cursor.col = 0;
1380 } 1449 }
1381 arg = startarg; 1450 arg = startarg;
1382 if (get_func_var(name, len, &retvar, &arg, 1451 if (get_func_vartv(name, len, &retvar.tv, &arg,
1383 eap->line1, eap->line2, &doesrange, !eap->skip) == FAIL) 1452 eap->line1, eap->line2, &doesrange, !eap->skip) == FAIL)
1384 { 1453 {
1385 failed = TRUE; 1454 failed = TRUE;
1386 break; 1455 break;
1387 } 1456 }
1388 clear_var(&retvar); 1457 clear_vartv(&retvar.tv);
1389 if (doesrange || eap->skip) 1458 if (doesrange || eap->skip)
1390 break; 1459 break;
1391 /* Stop when immediately aborting on error, or when an interrupt 1460 /* Stop when immediately aborting on error, or when an interrupt
1392 * occurred or an exception was thrown but not caught. get_func_var() 1461 * occurred or an exception was thrown but not caught.
1393 * returned OK, so that the check for trailing characters below is 1462 * get_func_vartv() returned OK, so that the check for trailing
1394 * executed. */ 1463 * characters below is executed. */
1395 if (aborting()) 1464 if (aborting())
1396 break; 1465 break;
1397 } 1466 }
1398 if (eap->skip) 1467 if (eap->skip)
1399 --emsg_skip; 1468 --emsg_skip;
1506 VAR v; 1575 VAR v;
1507 1576
1508 v = find_var(name, TRUE); 1577 v = find_var(name, TRUE);
1509 if (v != NULL) 1578 if (v != NULL)
1510 { 1579 {
1511 var_free_one(v); 1580 clear_var(v);
1512 return OK; 1581 return OK;
1513 } 1582 }
1514 return FAIL; 1583 return FAIL;
1515 } 1584 }
1516 1585
1522 del_menutrans_vars() 1591 del_menutrans_vars()
1523 { 1592 {
1524 int i; 1593 int i;
1525 1594
1526 for (i = 0; i < variables.ga_len; ++i) 1595 for (i = 0; i < variables.ga_len; ++i)
1527 if (VAR_ENTRY(i).var_name != NULL 1596 if (VAR_ENTRY(i).v_name != NULL
1528 && STRNCMP(VAR_ENTRY(i).var_name, "menutrans_", 10) == 0) 1597 && STRNCMP(VAR_ENTRY(i).v_name, "menutrans_", 10) == 0)
1529 var_free_one(&VAR_ENTRY(i)); 1598 clear_var(&VAR_ENTRY(i));
1530 } 1599 }
1531 #endif 1600 #endif
1532 1601
1533 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) 1602 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
1534 1603
1590 1659
1591 if (idx == 0) 1660 if (idx == 0)
1592 gidx = bidx = widx = vidx = 0; 1661 gidx = bidx = widx = vidx = 0;
1593 if (gidx < variables.ga_len) /* Global variables */ 1662 if (gidx < variables.ga_len) /* Global variables */
1594 { 1663 {
1595 while ((name = VAR_ENTRY(gidx++).var_name) == NULL 1664 while ((name = VAR_ENTRY(gidx++).v_name) == NULL
1596 && gidx < variables.ga_len) 1665 && gidx < variables.ga_len)
1597 /* skip */; 1666 /* skip */;
1598 if (name != NULL) 1667 if (name != NULL)
1599 { 1668 {
1600 if (STRNCMP("g:", xp->xp_pattern, 2) == 0) 1669 if (STRNCMP("g:", xp->xp_pattern, 2) == 0)
1603 return name; 1672 return name;
1604 } 1673 }
1605 } 1674 }
1606 if (bidx < curbuf->b_vars.ga_len) /* Current buffer variables */ 1675 if (bidx < curbuf->b_vars.ga_len) /* Current buffer variables */
1607 { 1676 {
1608 while ((name = BVAR_ENTRY(bidx++).var_name) == NULL 1677 while ((name = BVAR_ENTRY(bidx++).v_name) == NULL
1609 && bidx < curbuf->b_vars.ga_len) 1678 && bidx < curbuf->b_vars.ga_len)
1610 /* skip */; 1679 /* skip */;
1611 if (name != NULL) 1680 if (name != NULL)
1612 return cat_prefix_varname('b', name); 1681 return cat_prefix_varname('b', name);
1613 } 1682 }
1616 ++bidx; 1685 ++bidx;
1617 return (char_u *)"b:changedtick"; 1686 return (char_u *)"b:changedtick";
1618 } 1687 }
1619 if (widx < curwin->w_vars.ga_len) /* Current window variables */ 1688 if (widx < curwin->w_vars.ga_len) /* Current window variables */
1620 { 1689 {
1621 while ((name = WVAR_ENTRY(widx++).var_name) == NULL 1690 while ((name = WVAR_ENTRY(widx++).v_name) == NULL
1622 && widx < curwin->w_vars.ga_len) 1691 && widx < curwin->w_vars.ga_len)
1623 /* skip */; 1692 /* skip */;
1624 if (name != NULL) 1693 if (name != NULL)
1625 return cat_prefix_varname('w', name); 1694 return cat_prefix_varname('w', name);
1626 } 1695 }
1671 { 1740 {
1672 int ret; 1741 int ret;
1673 char_u *p; 1742 char_u *p;
1674 1743
1675 p = skipwhite(arg); 1744 p = skipwhite(arg);
1676 ret = eval1(&p, retvar, evaluate); 1745 ret = eval1(&p, &retvar->tv, evaluate);
1677 if (ret == FAIL || !ends_excmd(*p)) 1746 if (ret == FAIL || !ends_excmd(*p))
1678 { 1747 {
1679 if (ret != FAIL) 1748 if (ret != FAIL)
1680 clear_var(retvar); 1749 clear_vartv(&retvar->tv);
1681 /* 1750 /*
1682 * Report the invalid expression unless the expression evaluation has 1751 * Report the invalid expression unless the expression evaluation has
1683 * been cancelled due to an aborting error, an interrupt, or an 1752 * been cancelled due to an aborting error, an interrupt, or an
1684 * exception. 1753 * exception.
1685 */ 1754 */
1703 * Return OK or FAIL. 1772 * Return OK or FAIL.
1704 */ 1773 */
1705 static int 1774 static int
1706 eval1(arg, retvar, evaluate) 1775 eval1(arg, retvar, evaluate)
1707 char_u **arg; 1776 char_u **arg;
1708 VAR retvar; 1777 typeval *retvar;
1709 int evaluate; 1778 int evaluate;
1710 { 1779 {
1711 int result; 1780 int result;
1712 var var2; 1781 typeval var2;
1713 1782
1714 /* 1783 /*
1715 * Get the first variable. 1784 * Get the first variable.
1716 */ 1785 */
1717 if (eval2(arg, retvar, evaluate) == FAIL) 1786 if (eval2(arg, retvar, evaluate) == FAIL)
1720 if ((*arg)[0] == '?') 1789 if ((*arg)[0] == '?')
1721 { 1790 {
1722 result = FALSE; 1791 result = FALSE;
1723 if (evaluate) 1792 if (evaluate)
1724 { 1793 {
1725 if (get_var_number(retvar) != 0) 1794 if (get_vartv_number(retvar) != 0)
1726 result = TRUE; 1795 result = TRUE;
1727 clear_var(retvar); 1796 clear_vartv(retvar);
1728 } 1797 }
1729 1798
1730 /* 1799 /*
1731 * Get the second variable. 1800 * Get the second variable.
1732 */ 1801 */
1739 */ 1808 */
1740 if ((*arg)[0] != ':') 1809 if ((*arg)[0] != ':')
1741 { 1810 {
1742 EMSG(_("E109: Missing ':' after '?'")); 1811 EMSG(_("E109: Missing ':' after '?'"));
1743 if (evaluate && result) 1812 if (evaluate && result)
1744 clear_var(retvar); 1813 clear_vartv(retvar);
1745 return FAIL; 1814 return FAIL;
1746 } 1815 }
1747 1816
1748 /* 1817 /*
1749 * Get the third variable. 1818 * Get the third variable.
1750 */ 1819 */
1751 *arg = skipwhite(*arg + 1); 1820 *arg = skipwhite(*arg + 1);
1752 if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */ 1821 if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */
1753 { 1822 {
1754 if (evaluate && result) 1823 if (evaluate && result)
1755 clear_var(retvar); 1824 clear_vartv(retvar);
1756 return FAIL; 1825 return FAIL;
1757 } 1826 }
1758 if (evaluate && !result) 1827 if (evaluate && !result)
1759 *retvar = var2; 1828 *retvar = var2;
1760 } 1829 }
1772 * Return OK or FAIL. 1841 * Return OK or FAIL.
1773 */ 1842 */
1774 static int 1843 static int
1775 eval2(arg, retvar, evaluate) 1844 eval2(arg, retvar, evaluate)
1776 char_u **arg; 1845 char_u **arg;
1777 VAR retvar; 1846 typeval *retvar;
1778 int evaluate; 1847 int evaluate;
1779 { 1848 {
1780 var var2; 1849 typeval var2;
1781 long result; 1850 long result;
1782 int first; 1851 int first;
1783 1852
1784 /* 1853 /*
1785 * Get the first variable. 1854 * Get the first variable.
1794 result = FALSE; 1863 result = FALSE;
1795 while ((*arg)[0] == '|' && (*arg)[1] == '|') 1864 while ((*arg)[0] == '|' && (*arg)[1] == '|')
1796 { 1865 {
1797 if (evaluate && first) 1866 if (evaluate && first)
1798 { 1867 {
1799 if (get_var_number(retvar) != 0) 1868 if (get_vartv_number(retvar) != 0)
1800 result = TRUE; 1869 result = TRUE;
1801 clear_var(retvar); 1870 clear_vartv(retvar);
1802 first = FALSE; 1871 first = FALSE;
1803 } 1872 }
1804 1873
1805 /* 1874 /*
1806 * Get the second variable. 1875 * Get the second variable.
1812 /* 1881 /*
1813 * Compute the result. 1882 * Compute the result.
1814 */ 1883 */
1815 if (evaluate && !result) 1884 if (evaluate && !result)
1816 { 1885 {
1817 if (get_var_number(&var2) != 0) 1886 if (get_vartv_number(&var2) != 0)
1818 result = TRUE; 1887 result = TRUE;
1819 clear_var(&var2); 1888 clear_vartv(&var2);
1820 } 1889 }
1821 if (evaluate) 1890 if (evaluate)
1822 { 1891 {
1823 retvar->var_type = VAR_NUMBER; 1892 retvar->v_type = VAR_NUMBER;
1824 retvar->var_val.var_number = result; 1893 retvar->vval.v_number = result;
1825 } 1894 }
1826 } 1895 }
1827 1896
1828 return OK; 1897 return OK;
1829 } 1898 }
1838 * Return OK or FAIL. 1907 * Return OK or FAIL.
1839 */ 1908 */
1840 static int 1909 static int
1841 eval3(arg, retvar, evaluate) 1910 eval3(arg, retvar, evaluate)
1842 char_u **arg; 1911 char_u **arg;
1843 VAR retvar; 1912 typeval *retvar;
1844 int evaluate; 1913 int evaluate;
1845 { 1914 {
1846 var var2; 1915 typeval var2;
1847 long result; 1916 long result;
1848 int first; 1917 int first;
1849 1918
1850 /* 1919 /*
1851 * Get the first variable. 1920 * Get the first variable.
1860 result = TRUE; 1929 result = TRUE;
1861 while ((*arg)[0] == '&' && (*arg)[1] == '&') 1930 while ((*arg)[0] == '&' && (*arg)[1] == '&')
1862 { 1931 {
1863 if (evaluate && first) 1932 if (evaluate && first)
1864 { 1933 {
1865 if (get_var_number(retvar) == 0) 1934 if (get_vartv_number(retvar) == 0)
1866 result = FALSE; 1935 result = FALSE;
1867 clear_var(retvar); 1936 clear_vartv(retvar);
1868 first = FALSE; 1937 first = FALSE;
1869 } 1938 }
1870 1939
1871 /* 1940 /*
1872 * Get the second variable. 1941 * Get the second variable.
1878 /* 1947 /*
1879 * Compute the result. 1948 * Compute the result.
1880 */ 1949 */
1881 if (evaluate && result) 1950 if (evaluate && result)
1882 { 1951 {
1883 if (get_var_number(&var2) == 0) 1952 if (get_vartv_number(&var2) == 0)
1884 result = FALSE; 1953 result = FALSE;
1885 clear_var(&var2); 1954 clear_vartv(&var2);
1886 } 1955 }
1887 if (evaluate) 1956 if (evaluate)
1888 { 1957 {
1889 retvar->var_type = VAR_NUMBER; 1958 retvar->v_type = VAR_NUMBER;
1890 retvar->var_val.var_number = result; 1959 retvar->vval.v_number = result;
1891 } 1960 }
1892 } 1961 }
1893 1962
1894 return OK; 1963 return OK;
1895 } 1964 }
1911 * Return OK or FAIL. 1980 * Return OK or FAIL.
1912 */ 1981 */
1913 static int 1982 static int
1914 eval4(arg, retvar, evaluate) 1983 eval4(arg, retvar, evaluate)
1915 char_u **arg; 1984 char_u **arg;
1916 VAR retvar; 1985 typeval *retvar;
1917 int evaluate; 1986 int evaluate;
1918 { 1987 {
1919 var var2; 1988 typeval var2;
1920 char_u *p; 1989 char_u *p;
1921 int i; 1990 int i;
1922 exptype_T type = TYPE_UNKNOWN; 1991 exptype_T type = TYPE_UNKNOWN;
1923 int len = 2; 1992 int len = 2;
1924 long n1, n2; 1993 long n1, n2;
1990 * Get the second variable. 2059 * Get the second variable.
1991 */ 2060 */
1992 *arg = skipwhite(p + len); 2061 *arg = skipwhite(p + len);
1993 if (eval5(arg, &var2, evaluate) == FAIL) 2062 if (eval5(arg, &var2, evaluate) == FAIL)
1994 { 2063 {
1995 clear_var(retvar); 2064 clear_vartv(retvar);
1996 return FAIL; 2065 return FAIL;
1997 } 2066 }
1998 2067
1999 if (evaluate) 2068 if (evaluate)
2000 { 2069 {
2001 /* 2070 /*
2002 * If one of the two variables is a number, compare as a number. 2071 * If one of the two variables is a number, compare as a number.
2003 * When using "=~" or "!~", always compare as string. 2072 * When using "=~" or "!~", always compare as string.
2004 */ 2073 */
2005 if ((retvar->var_type == VAR_NUMBER || var2.var_type == VAR_NUMBER) 2074 if ((retvar->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
2006 && type != TYPE_MATCH && type != TYPE_NOMATCH) 2075 && type != TYPE_MATCH && type != TYPE_NOMATCH)
2007 { 2076 {
2008 n1 = get_var_number(retvar); 2077 n1 = get_vartv_number(retvar);
2009 n2 = get_var_number(&var2); 2078 n2 = get_vartv_number(&var2);
2010 switch (type) 2079 switch (type)
2011 { 2080 {
2012 case TYPE_EQUAL: n1 = (n1 == n2); break; 2081 case TYPE_EQUAL: n1 = (n1 == n2); break;
2013 case TYPE_NEQUAL: n1 = (n1 != n2); break; 2082 case TYPE_NEQUAL: n1 = (n1 != n2); break;
2014 case TYPE_GREATER: n1 = (n1 > n2); break; 2083 case TYPE_GREATER: n1 = (n1 > n2); break;
2020 case TYPE_NOMATCH: break; /* avoid gcc warning */ 2089 case TYPE_NOMATCH: break; /* avoid gcc warning */
2021 } 2090 }
2022 } 2091 }
2023 else 2092 else
2024 { 2093 {
2025 s1 = get_var_string_buf(retvar, buf1); 2094 s1 = get_vartv_string_buf(retvar, buf1);
2026 s2 = get_var_string_buf(&var2, buf2); 2095 s2 = get_vartv_string_buf(&var2, buf2);
2027 if (type != TYPE_MATCH && type != TYPE_NOMATCH) 2096 if (type != TYPE_MATCH && type != TYPE_NOMATCH)
2028 i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2); 2097 i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2);
2029 else 2098 else
2030 i = 0; 2099 i = 0;
2031 n1 = FALSE; 2100 n1 = FALSE;
2057 break; 2126 break;
2058 2127
2059 case TYPE_UNKNOWN: break; /* avoid gcc warning */ 2128 case TYPE_UNKNOWN: break; /* avoid gcc warning */
2060 } 2129 }
2061 } 2130 }
2062 clear_var(retvar); 2131 clear_vartv(retvar);
2063 clear_var(&var2); 2132 clear_vartv(&var2);
2064 retvar->var_type = VAR_NUMBER; 2133 retvar->v_type = VAR_NUMBER;
2065 retvar->var_val.var_number = n1; 2134 retvar->vval.v_number = n1;
2066 } 2135 }
2067 } 2136 }
2068 2137
2069 return OK; 2138 return OK;
2070 } 2139 }
2081 * Return OK or FAIL. 2150 * Return OK or FAIL.
2082 */ 2151 */
2083 static int 2152 static int
2084 eval5(arg, retvar, evaluate) 2153 eval5(arg, retvar, evaluate)
2085 char_u **arg; 2154 char_u **arg;
2086 VAR retvar; 2155 typeval *retvar;
2087 int evaluate; 2156 int evaluate;
2088 { 2157 {
2089 var var2; 2158 typeval var2;
2090 int op; 2159 int op;
2091 long n1, n2; 2160 long n1, n2;
2092 char_u *s1, *s2; 2161 char_u *s1, *s2;
2093 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; 2162 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
2094 char_u *p; 2163 char_u *p;
2112 * Get the second variable. 2181 * Get the second variable.
2113 */ 2182 */
2114 *arg = skipwhite(*arg + 1); 2183 *arg = skipwhite(*arg + 1);
2115 if (eval6(arg, &var2, evaluate) == FAIL) 2184 if (eval6(arg, &var2, evaluate) == FAIL)
2116 { 2185 {
2117 clear_var(retvar); 2186 clear_vartv(retvar);
2118 return FAIL; 2187 return FAIL;
2119 } 2188 }
2120 2189
2121 if (evaluate) 2190 if (evaluate)
2122 { 2191 {
2123 /* 2192 /*
2124 * Compute the result. 2193 * Compute the result.
2125 */ 2194 */
2126 if (op == '.') 2195 if (op == '.')
2127 { 2196 {
2128 s1 = get_var_string_buf(retvar, buf1); 2197 s1 = get_vartv_string_buf(retvar, buf1);
2129 s2 = get_var_string_buf(&var2, buf2); 2198 s2 = get_vartv_string_buf(&var2, buf2);
2130 op = (int)STRLEN(s1); 2199 op = (int)STRLEN(s1);
2131 p = alloc((unsigned)(op + STRLEN(s2) + 1)); 2200 p = alloc((unsigned)(op + STRLEN(s2) + 1));
2132 if (p != NULL) 2201 if (p != NULL)
2133 { 2202 {
2134 STRCPY(p, s1); 2203 STRCPY(p, s1);
2135 STRCPY(p + op, s2); 2204 STRCPY(p + op, s2);
2136 } 2205 }
2137 clear_var(retvar); 2206 clear_vartv(retvar);
2138 retvar->var_type = VAR_STRING; 2207 retvar->v_type = VAR_STRING;
2139 retvar->var_val.var_string = p; 2208 retvar->vval.v_string = p;
2140 } 2209 }
2141 else 2210 else
2142 { 2211 {
2143 n1 = get_var_number(retvar); 2212 n1 = get_vartv_number(retvar);
2144 n2 = get_var_number(&var2); 2213 n2 = get_vartv_number(&var2);
2145 clear_var(retvar); 2214 clear_vartv(retvar);
2146 if (op == '+') 2215 if (op == '+')
2147 n1 = n1 + n2; 2216 n1 = n1 + n2;
2148 else 2217 else
2149 n1 = n1 - n2; 2218 n1 = n1 - n2;
2150 retvar->var_type = VAR_NUMBER; 2219 retvar->v_type = VAR_NUMBER;
2151 retvar->var_val.var_number = n1; 2220 retvar->vval.v_number = n1;
2152 } 2221 }
2153 clear_var(&var2); 2222 clear_vartv(&var2);
2154 } 2223 }
2155 } 2224 }
2156 return OK; 2225 return OK;
2157 } 2226 }
2158 2227
2168 * Return OK or FAIL. 2237 * Return OK or FAIL.
2169 */ 2238 */
2170 static int 2239 static int
2171 eval6(arg, retvar, evaluate) 2240 eval6(arg, retvar, evaluate)
2172 char_u **arg; 2241 char_u **arg;
2173 VAR retvar; 2242 typeval *retvar;
2174 int evaluate; 2243 int evaluate;
2175 { 2244 {
2176 var var2; 2245 typeval var2;
2177 int op; 2246 int op;
2178 long n1, n2; 2247 long n1, n2;
2179 2248
2180 /* 2249 /*
2181 * Get the first variable. 2250 * Get the first variable.
2192 if (op != '*' && op != '/' && op != '%') 2261 if (op != '*' && op != '/' && op != '%')
2193 break; 2262 break;
2194 2263
2195 if (evaluate) 2264 if (evaluate)
2196 { 2265 {
2197 n1 = get_var_number(retvar); 2266 n1 = get_vartv_number(retvar);
2198 clear_var(retvar); 2267 clear_vartv(retvar);
2199 } 2268 }
2200 else 2269 else
2201 n1 = 0; 2270 n1 = 0;
2202 2271
2203 /* 2272 /*
2207 if (eval7(arg, &var2, evaluate) == FAIL) 2276 if (eval7(arg, &var2, evaluate) == FAIL)
2208 return FAIL; 2277 return FAIL;
2209 2278
2210 if (evaluate) 2279 if (evaluate)
2211 { 2280 {
2212 n2 = get_var_number(&var2); 2281 n2 = get_vartv_number(&var2);
2213 clear_var(&var2); 2282 clear_vartv(&var2);
2214 2283
2215 /* 2284 /*
2216 * Compute the result. 2285 * Compute the result.
2217 */ 2286 */
2218 if (op == '*') 2287 if (op == '*')
2229 if (n2 == 0) /* give an error message? */ 2298 if (n2 == 0) /* give an error message? */
2230 n1 = 0; 2299 n1 = 0;
2231 else 2300 else
2232 n1 = n1 % n2; 2301 n1 = n1 % n2;
2233 } 2302 }
2234 retvar->var_type = VAR_NUMBER; 2303 retvar->v_type = VAR_NUMBER;
2235 retvar->var_val.var_number = n1; 2304 retvar->vval.v_number = n1;
2236 } 2305 }
2237 } 2306 }
2238 2307
2239 return OK; 2308 return OK;
2240 } 2309 }
2263 * Return OK or FAIL. 2332 * Return OK or FAIL.
2264 */ 2333 */
2265 static int 2334 static int
2266 eval7(arg, retvar, evaluate) 2335 eval7(arg, retvar, evaluate)
2267 char_u **arg; 2336 char_u **arg;
2268 VAR retvar; 2337 typeval *retvar;
2269 int evaluate; 2338 int evaluate;
2270 { 2339 {
2271 var var2;
2272 long n; 2340 long n;
2273 int len; 2341 int len;
2274 char_u *s; 2342 char_u *s;
2275 int val; 2343 int val;
2276 char_u *start_leader, *end_leader; 2344 char_u *start_leader, *end_leader;
2277 int ret = OK; 2345 int ret = OK;
2278 char_u *alias; 2346 char_u *alias;
2279 2347
2280 /* 2348 /*
2281 * Initialise variable so that clear_var() can't mistake this for a string 2349 * Initialise variable so that clear_vartv() can't mistake this for a
2282 * and free a string that isn't there. 2350 * string and free a string that isn't there.
2283 */ 2351 */
2284 retvar->var_type = VAR_UNKNOWN; 2352 retvar->v_type = VAR_UNKNOWN;
2285 2353
2286 /* 2354 /*
2287 * Skip '!' and '-' characters. They are handled later. 2355 * Skip '!' and '-' characters. They are handled later.
2288 */ 2356 */
2289 start_leader = *arg; 2357 start_leader = *arg;
2308 case '9': 2376 case '9':
2309 vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL); 2377 vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL);
2310 *arg += len; 2378 *arg += len;
2311 if (evaluate) 2379 if (evaluate)
2312 { 2380 {
2313 retvar->var_type = VAR_NUMBER; 2381 retvar->v_type = VAR_NUMBER;
2314 retvar->var_val.var_number = n; 2382 retvar->vval.v_number = n;
2315 } 2383 }
2316 break; 2384 break;
2317 2385
2318 /* 2386 /*
2319 * String constant: "string". 2387 * String constant: "string".
2320 */ 2388 */
2321 case '"': ret = get_string_var(arg, retvar, evaluate); 2389 case '"': ret = get_string_vartv(arg, retvar, evaluate);
2322 break; 2390 break;
2323 2391
2324 /* 2392 /*
2325 * Literal string constant: 'string'. 2393 * Literal string constant: 'string'.
2326 */ 2394 */
2327 case '\'': ret = get_lit_string_var(arg, retvar, evaluate); 2395 case '\'': ret = get_lit_string_vartv(arg, retvar, evaluate);
2396 break;
2397
2398 /*
2399 * List: [expr, expr]
2400 */
2401 case '[': ret = get_list_vartv(arg, retvar, evaluate);
2328 break; 2402 break;
2329 2403
2330 /* 2404 /*
2331 * Option value: &name 2405 * Option value: &name
2332 */ 2406 */
2333 case '&': ret = get_option_var(arg, retvar, evaluate); 2407 case '&': ret = get_option_vartv(arg, retvar, evaluate);
2334 break; 2408 break;
2335 2409
2336 /* 2410 /*
2337 * Environment variable: $VAR. 2411 * Environment variable: $VAR.
2338 */ 2412 */
2339 case '$': ret = get_env_var(arg, retvar, evaluate); 2413 case '$': ret = get_env_vartv(arg, retvar, evaluate);
2340 break; 2414 break;
2341 2415
2342 /* 2416 /*
2343 * Register contents: @r. 2417 * Register contents: @r.
2344 */ 2418 */
2345 case '@': ++*arg; 2419 case '@': ++*arg;
2346 if (evaluate) 2420 if (evaluate)
2347 { 2421 {
2348 retvar->var_type = VAR_STRING; 2422 retvar->v_type = VAR_STRING;
2349 retvar->var_val.var_string = get_reg_contents(**arg, FALSE); 2423 retvar->vval.v_string = get_reg_contents(**arg, FALSE);
2350 } 2424 }
2351 if (**arg != NUL) 2425 if (**arg != NUL)
2352 ++*arg; 2426 ++*arg;
2353 break; 2427 break;
2354 2428
2360 if (**arg == ')') 2434 if (**arg == ')')
2361 ++*arg; 2435 ++*arg;
2362 else if (ret == OK) 2436 else if (ret == OK)
2363 { 2437 {
2364 EMSG(_("E110: Missing ')'")); 2438 EMSG(_("E110: Missing ')'"));
2365 clear_var(retvar); 2439 clear_vartv(retvar);
2366 ret = FAIL; 2440 ret = FAIL;
2367 } 2441 }
2368 break; 2442 break;
2369 2443
2370 /* 2444 /*
2379 ret = FAIL; 2453 ret = FAIL;
2380 else 2454 else
2381 { 2455 {
2382 if (**arg == '(') /* recursive! */ 2456 if (**arg == '(') /* recursive! */
2383 { 2457 {
2384 ret = get_func_var(s, len, retvar, arg, 2458 /* If "s" is the name of a variable of type VAR_FUNC
2459 * use its contents. */
2460 s = deref_func_name(s, &len);
2461
2462 /* Invoke the function. */
2463 ret = get_func_vartv(s, len, retvar, arg,
2385 curwin->w_cursor.lnum, curwin->w_cursor.lnum, 2464 curwin->w_cursor.lnum, curwin->w_cursor.lnum,
2386 &len, evaluate); 2465 &len, evaluate);
2387 /* Stop the expression evaluation when immediately 2466 /* Stop the expression evaluation when immediately
2388 * aborting on error, or when an interrupt occurred or 2467 * aborting on error, or when an interrupt occurred or
2389 * an exception was thrown but not caught. */ 2468 * an exception was thrown but not caught. */
2390 if (aborting()) 2469 if (aborting())
2391 { 2470 {
2392 if (ret == OK) 2471 if (ret == OK)
2393 clear_var(retvar); 2472 clear_vartv(retvar);
2394 ret = FAIL; 2473 ret = FAIL;
2395 } 2474 }
2396 } 2475 }
2397 else if (evaluate) 2476 else if (evaluate)
2398 ret = get_var_var(s, len, retvar); 2477 ret = get_var_vartv(s, len, retvar);
2399 } 2478 }
2400 2479
2401 if (alias != NULL) 2480 if (alias != NULL)
2402 vim_free(alias); 2481 vim_free(alias);
2403 2482
2404 break; 2483 break;
2405 } 2484 }
2406 *arg = skipwhite(*arg); 2485 *arg = skipwhite(*arg);
2407 2486
2408 /* 2487 /*
2409 * Handle expr[expr] subscript. 2488 * Handle expr[expr] and expr[expr:expr] subscript.
2410 */ 2489 */
2411 if (**arg == '[' && ret == OK) 2490 while (**arg == '[' && ret == OK)
2412 { 2491 {
2413 /* 2492 if (eval_index(arg, retvar, evaluate) == FAIL)
2414 * Get the variable from inside the []. 2493 {
2415 */ 2494 clear_vartv(retvar);
2416 *arg = skipwhite(*arg + 1);
2417 if (eval1(arg, &var2, evaluate) == FAIL) /* recursive! */
2418 {
2419 clear_var(retvar);
2420 return FAIL; 2495 return FAIL;
2421 } 2496 }
2422
2423 /* Check for the ']'. */
2424 if (**arg != ']')
2425 {
2426 EMSG(_("E111: Missing ']'"));
2427 clear_var(retvar);
2428 clear_var(&var2);
2429 return FAIL;
2430 }
2431
2432 if (evaluate)
2433 {
2434 n = get_var_number(&var2);
2435 clear_var(&var2);
2436
2437 /*
2438 * The resulting variable is a string of a single character.
2439 * If the index is too big or negative, the result is empty.
2440 */
2441 s = get_var_string(retvar);
2442 if (n >= (long)STRLEN(s) || n < 0)
2443 s = NULL;
2444 else
2445 s = vim_strnsave(s + n, 1);
2446 clear_var(retvar);
2447 retvar->var_type = VAR_STRING;
2448 retvar->var_val.var_string = s;
2449 }
2450 *arg = skipwhite(*arg + 1); /* skip the ']' */
2451 } 2497 }
2452 2498
2453 /* 2499 /*
2454 * Apply logical NOT and unary '-', from right to left, ignore '+'. 2500 * Apply logical NOT and unary '-', from right to left, ignore '+'.
2455 */ 2501 */
2456 if (ret == OK && evaluate && end_leader > start_leader) 2502 if (ret == OK && evaluate && end_leader > start_leader)
2457 { 2503 {
2458 val = get_var_number(retvar); 2504 val = get_vartv_number(retvar);
2459 while (end_leader > start_leader) 2505 while (end_leader > start_leader)
2460 { 2506 {
2461 --end_leader; 2507 --end_leader;
2462 if (*end_leader == '!') 2508 if (*end_leader == '!')
2463 val = !val; 2509 val = !val;
2464 else if (*end_leader == '-') 2510 else if (*end_leader == '-')
2465 val = -val; 2511 val = -val;
2466 } 2512 }
2467 clear_var(retvar); 2513 clear_vartv(retvar);
2468 retvar->var_type = VAR_NUMBER; 2514 retvar->v_type = VAR_NUMBER;
2469 retvar->var_val.var_number = val; 2515 retvar->vval.v_number = val;
2470 } 2516 }
2471 2517
2472 return ret; 2518 return ret;
2519 }
2520
2521 /*
2522 * Evaluate an "[expr]" or "[expr:expr]" index.
2523 * "*arg" points to the '['.
2524 * Returns FAIL or OK. "*arg" is advanced to after the ']'.
2525 */
2526 static int
2527 eval_index(arg, retvar, evaluate)
2528 char_u **arg;
2529 typeval *retvar;
2530 int evaluate;
2531 {
2532 int empty1 = FALSE, empty2 = FALSE;
2533 typeval var1, var2;
2534 long n1, n2 = 0;
2535 long len;
2536 int range;
2537 char_u *s;
2538
2539 if (retvar->v_type == VAR_FUNC)
2540 {
2541 EMSG(_("E999: Cannot index a Funcref"));
2542 return FAIL;
2543 }
2544
2545 /*
2546 * Get the (first) variable from inside the [].
2547 */
2548 *arg = skipwhite(*arg + 1);
2549 if (**arg == ':')
2550 empty1 = TRUE;
2551 else if (eval1(arg, &var1, evaluate) == FAIL) /* recursive! */
2552 return FAIL;
2553
2554 /*
2555 * Get the second variable from inside the [:].
2556 */
2557 if (**arg == ':')
2558 {
2559 range = TRUE;
2560 *arg = skipwhite(*arg + 1);
2561 if (**arg == ']')
2562 empty2 = TRUE;
2563 else if (eval1(arg, &var2, evaluate) == FAIL) /* recursive! */
2564 {
2565 clear_vartv(&var1);
2566 return FAIL;
2567 }
2568 }
2569 else
2570 range = FALSE;
2571
2572 /* Check for the ']'. */
2573 if (**arg != ']')
2574 {
2575 EMSG(_("E111: Missing ']'"));
2576 clear_vartv(&var1);
2577 if (range)
2578 clear_vartv(&var2);
2579 return FAIL;
2580 }
2581
2582 if (evaluate)
2583 {
2584 if (empty1)
2585 n1 = 0;
2586 else
2587 {
2588 n1 = get_vartv_number(&var1);
2589 clear_vartv(&var1);
2590 }
2591 if (range)
2592 {
2593 if (empty2)
2594 n2 = -1;
2595 else
2596 {
2597 n2 = get_vartv_number(&var2);
2598 clear_vartv(&var2);
2599 }
2600 }
2601
2602 switch (retvar->v_type)
2603 {
2604 case VAR_NUMBER:
2605 case VAR_STRING:
2606 s = get_vartv_string(retvar);
2607 len = (long)STRLEN(s);
2608 if (range)
2609 {
2610 /* The resulting variable is a substring. If the indexes
2611 * are out of range the result is empty. */
2612 if (n1 < 0)
2613 {
2614 n1 = len + n1;
2615 if (n1 < 0)
2616 n1 = 0;
2617 }
2618 if (n2 < 0)
2619 n2 = len + n2;
2620 else if (n2 >= len)
2621 n2 = len;
2622 if (n1 >= len || n2 < 0 || n1 > n2)
2623 s = NULL;
2624 else
2625 s = vim_strnsave(s + n1, (int)(n2 - n1 + 1));
2626 }
2627 else
2628 {
2629 /* The resulting variable is a string of a single
2630 * character. If the index is too big or negative the
2631 * result is empty. */
2632 if (n1 >= len || n1 < 0)
2633 s = NULL;
2634 else
2635 s = vim_strnsave(s + n1, 1);
2636 }
2637 clear_vartv(retvar);
2638 retvar->v_type = VAR_STRING;
2639 retvar->vval.v_string = s;
2640 break;
2641
2642 case VAR_LIST:
2643 len = list_len(retvar->vval.v_list);
2644 if (n1 < 0)
2645 n1 = len + n1;
2646 if (!empty1 && (n1 < 0 || n1 >= len))
2647 {
2648 EMSGN(_(e_listidx), n1);
2649 return FAIL;
2650 }
2651 if (range)
2652 {
2653 listvar *l;
2654 listitem *item;
2655
2656 if (n2 < 0)
2657 n2 = len + n2;
2658 if (!empty2 && (n2 < 0 || n2 >= len || n2 < n1))
2659 {
2660 EMSGN(_(e_listidx), n2);
2661 return FAIL;
2662 }
2663 l = list_alloc();
2664 if (l == NULL)
2665 return FAIL;
2666 for (item = list_find(retvar->vval.v_list, n1);
2667 n1 <= n2; ++n1)
2668 {
2669 if (list_append_tv(l, &item->li_tv) == FAIL)
2670 {
2671 list_free(l);
2672 return FAIL;
2673 }
2674 item = item->li_next;
2675 }
2676 clear_vartv(retvar);
2677 retvar->v_type = VAR_LIST;
2678 retvar->vval.v_list = l;
2679 }
2680 else
2681 {
2682 copy_vartv(&list_find(retvar->vval.v_list, n1)->li_tv,
2683 &var1);
2684 clear_vartv(retvar);
2685 *retvar = var1;
2686 }
2687 break;
2688 }
2689 }
2690
2691 *arg = skipwhite(*arg + 1); /* skip the ']' */
2692 return OK;
2473 } 2693 }
2474 2694
2475 /* 2695 /*
2476 * Get an option value. 2696 * Get an option value.
2477 * "arg" points to the '&' or '+' before the option name. 2697 * "arg" points to the '&' or '+' before the option name.
2478 * "arg" is advanced to character after the option name. 2698 * "arg" is advanced to character after the option name.
2479 * Return OK or FAIL. 2699 * Return OK or FAIL.
2480 */ 2700 */
2481 static int 2701 static int
2482 get_option_var(arg, retvar, evaluate) 2702 get_option_vartv(arg, retvar, evaluate)
2483 char_u **arg; 2703 char_u **arg;
2484 VAR retvar; /* when NULL, only check if option exists */ 2704 typeval *retvar; /* when NULL, only check if option exists */
2485 int evaluate; 2705 int evaluate;
2486 { 2706 {
2487 char_u *option_end; 2707 char_u *option_end;
2488 long numval; 2708 long numval;
2489 char_u *stringval; 2709 char_u *stringval;
2523 } 2743 }
2524 else if (retvar != NULL) 2744 else if (retvar != NULL)
2525 { 2745 {
2526 if (opt_type == -2) /* hidden string option */ 2746 if (opt_type == -2) /* hidden string option */
2527 { 2747 {
2528 retvar->var_type = VAR_STRING; 2748 retvar->v_type = VAR_STRING;
2529 retvar->var_val.var_string = NULL; 2749 retvar->vval.v_string = NULL;
2530 } 2750 }
2531 else if (opt_type == -1) /* hidden number option */ 2751 else if (opt_type == -1) /* hidden number option */
2532 { 2752 {
2533 retvar->var_type = VAR_NUMBER; 2753 retvar->v_type = VAR_NUMBER;
2534 retvar->var_val.var_number = 0; 2754 retvar->vval.v_number = 0;
2535 } 2755 }
2536 else if (opt_type == 1) /* number option */ 2756 else if (opt_type == 1) /* number option */
2537 { 2757 {
2538 retvar->var_type = VAR_NUMBER; 2758 retvar->v_type = VAR_NUMBER;
2539 retvar->var_val.var_number = numval; 2759 retvar->vval.v_number = numval;
2540 } 2760 }
2541 else /* string option */ 2761 else /* string option */
2542 { 2762 {
2543 retvar->var_type = VAR_STRING; 2763 retvar->v_type = VAR_STRING;
2544 retvar->var_val.var_string = stringval; 2764 retvar->vval.v_string = stringval;
2545 } 2765 }
2546 } 2766 }
2547 else if (working && (opt_type == -2 || opt_type == -1)) 2767 else if (working && (opt_type == -2 || opt_type == -1))
2548 ret = FAIL; 2768 ret = FAIL;
2549 2769
2556 /* 2776 /*
2557 * Allocate a variable for a string constant. 2777 * Allocate a variable for a string constant.
2558 * Return OK or FAIL. 2778 * Return OK or FAIL.
2559 */ 2779 */
2560 static int 2780 static int
2561 get_string_var(arg, retvar, evaluate) 2781 get_string_vartv(arg, retvar, evaluate)
2562 char_u **arg; 2782 char_u **arg;
2563 VAR retvar; 2783 typeval *retvar;
2564 int evaluate; 2784 int evaluate;
2565 { 2785 {
2566 char_u *p; 2786 char_u *p;
2567 char_u *name; 2787 char_u *name;
2568 int i; 2788 int i;
2701 #endif 2921 #endif
2702 } 2922 }
2703 name[i] = NUL; 2923 name[i] = NUL;
2704 *arg = p + 1; 2924 *arg = p + 1;
2705 2925
2706 retvar->var_type = VAR_STRING; 2926 retvar->v_type = VAR_STRING;
2707 retvar->var_val.var_string = name; 2927 retvar->vval.v_string = name;
2708 2928
2709 return OK; 2929 return OK;
2710 } 2930 }
2711 2931
2712 /* 2932 /*
2713 * Allocate a variable for an backtick-string constant. 2933 * Allocate a variable for an backtick-string constant.
2714 * Return OK or FAIL. 2934 * Return OK or FAIL.
2715 */ 2935 */
2716 static int 2936 static int
2717 get_lit_string_var(arg, retvar, evaluate) 2937 get_lit_string_vartv(arg, retvar, evaluate)
2718 char_u **arg; 2938 char_u **arg;
2719 VAR retvar; 2939 typeval *retvar;
2720 int evaluate; 2940 int evaluate;
2721 { 2941 {
2722 char_u *p; 2942 char_u *p;
2723 char_u *name; 2943 char_u *name;
2724 2944
2739 */ 2959 */
2740 name = vim_strnsave(*arg + 1, (int)(p - (*arg + 1))); 2960 name = vim_strnsave(*arg + 1, (int)(p - (*arg + 1)));
2741 if (name == NULL) 2961 if (name == NULL)
2742 return FAIL; 2962 return FAIL;
2743 2963
2744 retvar->var_type = VAR_STRING; 2964 retvar->v_type = VAR_STRING;
2745 retvar->var_val.var_string = name; 2965 retvar->vval.v_string = name;
2746 } 2966 }
2747 2967
2748 *arg = p + 1; 2968 *arg = p + 1;
2749 2969
2750 return OK; 2970 return OK;
2971 }
2972
2973 /*
2974 * Allocate a variable for a List and fill it from "*arg".
2975 * Return OK or FAIL.
2976 */
2977 static int
2978 get_list_vartv(arg, retvar, evaluate)
2979 char_u **arg;
2980 typeval *retvar;
2981 int evaluate;
2982 {
2983 listvar *l = NULL;
2984 typeval tv;
2985 listitem *item;
2986
2987 if (evaluate)
2988 {
2989 l = list_alloc();
2990 if (l == NULL)
2991 return FAIL;
2992 }
2993
2994 *arg = skipwhite(*arg + 1);
2995 while (**arg != ']' && **arg != NUL)
2996 {
2997 if (eval1(arg, &tv, evaluate) == FAIL) /* recursive! */
2998 goto failret;
2999 if (evaluate)
3000 {
3001 item = listitem_alloc();
3002 if (item != NULL)
3003 {
3004 item->li_tv = tv;
3005 list_append(l, item);
3006 }
3007 }
3008
3009 if (**arg == ']')
3010 break;
3011 if (**arg != ',')
3012 {
3013 EMSG2(_("E999: Missing comma in list: %s"), *arg);
3014 goto failret;
3015 }
3016 *arg = skipwhite(*arg + 1);
3017 }
3018
3019 if (**arg != ']')
3020 {
3021 EMSG2(_("E999: Missing end of list ']': %s"), *arg);
3022 failret:
3023 if (evaluate)
3024 list_free(l);
3025 return FAIL;
3026 }
3027
3028 *arg = skipwhite(*arg + 1);
3029 if (evaluate)
3030 {
3031 retvar->v_type = VAR_LIST;
3032 retvar->vval.v_list = l;
3033 ++l->lv_refcount;
3034 }
3035
3036 return OK;
3037 }
3038
3039 /*
3040 * Allocate an empty header for a list.
3041 */
3042 static listvar *
3043 list_alloc()
3044 {
3045 return (listvar *)alloc_clear(sizeof(listvar));
3046 }
3047
3048 /*
3049 * Unreference a list: decrement the reference count and free it when it
3050 * becomes zero.
3051 */
3052 static void
3053 list_unref(l)
3054 listvar *l;
3055 {
3056 if (l != NULL && --l->lv_refcount <= 0)
3057 list_free(l);
3058 }
3059
3060 /*
3061 * Free a list, including all items it points to.
3062 * Ignores the reference count.
3063 */
3064 static void
3065 list_free(l)
3066 listvar *l;
3067 {
3068 listitem *item;
3069 listitem *next;
3070
3071 for (item = l->lv_first; item != NULL; item = next)
3072 {
3073 next = item->li_next;
3074 listitem_free(item);
3075 }
3076 vim_free(l);
3077 }
3078
3079 /*
3080 * Allocate a list item.
3081 */
3082 static listitem *
3083 listitem_alloc()
3084 {
3085 return (listitem *)alloc(sizeof(listitem));
3086 }
3087
3088 /*
3089 * Free a list item. Also clears the value;
3090 */
3091 static void
3092 listitem_free(item)
3093 listitem *item;
3094 {
3095 clear_vartv(&item->li_tv);
3096 vim_free(item);
3097 }
3098
3099 /*
3100 * Get the number of items in a list.
3101 */
3102 static long
3103 list_len(l)
3104 listvar *l;
3105 {
3106 listitem *item;
3107 long len = 0;
3108
3109 if (l == NULL)
3110 return 0L;
3111 for (item = l->lv_first; item != NULL; item = item->li_next)
3112 ++len;
3113 return len;
3114 }
3115
3116 /*
3117 * Locate item with index "n" in list "l" and return it.
3118 * A negative index is counted from the end; -1 is the last item.
3119 * Returns NULL when "n" is out of range.
3120 */
3121 static listitem *
3122 list_find(l, n)
3123 listvar *l;
3124 long n;
3125 {
3126 listitem *item;
3127 long idx;
3128
3129 if (l == NULL)
3130 return NULL;
3131 if (n < 0)
3132 {
3133 idx = -1; /* search from the end */
3134 for (item = l->lv_last; item != NULL && idx > n; item = item->li_prev)
3135 --idx;
3136 }
3137 else
3138 {
3139 idx = 0; /* search from the start */
3140 for (item = l->lv_first; item != NULL && idx < n; item = item->li_next)
3141 ++idx;
3142 }
3143 if (idx != n)
3144 return NULL;
3145 return item;
3146 }
3147
3148 /*
3149 * Append item "item" to the end of list "l".
3150 */
3151 static void
3152 list_append(l, item)
3153 listvar *l;
3154 listitem *item;
3155 {
3156 if (l->lv_last == NULL)
3157 {
3158 /* empty list */
3159 l->lv_first = item;
3160 l->lv_last = item;
3161 item->li_prev = NULL;
3162 }
3163 else
3164 {
3165 l->lv_last->li_next = item;
3166 item->li_prev = l->lv_last;
3167 l->lv_last = item;
3168 }
3169 item->li_next = NULL;
3170 }
3171
3172 /*
3173 * Append typeval "tv" to the end of list "l".
3174 */
3175 static int
3176 list_append_tv(l, tv)
3177 listvar *l;
3178 typeval *tv;
3179 {
3180 listitem *ni = listitem_alloc();
3181
3182 if (ni == NULL)
3183 return FAIL;
3184 copy_vartv(tv, &ni->li_tv);
3185 list_append(l, ni);
3186 return OK;
3187 }
3188
3189 /*
3190 * Make a copy of list "l". Shallow if "deep" is FALSE.
3191 * The refcount of the new list is set to 1.
3192 * Returns NULL when out of memory.
3193 */
3194 static listvar *
3195 list_copy(orig, deep)
3196 listvar *orig;
3197 int deep;
3198 {
3199 listvar *copy;
3200 listitem *item;
3201 listitem *ni;
3202 static int recurse = 0;
3203
3204 if (orig == NULL)
3205 return NULL;
3206 if (recurse >= VAR_LIST_MAXNEST)
3207 {
3208 EMSG(_("E999: List nested too deep for making a copy"));
3209 return NULL;
3210 }
3211 ++recurse;
3212
3213 copy = list_alloc();
3214 if (copy != NULL)
3215 {
3216 for (item = orig->lv_first; item != NULL; item = item->li_next)
3217 {
3218 ni = listitem_alloc();
3219 if (ni == NULL)
3220 break;
3221 if (deep && item->li_tv.v_type == VAR_LIST)
3222 {
3223 ni->li_tv.v_type = VAR_LIST;
3224 ni->li_tv.vval.v_list = list_copy(item->li_tv.vval.v_list,
3225 TRUE);
3226 if (ni->li_tv.vval.v_list == NULL)
3227 {
3228 vim_free(ni);
3229 break;
3230 }
3231 }
3232 else
3233 copy_vartv(&item->li_tv, &ni->li_tv);
3234 list_append(copy, ni);
3235 }
3236 ++copy->lv_refcount;
3237 }
3238
3239 --recurse;
3240 return copy;
3241 }
3242
3243 /*
3244 * Remove item with index "n" from list "l" and return it.
3245 * Returns NULL when "n" is out of range.
3246 */
3247 static listitem *
3248 list_getrem(l, n)
3249 listvar *l;
3250 long n;
3251 {
3252 listitem *item;
3253
3254 item = list_find(l, n);
3255 if (item != NULL)
3256 {
3257 if (item->li_next == NULL)
3258 l->lv_last = item->li_prev;
3259 else
3260 item->li_next->li_prev = item->li_prev;
3261 if (item->li_prev == NULL)
3262 l->lv_first = item->li_next;
3263 else
3264 item->li_prev->li_next = item->li_next;
3265 }
3266 return item;
3267 }
3268
3269 /*
3270 * Return an allocated string with the string representation of a list.
3271 * May return NULL.
3272 */
3273 static char_u *
3274 list2string(tv)
3275 typeval *tv;
3276 {
3277 garray_T ga;
3278 listitem *item;
3279 int first = TRUE;
3280 char_u *tofree;
3281 char_u *s;
3282
3283 if (tv->vval.v_list == NULL)
3284 return NULL;
3285 ga_init2(&ga, (int)sizeof(char), 80);
3286 ga_append(&ga, '[');
3287
3288 for (item = tv->vval.v_list->lv_first; item != NULL; item = item->li_next)
3289 {
3290 if (first)
3291 first = FALSE;
3292 else
3293 ga_concat(&ga, (char_u *)", ");
3294
3295 s = tv2string(&item->li_tv, &tofree);
3296 if (s != NULL)
3297 ga_concat(&ga, s);
3298 vim_free(tofree);
3299 }
3300
3301 ga_append(&ga, ']');
3302 ga_append(&ga, NUL);
3303 return (char_u *)ga.ga_data;
3304 }
3305
3306 /*
3307 * Return a string with the string representation of a variable.
3308 * If the memory is allocated "tofree" is set to it, otherwise NULL.
3309 * Can only be used once before the value is used, it may call
3310 * get_var_string().
3311 * May return NULL;
3312 */
3313 static char_u *
3314 tv2string(tv, tofree)
3315 typeval *tv;
3316 char_u **tofree;
3317 {
3318 switch (tv->v_type)
3319 {
3320 case VAR_FUNC:
3321 *tofree = NULL;
3322 return tv->vval.v_string;
3323 case VAR_LIST:
3324 *tofree = list2string(tv);
3325 return *tofree;
3326 default:
3327 break;
3328 }
3329 *tofree = NULL;
3330 return get_vartv_string(tv);
2751 } 3331 }
2752 3332
2753 /* 3333 /*
2754 * Get the value of an environment variable. 3334 * Get the value of an environment variable.
2755 * "arg" is pointing to the '$'. It is advanced to after the name. 3335 * "arg" is pointing to the '$'. It is advanced to after the name.
2756 * If the environment variable was not set, silently assume it is empty. 3336 * If the environment variable was not set, silently assume it is empty.
2757 * Always return OK. 3337 * Always return OK.
2758 */ 3338 */
2759 static int 3339 static int
2760 get_env_var(arg, retvar, evaluate) 3340 get_env_vartv(arg, retvar, evaluate)
2761 char_u **arg; 3341 char_u **arg;
2762 VAR retvar; 3342 typeval *retvar;
2763 int evaluate; 3343 int evaluate;
2764 { 3344 {
2765 char_u *string = NULL; 3345 char_u *string = NULL;
2766 int len; 3346 int len;
2767 int cc; 3347 int cc;
2790 string = NULL; 3370 string = NULL;
2791 } 3371 }
2792 } 3372 }
2793 name[len] = cc; 3373 name[len] = cc;
2794 } 3374 }
2795 retvar->var_type = VAR_STRING; 3375 retvar->v_type = VAR_STRING;
2796 retvar->var_val.var_string = string; 3376 retvar->vval.v_string = string;
2797 } 3377 }
2798 3378
2799 return OK; 3379 return OK;
2800 } 3380 }
2801 3381
2806 static struct fst 3386 static struct fst
2807 { 3387 {
2808 char *f_name; /* function name */ 3388 char *f_name; /* function name */
2809 char f_min_argc; /* minimal number of arguments */ 3389 char f_min_argc; /* minimal number of arguments */
2810 char f_max_argc; /* maximal number of arguments */ 3390 char f_max_argc; /* maximal number of arguments */
2811 void (*f_func) __ARGS((VAR args, VAR rvar)); /* impl. function */ 3391 void (*f_func) __ARGS((typeval *args, typeval *rvar));
3392 /* implemenation of function */
2812 } functions[] = 3393 } functions[] =
2813 { 3394 {
2814 {"append", 2, 2, f_append}, 3395 {"append", 2, 2, f_append},
2815 {"argc", 0, 0, f_argc}, 3396 {"argc", 0, 0, f_argc},
2816 {"argidx", 0, 0, f_argidx}, 3397 {"argidx", 0, 0, f_argidx},
2830 {"byteidx", 2, 2, f_byteidx}, 3411 {"byteidx", 2, 2, f_byteidx},
2831 {"char2nr", 1, 1, f_char2nr}, 3412 {"char2nr", 1, 1, f_char2nr},
2832 {"cindent", 1, 1, f_cindent}, 3413 {"cindent", 1, 1, f_cindent},
2833 {"col", 1, 1, f_col}, 3414 {"col", 1, 1, f_col},
2834 {"confirm", 1, 4, f_confirm}, 3415 {"confirm", 1, 4, f_confirm},
3416 {"copy", 1, 1, f_copy},
2835 {"cscope_connection",0,3, f_cscope_connection}, 3417 {"cscope_connection",0,3, f_cscope_connection},
2836 {"cursor", 2, 2, f_cursor}, 3418 {"cursor", 2, 2, f_cursor},
3419 {"deepcopy", 1, 1, f_deepcopy},
2837 {"delete", 1, 1, f_delete}, 3420 {"delete", 1, 1, f_delete},
2838 {"did_filetype", 0, 0, f_did_filetype}, 3421 {"did_filetype", 0, 0, f_did_filetype},
2839 {"diff_filler", 1, 1, f_diff_filler}, 3422 {"diff_filler", 1, 1, f_diff_filler},
2840 {"diff_hlID", 2, 2, f_diff_hlID}, 3423 {"diff_hlID", 2, 2, f_diff_hlID},
2841 {"escape", 2, 2, f_escape}, 3424 {"escape", 2, 2, f_escape},
2853 {"foldclosedend", 1, 1, f_foldclosedend}, 3436 {"foldclosedend", 1, 1, f_foldclosedend},
2854 {"foldlevel", 1, 1, f_foldlevel}, 3437 {"foldlevel", 1, 1, f_foldlevel},
2855 {"foldtext", 0, 0, f_foldtext}, 3438 {"foldtext", 0, 0, f_foldtext},
2856 {"foldtextresult", 1, 1, f_foldtextresult}, 3439 {"foldtextresult", 1, 1, f_foldtextresult},
2857 {"foreground", 0, 0, f_foreground}, 3440 {"foreground", 0, 0, f_foreground},
3441 {"function", 1, 1, f_function},
2858 {"getbufvar", 2, 2, f_getbufvar}, 3442 {"getbufvar", 2, 2, f_getbufvar},
2859 {"getchar", 0, 1, f_getchar}, 3443 {"getchar", 0, 1, f_getchar},
2860 {"getcharmod", 0, 0, f_getcharmod}, 3444 {"getcharmod", 0, 0, f_getcharmod},
2861 {"getcmdline", 0, 0, f_getcmdline}, 3445 {"getcmdline", 0, 0, f_getcmdline},
2862 {"getcmdpos", 0, 0, f_getcmdpos}, 3446 {"getcmdpos", 0, 0, f_getcmdpos},
2890 {"input", 1, 2, f_input}, 3474 {"input", 1, 2, f_input},
2891 {"inputdialog", 1, 3, f_inputdialog}, 3475 {"inputdialog", 1, 3, f_inputdialog},
2892 {"inputrestore", 0, 0, f_inputrestore}, 3476 {"inputrestore", 0, 0, f_inputrestore},
2893 {"inputsave", 0, 0, f_inputsave}, 3477 {"inputsave", 0, 0, f_inputsave},
2894 {"inputsecret", 1, 2, f_inputsecret}, 3478 {"inputsecret", 1, 2, f_inputsecret},
3479 {"insert", 2, 3, f_insert},
2895 {"isdirectory", 1, 1, f_isdirectory}, 3480 {"isdirectory", 1, 1, f_isdirectory},
2896 {"last_buffer_nr", 0, 0, f_last_buffer_nr},/* obsolete */ 3481 {"last_buffer_nr", 0, 0, f_last_buffer_nr},/* obsolete */
3482 {"len", 1, 1, f_len},
2897 {"libcall", 3, 3, f_libcall}, 3483 {"libcall", 3, 3, f_libcall},
2898 {"libcallnr", 3, 3, f_libcallnr}, 3484 {"libcallnr", 3, 3, f_libcallnr},
2899 {"line", 1, 1, f_line}, 3485 {"line", 1, 1, f_line},
2900 {"line2byte", 1, 1, f_line2byte}, 3486 {"line2byte", 1, 1, f_line2byte},
2901 {"lispindent", 1, 1, f_lispindent}, 3487 {"lispindent", 1, 1, f_lispindent},
2912 {"remote_expr", 2, 3, f_remote_expr}, 3498 {"remote_expr", 2, 3, f_remote_expr},
2913 {"remote_foreground", 1, 1, f_remote_foreground}, 3499 {"remote_foreground", 1, 1, f_remote_foreground},
2914 {"remote_peek", 1, 2, f_remote_peek}, 3500 {"remote_peek", 1, 2, f_remote_peek},
2915 {"remote_read", 1, 1, f_remote_read}, 3501 {"remote_read", 1, 1, f_remote_read},
2916 {"remote_send", 2, 3, f_remote_send}, 3502 {"remote_send", 2, 3, f_remote_send},
3503 {"remove", 2, 2, f_remove},
2917 {"rename", 2, 2, f_rename}, 3504 {"rename", 2, 2, f_rename},
2918 {"repeat", 2, 2, f_repeat}, 3505 {"repeat", 2, 2, f_repeat},
2919 {"resolve", 1, 1, f_resolve}, 3506 {"resolve", 1, 1, f_resolve},
2920 {"search", 1, 2, f_search}, 3507 {"search", 1, 2, f_search},
2921 {"searchpair", 3, 5, f_searchpair}, 3508 {"searchpair", 3, 5, f_searchpair},
2929 {"simplify", 1, 1, f_simplify}, 3516 {"simplify", 1, 1, f_simplify},
2930 #ifdef HAVE_STRFTIME 3517 #ifdef HAVE_STRFTIME
2931 {"strftime", 1, 2, f_strftime}, 3518 {"strftime", 1, 2, f_strftime},
2932 #endif 3519 #endif
2933 {"stridx", 2, 2, f_stridx}, 3520 {"stridx", 2, 2, f_stridx},
3521 {"string", 1, 1, f_string},
2934 {"strlen", 1, 1, f_strlen}, 3522 {"strlen", 1, 1, f_strlen},
2935 {"strpart", 2, 3, f_strpart}, 3523 {"strpart", 2, 3, f_strpart},
2936 {"strridx", 2, 2, f_strridx}, 3524 {"strridx", 2, 2, f_strridx},
2937 {"strtrans", 1, 1, f_strtrans}, 3525 {"strtrans", 1, 1, f_strtrans},
2938 {"submatch", 1, 1, f_submatch}, 3526 {"submatch", 1, 1, f_submatch},
3046 } 3634 }
3047 return -1; 3635 return -1;
3048 } 3636 }
3049 3637
3050 /* 3638 /*
3639 * Check if "name" is a variable of type VAR_FUNC. If so, return the function
3640 * name it contains, otherwise return "name".
3641 */
3642 static char_u *
3643 deref_func_name(name, lenp)
3644 char_u *name;
3645 int *lenp;
3646 {
3647 VAR v;
3648 int cc;
3649
3650 cc = name[*lenp];
3651 name[*lenp] = NUL;
3652 v = find_var(name, FALSE);
3653 name[*lenp] = cc;
3654 if (v != NULL && v->tv.v_type == VAR_FUNC)
3655 {
3656 if (v->tv.vval.v_string == NULL)
3657 {
3658 *lenp = 0;
3659 return (char_u *)""; /* just in case */
3660 }
3661 *lenp = STRLEN(v->tv.vval.v_string);
3662 return v->tv.vval.v_string;
3663 }
3664
3665 return name;
3666 }
3667
3668 /*
3051 * Allocate a variable for the result of a function. 3669 * Allocate a variable for the result of a function.
3052 * Return OK or FAIL. 3670 * Return OK or FAIL.
3053 */ 3671 */
3054 static int 3672 static int
3055 get_func_var(name, len, retvar, arg, firstline, lastline, doesrange, evaluate) 3673 get_func_vartv(name, len, retvar, arg, firstline, lastline, doesrange, evaluate)
3056 char_u *name; /* name of the function */ 3674 char_u *name; /* name of the function */
3057 int len; /* length of "name" */ 3675 int len; /* length of "name" */
3058 VAR retvar; 3676 typeval *retvar;
3059 char_u **arg; /* argument, pointing to the '(' */ 3677 char_u **arg; /* argument, pointing to the '(' */
3060 linenr_T firstline; /* first line of range */ 3678 linenr_T firstline; /* first line of range */
3061 linenr_T lastline; /* last line of range */ 3679 linenr_T lastline; /* last line of range */
3062 int *doesrange; /* return: function handled range */ 3680 int *doesrange; /* return: function handled range */
3063 int evaluate; 3681 int evaluate;
3064 { 3682 {
3065 char_u *argp; 3683 char_u *argp;
3066 int ret = OK; 3684 int ret = OK;
3067 #define MAX_FUNC_ARGS 20 3685 #define MAX_FUNC_ARGS 20
3068 var argvars[MAX_FUNC_ARGS]; /* vars for arguments */ 3686 typeval argvars[MAX_FUNC_ARGS]; /* vars for arguments */
3069 int argcount = 0; /* number of arguments found */ 3687 int argcount = 0; /* number of arguments found */
3070 3688
3071 /* 3689 /*
3072 * Get the arguments. 3690 * Get the arguments.
3073 */ 3691 */
3075 while (argcount < MAX_FUNC_ARGS) 3693 while (argcount < MAX_FUNC_ARGS)
3076 { 3694 {
3077 argp = skipwhite(argp + 1); /* skip the '(' or ',' */ 3695 argp = skipwhite(argp + 1); /* skip the '(' or ',' */
3078 if (*argp == ')' || *argp == ',' || *argp == NUL) 3696 if (*argp == ')' || *argp == ',' || *argp == NUL)
3079 break; 3697 break;
3080 argvars[argcount].var_name = NULL; /* the name is not stored */
3081 if (eval1(&argp, &argvars[argcount], evaluate) == FAIL) 3698 if (eval1(&argp, &argvars[argcount], evaluate) == FAIL)
3082 { 3699 {
3083 ret = FAIL; 3700 ret = FAIL;
3084 break; 3701 break;
3085 } 3702 }
3097 firstline, lastline, doesrange, evaluate); 3714 firstline, lastline, doesrange, evaluate);
3098 else if (!aborting()) 3715 else if (!aborting())
3099 EMSG2(_("E116: Invalid arguments for function %s"), name); 3716 EMSG2(_("E116: Invalid arguments for function %s"), name);
3100 3717
3101 while (--argcount >= 0) 3718 while (--argcount >= 0)
3102 clear_var(&argvars[argcount]); 3719 clear_vartv(&argvars[argcount]);
3103 3720
3104 *arg = skipwhite(argp); 3721 *arg = skipwhite(argp);
3105 return ret; 3722 return ret;
3106 } 3723 }
3107 3724
3113 static int 3730 static int
3114 call_func(name, len, retvar, argcount, argvars, firstline, lastline, 3731 call_func(name, len, retvar, argcount, argvars, firstline, lastline,
3115 doesrange, evaluate) 3732 doesrange, evaluate)
3116 char_u *name; /* name of the function */ 3733 char_u *name; /* name of the function */
3117 int len; /* length of "name" */ 3734 int len; /* length of "name" */
3118 VAR retvar; /* return value goes here */ 3735 typeval *retvar; /* return value goes here */
3119 int argcount; /* number of "argvars" */ 3736 int argcount; /* number of "argvars" */
3120 VAR argvars; /* vars for arguments */ 3737 typeval *argvars; /* vars for arguments */
3121 linenr_T firstline; /* first line of range */ 3738 linenr_T firstline; /* first line of range */
3122 linenr_T lastline; /* last line of range */ 3739 linenr_T lastline; /* last line of range */
3123 int *doesrange; /* return: function handled range */ 3740 int *doesrange; /* return: function handled range */
3124 int evaluate; 3741 int evaluate;
3125 { 3742 {
3193 3810
3194 3811
3195 /* execute the function if no errors detected and executing */ 3812 /* execute the function if no errors detected and executing */
3196 if (evaluate && error == ERROR_NONE) 3813 if (evaluate && error == ERROR_NONE)
3197 { 3814 {
3198 retvar->var_type = VAR_NUMBER; /* default is number retvar */ 3815 retvar->v_type = VAR_NUMBER; /* default is number retvar */
3199 error = ERROR_UNKNOWN; 3816 error = ERROR_UNKNOWN;
3200 3817
3201 if (!ASCII_ISLOWER(fname[0])) 3818 if (!ASCII_ISLOWER(fname[0]))
3202 { 3819 {
3203 /* 3820 /*
3255 error = ERROR_TOOFEW; 3872 error = ERROR_TOOFEW;
3256 else if (argcount > functions[i].f_max_argc) 3873 else if (argcount > functions[i].f_max_argc)
3257 error = ERROR_TOOMANY; 3874 error = ERROR_TOOMANY;
3258 else 3875 else
3259 { 3876 {
3260 argvars[argcount].var_type = VAR_UNKNOWN; 3877 argvars[argcount].v_type = VAR_UNKNOWN;
3261 functions[i].f_func(argvars, retvar); 3878 functions[i].f_func(argvars, retvar);
3262 error = ERROR_NONE; 3879 error = ERROR_NONE;
3263 } 3880 }
3264 } 3881 }
3265 } 3882 }
3296 * Implementation of the built-in functions 3913 * Implementation of the built-in functions
3297 */ 3914 */
3298 3915
3299 /* 3916 /*
3300 * "append(lnum, string)" function 3917 * "append(lnum, string)" function
3918 * or "append(list, item)" function
3301 */ 3919 */
3302 static void 3920 static void
3303 f_append(argvars, retvar) 3921 f_append(argvars, retvar)
3304 VAR argvars; 3922 typeval *argvars;
3305 VAR retvar; 3923 typeval *retvar;
3306 { 3924 {
3307 long lnum; 3925 long lnum;
3308 3926
3309 lnum = get_var_lnum(argvars); 3927 retvar->vval.v_number = 1; /* Default: Failed */
3310 retvar->var_val.var_number = 1; /* Default: Failed */ 3928 if (argvars[0].v_type == VAR_LIST)
3311 3929 {
3312 if (lnum >= 0 3930 if (argvars[0].vval.v_list != NULL
3313 && lnum <= curbuf->b_ml.ml_line_count 3931 && list_append_tv(argvars[0].vval.v_list, &argvars[1]) == OK)
3314 && u_save(lnum, lnum + 1) == OK) 3932 copy_vartv(&argvars[0], retvar);
3315 { 3933 }
3316 ml_append(lnum, get_var_string(&argvars[1]), (colnr_T)0, FALSE); 3934 else
3317 if (curwin->w_cursor.lnum > lnum) 3935 {
3318 ++curwin->w_cursor.lnum; 3936 lnum = get_vartv_lnum(argvars);
3319 appended_lines_mark(lnum, 1L); 3937 if (lnum >= 0
3320 retvar->var_val.var_number = 0; 3938 && lnum <= curbuf->b_ml.ml_line_count
3939 && u_save(lnum, lnum + 1) == OK)
3940 {
3941 ml_append(lnum, get_vartv_string(&argvars[1]), (colnr_T)0, FALSE);
3942 if (curwin->w_cursor.lnum > lnum)
3943 ++curwin->w_cursor.lnum;
3944 appended_lines_mark(lnum, 1L);
3945 retvar->vval.v_number = 0;
3946 }
3321 } 3947 }
3322 } 3948 }
3323 3949
3324 /* 3950 /*
3325 * "argc()" function 3951 * "argc()" function
3326 */ 3952 */
3327 /* ARGSUSED */ 3953 /* ARGSUSED */
3328 static void 3954 static void
3329 f_argc(argvars, retvar) 3955 f_argc(argvars, retvar)
3330 VAR argvars; 3956 typeval *argvars;
3331 VAR retvar; 3957 typeval *retvar;
3332 { 3958 {
3333 retvar->var_val.var_number = ARGCOUNT; 3959 retvar->vval.v_number = ARGCOUNT;
3334 } 3960 }
3335 3961
3336 /* 3962 /*
3337 * "argidx()" function 3963 * "argidx()" function
3338 */ 3964 */
3339 /* ARGSUSED */ 3965 /* ARGSUSED */
3340 static void 3966 static void
3341 f_argidx(argvars, retvar) 3967 f_argidx(argvars, retvar)
3342 VAR argvars; 3968 typeval *argvars;
3343 VAR retvar; 3969 typeval *retvar;
3344 { 3970 {
3345 retvar->var_val.var_number = curwin->w_arg_idx; 3971 retvar->vval.v_number = curwin->w_arg_idx;
3346 } 3972 }
3347 3973
3348 /* 3974 /*
3349 * "argv(nr)" function 3975 * "argv(nr)" function
3350 */ 3976 */
3351 static void 3977 static void
3352 f_argv(argvars, retvar) 3978 f_argv(argvars, retvar)
3353 VAR argvars; 3979 typeval *argvars;
3354 VAR retvar; 3980 typeval *retvar;
3355 { 3981 {
3356 int idx; 3982 int idx;
3357 3983
3358 idx = get_var_number(&argvars[0]); 3984 idx = get_vartv_number(&argvars[0]);
3359 if (idx >= 0 && idx < ARGCOUNT) 3985 if (idx >= 0 && idx < ARGCOUNT)
3360 retvar->var_val.var_string = vim_strsave(alist_name(&ARGLIST[idx])); 3986 retvar->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
3361 else 3987 else
3362 retvar->var_val.var_string = NULL; 3988 retvar->vval.v_string = NULL;
3363 retvar->var_type = VAR_STRING; 3989 retvar->v_type = VAR_STRING;
3364 } 3990 }
3365 3991
3366 /* 3992 /*
3367 * "browse(save, title, initdir, default)" function 3993 * "browse(save, title, initdir, default)" function
3368 */ 3994 */
3369 /* ARGSUSED */ 3995 /* ARGSUSED */
3370 static void 3996 static void
3371 f_browse(argvars, retvar) 3997 f_browse(argvars, retvar)
3372 VAR argvars; 3998 typeval *argvars;
3373 VAR retvar; 3999 typeval *retvar;
3374 { 4000 {
3375 #ifdef FEAT_BROWSE 4001 #ifdef FEAT_BROWSE
3376 int save; 4002 int save;
3377 char_u *title; 4003 char_u *title;
3378 char_u *initdir; 4004 char_u *initdir;
3379 char_u *defname; 4005 char_u *defname;
3380 char_u buf[NUMBUFLEN]; 4006 char_u buf[NUMBUFLEN];
3381 char_u buf2[NUMBUFLEN]; 4007 char_u buf2[NUMBUFLEN];
3382 4008
3383 save = get_var_number(&argvars[0]); 4009 save = get_vartv_number(&argvars[0]);
3384 title = get_var_string(&argvars[1]); 4010 title = get_vartv_string(&argvars[1]);
3385 initdir = get_var_string_buf(&argvars[2], buf); 4011 initdir = get_vartv_string_buf(&argvars[2], buf);
3386 defname = get_var_string_buf(&argvars[3], buf2); 4012 defname = get_vartv_string_buf(&argvars[3], buf2);
3387 4013
3388 retvar->var_val.var_string = 4014 retvar->vval.v_string =
3389 do_browse(save ? BROWSE_SAVE : 0, 4015 do_browse(save ? BROWSE_SAVE : 0,
3390 title, defname, NULL, initdir, NULL, curbuf); 4016 title, defname, NULL, initdir, NULL, curbuf);
3391 #else 4017 #else
3392 retvar->var_val.var_string = NULL; 4018 retvar->vval.v_string = NULL;
3393 #endif 4019 #endif
3394 retvar->var_type = VAR_STRING; 4020 retvar->v_type = VAR_STRING;
3395 } 4021 }
3396 4022
3397 /* 4023 /*
3398 * "browsedir(title, initdir)" function 4024 * "browsedir(title, initdir)" function
3399 */ 4025 */
3400 /* ARGSUSED */ 4026 /* ARGSUSED */
3401 static void 4027 static void
3402 f_browsedir(argvars, retvar) 4028 f_browsedir(argvars, retvar)
3403 VAR argvars; 4029 typeval *argvars;
3404 VAR retvar; 4030 typeval *retvar;
3405 { 4031 {
3406 #ifdef FEAT_BROWSE 4032 #ifdef FEAT_BROWSE
3407 char_u *title; 4033 char_u *title;
3408 char_u *initdir; 4034 char_u *initdir;
3409 char_u buf[NUMBUFLEN]; 4035 char_u buf[NUMBUFLEN];
3410 4036
3411 title = get_var_string(&argvars[0]); 4037 title = get_vartv_string(&argvars[0]);
3412 initdir = get_var_string_buf(&argvars[1], buf); 4038 initdir = get_vartv_string_buf(&argvars[1], buf);
3413 4039
3414 retvar->var_val.var_string = do_browse(BROWSE_DIR, 4040 retvar->vval.v_string = do_browse(BROWSE_DIR,
3415 title, NULL, NULL, initdir, NULL, curbuf); 4041 title, NULL, NULL, initdir, NULL, curbuf);
3416 #else 4042 #else
3417 retvar->var_val.var_string = NULL; 4043 retvar->vval.v_string = NULL;
3418 #endif 4044 #endif
3419 retvar->var_type = VAR_STRING; 4045 retvar->v_type = VAR_STRING;
3420 } 4046 }
3421 4047
3422 /* 4048 /*
3423 * Find a buffer by number or exact name. 4049 * Find a buffer by number or exact name.
3424 */ 4050 */
3425 static buf_T * 4051 static buf_T *
3426 find_buffer(avar) 4052 find_buffer(avar)
3427 VAR avar; 4053 typeval *avar;
3428 { 4054 {
3429 buf_T *buf = NULL; 4055 buf_T *buf = NULL;
3430 4056
3431 if (avar->var_type == VAR_NUMBER) 4057 if (avar->v_type == VAR_NUMBER)
3432 buf = buflist_findnr((int)avar->var_val.var_number); 4058 buf = buflist_findnr((int)avar->vval.v_number);
3433 else if (avar->var_val.var_string != NULL) 4059 else if (avar->vval.v_string != NULL)
3434 { 4060 {
3435 buf = buflist_findname_exp(avar->var_val.var_string); 4061 buf = buflist_findname_exp(avar->vval.v_string);
3436 if (buf == NULL) 4062 if (buf == NULL)
3437 { 4063 {
3438 /* No full path name match, try a match with a URL or a "nofile" 4064 /* No full path name match, try a match with a URL or a "nofile"
3439 * buffer, these don't use the full path. */ 4065 * buffer, these don't use the full path. */
3440 for (buf = firstbuf; buf != NULL; buf = buf->b_next) 4066 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
3442 && (path_with_url(buf->b_fname) 4068 && (path_with_url(buf->b_fname)
3443 #ifdef FEAT_QUICKFIX 4069 #ifdef FEAT_QUICKFIX
3444 || bt_nofile(buf) 4070 || bt_nofile(buf)
3445 #endif 4071 #endif
3446 ) 4072 )
3447 && STRCMP(buf->b_fname, avar->var_val.var_string) == 0) 4073 && STRCMP(buf->b_fname, avar->vval.v_string) == 0)
3448 break; 4074 break;
3449 } 4075 }
3450 } 4076 }
3451 return buf; 4077 return buf;
3452 } 4078 }
3454 /* 4080 /*
3455 * "bufexists(expr)" function 4081 * "bufexists(expr)" function
3456 */ 4082 */
3457 static void 4083 static void
3458 f_bufexists(argvars, retvar) 4084 f_bufexists(argvars, retvar)
3459 VAR argvars; 4085 typeval *argvars;
3460 VAR retvar; 4086 typeval *retvar;
3461 { 4087 {
3462 retvar->var_val.var_number = (find_buffer(&argvars[0]) != NULL); 4088 retvar->vval.v_number = (find_buffer(&argvars[0]) != NULL);
3463 } 4089 }
3464 4090
3465 /* 4091 /*
3466 * "buflisted(expr)" function 4092 * "buflisted(expr)" function
3467 */ 4093 */
3468 static void 4094 static void
3469 f_buflisted(argvars, retvar) 4095 f_buflisted(argvars, retvar)
3470 VAR argvars; 4096 typeval *argvars;
3471 VAR retvar; 4097 typeval *retvar;
3472 { 4098 {
3473 buf_T *buf; 4099 buf_T *buf;
3474 4100
3475 buf = find_buffer(&argvars[0]); 4101 buf = find_buffer(&argvars[0]);
3476 retvar->var_val.var_number = (buf != NULL && buf->b_p_bl); 4102 retvar->vval.v_number = (buf != NULL && buf->b_p_bl);
3477 } 4103 }
3478 4104
3479 /* 4105 /*
3480 * "bufloaded(expr)" function 4106 * "bufloaded(expr)" function
3481 */ 4107 */
3482 static void 4108 static void
3483 f_bufloaded(argvars, retvar) 4109 f_bufloaded(argvars, retvar)
3484 VAR argvars; 4110 typeval *argvars;
3485 VAR retvar; 4111 typeval *retvar;
3486 { 4112 {
3487 buf_T *buf; 4113 buf_T *buf;
3488 4114
3489 buf = find_buffer(&argvars[0]); 4115 buf = find_buffer(&argvars[0]);
3490 retvar->var_val.var_number = (buf != NULL && buf->b_ml.ml_mfp != NULL); 4116 retvar->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
3491 } 4117 }
3492 4118
3493 /* 4119 /*
3494 * Get buffer by number or pattern. 4120 * Get buffer by number or pattern.
3495 */ 4121 */
3496 static buf_T * 4122 static buf_T *
3497 get_buf_var(avar) 4123 get_buf_vartv(avar)
3498 VAR avar; 4124 typeval *avar;
3499 { 4125 {
3500 char_u *name = avar->var_val.var_string; 4126 char_u *name = avar->vval.v_string;
3501 int save_magic; 4127 int save_magic;
3502 char_u *save_cpo; 4128 char_u *save_cpo;
3503 buf_T *buf; 4129 buf_T *buf;
3504 4130
3505 if (avar->var_type == VAR_NUMBER) 4131 if (avar->v_type == VAR_NUMBER)
3506 return buflist_findnr((int)avar->var_val.var_number); 4132 return buflist_findnr((int)avar->vval.v_number);
3507 if (name == NULL || *name == NUL) 4133 if (name == NULL || *name == NUL)
3508 return curbuf; 4134 return curbuf;
3509 if (name[0] == '$' && name[1] == NUL) 4135 if (name[0] == '$' && name[1] == NUL)
3510 return lastbuf; 4136 return lastbuf;
3511 4137
3531 /* 4157 /*
3532 * "bufname(expr)" function 4158 * "bufname(expr)" function
3533 */ 4159 */
3534 static void 4160 static void
3535 f_bufname(argvars, retvar) 4161 f_bufname(argvars, retvar)
3536 VAR argvars; 4162 typeval *argvars;
3537 VAR retvar; 4163 typeval *retvar;
3538 { 4164 {
3539 buf_T *buf; 4165 buf_T *buf;
3540 4166
3541 ++emsg_off; 4167 ++emsg_off;
3542 buf = get_buf_var(&argvars[0]); 4168 buf = get_buf_vartv(&argvars[0]);
3543 retvar->var_type = VAR_STRING; 4169 retvar->v_type = VAR_STRING;
3544 if (buf != NULL && buf->b_fname != NULL) 4170 if (buf != NULL && buf->b_fname != NULL)
3545 retvar->var_val.var_string = vim_strsave(buf->b_fname); 4171 retvar->vval.v_string = vim_strsave(buf->b_fname);
3546 else 4172 else
3547 retvar->var_val.var_string = NULL; 4173 retvar->vval.v_string = NULL;
3548 --emsg_off; 4174 --emsg_off;
3549 } 4175 }
3550 4176
3551 /* 4177 /*
3552 * "bufnr(expr)" function 4178 * "bufnr(expr)" function
3553 */ 4179 */
3554 static void 4180 static void
3555 f_bufnr(argvars, retvar) 4181 f_bufnr(argvars, retvar)
3556 VAR argvars; 4182 typeval *argvars;
3557 VAR retvar; 4183 typeval *retvar;
3558 { 4184 {
3559 buf_T *buf; 4185 buf_T *buf;
3560 4186
3561 ++emsg_off; 4187 ++emsg_off;
3562 buf = get_buf_var(&argvars[0]); 4188 buf = get_buf_vartv(&argvars[0]);
3563 if (buf != NULL) 4189 if (buf != NULL)
3564 retvar->var_val.var_number = buf->b_fnum; 4190 retvar->vval.v_number = buf->b_fnum;
3565 else 4191 else
3566 retvar->var_val.var_number = -1; 4192 retvar->vval.v_number = -1;
3567 --emsg_off; 4193 --emsg_off;
3568 } 4194 }
3569 4195
3570 /* 4196 /*
3571 * "bufwinnr(nr)" function 4197 * "bufwinnr(nr)" function
3572 */ 4198 */
3573 static void 4199 static void
3574 f_bufwinnr(argvars, retvar) 4200 f_bufwinnr(argvars, retvar)
3575 VAR argvars; 4201 typeval *argvars;
3576 VAR retvar; 4202 typeval *retvar;
3577 { 4203 {
3578 #ifdef FEAT_WINDOWS 4204 #ifdef FEAT_WINDOWS
3579 win_T *wp; 4205 win_T *wp;
3580 int winnr = 0; 4206 int winnr = 0;
3581 #endif 4207 #endif
3582 buf_T *buf; 4208 buf_T *buf;
3583 4209
3584 ++emsg_off; 4210 ++emsg_off;
3585 buf = get_buf_var(&argvars[0]); 4211 buf = get_buf_vartv(&argvars[0]);
3586 #ifdef FEAT_WINDOWS 4212 #ifdef FEAT_WINDOWS
3587 for (wp = firstwin; wp; wp = wp->w_next) 4213 for (wp = firstwin; wp; wp = wp->w_next)
3588 { 4214 {
3589 ++winnr; 4215 ++winnr;
3590 if (wp->w_buffer == buf) 4216 if (wp->w_buffer == buf)
3591 break; 4217 break;
3592 } 4218 }
3593 retvar->var_val.var_number = (wp != NULL ? winnr : -1); 4219 retvar->vval.v_number = (wp != NULL ? winnr : -1);
3594 #else 4220 #else
3595 retvar->var_val.var_number = (curwin->w_buffer == buf ? 1 : -1); 4221 retvar->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
3596 #endif 4222 #endif
3597 --emsg_off; 4223 --emsg_off;
3598 } 4224 }
3599 4225
3600 /* 4226 /*
3601 * "byte2line(byte)" function 4227 * "byte2line(byte)" function
3602 */ 4228 */
3603 /*ARGSUSED*/ 4229 /*ARGSUSED*/
3604 static void 4230 static void
3605 f_byte2line(argvars, retvar) 4231 f_byte2line(argvars, retvar)
3606 VAR argvars; 4232 typeval *argvars;
3607 VAR retvar; 4233 typeval *retvar;
3608 { 4234 {
3609 #ifndef FEAT_BYTEOFF 4235 #ifndef FEAT_BYTEOFF
3610 retvar->var_val.var_number = -1; 4236 retvar->vval.v_number = -1;
3611 #else 4237 #else
3612 long boff = 0; 4238 long boff = 0;
3613 4239
3614 boff = get_var_number(&argvars[0]) - 1; 4240 boff = get_vartv_number(&argvars[0]) - 1;
3615 if (boff < 0) 4241 if (boff < 0)
3616 retvar->var_val.var_number = -1; 4242 retvar->vval.v_number = -1;
3617 else 4243 else
3618 retvar->var_val.var_number = ml_find_line_or_offset(curbuf, 4244 retvar->vval.v_number = ml_find_line_or_offset(curbuf,
3619 (linenr_T)0, &boff); 4245 (linenr_T)0, &boff);
3620 #endif 4246 #endif
3621 } 4247 }
3622 4248
3623 /* 4249 /*
3624 * "byteidx()" function 4250 * "byteidx()" function
3625 */ 4251 */
3626 /*ARGSUSED*/ 4252 /*ARGSUSED*/
3627 static void 4253 static void
3628 f_byteidx(argvars, retvar) 4254 f_byteidx(argvars, retvar)
3629 VAR argvars; 4255 typeval *argvars;
3630 VAR retvar; 4256 typeval *retvar;
3631 { 4257 {
3632 #ifdef FEAT_MBYTE 4258 #ifdef FEAT_MBYTE
3633 char_u *t; 4259 char_u *t;
3634 #endif 4260 #endif
3635 char_u *str; 4261 char_u *str;
3636 long idx; 4262 long idx;
3637 4263
3638 str = get_var_string(&argvars[0]); 4264 str = get_vartv_string(&argvars[0]);
3639 idx = get_var_number(&argvars[1]); 4265 idx = get_vartv_number(&argvars[1]);
3640 retvar->var_val.var_number = -1; 4266 retvar->vval.v_number = -1;
3641 if (idx < 0) 4267 if (idx < 0)
3642 return; 4268 return;
3643 4269
3644 #ifdef FEAT_MBYTE 4270 #ifdef FEAT_MBYTE
3645 t = str; 4271 t = str;
3647 { 4273 {
3648 if (*t == NUL) /* EOL reached */ 4274 if (*t == NUL) /* EOL reached */
3649 return; 4275 return;
3650 t += mb_ptr2len_check(t); 4276 t += mb_ptr2len_check(t);
3651 } 4277 }
3652 retvar->var_val.var_number = t - str; 4278 retvar->vval.v_number = t - str;
3653 #else 4279 #else
3654 if (idx <= STRLEN(str)) 4280 if (idx <= STRLEN(str))
3655 retvar->var_val.var_number = idx; 4281 retvar->vval.v_number = idx;
3656 #endif 4282 #endif
3657 } 4283 }
3658 4284
3659 /* 4285 /*
3660 * "char2nr(string)" function 4286 * "char2nr(string)" function
3661 */ 4287 */
3662 static void 4288 static void
3663 f_char2nr(argvars, retvar) 4289 f_char2nr(argvars, retvar)
3664 VAR argvars; 4290 typeval *argvars;
3665 VAR retvar; 4291 typeval *retvar;
3666 { 4292 {
3667 #ifdef FEAT_MBYTE 4293 #ifdef FEAT_MBYTE
3668 if (has_mbyte) 4294 if (has_mbyte)
3669 retvar->var_val.var_number = 4295 retvar->vval.v_number =
3670 (*mb_ptr2char)(get_var_string(&argvars[0])); 4296 (*mb_ptr2char)(get_vartv_string(&argvars[0]));
3671 else 4297 else
3672 #endif 4298 #endif
3673 retvar->var_val.var_number = get_var_string(&argvars[0])[0]; 4299 retvar->vval.v_number = get_vartv_string(&argvars[0])[0];
3674 } 4300 }
3675 4301
3676 /* 4302 /*
3677 * "cindent(lnum)" function 4303 * "cindent(lnum)" function
3678 */ 4304 */
3679 static void 4305 static void
3680 f_cindent(argvars, retvar) 4306 f_cindent(argvars, retvar)
3681 VAR argvars; 4307 typeval *argvars;
3682 VAR retvar; 4308 typeval *retvar;
3683 { 4309 {
3684 #ifdef FEAT_CINDENT 4310 #ifdef FEAT_CINDENT
3685 pos_T pos; 4311 pos_T pos;
3686 linenr_T lnum; 4312 linenr_T lnum;
3687 4313
3688 pos = curwin->w_cursor; 4314 pos = curwin->w_cursor;
3689 lnum = get_var_lnum(argvars); 4315 lnum = get_vartv_lnum(argvars);
3690 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 4316 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
3691 { 4317 {
3692 curwin->w_cursor.lnum = lnum; 4318 curwin->w_cursor.lnum = lnum;
3693 retvar->var_val.var_number = get_c_indent(); 4319 retvar->vval.v_number = get_c_indent();
3694 curwin->w_cursor = pos; 4320 curwin->w_cursor = pos;
3695 } 4321 }
3696 else 4322 else
3697 #endif 4323 #endif
3698 retvar->var_val.var_number = -1; 4324 retvar->vval.v_number = -1;
3699 } 4325 }
3700 4326
3701 /* 4327 /*
3702 * "col(string)" function 4328 * "col(string)" function
3703 */ 4329 */
3704 static void 4330 static void
3705 f_col(argvars, retvar) 4331 f_col(argvars, retvar)
3706 VAR argvars; 4332 typeval *argvars;
3707 VAR retvar; 4333 typeval *retvar;
3708 { 4334 {
3709 colnr_T col = 0; 4335 colnr_T col = 0;
3710 pos_T *fp; 4336 pos_T *fp;
3711 4337
3712 fp = var2fpos(&argvars[0], FALSE); 4338 fp = var2fpos(&argvars[0], FALSE);
3745 } 4371 }
3746 } 4372 }
3747 #endif 4373 #endif
3748 } 4374 }
3749 } 4375 }
3750 retvar->var_val.var_number = col; 4376 retvar->vval.v_number = col;
3751 } 4377 }
3752 4378
3753 /* 4379 /*
3754 * "confirm(message, buttons[, default [, type]])" function 4380 * "confirm(message, buttons[, default [, type]])" function
3755 */ 4381 */
3756 /*ARGSUSED*/ 4382 /*ARGSUSED*/
3757 static void 4383 static void
3758 f_confirm(argvars, retvar) 4384 f_confirm(argvars, retvar)
3759 VAR argvars; 4385 typeval *argvars;
3760 VAR retvar; 4386 typeval *retvar;
3761 { 4387 {
3762 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) 4388 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
3763 char_u *message; 4389 char_u *message;
3764 char_u *buttons = NULL; 4390 char_u *buttons = NULL;
3765 char_u buf[NUMBUFLEN]; 4391 char_u buf[NUMBUFLEN];
3766 char_u buf2[NUMBUFLEN]; 4392 char_u buf2[NUMBUFLEN];
3767 int def = 1; 4393 int def = 1;
3768 int type = VIM_GENERIC; 4394 int type = VIM_GENERIC;
3769 int c; 4395 int c;
3770 4396
3771 message = get_var_string(&argvars[0]); 4397 message = get_vartv_string(&argvars[0]);
3772 if (argvars[1].var_type != VAR_UNKNOWN) 4398 if (argvars[1].v_type != VAR_UNKNOWN)
3773 { 4399 {
3774 buttons = get_var_string_buf(&argvars[1], buf); 4400 buttons = get_vartv_string_buf(&argvars[1], buf);
3775 if (argvars[2].var_type != VAR_UNKNOWN) 4401 if (argvars[2].v_type != VAR_UNKNOWN)
3776 { 4402 {
3777 def = get_var_number(&argvars[2]); 4403 def = get_vartv_number(&argvars[2]);
3778 if (argvars[3].var_type != VAR_UNKNOWN) 4404 if (argvars[3].v_type != VAR_UNKNOWN)
3779 { 4405 {
3780 /* avoid that TOUPPER_ASC calls get_var_string_buf() twice */ 4406 /* avoid that TOUPPER_ASC calls get_var_string_buf() twice */
3781 c = *get_var_string_buf(&argvars[3], buf2); 4407 c = *get_vartv_string_buf(&argvars[3], buf2);
3782 switch (TOUPPER_ASC(c)) 4408 switch (TOUPPER_ASC(c))
3783 { 4409 {
3784 case 'E': type = VIM_ERROR; break; 4410 case 'E': type = VIM_ERROR; break;
3785 case 'Q': type = VIM_QUESTION; break; 4411 case 'Q': type = VIM_QUESTION; break;
3786 case 'I': type = VIM_INFO; break; 4412 case 'I': type = VIM_INFO; break;
3792 } 4418 }
3793 4419
3794 if (buttons == NULL || *buttons == NUL) 4420 if (buttons == NULL || *buttons == NUL)
3795 buttons = (char_u *)_("&Ok"); 4421 buttons = (char_u *)_("&Ok");
3796 4422
3797 retvar->var_val.var_number = do_dialog(type, NULL, message, buttons, 4423 retvar->vval.v_number = do_dialog(type, NULL, message, buttons,
3798 def, NULL); 4424 def, NULL);
3799 #else 4425 #else
3800 retvar->var_val.var_number = 0; 4426 retvar->vval.v_number = 0;
3801 #endif 4427 #endif
3802 } 4428 }
3803 4429
4430 /*
4431 * "copy()" function
4432 */
4433 static void
4434 f_copy(argvars, retvar)
4435 typeval *argvars;
4436 typeval *retvar;
4437 {
4438 if (argvars[0].v_type == VAR_LIST)
4439 {
4440 retvar->v_type = VAR_LIST;
4441 retvar->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE);
4442 }
4443 else
4444 copy_vartv(&argvars[0], retvar);
4445 }
3804 4446
3805 /* 4447 /*
3806 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function 4448 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function
3807 * 4449 *
3808 * Checks the existence of a cscope connection. 4450 * Checks the existence of a cscope connection.
3809 */ 4451 */
3810 /*ARGSUSED*/ 4452 /*ARGSUSED*/
3811 static void 4453 static void
3812 f_cscope_connection(argvars, retvar) 4454 f_cscope_connection(argvars, retvar)
3813 VAR argvars; 4455 typeval *argvars;
3814 VAR retvar; 4456 typeval *retvar;
3815 { 4457 {
3816 #ifdef FEAT_CSCOPE 4458 #ifdef FEAT_CSCOPE
3817 int num = 0; 4459 int num = 0;
3818 char_u *dbpath = NULL; 4460 char_u *dbpath = NULL;
3819 char_u *prepend = NULL; 4461 char_u *prepend = NULL;
3820 char_u buf[NUMBUFLEN]; 4462 char_u buf[NUMBUFLEN];
3821 4463
3822 if (argvars[0].var_type != VAR_UNKNOWN 4464 if (argvars[0].v_type != VAR_UNKNOWN
3823 && argvars[1].var_type != VAR_UNKNOWN) 4465 && argvars[1].v_type != VAR_UNKNOWN)
3824 { 4466 {
3825 num = (int)get_var_number(&argvars[0]); 4467 num = (int)get_vartv_number(&argvars[0]);
3826 dbpath = get_var_string(&argvars[1]); 4468 dbpath = get_vartv_string(&argvars[1]);
3827 if (argvars[2].var_type != VAR_UNKNOWN) 4469 if (argvars[2].v_type != VAR_UNKNOWN)
3828 prepend = get_var_string_buf(&argvars[2], buf); 4470 prepend = get_vartv_string_buf(&argvars[2], buf);
3829 } 4471 }
3830 4472
3831 retvar->var_val.var_number = cs_connection(num, dbpath, prepend); 4473 retvar->vval.v_number = cs_connection(num, dbpath, prepend);
3832 #else 4474 #else
3833 retvar->var_val.var_number = 0; 4475 retvar->vval.v_number = 0;
3834 #endif 4476 #endif
3835 } 4477 }
3836 4478
3837 /* 4479 /*
3838 * "cursor(lnum, col)" function 4480 * "cursor(lnum, col)" function
3840 * Moves the cursor to the specified line and column 4482 * Moves the cursor to the specified line and column
3841 */ 4483 */
3842 /*ARGSUSED*/ 4484 /*ARGSUSED*/
3843 static void 4485 static void
3844 f_cursor(argvars, retvar) 4486 f_cursor(argvars, retvar)
3845 VAR argvars; 4487 typeval *argvars;
3846 VAR retvar; 4488 typeval *retvar;
3847 { 4489 {
3848 long line, col; 4490 long line, col;
3849 4491
3850 line = get_var_lnum(argvars); 4492 line = get_vartv_lnum(argvars);
3851 if (line > 0) 4493 if (line > 0)
3852 curwin->w_cursor.lnum = line; 4494 curwin->w_cursor.lnum = line;
3853 col = get_var_number(&argvars[1]); 4495 col = get_vartv_number(&argvars[1]);
3854 if (col > 0) 4496 if (col > 0)
3855 curwin->w_cursor.col = col - 1; 4497 curwin->w_cursor.col = col - 1;
3856 #ifdef FEAT_VIRTUALEDIT 4498 #ifdef FEAT_VIRTUALEDIT
3857 curwin->w_cursor.coladd = 0; 4499 curwin->w_cursor.coladd = 0;
3858 #endif 4500 #endif
3867 4509
3868 curwin->w_set_curswant = TRUE; 4510 curwin->w_set_curswant = TRUE;
3869 } 4511 }
3870 4512
3871 /* 4513 /*
3872 * "libcall()" function 4514 * "deepcopy()" function
3873 */ 4515 */
3874 static void 4516 static void
3875 f_libcall(argvars, retvar) 4517 f_deepcopy(argvars, retvar)
3876 VAR argvars; 4518 typeval *argvars;
3877 VAR retvar; 4519 typeval *retvar;
3878 { 4520 {
3879 libcall_common(argvars, retvar, VAR_STRING); 4521 if (argvars[0].v_type == VAR_LIST)
3880 } 4522 {
3881 4523 retvar->v_type = VAR_LIST;
3882 /* 4524 retvar->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE);
3883 * "libcallnr()" function 4525 }
3884 */
3885 static void
3886 f_libcallnr(argvars, retvar)
3887 VAR argvars;
3888 VAR retvar;
3889 {
3890 libcall_common(argvars, retvar, VAR_NUMBER);
3891 }
3892
3893 static void
3894 libcall_common(argvars, retvar, type)
3895 VAR argvars;
3896 VAR retvar;
3897 int type;
3898 {
3899 #ifdef FEAT_LIBCALL
3900 char_u *string_in;
3901 char_u **string_result;
3902 int nr_result;
3903 #endif
3904
3905 retvar->var_type = type;
3906 if (type == VAR_NUMBER)
3907 retvar->var_val.var_number = 0;
3908 else 4526 else
3909 retvar->var_val.var_string = NULL; 4527 copy_vartv(&argvars[0], retvar);
3910 4528 }
4529
4530 /*
4531 * "delete()" function
4532 */
4533 static void
4534 f_delete(argvars, retvar)
4535 typeval *argvars;
4536 typeval *retvar;
4537 {
3911 if (check_restricted() || check_secure()) 4538 if (check_restricted() || check_secure())
3912 return; 4539 retvar->vval.v_number = -1;
3913
3914 #ifdef FEAT_LIBCALL
3915 /* The first two args must be strings, otherwise its meaningless */
3916 if (argvars[0].var_type == VAR_STRING && argvars[1].var_type == VAR_STRING)
3917 {
3918 if (argvars[2].var_type == VAR_NUMBER)
3919 string_in = NULL;
3920 else
3921 string_in = argvars[2].var_val.var_string;
3922 if (type == VAR_NUMBER)
3923 string_result = NULL;
3924 else
3925 string_result = &retvar->var_val.var_string;
3926 if (mch_libcall(argvars[0].var_val.var_string,
3927 argvars[1].var_val.var_string,
3928 string_in,
3929 argvars[2].var_val.var_number,
3930 string_result,
3931 &nr_result) == OK
3932 && type == VAR_NUMBER)
3933 retvar->var_val.var_number = nr_result;
3934 }
3935 #endif
3936 }
3937
3938 /*
3939 * "delete()" function
3940 */
3941 static void
3942 f_delete(argvars, retvar)
3943 VAR argvars;
3944 VAR retvar;
3945 {
3946 if (check_restricted() || check_secure())
3947 retvar->var_val.var_number = -1;
3948 else 4540 else
3949 retvar->var_val.var_number = mch_remove(get_var_string(&argvars[0])); 4541 retvar->vval.v_number = mch_remove(get_vartv_string(&argvars[0]));
3950 } 4542 }
3951 4543
3952 /* 4544 /*
3953 * "did_filetype()" function 4545 * "did_filetype()" function
3954 */ 4546 */
3955 /*ARGSUSED*/ 4547 /*ARGSUSED*/
3956 static void 4548 static void
3957 f_did_filetype(argvars, retvar) 4549 f_did_filetype(argvars, retvar)
3958 VAR argvars; 4550 typeval *argvars;
3959 VAR retvar; 4551 typeval *retvar;
3960 { 4552 {
3961 #ifdef FEAT_AUTOCMD 4553 #ifdef FEAT_AUTOCMD
3962 retvar->var_val.var_number = did_filetype; 4554 retvar->vval.v_number = did_filetype;
3963 #else 4555 #else
3964 retvar->var_val.var_number = 0; 4556 retvar->vval.v_number = 0;
3965 #endif 4557 #endif
3966 } 4558 }
3967 4559
3968 /* 4560 /*
3969 * "diff_filler()" function 4561 * "diff_filler()" function
3970 */ 4562 */
3971 /*ARGSUSED*/ 4563 /*ARGSUSED*/
3972 static void 4564 static void
3973 f_diff_filler(argvars, retvar) 4565 f_diff_filler(argvars, retvar)
3974 VAR argvars; 4566 typeval *argvars;
3975 VAR retvar; 4567 typeval *retvar;
3976 { 4568 {
3977 #ifdef FEAT_DIFF 4569 #ifdef FEAT_DIFF
3978 retvar->var_val.var_number = diff_check_fill(curwin, get_var_lnum(argvars)); 4570 retvar->vval.v_number = diff_check_fill(curwin, get_vartv_lnum(argvars));
3979 #endif 4571 #endif
3980 } 4572 }
3981 4573
3982 /* 4574 /*
3983 * "diff_hlID()" function 4575 * "diff_hlID()" function
3984 */ 4576 */
3985 /*ARGSUSED*/ 4577 /*ARGSUSED*/
3986 static void 4578 static void
3987 f_diff_hlID(argvars, retvar) 4579 f_diff_hlID(argvars, retvar)
3988 VAR argvars; 4580 typeval *argvars;
3989 VAR retvar; 4581 typeval *retvar;
3990 { 4582 {
3991 #ifdef FEAT_DIFF 4583 #ifdef FEAT_DIFF
3992 linenr_T lnum = get_var_lnum(argvars); 4584 linenr_T lnum = get_vartv_lnum(argvars);
3993 static linenr_T prev_lnum = 0; 4585 static linenr_T prev_lnum = 0;
3994 static int changedtick = 0; 4586 static int changedtick = 0;
3995 static int fnum = 0; 4587 static int fnum = 0;
3996 static int change_start = 0; 4588 static int change_start = 0;
3997 static int change_end = 0; 4589 static int change_end = 0;
4026 fnum = curbuf->b_fnum; 4618 fnum = curbuf->b_fnum;
4027 } 4619 }
4028 4620
4029 if (hlID == HLF_CHD || hlID == HLF_TXD) 4621 if (hlID == HLF_CHD || hlID == HLF_TXD)
4030 { 4622 {
4031 col = get_var_number(&argvars[1]) - 1; 4623 col = get_vartv_number(&argvars[1]) - 1;
4032 if (col >= change_start && col <= change_end) 4624 if (col >= change_start && col <= change_end)
4033 hlID = HLF_TXD; /* changed text */ 4625 hlID = HLF_TXD; /* changed text */
4034 else 4626 else
4035 hlID = HLF_CHD; /* changed line */ 4627 hlID = HLF_CHD; /* changed line */
4036 } 4628 }
4037 retvar->var_val.var_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID; 4629 retvar->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID;
4038 #endif 4630 #endif
4039 } 4631 }
4040 4632
4041 /* 4633 /*
4042 * "escape({string}, {chars})" function 4634 * "escape({string}, {chars})" function
4043 */ 4635 */
4044 static void 4636 static void
4045 f_escape(argvars, retvar) 4637 f_escape(argvars, retvar)
4046 VAR argvars; 4638 typeval *argvars;
4047 VAR retvar; 4639 typeval *retvar;
4048 { 4640 {
4049 char_u buf[NUMBUFLEN]; 4641 char_u buf[NUMBUFLEN];
4050 4642
4051 retvar->var_val.var_string = 4643 retvar->vval.v_string =
4052 vim_strsave_escaped(get_var_string(&argvars[0]), 4644 vim_strsave_escaped(get_vartv_string(&argvars[0]),
4053 get_var_string_buf(&argvars[1], buf)); 4645 get_vartv_string_buf(&argvars[1], buf));
4054 retvar->var_type = VAR_STRING; 4646 retvar->v_type = VAR_STRING;
4055 } 4647 }
4056 4648
4057 /* 4649 /*
4058 * "eventhandler()" function 4650 * "eventhandler()" function
4059 */ 4651 */
4060 /*ARGSUSED*/ 4652 /*ARGSUSED*/
4061 static void 4653 static void
4062 f_eventhandler(argvars, retvar) 4654 f_eventhandler(argvars, retvar)
4063 VAR argvars; 4655 typeval *argvars;
4064 VAR retvar; 4656 typeval *retvar;
4065 { 4657 {
4066 retvar->var_val.var_number = vgetc_busy; 4658 retvar->vval.v_number = vgetc_busy;
4067 } 4659 }
4068 4660
4069 /* 4661 /*
4070 * "executable()" function 4662 * "executable()" function
4071 */ 4663 */
4072 static void 4664 static void
4073 f_executable(argvars, retvar) 4665 f_executable(argvars, retvar)
4074 VAR argvars; 4666 typeval *argvars;
4075 VAR retvar; 4667 typeval *retvar;
4076 { 4668 {
4077 retvar->var_val.var_number = mch_can_exe(get_var_string(&argvars[0])); 4669 retvar->vval.v_number = mch_can_exe(get_vartv_string(&argvars[0]));
4078 } 4670 }
4079 4671
4080 /* 4672 /*
4081 * "exists()" function 4673 * "exists()" function
4082 */ 4674 */
4083 static void 4675 static void
4084 f_exists(argvars, retvar) 4676 f_exists(argvars, retvar)
4085 VAR argvars; 4677 typeval *argvars;
4086 VAR retvar; 4678 typeval *retvar;
4087 { 4679 {
4088 char_u *p; 4680 char_u *p;
4089 char_u *name; 4681 char_u *name;
4090 int n = FALSE; 4682 int n = FALSE;
4091 int len = 0; 4683 int len = 0;
4092 4684
4093 p = get_var_string(&argvars[0]); 4685 p = get_vartv_string(&argvars[0]);
4094 if (*p == '$') /* environment variable */ 4686 if (*p == '$') /* environment variable */
4095 { 4687 {
4096 /* first try "normal" environment variables (fast) */ 4688 /* first try "normal" environment variables (fast) */
4097 if (mch_getenv(p + 1) != NULL) 4689 if (mch_getenv(p + 1) != NULL)
4098 n = TRUE; 4690 n = TRUE;
4104 n = TRUE; 4696 n = TRUE;
4105 vim_free(p); 4697 vim_free(p);
4106 } 4698 }
4107 } 4699 }
4108 else if (*p == '&' || *p == '+') /* option */ 4700 else if (*p == '&' || *p == '+') /* option */
4109 n = (get_option_var(&p, NULL, TRUE) == OK); 4701 n = (get_option_vartv(&p, NULL, TRUE) == OK);
4110 else if (*p == '*') /* internal or user defined function */ 4702 else if (*p == '*') /* internal or user defined function */
4111 { 4703 {
4112 ++p; 4704 n = function_exists(p + 1);
4113 p = trans_function_name(&p, FALSE, TRUE);
4114 if (p != NULL)
4115 {
4116 if (ASCII_ISUPPER(*p) || p[0] == K_SPECIAL)
4117 n = (find_func(p) != NULL);
4118 else if (ASCII_ISLOWER(*p))
4119 n = (find_internal_func(p) >= 0);
4120 vim_free(p);
4121 }
4122 } 4705 }
4123 else if (*p == ':') 4706 else if (*p == ':')
4124 { 4707 {
4125 n = cmd_exists(p + 1); 4708 n = cmd_exists(p + 1);
4126 } 4709 }
4159 } 4742 }
4160 #endif 4743 #endif
4161 if (len == 0) 4744 if (len == 0)
4162 len = get_id_len(&p); 4745 len = get_id_len(&p);
4163 if (len != 0) 4746 if (len != 0)
4164 n = (get_var_var(name, len, NULL) == OK); 4747 n = (get_var_vartv(name, len, NULL) == OK);
4165 4748
4166 #ifdef FEAT_MAGIC_BRACES 4749 #ifdef FEAT_MAGIC_BRACES
4167 vim_free(temp_string); 4750 vim_free(temp_string);
4168 #endif 4751 #endif
4169 } 4752 }
4170 4753
4171 retvar->var_val.var_number = n; 4754 retvar->vval.v_number = n;
4172 } 4755 }
4173 4756
4174 /* 4757 /*
4175 * "expand()" function 4758 * "expand()" function
4176 */ 4759 */
4177 static void 4760 static void
4178 f_expand(argvars, retvar) 4761 f_expand(argvars, retvar)
4179 VAR argvars; 4762 typeval *argvars;
4180 VAR retvar; 4763 typeval *retvar;
4181 { 4764 {
4182 char_u *s; 4765 char_u *s;
4183 int len; 4766 int len;
4184 char_u *errormsg; 4767 char_u *errormsg;
4185 int flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND; 4768 int flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
4186 expand_T xpc; 4769 expand_T xpc;
4187 4770
4188 retvar->var_type = VAR_STRING; 4771 retvar->v_type = VAR_STRING;
4189 s = get_var_string(&argvars[0]); 4772 s = get_vartv_string(&argvars[0]);
4190 if (*s == '%' || *s == '#' || *s == '<') 4773 if (*s == '%' || *s == '#' || *s == '<')
4191 { 4774 {
4192 ++emsg_off; 4775 ++emsg_off;
4193 retvar->var_val.var_string = eval_vars(s, &len, NULL, &errormsg, s); 4776 retvar->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
4194 --emsg_off; 4777 --emsg_off;
4195 } 4778 }
4196 else 4779 else
4197 { 4780 {
4198 /* When the optional second argument is non-zero, don't remove matches 4781 /* When the optional second argument is non-zero, don't remove matches
4199 * for 'suffixes' and 'wildignore' */ 4782 * for 'suffixes' and 'wildignore' */
4200 if (argvars[1].var_type != VAR_UNKNOWN && get_var_number(&argvars[1])) 4783 if (argvars[1].v_type != VAR_UNKNOWN && get_vartv_number(&argvars[1]))
4201 flags |= WILD_KEEP_ALL; 4784 flags |= WILD_KEEP_ALL;
4202 ExpandInit(&xpc); 4785 ExpandInit(&xpc);
4203 xpc.xp_context = EXPAND_FILES; 4786 xpc.xp_context = EXPAND_FILES;
4204 retvar->var_val.var_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL); 4787 retvar->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
4205 ExpandCleanup(&xpc); 4788 ExpandCleanup(&xpc);
4206 } 4789 }
4207 } 4790 }
4208 4791
4209 /* 4792 /*
4210 * "filereadable()" function 4793 * "filereadable()" function
4211 */ 4794 */
4212 static void 4795 static void
4213 f_filereadable(argvars, retvar) 4796 f_filereadable(argvars, retvar)
4214 VAR argvars; 4797 typeval *argvars;
4215 VAR retvar; 4798 typeval *retvar;
4216 { 4799 {
4217 FILE *fd; 4800 FILE *fd;
4218 char_u *p; 4801 char_u *p;
4219 int n; 4802 int n;
4220 4803
4221 p = get_var_string(&argvars[0]); 4804 p = get_vartv_string(&argvars[0]);
4222 if (*p && !mch_isdir(p) && (fd = mch_fopen((char *)p, "r")) != NULL) 4805 if (*p && !mch_isdir(p) && (fd = mch_fopen((char *)p, "r")) != NULL)
4223 { 4806 {
4224 n = TRUE; 4807 n = TRUE;
4225 fclose(fd); 4808 fclose(fd);
4226 } 4809 }
4227 else 4810 else
4228 n = FALSE; 4811 n = FALSE;
4229 4812
4230 retvar->var_val.var_number = n; 4813 retvar->vval.v_number = n;
4231 } 4814 }
4232 4815
4233 /* 4816 /*
4234 * return 0 for not writable, 1 for writable file, 2 for a dir which we have 4817 * return 0 for not writable, 1 for writable file, 2 for a dir which we have
4235 * rights to write into. 4818 * rights to write into.
4236 */ 4819 */
4237 static void 4820 static void
4238 f_filewritable(argvars, retvar) 4821 f_filewritable(argvars, retvar)
4239 VAR argvars; 4822 typeval *argvars;
4240 VAR retvar; 4823 typeval *retvar;
4241 { 4824 {
4242 char_u *p; 4825 char_u *p;
4243 int retval = 0; 4826 int retval = 0;
4244 #if defined(UNIX) || defined(VMS) 4827 #if defined(UNIX) || defined(VMS)
4245 int perm = 0; 4828 int perm = 0;
4246 #endif 4829 #endif
4247 4830
4248 p = get_var_string(&argvars[0]); 4831 p = get_vartv_string(&argvars[0]);
4249 #if defined(UNIX) || defined(VMS) 4832 #if defined(UNIX) || defined(VMS)
4250 perm = mch_getperm(p); 4833 perm = mch_getperm(p);
4251 #endif 4834 #endif
4252 #ifndef MACOS_CLASSIC /* TODO: get either mch_writable or mch_access */ 4835 #ifndef MACOS_CLASSIC /* TODO: get either mch_writable or mch_access */
4253 if ( 4836 if (
4264 { 4847 {
4265 ++retval; 4848 ++retval;
4266 if (mch_isdir(p)) 4849 if (mch_isdir(p))
4267 ++retval; 4850 ++retval;
4268 } 4851 }
4269 retvar->var_val.var_number = retval; 4852 retvar->vval.v_number = retval;
4270 } 4853 }
4271 4854
4272 /* 4855 /*
4273 * "finddir({fname}[, {path}[, {count}]])" function 4856 * "finddir({fname}[, {path}[, {count}]])" function
4274 */ 4857 */
4275 static void 4858 static void
4276 f_finddir(argvars, retvar) 4859 f_finddir(argvars, retvar)
4277 VAR argvars; 4860 typeval *argvars;
4278 VAR retvar; 4861 typeval *retvar;
4279 { 4862 {
4280 f_findfilendir(argvars, retvar, TRUE); 4863 f_findfilendir(argvars, retvar, TRUE);
4281 } 4864 }
4282 4865
4283 /* 4866 /*
4284 * "findfile({fname}[, {path}[, {count}]])" function 4867 * "findfile({fname}[, {path}[, {count}]])" function
4285 */ 4868 */
4286 static void 4869 static void
4287 f_findfile(argvars, retvar) 4870 f_findfile(argvars, retvar)
4288 VAR argvars; 4871 typeval *argvars;
4289 VAR retvar; 4872 typeval *retvar;
4290 { 4873 {
4291 f_findfilendir(argvars, retvar, FALSE); 4874 f_findfilendir(argvars, retvar, FALSE);
4292 } 4875 }
4293 4876
4294 static void 4877 static void
4295 f_findfilendir(argvars, retvar, dir) 4878 f_findfilendir(argvars, retvar, dir)
4296 VAR argvars; 4879 typeval *argvars;
4297 VAR retvar; 4880 typeval *retvar;
4298 int dir; 4881 int dir;
4299 { 4882 {
4300 #ifdef FEAT_SEARCHPATH 4883 #ifdef FEAT_SEARCHPATH
4301 char_u *fname; 4884 char_u *fname;
4302 char_u *fresult = NULL; 4885 char_u *fresult = NULL;
4304 char_u *p; 4887 char_u *p;
4305 char_u pathbuf[NUMBUFLEN]; 4888 char_u pathbuf[NUMBUFLEN];
4306 int count = 1; 4889 int count = 1;
4307 int first = TRUE; 4890 int first = TRUE;
4308 4891
4309 fname = get_var_string(&argvars[0]); 4892 fname = get_vartv_string(&argvars[0]);
4310 4893
4311 if (argvars[1].var_type != VAR_UNKNOWN) 4894 if (argvars[1].v_type != VAR_UNKNOWN)
4312 { 4895 {
4313 p = get_var_string_buf(&argvars[1], pathbuf); 4896 p = get_vartv_string_buf(&argvars[1], pathbuf);
4314 if (*p != NUL) 4897 if (*p != NUL)
4315 path = p; 4898 path = p;
4316 4899
4317 if (argvars[2].var_type != VAR_UNKNOWN) 4900 if (argvars[2].v_type != VAR_UNKNOWN)
4318 count = get_var_number(&argvars[2]); 4901 count = get_vartv_number(&argvars[2]);
4319 } 4902 }
4320 4903
4321 do 4904 do
4322 { 4905 {
4323 vim_free(fresult); 4906 vim_free(fresult);
4325 first ? (int)STRLEN(fname) : 0, 4908 first ? (int)STRLEN(fname) : 0,
4326 0, first, path, dir, NULL); 4909 0, first, path, dir, NULL);
4327 first = FALSE; 4910 first = FALSE;
4328 } while (--count > 0 && fresult != NULL); 4911 } while (--count > 0 && fresult != NULL);
4329 4912
4330 retvar->var_val.var_string = fresult; 4913 retvar->vval.v_string = fresult;
4331 #else 4914 #else
4332 retvar->var_val.var_string = NULL; 4915 retvar->vval.v_string = NULL;
4333 #endif 4916 #endif
4334 retvar->var_type = VAR_STRING; 4917 retvar->v_type = VAR_STRING;
4335 } 4918 }
4336 4919
4337 /* 4920 /*
4338 * "fnamemodify({fname}, {mods})" function 4921 * "fnamemodify({fname}, {mods})" function
4339 */ 4922 */
4340 static void 4923 static void
4341 f_fnamemodify(argvars, retvar) 4924 f_fnamemodify(argvars, retvar)
4342 VAR argvars; 4925 typeval *argvars;
4343 VAR retvar; 4926 typeval *retvar;
4344 { 4927 {
4345 char_u *fname; 4928 char_u *fname;
4346 char_u *mods; 4929 char_u *mods;
4347 int usedlen = 0; 4930 int usedlen = 0;
4348 int len; 4931 int len;
4349 char_u *fbuf = NULL; 4932 char_u *fbuf = NULL;
4350 char_u buf[NUMBUFLEN]; 4933 char_u buf[NUMBUFLEN];
4351 4934
4352 fname = get_var_string(&argvars[0]); 4935 fname = get_vartv_string(&argvars[0]);
4353 mods = get_var_string_buf(&argvars[1], buf); 4936 mods = get_vartv_string_buf(&argvars[1], buf);
4354 len = (int)STRLEN(fname); 4937 len = (int)STRLEN(fname);
4355 4938
4356 (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len); 4939 (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
4357 4940
4358 retvar->var_type = VAR_STRING; 4941 retvar->v_type = VAR_STRING;
4359 if (fname == NULL) 4942 if (fname == NULL)
4360 retvar->var_val.var_string = NULL; 4943 retvar->vval.v_string = NULL;
4361 else 4944 else
4362 retvar->var_val.var_string = vim_strnsave(fname, len); 4945 retvar->vval.v_string = vim_strnsave(fname, len);
4363 vim_free(fbuf); 4946 vim_free(fbuf);
4364 } 4947 }
4365 4948
4366 /* 4949 /*
4367 * "foldclosed()" function 4950 * "foldclosed()" function
4368 */ 4951 */
4369 static void 4952 static void
4370 f_foldclosed(argvars, retvar) 4953 f_foldclosed(argvars, retvar)
4371 VAR argvars; 4954 typeval *argvars;
4372 VAR retvar; 4955 typeval *retvar;
4373 { 4956 {
4374 foldclosed_both(argvars, retvar, FALSE); 4957 foldclosed_both(argvars, retvar, FALSE);
4375 } 4958 }
4376 4959
4377 /* 4960 /*
4378 * "foldclosedend()" function 4961 * "foldclosedend()" function
4379 */ 4962 */
4380 static void 4963 static void
4381 f_foldclosedend(argvars, retvar) 4964 f_foldclosedend(argvars, retvar)
4382 VAR argvars; 4965 typeval *argvars;
4383 VAR retvar; 4966 typeval *retvar;
4384 { 4967 {
4385 foldclosed_both(argvars, retvar, TRUE); 4968 foldclosed_both(argvars, retvar, TRUE);
4386 } 4969 }
4387 4970
4388 /* 4971 /*
4389 * "foldclosed()" function 4972 * "foldclosed()" function
4390 */ 4973 */
4391 static void 4974 static void
4392 foldclosed_both(argvars, retvar, end) 4975 foldclosed_both(argvars, retvar, end)
4393 VAR argvars; 4976 typeval *argvars;
4394 VAR retvar; 4977 typeval *retvar;
4395 int end; 4978 int end;
4396 { 4979 {
4397 #ifdef FEAT_FOLDING 4980 #ifdef FEAT_FOLDING
4398 linenr_T lnum; 4981 linenr_T lnum;
4399 linenr_T first, last; 4982 linenr_T first, last;
4400 4983
4401 lnum = get_var_lnum(argvars); 4984 lnum = get_vartv_lnum(argvars);
4402 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 4985 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
4403 { 4986 {
4404 if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL)) 4987 if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
4405 { 4988 {
4406 if (end) 4989 if (end)
4407 retvar->var_val.var_number = (varnumber_T)last; 4990 retvar->vval.v_number = (varnumber_T)last;
4408 else 4991 else
4409 retvar->var_val.var_number = (varnumber_T)first; 4992 retvar->vval.v_number = (varnumber_T)first;
4410 return; 4993 return;
4411 } 4994 }
4412 } 4995 }
4413 #endif 4996 #endif
4414 retvar->var_val.var_number = -1; 4997 retvar->vval.v_number = -1;
4415 } 4998 }
4416 4999
4417 /* 5000 /*
4418 * "foldlevel()" function 5001 * "foldlevel()" function
4419 */ 5002 */
4420 static void 5003 static void
4421 f_foldlevel(argvars, retvar) 5004 f_foldlevel(argvars, retvar)
4422 VAR argvars; 5005 typeval *argvars;
4423 VAR retvar; 5006 typeval *retvar;
4424 { 5007 {
4425 #ifdef FEAT_FOLDING 5008 #ifdef FEAT_FOLDING
4426 linenr_T lnum; 5009 linenr_T lnum;
4427 5010
4428 lnum = get_var_lnum(argvars); 5011 lnum = get_vartv_lnum(argvars);
4429 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 5012 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
4430 retvar->var_val.var_number = foldLevel(lnum); 5013 retvar->vval.v_number = foldLevel(lnum);
4431 else 5014 else
4432 #endif 5015 #endif
4433 retvar->var_val.var_number = 0; 5016 retvar->vval.v_number = 0;
4434 } 5017 }
4435 5018
4436 /* 5019 /*
4437 * "foldtext()" function 5020 * "foldtext()" function
4438 */ 5021 */
4439 /*ARGSUSED*/ 5022 /*ARGSUSED*/
4440 static void 5023 static void
4441 f_foldtext(argvars, retvar) 5024 f_foldtext(argvars, retvar)
4442 VAR argvars; 5025 typeval *argvars;
4443 VAR retvar; 5026 typeval *retvar;
4444 { 5027 {
4445 #ifdef FEAT_FOLDING 5028 #ifdef FEAT_FOLDING
4446 linenr_T lnum; 5029 linenr_T lnum;
4447 char_u *s; 5030 char_u *s;
4448 char_u *r; 5031 char_u *r;
4449 int len; 5032 int len;
4450 char *txt; 5033 char *txt;
4451 #endif 5034 #endif
4452 5035
4453 retvar->var_type = VAR_STRING; 5036 retvar->v_type = VAR_STRING;
4454 retvar->var_val.var_string = NULL; 5037 retvar->vval.v_string = NULL;
4455 #ifdef FEAT_FOLDING 5038 #ifdef FEAT_FOLDING
4456 if ((linenr_T)vimvars[VV_FOLDSTART].val > 0 5039 if ((linenr_T)vimvars[VV_FOLDSTART].val > 0
4457 && (linenr_T)vimvars[VV_FOLDEND].val <= curbuf->b_ml.ml_line_count 5040 && (linenr_T)vimvars[VV_FOLDEND].val <= curbuf->b_ml.ml_line_count
4458 && vimvars[VV_FOLDDASHES].val != NULL) 5041 && vimvars[VV_FOLDDASHES].val != NULL)
4459 { 5042 {
4492 - (linenr_T)vimvars[VV_FOLDSTART].val + 1)); 5075 - (linenr_T)vimvars[VV_FOLDSTART].val + 1));
4493 len = (int)STRLEN(r); 5076 len = (int)STRLEN(r);
4494 STRCAT(r, s); 5077 STRCAT(r, s);
4495 /* remove 'foldmarker' and 'commentstring' */ 5078 /* remove 'foldmarker' and 'commentstring' */
4496 foldtext_cleanup(r + len); 5079 foldtext_cleanup(r + len);
4497 retvar->var_val.var_string = r; 5080 retvar->vval.v_string = r;
4498 } 5081 }
4499 } 5082 }
4500 #endif 5083 #endif
4501 } 5084 }
4502 5085
4504 * "foldtextresult(lnum)" function 5087 * "foldtextresult(lnum)" function
4505 */ 5088 */
4506 /*ARGSUSED*/ 5089 /*ARGSUSED*/
4507 static void 5090 static void
4508 f_foldtextresult(argvars, retvar) 5091 f_foldtextresult(argvars, retvar)
4509 VAR argvars; 5092 typeval *argvars;
4510 VAR retvar; 5093 typeval *retvar;
4511 { 5094 {
4512 #ifdef FEAT_FOLDING 5095 #ifdef FEAT_FOLDING
4513 linenr_T lnum; 5096 linenr_T lnum;
4514 char_u *text; 5097 char_u *text;
4515 char_u buf[51]; 5098 char_u buf[51];
4516 foldinfo_T foldinfo; 5099 foldinfo_T foldinfo;
4517 int fold_count; 5100 int fold_count;
4518 #endif 5101 #endif
4519 5102
4520 retvar->var_type = VAR_STRING; 5103 retvar->v_type = VAR_STRING;
4521 retvar->var_val.var_string = NULL; 5104 retvar->vval.v_string = NULL;
4522 #ifdef FEAT_FOLDING 5105 #ifdef FEAT_FOLDING
4523 lnum = get_var_lnum(argvars); 5106 lnum = get_vartv_lnum(argvars);
4524 fold_count = foldedCount(curwin, lnum, &foldinfo); 5107 fold_count = foldedCount(curwin, lnum, &foldinfo);
4525 if (fold_count > 0) 5108 if (fold_count > 0)
4526 { 5109 {
4527 text = get_foldtext(curwin, lnum, lnum + fold_count - 1, 5110 text = get_foldtext(curwin, lnum, lnum + fold_count - 1,
4528 &foldinfo, buf); 5111 &foldinfo, buf);
4529 if (text == buf) 5112 if (text == buf)
4530 text = vim_strsave(text); 5113 text = vim_strsave(text);
4531 retvar->var_val.var_string = text; 5114 retvar->vval.v_string = text;
4532 } 5115 }
4533 #endif 5116 #endif
4534 } 5117 }
4535 5118
4536 /* 5119 /*
4537 * "foreground()" function 5120 * "foreground()" function
4538 */ 5121 */
4539 /*ARGSUSED*/ 5122 /*ARGSUSED*/
4540 static void 5123 static void
4541 f_foreground(argvars, retvar) 5124 f_foreground(argvars, retvar)
4542 VAR argvars; 5125 typeval *argvars;
4543 VAR retvar; 5126 typeval *retvar;
4544 { 5127 {
4545 retvar->var_val.var_number = 0; 5128 retvar->vval.v_number = 0;
4546 #ifdef FEAT_GUI 5129 #ifdef FEAT_GUI
4547 if (gui.in_use) 5130 if (gui.in_use)
4548 gui_mch_set_foreground(); 5131 gui_mch_set_foreground();
4549 #else 5132 #else
4550 # ifdef WIN32 5133 # ifdef WIN32
4552 # endif 5135 # endif
4553 #endif 5136 #endif
4554 } 5137 }
4555 5138
4556 /* 5139 /*
5140 * "function()" function
5141 */
5142 /*ARGSUSED*/
5143 static void
5144 f_function(argvars, retvar)
5145 typeval *argvars;
5146 typeval *retvar;
5147 {
5148 char_u *s;
5149
5150 s = get_vartv_string(&argvars[0]);
5151 if (s == NULL || *s == NUL || isdigit(*s))
5152 EMSG2(_(e_invarg2), s);
5153 else if (!function_exists(s))
5154 EMSG2(_("E999: Unknown function: %s"), s);
5155 else
5156 {
5157 retvar->vval.v_string = vim_strsave(s);
5158 retvar->v_type = VAR_FUNC;
5159 }
5160 }
5161
5162 /*
4557 * "getchar()" function 5163 * "getchar()" function
4558 */ 5164 */
4559 static void 5165 static void
4560 f_getchar(argvars, retvar) 5166 f_getchar(argvars, retvar)
4561 VAR argvars; 5167 typeval *argvars;
4562 VAR retvar; 5168 typeval *retvar;
4563 { 5169 {
4564 varnumber_T n; 5170 varnumber_T n;
4565 5171
4566 ++no_mapping; 5172 ++no_mapping;
4567 ++allow_keys; 5173 ++allow_keys;
4568 if (argvars[0].var_type == VAR_UNKNOWN) 5174 if (argvars[0].v_type == VAR_UNKNOWN)
4569 /* getchar(): blocking wait. */ 5175 /* getchar(): blocking wait. */
4570 n = safe_vgetc(); 5176 n = safe_vgetc();
4571 else if (get_var_number(&argvars[0]) == 1) 5177 else if (get_vartv_number(&argvars[0]) == 1)
4572 /* getchar(1): only check if char avail */ 5178 /* getchar(1): only check if char avail */
4573 n = vpeekc(); 5179 n = vpeekc();
4574 else if (vpeekc() == NUL) 5180 else if (vpeekc() == NUL)
4575 /* getchar(0) and no char avail: return zero */ 5181 /* getchar(0) and no char avail: return zero */
4576 n = 0; 5182 n = 0;
4578 /* getchar(0) and char avail: return char */ 5184 /* getchar(0) and char avail: return char */
4579 n = safe_vgetc(); 5185 n = safe_vgetc();
4580 --no_mapping; 5186 --no_mapping;
4581 --allow_keys; 5187 --allow_keys;
4582 5188
4583 retvar->var_val.var_number = n; 5189 retvar->vval.v_number = n;
4584 if (IS_SPECIAL(n) || mod_mask != 0) 5190 if (IS_SPECIAL(n) || mod_mask != 0)
4585 { 5191 {
4586 char_u temp[10]; /* modifier: 3, mbyte-char: 6, NUL: 1 */ 5192 char_u temp[10]; /* modifier: 3, mbyte-char: 6, NUL: 1 */
4587 int i = 0; 5193 int i = 0;
4588 5194
4604 i += (*mb_char2bytes)(n, temp + i); 5210 i += (*mb_char2bytes)(n, temp + i);
4605 #endif 5211 #endif
4606 else 5212 else
4607 temp[i++] = n; 5213 temp[i++] = n;
4608 temp[i++] = NUL; 5214 temp[i++] = NUL;
4609 retvar->var_type = VAR_STRING; 5215 retvar->v_type = VAR_STRING;
4610 retvar->var_val.var_string = vim_strsave(temp); 5216 retvar->vval.v_string = vim_strsave(temp);
4611 } 5217 }
4612 } 5218 }
4613 5219
4614 /* 5220 /*
4615 * "getcharmod()" function 5221 * "getcharmod()" function
4616 */ 5222 */
4617 /*ARGSUSED*/ 5223 /*ARGSUSED*/
4618 static void 5224 static void
4619 f_getcharmod(argvars, retvar) 5225 f_getcharmod(argvars, retvar)
4620 VAR argvars; 5226 typeval *argvars;
4621 VAR retvar; 5227 typeval *retvar;
4622 { 5228 {
4623 retvar->var_val.var_number = mod_mask; 5229 retvar->vval.v_number = mod_mask;
4624 } 5230 }
4625 5231
4626 /* 5232 /*
4627 * "getcmdline()" function 5233 * "getcmdline()" function
4628 */ 5234 */
4629 /*ARGSUSED*/ 5235 /*ARGSUSED*/
4630 static void 5236 static void
4631 f_getcmdline(argvars, retvar) 5237 f_getcmdline(argvars, retvar)
4632 VAR argvars; 5238 typeval *argvars;
4633 VAR retvar; 5239 typeval *retvar;
4634 { 5240 {
4635 retvar->var_type = VAR_STRING; 5241 retvar->v_type = VAR_STRING;
4636 retvar->var_val.var_string = get_cmdline_str(); 5242 retvar->vval.v_string = get_cmdline_str();
4637 } 5243 }
4638 5244
4639 /* 5245 /*
4640 * "getcmdpos()" function 5246 * "getcmdpos()" function
4641 */ 5247 */
4642 /*ARGSUSED*/ 5248 /*ARGSUSED*/
4643 static void 5249 static void
4644 f_getcmdpos(argvars, retvar) 5250 f_getcmdpos(argvars, retvar)
4645 VAR argvars; 5251 typeval *argvars;
4646 VAR retvar; 5252 typeval *retvar;
4647 { 5253 {
4648 retvar->var_val.var_number = get_cmdline_pos() + 1; 5254 retvar->vval.v_number = get_cmdline_pos() + 1;
4649 } 5255 }
4650 5256
4651 /* 5257 /*
4652 * "getbufvar()" function 5258 * "getbufvar()" function
4653 */ 5259 */
4654 static void 5260 static void
4655 f_getbufvar(argvars, retvar) 5261 f_getbufvar(argvars, retvar)
4656 VAR argvars; 5262 typeval *argvars;
4657 VAR retvar; 5263 typeval *retvar;
4658 { 5264 {
4659 buf_T *buf; 5265 buf_T *buf;
4660 buf_T *save_curbuf; 5266 buf_T *save_curbuf;
4661 char_u *varname; 5267 char_u *varname;
4662 VAR v; 5268 VAR v;
4663 5269
4664 ++emsg_off; 5270 ++emsg_off;
4665 buf = get_buf_var(&argvars[0]); 5271 buf = get_buf_vartv(&argvars[0]);
4666 varname = get_var_string(&argvars[1]); 5272 varname = get_vartv_string(&argvars[1]);
4667 5273
4668 retvar->var_type = VAR_STRING; 5274 retvar->v_type = VAR_STRING;
4669 retvar->var_val.var_string = NULL; 5275 retvar->vval.v_string = NULL;
4670 5276
4671 if (buf != NULL && varname != NULL) 5277 if (buf != NULL && varname != NULL)
4672 { 5278 {
4673 if (*varname == '&') /* buffer-local-option */ 5279 if (*varname == '&') /* buffer-local-option */
4674 { 5280 {
4675 /* set curbuf to be our buf, temporarily */ 5281 /* set curbuf to be our buf, temporarily */
4676 save_curbuf = curbuf; 5282 save_curbuf = curbuf;
4677 curbuf = buf; 5283 curbuf = buf;
4678 5284
4679 get_option_var(&varname, retvar, TRUE); 5285 get_option_vartv(&varname, retvar, TRUE);
4680 5286
4681 /* restore previous notion of curbuf */ 5287 /* restore previous notion of curbuf */
4682 curbuf = save_curbuf; 5288 curbuf = save_curbuf;
4683 } 5289 }
4684 else 5290 else
4685 { 5291 {
4686 /* look up the variable */ 5292 /* look up the variable */
4687 v = find_var_in_ga(&buf->b_vars, varname); 5293 v = find_var_in_ga(&buf->b_vars, varname);
4688 if (v != NULL) 5294 if (v != NULL)
4689 copy_var(v, retvar); 5295 copy_vartv(&v->tv, retvar);
4690 } 5296 }
4691 } 5297 }
4692 5298
4693 --emsg_off; 5299 --emsg_off;
4694 } 5300 }
4697 * "getcwd()" function 5303 * "getcwd()" function
4698 */ 5304 */
4699 /*ARGSUSED*/ 5305 /*ARGSUSED*/
4700 static void 5306 static void
4701 f_getcwd(argvars, retvar) 5307 f_getcwd(argvars, retvar)
4702 VAR argvars; 5308 typeval *argvars;
4703 VAR retvar; 5309 typeval *retvar;
4704 { 5310 {
4705 char_u cwd[MAXPATHL]; 5311 char_u cwd[MAXPATHL];
4706 5312
4707 retvar->var_type = VAR_STRING; 5313 retvar->v_type = VAR_STRING;
4708 if (mch_dirname(cwd, MAXPATHL) == FAIL) 5314 if (mch_dirname(cwd, MAXPATHL) == FAIL)
4709 retvar->var_val.var_string = NULL; 5315 retvar->vval.v_string = NULL;
4710 else 5316 else
4711 { 5317 {
4712 retvar->var_val.var_string = vim_strsave(cwd); 5318 retvar->vval.v_string = vim_strsave(cwd);
4713 #ifdef BACKSLASH_IN_FILENAME 5319 #ifdef BACKSLASH_IN_FILENAME
4714 slash_adjust(retvar->var_val.var_string); 5320 slash_adjust(retvar->vval.v_string);
4715 #endif 5321 #endif
4716 } 5322 }
4717 } 5323 }
4718 5324
4719 /* 5325 /*
4720 * "getfontname()" function 5326 * "getfontname()" function
4721 */ 5327 */
4722 /*ARGSUSED*/ 5328 /*ARGSUSED*/
4723 static void 5329 static void
4724 f_getfontname(argvars, retvar) 5330 f_getfontname(argvars, retvar)
4725 VAR argvars; 5331 typeval *argvars;
4726 VAR retvar; 5332 typeval *retvar;
4727 { 5333 {
4728 retvar->var_type = VAR_STRING; 5334 retvar->v_type = VAR_STRING;
4729 retvar->var_val.var_string = NULL; 5335 retvar->vval.v_string = NULL;
4730 #ifdef FEAT_GUI 5336 #ifdef FEAT_GUI
4731 if (gui.in_use) 5337 if (gui.in_use)
4732 { 5338 {
4733 GuiFont font; 5339 GuiFont font;
4734 char_u *name = NULL; 5340 char_u *name = NULL;
4735 5341
4736 if (argvars[0].var_type == VAR_UNKNOWN) 5342 if (argvars[0].v_type == VAR_UNKNOWN)
4737 { 5343 {
4738 /* Get the "Normal" font. Either the name saved by 5344 /* Get the "Normal" font. Either the name saved by
4739 * hl_set_font_name() or from the font ID. */ 5345 * hl_set_font_name() or from the font ID. */
4740 font = gui.norm_font; 5346 font = gui.norm_font;
4741 name = hl_get_font_name(); 5347 name = hl_get_font_name();
4742 } 5348 }
4743 else 5349 else
4744 { 5350 {
4745 name = get_var_string(&argvars[0]); 5351 name = get_vartv_string(&argvars[0]);
4746 if (STRCMP(name, "*") == 0) /* don't use font dialog */ 5352 if (STRCMP(name, "*") == 0) /* don't use font dialog */
4747 return; 5353 return;
4748 font = gui_mch_get_font(name, FALSE); 5354 font = gui_mch_get_font(name, FALSE);
4749 if (font == NOFONT) 5355 if (font == NOFONT)
4750 return; /* Invalid font name, return empty string. */ 5356 return; /* Invalid font name, return empty string. */
4751 } 5357 }
4752 retvar->var_val.var_string = gui_mch_get_fontname(font, name); 5358 retvar->vval.v_string = gui_mch_get_fontname(font, name);
4753 if (argvars[0].var_type != VAR_UNKNOWN) 5359 if (argvars[0].v_type != VAR_UNKNOWN)
4754 gui_mch_free_font(font); 5360 gui_mch_free_font(font);
4755 } 5361 }
4756 #endif 5362 #endif
4757 } 5363 }
4758 5364
4759 /* 5365 /*
4760 * "getfperm({fname})" function 5366 * "getfperm({fname})" function
4761 */ 5367 */
4762 static void 5368 static void
4763 f_getfperm(argvars, retvar) 5369 f_getfperm(argvars, retvar)
4764 VAR argvars; 5370 typeval *argvars;
4765 VAR retvar; 5371 typeval *retvar;
4766 { 5372 {
4767 char_u *fname; 5373 char_u *fname;
4768 struct stat st; 5374 struct stat st;
4769 char_u *perm = NULL; 5375 char_u *perm = NULL;
4770 char_u flags[] = "rwx"; 5376 char_u flags[] = "rwx";
4771 int i; 5377 int i;
4772 5378
4773 fname = get_var_string(&argvars[0]); 5379 fname = get_vartv_string(&argvars[0]);
4774 5380
4775 retvar->var_type = VAR_STRING; 5381 retvar->v_type = VAR_STRING;
4776 if (mch_stat((char *)fname, &st) >= 0) 5382 if (mch_stat((char *)fname, &st) >= 0)
4777 { 5383 {
4778 perm = vim_strsave((char_u *)"---------"); 5384 perm = vim_strsave((char_u *)"---------");
4779 if (perm != NULL) 5385 if (perm != NULL)
4780 { 5386 {
4783 if (st.st_mode & (1 << (8 - i))) 5389 if (st.st_mode & (1 << (8 - i)))
4784 perm[i] = flags[i % 3]; 5390 perm[i] = flags[i % 3];
4785 } 5391 }
4786 } 5392 }
4787 } 5393 }
4788 retvar->var_val.var_string = perm; 5394 retvar->vval.v_string = perm;
4789 } 5395 }
4790 5396
4791 /* 5397 /*
4792 * "getfsize({fname})" function 5398 * "getfsize({fname})" function
4793 */ 5399 */
4794 static void 5400 static void
4795 f_getfsize(argvars, retvar) 5401 f_getfsize(argvars, retvar)
4796 VAR argvars; 5402 typeval *argvars;
4797 VAR retvar; 5403 typeval *retvar;
4798 { 5404 {
4799 char_u *fname; 5405 char_u *fname;
4800 struct stat st; 5406 struct stat st;
4801 5407
4802 fname = get_var_string(&argvars[0]); 5408 fname = get_vartv_string(&argvars[0]);
4803 5409
4804 retvar->var_type = VAR_NUMBER; 5410 retvar->v_type = VAR_NUMBER;
4805 5411
4806 if (mch_stat((char *)fname, &st) >= 0) 5412 if (mch_stat((char *)fname, &st) >= 0)
4807 { 5413 {
4808 if (mch_isdir(fname)) 5414 if (mch_isdir(fname))
4809 retvar->var_val.var_number = 0; 5415 retvar->vval.v_number = 0;
4810 else 5416 else
4811 retvar->var_val.var_number = (varnumber_T)st.st_size; 5417 retvar->vval.v_number = (varnumber_T)st.st_size;
4812 } 5418 }
4813 else 5419 else
4814 retvar->var_val.var_number = -1; 5420 retvar->vval.v_number = -1;
4815 } 5421 }
4816 5422
4817 /* 5423 /*
4818 * "getftime({fname})" function 5424 * "getftime({fname})" function
4819 */ 5425 */
4820 static void 5426 static void
4821 f_getftime(argvars, retvar) 5427 f_getftime(argvars, retvar)
4822 VAR argvars; 5428 typeval *argvars;
4823 VAR retvar; 5429 typeval *retvar;
4824 { 5430 {
4825 char_u *fname; 5431 char_u *fname;
4826 struct stat st; 5432 struct stat st;
4827 5433
4828 fname = get_var_string(&argvars[0]); 5434 fname = get_vartv_string(&argvars[0]);
4829 5435
4830 if (mch_stat((char *)fname, &st) >= 0) 5436 if (mch_stat((char *)fname, &st) >= 0)
4831 retvar->var_val.var_number = (varnumber_T)st.st_mtime; 5437 retvar->vval.v_number = (varnumber_T)st.st_mtime;
4832 else 5438 else
4833 retvar->var_val.var_number = -1; 5439 retvar->vval.v_number = -1;
4834 } 5440 }
4835 5441
4836 /* 5442 /*
4837 * "getftype({fname})" function 5443 * "getftype({fname})" function
4838 */ 5444 */
4839 static void 5445 static void
4840 f_getftype(argvars, retvar) 5446 f_getftype(argvars, retvar)
4841 VAR argvars; 5447 typeval *argvars;
4842 VAR retvar; 5448 typeval *retvar;
4843 { 5449 {
4844 char_u *fname; 5450 char_u *fname;
4845 struct stat st; 5451 struct stat st;
4846 char_u *type = NULL; 5452 char_u *type = NULL;
4847 char *t; 5453 char *t;
4848 5454
4849 fname = get_var_string(&argvars[0]); 5455 fname = get_vartv_string(&argvars[0]);
4850 5456
4851 retvar->var_type = VAR_STRING; 5457 retvar->v_type = VAR_STRING;
4852 if (mch_lstat((char *)fname, &st) >= 0) 5458 if (mch_lstat((char *)fname, &st) >= 0)
4853 { 5459 {
4854 #ifdef S_ISREG 5460 #ifdef S_ISREG
4855 if (S_ISREG(st.st_mode)) 5461 if (S_ISREG(st.st_mode))
4856 t = "file"; 5462 t = "file";
4908 t = "file"; 5514 t = "file";
4909 # endif 5515 # endif
4910 #endif 5516 #endif
4911 type = vim_strsave((char_u *)t); 5517 type = vim_strsave((char_u *)t);
4912 } 5518 }
4913 retvar->var_val.var_string = type; 5519 retvar->vval.v_string = type;
4914 } 5520 }
4915 5521
4916 /* 5522 /*
4917 * "getreg()" function 5523 * "getreg()" function
4918 */ 5524 */
4919 static void 5525 static void
4920 f_getreg(argvars, retvar) 5526 f_getreg(argvars, retvar)
4921 VAR argvars; 5527 typeval *argvars;
4922 VAR retvar; 5528 typeval *retvar;
4923 { 5529 {
4924 char_u *strregname; 5530 char_u *strregname;
4925 int regname; 5531 int regname;
4926 5532
4927 if (argvars[0].var_type != VAR_UNKNOWN) 5533 if (argvars[0].v_type != VAR_UNKNOWN)
4928 strregname = get_var_string(&argvars[0]); 5534 strregname = get_vartv_string(&argvars[0]);
4929 else 5535 else
4930 strregname = vimvars[VV_REG].val; 5536 strregname = vimvars[VV_REG].val;
4931 regname = (strregname == NULL ? '"' : *strregname); 5537 regname = (strregname == NULL ? '"' : *strregname);
4932 if (regname == 0) 5538 if (regname == 0)
4933 regname = '"'; 5539 regname = '"';
4934 5540
4935 retvar->var_type = VAR_STRING; 5541 retvar->v_type = VAR_STRING;
4936 retvar->var_val.var_string = get_reg_contents(regname, TRUE); 5542 retvar->vval.v_string = get_reg_contents(regname, TRUE);
4937 } 5543 }
4938 5544
4939 /* 5545 /*
4940 * "getregtype()" function 5546 * "getregtype()" function
4941 */ 5547 */
4942 static void 5548 static void
4943 f_getregtype(argvars, retvar) 5549 f_getregtype(argvars, retvar)
4944 VAR argvars; 5550 typeval *argvars;
4945 VAR retvar; 5551 typeval *retvar;
4946 { 5552 {
4947 char_u *strregname; 5553 char_u *strregname;
4948 int regname; 5554 int regname;
4949 char_u buf[NUMBUFLEN + 2]; 5555 char_u buf[NUMBUFLEN + 2];
4950 long reglen = 0; 5556 long reglen = 0;
4951 5557
4952 if (argvars[0].var_type != VAR_UNKNOWN) 5558 if (argvars[0].v_type != VAR_UNKNOWN)
4953 strregname = get_var_string(&argvars[0]); 5559 strregname = get_vartv_string(&argvars[0]);
4954 else 5560 else
4955 /* Default to v:register */ 5561 /* Default to v:register */
4956 strregname = vimvars[VV_REG].val; 5562 strregname = vimvars[VV_REG].val;
4957 5563
4958 regname = (strregname == NULL ? '"' : *strregname); 5564 regname = (strregname == NULL ? '"' : *strregname);
4970 buf[0] = Ctrl_V; 5576 buf[0] = Ctrl_V;
4971 sprintf((char *)buf + 1, "%ld", reglen + 1); 5577 sprintf((char *)buf + 1, "%ld", reglen + 1);
4972 break; 5578 break;
4973 #endif 5579 #endif
4974 } 5580 }
4975 retvar->var_type = VAR_STRING; 5581 retvar->v_type = VAR_STRING;
4976 retvar->var_val.var_string = vim_strsave(buf); 5582 retvar->vval.v_string = vim_strsave(buf);
4977 } 5583 }
4978 5584
4979 /* 5585 /*
4980 * "getline(lnum)" function 5586 * "getline(lnum)" function
4981 */ 5587 */
4982 static void 5588 static void
4983 f_getline(argvars, retvar) 5589 f_getline(argvars, retvar)
4984 VAR argvars; 5590 typeval *argvars;
4985 VAR retvar; 5591 typeval *retvar;
4986 { 5592 {
4987 linenr_T lnum; 5593 linenr_T lnum;
4988 char_u *p; 5594 char_u *p;
4989 5595
4990 lnum = get_var_lnum(argvars); 5596 lnum = get_vartv_lnum(argvars);
4991 5597
4992 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 5598 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
4993 p = ml_get(lnum); 5599 p = ml_get(lnum);
4994 else 5600 else
4995 p = (char_u *)""; 5601 p = (char_u *)"";
4996 5602
4997 retvar->var_type = VAR_STRING; 5603 retvar->v_type = VAR_STRING;
4998 retvar->var_val.var_string = vim_strsave(p); 5604 retvar->vval.v_string = vim_strsave(p);
4999 } 5605 }
5000 5606
5001 /* 5607 /*
5002 * "getwinposx()" function 5608 * "getwinposx()" function
5003 */ 5609 */
5004 /*ARGSUSED*/ 5610 /*ARGSUSED*/
5005 static void 5611 static void
5006 f_getwinposx(argvars, retvar) 5612 f_getwinposx(argvars, retvar)
5007 VAR argvars; 5613 typeval *argvars;
5008 VAR retvar; 5614 typeval *retvar;
5009 { 5615 {
5010 retvar->var_val.var_number = -1; 5616 retvar->vval.v_number = -1;
5011 #ifdef FEAT_GUI 5617 #ifdef FEAT_GUI
5012 if (gui.in_use) 5618 if (gui.in_use)
5013 { 5619 {
5014 int x, y; 5620 int x, y;
5015 5621
5016 if (gui_mch_get_winpos(&x, &y) == OK) 5622 if (gui_mch_get_winpos(&x, &y) == OK)
5017 retvar->var_val.var_number = x; 5623 retvar->vval.v_number = x;
5018 } 5624 }
5019 #endif 5625 #endif
5020 } 5626 }
5021 5627
5022 /* 5628 /*
5023 * "getwinposy()" function 5629 * "getwinposy()" function
5024 */ 5630 */
5025 /*ARGSUSED*/ 5631 /*ARGSUSED*/
5026 static void 5632 static void
5027 f_getwinposy(argvars, retvar) 5633 f_getwinposy(argvars, retvar)
5028 VAR argvars; 5634 typeval *argvars;
5029 VAR retvar; 5635 typeval *retvar;
5030 { 5636 {
5031 retvar->var_val.var_number = -1; 5637 retvar->vval.v_number = -1;
5032 #ifdef FEAT_GUI 5638 #ifdef FEAT_GUI
5033 if (gui.in_use) 5639 if (gui.in_use)
5034 { 5640 {
5035 int x, y; 5641 int x, y;
5036 5642
5037 if (gui_mch_get_winpos(&x, &y) == OK) 5643 if (gui_mch_get_winpos(&x, &y) == OK)
5038 retvar->var_val.var_number = y; 5644 retvar->vval.v_number = y;
5039 } 5645 }
5040 #endif 5646 #endif
5041 } 5647 }
5042 5648
5043 /* 5649 /*
5044 * "getwinvar()" function 5650 * "getwinvar()" function
5045 */ 5651 */
5046 static void 5652 static void
5047 f_getwinvar(argvars, retvar) 5653 f_getwinvar(argvars, retvar)
5048 VAR argvars; 5654 typeval *argvars;
5049 VAR retvar; 5655 typeval *retvar;
5050 { 5656 {
5051 win_T *win, *oldcurwin; 5657 win_T *win, *oldcurwin;
5052 char_u *varname; 5658 char_u *varname;
5053 VAR v; 5659 VAR v;
5054 5660
5055 ++emsg_off; 5661 ++emsg_off;
5056 win = find_win_by_nr(&argvars[0]); 5662 win = find_win_by_nr(&argvars[0]);
5057 varname = get_var_string(&argvars[1]); 5663 varname = get_vartv_string(&argvars[1]);
5058 5664
5059 retvar->var_type = VAR_STRING; 5665 retvar->v_type = VAR_STRING;
5060 retvar->var_val.var_string = NULL; 5666 retvar->vval.v_string = NULL;
5061 5667
5062 if (win != NULL && varname != NULL) 5668 if (win != NULL && varname != NULL)
5063 { 5669 {
5064 if (*varname == '&') /* window-local-option */ 5670 if (*varname == '&') /* window-local-option */
5065 { 5671 {
5066 /* set curwin to be our win, temporarily */ 5672 /* set curwin to be our win, temporarily */
5067 oldcurwin = curwin; 5673 oldcurwin = curwin;
5068 curwin = win; 5674 curwin = win;
5069 5675
5070 get_option_var(&varname, retvar , 1); 5676 get_option_vartv(&varname, retvar, 1);
5071 5677
5072 /* restore previous notion of curwin */ 5678 /* restore previous notion of curwin */
5073 curwin = oldcurwin; 5679 curwin = oldcurwin;
5074 } 5680 }
5075 else 5681 else
5076 { 5682 {
5077 /* look up the variable */ 5683 /* look up the variable */
5078 v = find_var_in_ga(&win->w_vars, varname); 5684 v = find_var_in_ga(&win->w_vars, varname);
5079 if (v != NULL) 5685 if (v != NULL)
5080 copy_var(v, retvar); 5686 copy_vartv(&v->tv, retvar);
5081 } 5687 }
5082 } 5688 }
5083 5689
5084 --emsg_off; 5690 --emsg_off;
5085 } 5691 }
5087 /* 5693 /*
5088 * "glob()" function 5694 * "glob()" function
5089 */ 5695 */
5090 static void 5696 static void
5091 f_glob(argvars, retvar) 5697 f_glob(argvars, retvar)
5092 VAR argvars; 5698 typeval *argvars;
5093 VAR retvar; 5699 typeval *retvar;
5094 { 5700 {
5095 expand_T xpc; 5701 expand_T xpc;
5096 5702
5097 ExpandInit(&xpc); 5703 ExpandInit(&xpc);
5098 xpc.xp_context = EXPAND_FILES; 5704 xpc.xp_context = EXPAND_FILES;
5099 retvar->var_type = VAR_STRING; 5705 retvar->v_type = VAR_STRING;
5100 retvar->var_val.var_string = ExpandOne(&xpc, get_var_string(&argvars[0]), 5706 retvar->vval.v_string = ExpandOne(&xpc, get_vartv_string(&argvars[0]),
5101 NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL); 5707 NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
5102 ExpandCleanup(&xpc); 5708 ExpandCleanup(&xpc);
5103 } 5709 }
5104 5710
5105 /* 5711 /*
5106 * "globpath()" function 5712 * "globpath()" function
5107 */ 5713 */
5108 static void 5714 static void
5109 f_globpath(argvars, retvar) 5715 f_globpath(argvars, retvar)
5110 VAR argvars; 5716 typeval *argvars;
5111 VAR retvar; 5717 typeval *retvar;
5112 { 5718 {
5113 char_u buf1[NUMBUFLEN]; 5719 char_u buf1[NUMBUFLEN];
5114 5720
5115 retvar->var_type = VAR_STRING; 5721 retvar->v_type = VAR_STRING;
5116 retvar->var_val.var_string = globpath(get_var_string(&argvars[0]), 5722 retvar->vval.v_string = globpath(get_vartv_string(&argvars[0]),
5117 get_var_string_buf(&argvars[1], buf1)); 5723 get_vartv_string_buf(&argvars[1], buf1));
5118 } 5724 }
5119 5725
5120 /* 5726 /*
5121 * "has()" function 5727 * "has()" function
5122 */ 5728 */
5123 static void 5729 static void
5124 f_has(argvars, retvar) 5730 f_has(argvars, retvar)
5125 VAR argvars; 5731 typeval *argvars;
5126 VAR retvar; 5732 typeval *retvar;
5127 { 5733 {
5128 int i; 5734 int i;
5129 char_u *name; 5735 char_u *name;
5130 int n = FALSE; 5736 int n = FALSE;
5131 static char *(has_list[]) = 5737 static char *(has_list[]) =
5549 "X11", 6155 "X11",
5550 #endif 6156 #endif
5551 NULL 6157 NULL
5552 }; 6158 };
5553 6159
5554 name = get_var_string(&argvars[0]); 6160 name = get_vartv_string(&argvars[0]);
5555 for (i = 0; has_list[i] != NULL; ++i) 6161 for (i = 0; has_list[i] != NULL; ++i)
5556 if (STRICMP(name, has_list[i]) == 0) 6162 if (STRICMP(name, has_list[i]) == 0)
5557 { 6163 {
5558 n = TRUE; 6164 n = TRUE;
5559 break; 6165 break;
5609 else if (STRICMP(name, "netbeans_enabled") == 0) 6215 else if (STRICMP(name, "netbeans_enabled") == 0)
5610 n = usingNetbeans; 6216 n = usingNetbeans;
5611 #endif 6217 #endif
5612 } 6218 }
5613 6219
5614 retvar->var_val.var_number = n; 6220 retvar->vval.v_number = n;
5615 } 6221 }
5616 6222
5617 /* 6223 /*
5618 * "hasmapto()" function 6224 * "hasmapto()" function
5619 */ 6225 */
5620 static void 6226 static void
5621 f_hasmapto(argvars, retvar) 6227 f_hasmapto(argvars, retvar)
5622 VAR argvars; 6228 typeval *argvars;
5623 VAR retvar; 6229 typeval *retvar;
5624 { 6230 {
5625 char_u *name; 6231 char_u *name;
5626 char_u *mode; 6232 char_u *mode;
5627 char_u buf[NUMBUFLEN]; 6233 char_u buf[NUMBUFLEN];
5628 6234
5629 name = get_var_string(&argvars[0]); 6235 name = get_vartv_string(&argvars[0]);
5630 if (argvars[1].var_type == VAR_UNKNOWN) 6236 if (argvars[1].v_type == VAR_UNKNOWN)
5631 mode = (char_u *)"nvo"; 6237 mode = (char_u *)"nvo";
5632 else 6238 else
5633 mode = get_var_string_buf(&argvars[1], buf); 6239 mode = get_vartv_string_buf(&argvars[1], buf);
5634 6240
5635 if (map_to_exists(name, mode)) 6241 if (map_to_exists(name, mode))
5636 retvar->var_val.var_number = TRUE; 6242 retvar->vval.v_number = TRUE;
5637 else 6243 else
5638 retvar->var_val.var_number = FALSE; 6244 retvar->vval.v_number = FALSE;
5639 } 6245 }
5640 6246
5641 /* 6247 /*
5642 * "histadd()" function 6248 * "histadd()" function
5643 */ 6249 */
5644 /*ARGSUSED*/ 6250 /*ARGSUSED*/
5645 static void 6251 static void
5646 f_histadd(argvars, retvar) 6252 f_histadd(argvars, retvar)
5647 VAR argvars; 6253 typeval *argvars;
5648 VAR retvar; 6254 typeval *retvar;
5649 { 6255 {
5650 #ifdef FEAT_CMDHIST 6256 #ifdef FEAT_CMDHIST
5651 int histype; 6257 int histype;
5652 char_u *str; 6258 char_u *str;
5653 char_u buf[NUMBUFLEN]; 6259 char_u buf[NUMBUFLEN];
5654 #endif 6260 #endif
5655 6261
5656 retvar->var_val.var_number = FALSE; 6262 retvar->vval.v_number = FALSE;
5657 if (check_restricted() || check_secure()) 6263 if (check_restricted() || check_secure())
5658 return; 6264 return;
5659 #ifdef FEAT_CMDHIST 6265 #ifdef FEAT_CMDHIST
5660 histype = get_histtype(get_var_string(&argvars[0])); 6266 histype = get_histtype(get_vartv_string(&argvars[0]));
5661 if (histype >= 0) 6267 if (histype >= 0)
5662 { 6268 {
5663 str = get_var_string_buf(&argvars[1], buf); 6269 str = get_vartv_string_buf(&argvars[1], buf);
5664 if (*str != NUL) 6270 if (*str != NUL)
5665 { 6271 {
5666 add_to_history(histype, str, FALSE, NUL); 6272 add_to_history(histype, str, FALSE, NUL);
5667 retvar->var_val.var_number = TRUE; 6273 retvar->vval.v_number = TRUE;
5668 return; 6274 return;
5669 } 6275 }
5670 } 6276 }
5671 #endif 6277 #endif
5672 } 6278 }
5675 * "histdel()" function 6281 * "histdel()" function
5676 */ 6282 */
5677 /*ARGSUSED*/ 6283 /*ARGSUSED*/
5678 static void 6284 static void
5679 f_histdel(argvars, retvar) 6285 f_histdel(argvars, retvar)
5680 VAR argvars; 6286 typeval *argvars;
5681 VAR retvar; 6287 typeval *retvar;
5682 { 6288 {
5683 #ifdef FEAT_CMDHIST 6289 #ifdef FEAT_CMDHIST
5684 int n; 6290 int n;
5685 char_u buf[NUMBUFLEN]; 6291 char_u buf[NUMBUFLEN];
5686 6292
5687 if (argvars[1].var_type == VAR_UNKNOWN) 6293 if (argvars[1].v_type == VAR_UNKNOWN)
5688 /* only one argument: clear entire history */ 6294 /* only one argument: clear entire history */
5689 n = clr_history(get_histtype(get_var_string(&argvars[0]))); 6295 n = clr_history(get_histtype(get_vartv_string(&argvars[0])));
5690 else if (argvars[1].var_type == VAR_NUMBER) 6296 else if (argvars[1].v_type == VAR_NUMBER)
5691 /* index given: remove that entry */ 6297 /* index given: remove that entry */
5692 n = del_history_idx(get_histtype(get_var_string(&argvars[0])), 6298 n = del_history_idx(get_histtype(get_vartv_string(&argvars[0])),
5693 (int)get_var_number(&argvars[1])); 6299 (int)get_vartv_number(&argvars[1]));
5694 else 6300 else
5695 /* string given: remove all matching entries */ 6301 /* string given: remove all matching entries */
5696 n = del_history_entry(get_histtype(get_var_string(&argvars[0])), 6302 n = del_history_entry(get_histtype(get_vartv_string(&argvars[0])),
5697 get_var_string_buf(&argvars[1], buf)); 6303 get_vartv_string_buf(&argvars[1], buf));
5698 retvar->var_val.var_number = n; 6304 retvar->vval.v_number = n;
5699 #else 6305 #else
5700 retvar->var_val.var_number = 0; 6306 retvar->vval.v_number = 0;
5701 #endif 6307 #endif
5702 } 6308 }
5703 6309
5704 /* 6310 /*
5705 * "histget()" function 6311 * "histget()" function
5706 */ 6312 */
5707 /*ARGSUSED*/ 6313 /*ARGSUSED*/
5708 static void 6314 static void
5709 f_histget(argvars, retvar) 6315 f_histget(argvars, retvar)
5710 VAR argvars; 6316 typeval *argvars;
5711 VAR retvar; 6317 typeval *retvar;
5712 { 6318 {
5713 #ifdef FEAT_CMDHIST 6319 #ifdef FEAT_CMDHIST
5714 int type; 6320 int type;
5715 int idx; 6321 int idx;
5716 6322
5717 type = get_histtype(get_var_string(&argvars[0])); 6323 type = get_histtype(get_vartv_string(&argvars[0]));
5718 if (argvars[1].var_type == VAR_UNKNOWN) 6324 if (argvars[1].v_type == VAR_UNKNOWN)
5719 idx = get_history_idx(type); 6325 idx = get_history_idx(type);
5720 else 6326 else
5721 idx = (int)get_var_number(&argvars[1]); 6327 idx = (int)get_vartv_number(&argvars[1]);
5722 retvar->var_val.var_string = vim_strsave(get_history_entry(type, idx)); 6328 retvar->vval.v_string = vim_strsave(get_history_entry(type, idx));
5723 #else 6329 #else
5724 retvar->var_val.var_string = NULL; 6330 retvar->vval.v_string = NULL;
5725 #endif 6331 #endif
5726 retvar->var_type = VAR_STRING; 6332 retvar->v_type = VAR_STRING;
5727 } 6333 }
5728 6334
5729 /* 6335 /*
5730 * "histnr()" function 6336 * "histnr()" function
5731 */ 6337 */
5732 /*ARGSUSED*/ 6338 /*ARGSUSED*/
5733 static void 6339 static void
5734 f_histnr(argvars, retvar) 6340 f_histnr(argvars, retvar)
5735 VAR argvars; 6341 typeval *argvars;
5736 VAR retvar; 6342 typeval *retvar;
5737 { 6343 {
5738 int i; 6344 int i;
5739 6345
5740 #ifdef FEAT_CMDHIST 6346 #ifdef FEAT_CMDHIST
5741 i = get_histtype(get_var_string(&argvars[0])); 6347 i = get_histtype(get_vartv_string(&argvars[0]));
5742 if (i >= HIST_CMD && i < HIST_COUNT) 6348 if (i >= HIST_CMD && i < HIST_COUNT)
5743 i = get_history_idx(i); 6349 i = get_history_idx(i);
5744 else 6350 else
5745 #endif 6351 #endif
5746 i = -1; 6352 i = -1;
5747 retvar->var_val.var_number = i; 6353 retvar->vval.v_number = i;
5748 } 6354 }
5749 6355
5750 /* 6356 /*
5751 * "highlight_exists()" function 6357 * "highlight_exists()" function
5752 */ 6358 */
5753 static void 6359 static void
5754 f_hlexists(argvars, retvar) 6360 f_hlexists(argvars, retvar)
5755 VAR argvars; 6361 typeval *argvars;
5756 VAR retvar; 6362 typeval *retvar;
5757 { 6363 {
5758 retvar->var_val.var_number = highlight_exists(get_var_string(&argvars[0])); 6364 retvar->vval.v_number = highlight_exists(get_vartv_string(&argvars[0]));
5759 } 6365 }
5760 6366
5761 /* 6367 /*
5762 * "highlightID(name)" function 6368 * "highlightID(name)" function
5763 */ 6369 */
5764 static void 6370 static void
5765 f_hlID(argvars, retvar) 6371 f_hlID(argvars, retvar)
5766 VAR argvars; 6372 typeval *argvars;
5767 VAR retvar; 6373 typeval *retvar;
5768 { 6374 {
5769 retvar->var_val.var_number = syn_name2id(get_var_string(&argvars[0])); 6375 retvar->vval.v_number = syn_name2id(get_vartv_string(&argvars[0]));
5770 } 6376 }
5771 6377
5772 /* 6378 /*
5773 * "hostname()" function 6379 * "hostname()" function
5774 */ 6380 */
5775 /*ARGSUSED*/ 6381 /*ARGSUSED*/
5776 static void 6382 static void
5777 f_hostname(argvars, retvar) 6383 f_hostname(argvars, retvar)
5778 VAR argvars; 6384 typeval *argvars;
5779 VAR retvar; 6385 typeval *retvar;
5780 { 6386 {
5781 char_u hostname[256]; 6387 char_u hostname[256];
5782 6388
5783 mch_get_host_name(hostname, 256); 6389 mch_get_host_name(hostname, 256);
5784 retvar->var_type = VAR_STRING; 6390 retvar->v_type = VAR_STRING;
5785 retvar->var_val.var_string = vim_strsave(hostname); 6391 retvar->vval.v_string = vim_strsave(hostname);
5786 } 6392 }
5787 6393
5788 /* 6394 /*
5789 * iconv() function 6395 * iconv() function
5790 */ 6396 */
5791 /*ARGSUSED*/ 6397 /*ARGSUSED*/
5792 static void 6398 static void
5793 f_iconv(argvars, retvar) 6399 f_iconv(argvars, retvar)
5794 VAR argvars; 6400 typeval *argvars;
5795 VAR retvar; 6401 typeval *retvar;
5796 { 6402 {
5797 #ifdef FEAT_MBYTE 6403 #ifdef FEAT_MBYTE
5798 char_u buf1[NUMBUFLEN]; 6404 char_u buf1[NUMBUFLEN];
5799 char_u buf2[NUMBUFLEN]; 6405 char_u buf2[NUMBUFLEN];
5800 char_u *from, *to, *str; 6406 char_u *from, *to, *str;
5801 vimconv_T vimconv; 6407 vimconv_T vimconv;
5802 #endif 6408 #endif
5803 6409
5804 retvar->var_type = VAR_STRING; 6410 retvar->v_type = VAR_STRING;
5805 retvar->var_val.var_string = NULL; 6411 retvar->vval.v_string = NULL;
5806 6412
5807 #ifdef FEAT_MBYTE 6413 #ifdef FEAT_MBYTE
5808 str = get_var_string(&argvars[0]); 6414 str = get_vartv_string(&argvars[0]);
5809 from = enc_canonize(enc_skip(get_var_string_buf(&argvars[1], buf1))); 6415 from = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[1], buf1)));
5810 to = enc_canonize(enc_skip(get_var_string_buf(&argvars[2], buf2))); 6416 to = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[2], buf2)));
5811 vimconv.vc_type = CONV_NONE; 6417 vimconv.vc_type = CONV_NONE;
5812 convert_setup(&vimconv, from, to); 6418 convert_setup(&vimconv, from, to);
5813 6419
5814 /* If the encodings are equal, no conversion needed. */ 6420 /* If the encodings are equal, no conversion needed. */
5815 if (vimconv.vc_type == CONV_NONE) 6421 if (vimconv.vc_type == CONV_NONE)
5816 retvar->var_val.var_string = vim_strsave(str); 6422 retvar->vval.v_string = vim_strsave(str);
5817 else 6423 else
5818 retvar->var_val.var_string = string_convert(&vimconv, str, NULL); 6424 retvar->vval.v_string = string_convert(&vimconv, str, NULL);
5819 6425
5820 convert_setup(&vimconv, NULL, NULL); 6426 convert_setup(&vimconv, NULL, NULL);
5821 vim_free(from); 6427 vim_free(from);
5822 vim_free(to); 6428 vim_free(to);
5823 #endif 6429 #endif
5826 /* 6432 /*
5827 * "indent()" function 6433 * "indent()" function
5828 */ 6434 */
5829 static void 6435 static void
5830 f_indent(argvars, retvar) 6436 f_indent(argvars, retvar)
5831 VAR argvars; 6437 typeval *argvars;
5832 VAR retvar; 6438 typeval *retvar;
5833 { 6439 {
5834 linenr_T lnum; 6440 linenr_T lnum;
5835 6441
5836 lnum = get_var_lnum(argvars); 6442 lnum = get_vartv_lnum(argvars);
5837 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 6443 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
5838 retvar->var_val.var_number = get_indent_lnum(lnum); 6444 retvar->vval.v_number = get_indent_lnum(lnum);
5839 else 6445 else
5840 retvar->var_val.var_number = -1; 6446 retvar->vval.v_number = -1;
5841 } 6447 }
5842 6448
5843 static int inputsecret_flag = 0; 6449 static int inputsecret_flag = 0;
5844 6450
5845 /* 6451 /*
5846 * "input()" function 6452 * "input()" function
5847 * Also handles inputsecret() when inputsecret is set. 6453 * Also handles inputsecret() when inputsecret is set.
5848 */ 6454 */
5849 static void 6455 static void
5850 f_input(argvars, retvar) 6456 f_input(argvars, retvar)
5851 VAR argvars; 6457 typeval *argvars;
5852 VAR retvar; 6458 typeval *retvar;
5853 { 6459 {
5854 char_u *prompt = get_var_string(&argvars[0]); 6460 char_u *prompt = get_vartv_string(&argvars[0]);
5855 char_u *p = NULL; 6461 char_u *p = NULL;
5856 int c; 6462 int c;
5857 char_u buf[NUMBUFLEN]; 6463 char_u buf[NUMBUFLEN];
5858 int cmd_silent_save = cmd_silent; 6464 int cmd_silent_save = cmd_silent;
5859 6465
5860 retvar->var_type = VAR_STRING; 6466 retvar->v_type = VAR_STRING;
5861 6467
5862 #ifdef NO_CONSOLE_INPUT 6468 #ifdef NO_CONSOLE_INPUT
5863 /* While starting up, there is no place to enter text. */ 6469 /* While starting up, there is no place to enter text. */
5864 if (no_console_input()) 6470 if (no_console_input())
5865 { 6471 {
5866 retvar->var_val.var_string = NULL; 6472 retvar->vval.v_string = NULL;
5867 return; 6473 return;
5868 } 6474 }
5869 #endif 6475 #endif
5870 6476
5871 cmd_silent = FALSE; /* Want to see the prompt. */ 6477 cmd_silent = FALSE; /* Want to see the prompt. */
5889 *p = c; 6495 *p = c;
5890 } 6496 }
5891 cmdline_row = msg_row; 6497 cmdline_row = msg_row;
5892 } 6498 }
5893 6499
5894 if (argvars[1].var_type != VAR_UNKNOWN) 6500 if (argvars[1].v_type != VAR_UNKNOWN)
5895 stuffReadbuffSpec(get_var_string_buf(&argvars[1], buf)); 6501 stuffReadbuffSpec(get_vartv_string_buf(&argvars[1], buf));
5896 6502
5897 retvar->var_val.var_string = 6503 retvar->vval.v_string =
5898 getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr); 6504 getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr);
5899 6505
5900 /* since the user typed this, no need to wait for return */ 6506 /* since the user typed this, no need to wait for return */
5901 need_wait_return = FALSE; 6507 need_wait_return = FALSE;
5902 msg_didout = FALSE; 6508 msg_didout = FALSE;
5906 /* 6512 /*
5907 * "inputdialog()" function 6513 * "inputdialog()" function
5908 */ 6514 */
5909 static void 6515 static void
5910 f_inputdialog(argvars, retvar) 6516 f_inputdialog(argvars, retvar)
5911 VAR argvars; 6517 typeval *argvars;
5912 VAR retvar; 6518 typeval *retvar;
5913 { 6519 {
5914 #if defined(FEAT_GUI_TEXTDIALOG) 6520 #if defined(FEAT_GUI_TEXTDIALOG)
5915 /* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */ 6521 /* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */
5916 if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL) 6522 if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL)
5917 { 6523 {
5918 char_u *message; 6524 char_u *message;
5919 char_u buf[NUMBUFLEN]; 6525 char_u buf[NUMBUFLEN];
5920 6526
5921 message = get_var_string(&argvars[0]); 6527 message = get_vartv_string(&argvars[0]);
5922 if (argvars[1].var_type != VAR_UNKNOWN) 6528 if (argvars[1].v_type != VAR_UNKNOWN)
5923 { 6529 {
5924 STRNCPY(IObuff, get_var_string_buf(&argvars[1], buf), IOSIZE); 6530 STRNCPY(IObuff, get_vartv_string_buf(&argvars[1], buf), IOSIZE);
5925 IObuff[IOSIZE - 1] = NUL; 6531 IObuff[IOSIZE - 1] = NUL;
5926 } 6532 }
5927 else 6533 else
5928 IObuff[0] = NUL; 6534 IObuff[0] = NUL;
5929 if (do_dialog(VIM_QUESTION, NULL, message, (char_u *)_("&OK\n&Cancel"), 6535 if (do_dialog(VIM_QUESTION, NULL, message, (char_u *)_("&OK\n&Cancel"),
5930 1, IObuff) == 1) 6536 1, IObuff) == 1)
5931 retvar->var_val.var_string = vim_strsave(IObuff); 6537 retvar->vval.v_string = vim_strsave(IObuff);
5932 else 6538 else
5933 { 6539 {
5934 if (argvars[1].var_type != VAR_UNKNOWN 6540 if (argvars[1].v_type != VAR_UNKNOWN
5935 && argvars[2].var_type != VAR_UNKNOWN) 6541 && argvars[2].v_type != VAR_UNKNOWN)
5936 retvar->var_val.var_string = vim_strsave( 6542 retvar->vval.v_string = vim_strsave(
5937 get_var_string_buf(&argvars[2], buf)); 6543 get_vartv_string_buf(&argvars[2], buf));
5938 else 6544 else
5939 retvar->var_val.var_string = NULL; 6545 retvar->vval.v_string = NULL;
5940 } 6546 }
5941 retvar->var_type = VAR_STRING; 6547 retvar->v_type = VAR_STRING;
5942 } 6548 }
5943 else 6549 else
5944 #endif 6550 #endif
5945 f_input(argvars, retvar); 6551 f_input(argvars, retvar);
5946 } 6552 }
5951 * "inputrestore()" function 6557 * "inputrestore()" function
5952 */ 6558 */
5953 /*ARGSUSED*/ 6559 /*ARGSUSED*/
5954 static void 6560 static void
5955 f_inputrestore(argvars, retvar) 6561 f_inputrestore(argvars, retvar)
5956 VAR argvars; 6562 typeval *argvars;
5957 VAR retvar; 6563 typeval *retvar;
5958 { 6564 {
5959 if (ga_userinput.ga_len > 0) 6565 if (ga_userinput.ga_len > 0)
5960 { 6566 {
5961 --ga_userinput.ga_len; 6567 --ga_userinput.ga_len;
5962 restore_typeahead((tasave_T *)(ga_userinput.ga_data) 6568 restore_typeahead((tasave_T *)(ga_userinput.ga_data)
5963 + ga_userinput.ga_len); 6569 + ga_userinput.ga_len);
5964 retvar->var_val.var_number = 0; /* OK */ 6570 retvar->vval.v_number = 0; /* OK */
5965 } 6571 }
5966 else if (p_verbose > 1) 6572 else if (p_verbose > 1)
5967 { 6573 {
5968 msg((char_u *)_("called inputrestore() more often than inputsave()")); 6574 msg((char_u *)_("called inputrestore() more often than inputsave()"));
5969 retvar->var_val.var_number = 1; /* Failed */ 6575 retvar->vval.v_number = 1; /* Failed */
5970 } 6576 }
5971 } 6577 }
5972 6578
5973 /* 6579 /*
5974 * "inputsave()" function 6580 * "inputsave()" function
5975 */ 6581 */
5976 /*ARGSUSED*/ 6582 /*ARGSUSED*/
5977 static void 6583 static void
5978 f_inputsave(argvars, retvar) 6584 f_inputsave(argvars, retvar)
5979 VAR argvars; 6585 typeval *argvars;
5980 VAR retvar; 6586 typeval *retvar;
5981 { 6587 {
5982 /* Add an entry to the stack of typehead storage. */ 6588 /* Add an entry to the stack of typehead storage. */
5983 if (ga_grow(&ga_userinput, 1) == OK) 6589 if (ga_grow(&ga_userinput, 1) == OK)
5984 { 6590 {
5985 save_typeahead((tasave_T *)(ga_userinput.ga_data) 6591 save_typeahead((tasave_T *)(ga_userinput.ga_data)
5986 + ga_userinput.ga_len); 6592 + ga_userinput.ga_len);
5987 ++ga_userinput.ga_len; 6593 ++ga_userinput.ga_len;
5988 retvar->var_val.var_number = 0; /* OK */ 6594 retvar->vval.v_number = 0; /* OK */
5989 } 6595 }
5990 else 6596 else
5991 retvar->var_val.var_number = 1; /* Failed */ 6597 retvar->vval.v_number = 1; /* Failed */
5992 } 6598 }
5993 6599
5994 /* 6600 /*
5995 * "inputsecret()" function 6601 * "inputsecret()" function
5996 */ 6602 */
5997 static void 6603 static void
5998 f_inputsecret(argvars, retvar) 6604 f_inputsecret(argvars, retvar)
5999 VAR argvars; 6605 typeval *argvars;
6000 VAR retvar; 6606 typeval *retvar;
6001 { 6607 {
6002 ++cmdline_star; 6608 ++cmdline_star;
6003 ++inputsecret_flag; 6609 ++inputsecret_flag;
6004 f_input(argvars, retvar); 6610 f_input(argvars, retvar);
6005 --cmdline_star; 6611 --cmdline_star;
6006 --inputsecret_flag; 6612 --inputsecret_flag;
6007 } 6613 }
6008 6614
6009 /* 6615 /*
6616 * "insert()" function
6617 */
6618 static void
6619 f_insert(argvars, retvar)
6620 typeval *argvars;
6621 typeval *retvar;
6622 {
6623 long before = 0;
6624 long n;
6625 listitem *item;
6626 listitem *ni;
6627 listvar *l;
6628
6629 if (argvars[0].v_type != VAR_LIST)
6630 EMSG(_("E999: First argument of insert() must be a list"));
6631 else if ((l = argvars[0].vval.v_list) != NULL)
6632 {
6633 if (argvars[2].v_type != VAR_UNKNOWN)
6634 before = get_vartv_number(&argvars[2]);
6635
6636 if (before < 0)
6637 {
6638 /* Count from the end: -1 is before last item. */
6639 item = l->lv_last;
6640 for (n = before + 1; n < 0 && item != NULL; ++n)
6641 item = item->li_prev;
6642 if (item == NULL)
6643 n = 1; /* report an error, don't append */
6644 }
6645 else
6646 {
6647 /* Can't use list_find() here, we allow one past the end. */
6648 item = l->lv_first;
6649 for (n = before; n > 0 && item != NULL; --n)
6650 item = item->li_next;
6651 }
6652 if (n > 0)
6653 EMSGN(_(e_listidx), before);
6654 else
6655 {
6656 ni = listitem_alloc();
6657 if (ni != NULL)
6658 {
6659 copy_vartv(&argvars[1], &ni->li_tv);
6660 if (item == NULL)
6661 /* Append new item at end of list. */
6662 list_append(l, ni);
6663 else
6664 {
6665 /* Insert new item before existing item. */
6666 ni->li_prev = item->li_prev;
6667 ni->li_next = item;
6668 if (item->li_prev == NULL)
6669 l->lv_first = ni;
6670 else
6671 item->li_prev->li_next = ni;
6672 item->li_prev = ni;
6673 }
6674 copy_vartv(&argvars[0], retvar);
6675 }
6676 }
6677 }
6678 }
6679
6680 /*
6010 * "isdirectory()" function 6681 * "isdirectory()" function
6011 */ 6682 */
6012 static void 6683 static void
6013 f_isdirectory(argvars, retvar) 6684 f_isdirectory(argvars, retvar)
6014 VAR argvars; 6685 typeval *argvars;
6015 VAR retvar; 6686 typeval *retvar;
6016 { 6687 {
6017 retvar->var_val.var_number = mch_isdir(get_var_string(&argvars[0])); 6688 retvar->vval.v_number = mch_isdir(get_vartv_string(&argvars[0]));
6018 } 6689 }
6019 6690
6020 /* 6691 /*
6021 * "last_buffer_nr()" function. 6692 * "last_buffer_nr()" function.
6022 */ 6693 */
6023 /*ARGSUSED*/ 6694 /*ARGSUSED*/
6024 static void 6695 static void
6025 f_last_buffer_nr(argvars, retvar) 6696 f_last_buffer_nr(argvars, retvar)
6026 VAR argvars; 6697 typeval *argvars;
6027 VAR retvar; 6698 typeval *retvar;
6028 { 6699 {
6029 int n = 0; 6700 int n = 0;
6030 buf_T *buf; 6701 buf_T *buf;
6031 6702
6032 for (buf = firstbuf; buf != NULL; buf = buf->b_next) 6703 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
6033 if (n < buf->b_fnum) 6704 if (n < buf->b_fnum)
6034 n = buf->b_fnum; 6705 n = buf->b_fnum;
6035 6706
6036 retvar->var_val.var_number = n; 6707 retvar->vval.v_number = n;
6708 }
6709
6710 /*
6711 * "len()" function
6712 */
6713 static void
6714 f_len(argvars, retvar)
6715 typeval *argvars;
6716 typeval *retvar;
6717 {
6718 switch (argvars[0].v_type)
6719 {
6720 case VAR_STRING:
6721 case VAR_NUMBER:
6722 retvar->vval.v_number = (varnumber_T)STRLEN(
6723 get_vartv_string(&argvars[0]));
6724 break;
6725 case VAR_LIST:
6726 retvar->vval.v_number = list_len(argvars[0].vval.v_list);
6727 break;
6728 default:
6729 EMSG(_("E999: Invalid type for len()"));
6730 break;
6731 }
6732 }
6733
6734 /*
6735 * "libcall()" function
6736 */
6737 static void
6738 f_libcall(argvars, retvar)
6739 typeval *argvars;
6740 typeval *retvar;
6741 {
6742 libcall_common(argvars, retvar, VAR_STRING);
6743 }
6744
6745 /*
6746 * "libcallnr()" function
6747 */
6748 static void
6749 f_libcallnr(argvars, retvar)
6750 typeval *argvars;
6751 typeval *retvar;
6752 {
6753 libcall_common(argvars, retvar, VAR_NUMBER);
6754 }
6755
6756 static void
6757 libcall_common(argvars, retvar, type)
6758 typeval *argvars;
6759 typeval *retvar;
6760 int type;
6761 {
6762 #ifdef FEAT_LIBCALL
6763 char_u *string_in;
6764 char_u **string_result;
6765 int nr_result;
6766 #endif
6767
6768 retvar->v_type = type;
6769 if (type == VAR_NUMBER)
6770 retvar->vval.v_number = 0;
6771 else
6772 retvar->vval.v_string = NULL;
6773
6774 if (check_restricted() || check_secure())
6775 return;
6776
6777 #ifdef FEAT_LIBCALL
6778 /* The first two args must be strings, otherwise its meaningless */
6779 if (argvars[0].v_type == VAR_STRING && argvars[1].v_type == VAR_STRING)
6780 {
6781 if (argvars[2].v_type == VAR_NUMBER)
6782 string_in = NULL;
6783 else
6784 string_in = argvars[2].vval.v_string;
6785 if (type == VAR_NUMBER)
6786 string_result = NULL;
6787 else
6788 string_result = &retvar->vval.v_string;
6789 if (mch_libcall(argvars[0].vval.v_string,
6790 argvars[1].vval.v_string,
6791 string_in,
6792 argvars[2].vval.v_number,
6793 string_result,
6794 &nr_result) == OK
6795 && type == VAR_NUMBER)
6796 retvar->vval.v_number = nr_result;
6797 }
6798 #endif
6037 } 6799 }
6038 6800
6039 /* 6801 /*
6040 * "line(string)" function 6802 * "line(string)" function
6041 */ 6803 */
6042 static void 6804 static void
6043 f_line(argvars, retvar) 6805 f_line(argvars, retvar)
6044 VAR argvars; 6806 typeval *argvars;
6045 VAR retvar; 6807 typeval *retvar;
6046 { 6808 {
6047 linenr_T lnum = 0; 6809 linenr_T lnum = 0;
6048 pos_T *fp; 6810 pos_T *fp;
6049 6811
6050 fp = var2fpos(&argvars[0], TRUE); 6812 fp = var2fpos(&argvars[0], TRUE);
6051 if (fp != NULL) 6813 if (fp != NULL)
6052 lnum = fp->lnum; 6814 lnum = fp->lnum;
6053 retvar->var_val.var_number = lnum; 6815 retvar->vval.v_number = lnum;
6054 } 6816 }
6055 6817
6056 /* 6818 /*
6057 * "line2byte(lnum)" function 6819 * "line2byte(lnum)" function
6058 */ 6820 */
6059 /*ARGSUSED*/ 6821 /*ARGSUSED*/
6060 static void 6822 static void
6061 f_line2byte(argvars, retvar) 6823 f_line2byte(argvars, retvar)
6062 VAR argvars; 6824 typeval *argvars;
6063 VAR retvar; 6825 typeval *retvar;
6064 { 6826 {
6065 #ifndef FEAT_BYTEOFF 6827 #ifndef FEAT_BYTEOFF
6066 retvar->var_val.var_number = -1; 6828 retvar->vval.v_number = -1;
6067 #else 6829 #else
6068 linenr_T lnum; 6830 linenr_T lnum;
6069 6831
6070 lnum = get_var_lnum(argvars); 6832 lnum = get_vartv_lnum(argvars);
6071 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1) 6833 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
6072 retvar->var_val.var_number = -1; 6834 retvar->vval.v_number = -1;
6073 else 6835 else
6074 retvar->var_val.var_number = ml_find_line_or_offset(curbuf, lnum, NULL); 6836 retvar->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
6075 if (retvar->var_val.var_number >= 0) 6837 if (retvar->vval.v_number >= 0)
6076 ++retvar->var_val.var_number; 6838 ++retvar->vval.v_number;
6077 #endif 6839 #endif
6078 } 6840 }
6079 6841
6080 /* 6842 /*
6081 * "lispindent(lnum)" function 6843 * "lispindent(lnum)" function
6082 */ 6844 */
6083 static void 6845 static void
6084 f_lispindent(argvars, retvar) 6846 f_lispindent(argvars, retvar)
6085 VAR argvars; 6847 typeval *argvars;
6086 VAR retvar; 6848 typeval *retvar;
6087 { 6849 {
6088 #ifdef FEAT_LISP 6850 #ifdef FEAT_LISP
6089 pos_T pos; 6851 pos_T pos;
6090 linenr_T lnum; 6852 linenr_T lnum;
6091 6853
6092 pos = curwin->w_cursor; 6854 pos = curwin->w_cursor;
6093 lnum = get_var_lnum(argvars); 6855 lnum = get_vartv_lnum(argvars);
6094 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 6856 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
6095 { 6857 {
6096 curwin->w_cursor.lnum = lnum; 6858 curwin->w_cursor.lnum = lnum;
6097 retvar->var_val.var_number = get_lisp_indent(); 6859 retvar->vval.v_number = get_lisp_indent();
6098 curwin->w_cursor = pos; 6860 curwin->w_cursor = pos;
6099 } 6861 }
6100 else 6862 else
6101 #endif 6863 #endif
6102 retvar->var_val.var_number = -1; 6864 retvar->vval.v_number = -1;
6103 } 6865 }
6104 6866
6105 /* 6867 /*
6106 * "localtime()" function 6868 * "localtime()" function
6107 */ 6869 */
6108 /*ARGSUSED*/ 6870 /*ARGSUSED*/
6109 static void 6871 static void
6110 f_localtime(argvars, retvar) 6872 f_localtime(argvars, retvar)
6111 VAR argvars; 6873 typeval *argvars;
6112 VAR retvar; 6874 typeval *retvar;
6113 { 6875 {
6114 retvar->var_val.var_number = (varnumber_T)time(NULL); 6876 retvar->vval.v_number = (varnumber_T)time(NULL);
6115 } 6877 }
6116 6878
6117 /* 6879 /*
6118 * "maparg()" function 6880 * "maparg()" function
6119 */ 6881 */
6120 static void 6882 static void
6121 f_maparg(argvars, retvar) 6883 f_maparg(argvars, retvar)
6122 VAR argvars; 6884 typeval *argvars;
6123 VAR retvar; 6885 typeval *retvar;
6124 { 6886 {
6125 get_maparg(argvars, retvar, TRUE); 6887 get_maparg(argvars, retvar, TRUE);
6126 } 6888 }
6127 6889
6128 /* 6890 /*
6129 * "mapcheck()" function 6891 * "mapcheck()" function
6130 */ 6892 */
6131 static void 6893 static void
6132 f_mapcheck(argvars, retvar) 6894 f_mapcheck(argvars, retvar)
6133 VAR argvars; 6895 typeval *argvars;
6134 VAR retvar; 6896 typeval *retvar;
6135 { 6897 {
6136 get_maparg(argvars, retvar, FALSE); 6898 get_maparg(argvars, retvar, FALSE);
6137 } 6899 }
6138 6900
6139 static void 6901 static void
6140 get_maparg(argvars, retvar, exact) 6902 get_maparg(argvars, retvar, exact)
6141 VAR argvars; 6903 typeval *argvars;
6142 VAR retvar; 6904 typeval *retvar;
6143 int exact; 6905 int exact;
6144 { 6906 {
6145 char_u *keys; 6907 char_u *keys;
6146 char_u *which; 6908 char_u *which;
6147 char_u buf[NUMBUFLEN]; 6909 char_u buf[NUMBUFLEN];
6149 char_u *rhs; 6911 char_u *rhs;
6150 int mode; 6912 int mode;
6151 garray_T ga; 6913 garray_T ga;
6152 6914
6153 /* return empty string for failure */ 6915 /* return empty string for failure */
6154 retvar->var_type = VAR_STRING; 6916 retvar->v_type = VAR_STRING;
6155 retvar->var_val.var_string = NULL; 6917 retvar->vval.v_string = NULL;
6156 6918
6157 keys = get_var_string(&argvars[0]); 6919 keys = get_vartv_string(&argvars[0]);
6158 if (*keys == NUL) 6920 if (*keys == NUL)
6159 return; 6921 return;
6160 6922
6161 if (argvars[1].var_type != VAR_UNKNOWN) 6923 if (argvars[1].v_type != VAR_UNKNOWN)
6162 which = get_var_string_buf(&argvars[1], buf); 6924 which = get_vartv_string_buf(&argvars[1], buf);
6163 else 6925 else
6164 which = (char_u *)""; 6926 which = (char_u *)"";
6165 mode = get_map_mode(&which, 0); 6927 mode = get_map_mode(&which, 0);
6166 6928
6167 keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE); 6929 keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE);
6175 6937
6176 while (*rhs != NUL) 6938 while (*rhs != NUL)
6177 ga_concat(&ga, str2special(&rhs, FALSE)); 6939 ga_concat(&ga, str2special(&rhs, FALSE));
6178 6940
6179 ga_append(&ga, NUL); 6941 ga_append(&ga, NUL);
6180 retvar->var_val.var_string = (char_u *)ga.ga_data; 6942 retvar->vval.v_string = (char_u *)ga.ga_data;
6181 } 6943 }
6182 } 6944 }
6183 6945
6184 /* 6946 /*
6185 * "match()" function 6947 * "match()" function
6186 */ 6948 */
6187 static void 6949 static void
6188 f_match(argvars, retvar) 6950 f_match(argvars, retvar)
6189 VAR argvars; 6951 typeval *argvars;
6190 VAR retvar; 6952 typeval *retvar;
6191 { 6953 {
6192 find_some_match(argvars, retvar, 1); 6954 find_some_match(argvars, retvar, 1);
6193 } 6955 }
6194 6956
6195 /* 6957 /*
6196 * "matchend()" function 6958 * "matchend()" function
6197 */ 6959 */
6198 static void 6960 static void
6199 f_matchend(argvars, retvar) 6961 f_matchend(argvars, retvar)
6200 VAR argvars; 6962 typeval *argvars;
6201 VAR retvar; 6963 typeval *retvar;
6202 { 6964 {
6203 find_some_match(argvars, retvar, 0); 6965 find_some_match(argvars, retvar, 0);
6204 } 6966 }
6205 6967
6206 /* 6968 /*
6207 * "matchstr()" function 6969 * "matchstr()" function
6208 */ 6970 */
6209 static void 6971 static void
6210 f_matchstr(argvars, retvar) 6972 f_matchstr(argvars, retvar)
6211 VAR argvars; 6973 typeval *argvars;
6212 VAR retvar; 6974 typeval *retvar;
6213 { 6975 {
6214 find_some_match(argvars, retvar, 2); 6976 find_some_match(argvars, retvar, 2);
6215 } 6977 }
6216 6978
6217 static void 6979 static void
6218 find_some_match(argvars, retvar, type) 6980 find_some_match(argvars, retvar, type)
6219 VAR argvars; 6981 typeval *argvars;
6220 VAR retvar; 6982 typeval *retvar;
6221 int type; 6983 int type;
6222 { 6984 {
6223 char_u *str; 6985 char_u *str;
6224 char_u *expr; 6986 char_u *expr;
6225 char_u *pat; 6987 char_u *pat;
6232 6994
6233 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ 6995 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
6234 save_cpo = p_cpo; 6996 save_cpo = p_cpo;
6235 p_cpo = (char_u *)""; 6997 p_cpo = (char_u *)"";
6236 6998
6237 expr = str = get_var_string(&argvars[0]); 6999 expr = str = get_vartv_string(&argvars[0]);
6238 pat = get_var_string_buf(&argvars[1], patbuf); 7000 pat = get_vartv_string_buf(&argvars[1], patbuf);
6239 7001
6240 if (type == 2) 7002 if (type == 2)
6241 { 7003 {
6242 retvar->var_type = VAR_STRING; 7004 retvar->v_type = VAR_STRING;
6243 retvar->var_val.var_string = NULL; 7005 retvar->vval.v_string = NULL;
6244 } 7006 }
6245 else 7007 else
6246 retvar->var_val.var_number = -1; 7008 retvar->vval.v_number = -1;
6247 7009
6248 if (argvars[2].var_type != VAR_UNKNOWN) 7010 if (argvars[2].v_type != VAR_UNKNOWN)
6249 { 7011 {
6250 start = get_var_number(&argvars[2]); 7012 start = get_vartv_number(&argvars[2]);
6251 if (start < 0) 7013 if (start < 0)
6252 start = 0; 7014 start = 0;
6253 if (start > (long)STRLEN(str)) 7015 if (start > (long)STRLEN(str))
6254 goto theend; 7016 goto theend;
6255 str += start; 7017 str += start;
6256 7018
6257 if (argvars[3].var_type != VAR_UNKNOWN) 7019 if (argvars[3].v_type != VAR_UNKNOWN)
6258 nth = get_var_number(&argvars[3]); 7020 nth = get_vartv_number(&argvars[3]);
6259 } 7021 }
6260 7022
6261 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); 7023 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
6262 if (regmatch.regprog != NULL) 7024 if (regmatch.regprog != NULL)
6263 { 7025 {
6277 } 7039 }
6278 7040
6279 if (match) 7041 if (match)
6280 { 7042 {
6281 if (type == 2) 7043 if (type == 2)
6282 retvar->var_val.var_string = vim_strnsave(regmatch.startp[0], 7044 retvar->vval.v_string = vim_strnsave(regmatch.startp[0],
6283 (int)(regmatch.endp[0] - regmatch.startp[0])); 7045 (int)(regmatch.endp[0] - regmatch.startp[0]));
6284 else 7046 else
6285 { 7047 {
6286 if (type != 0) 7048 if (type != 0)
6287 retvar->var_val.var_number = 7049 retvar->vval.v_number =
6288 (varnumber_T)(regmatch.startp[0] - str); 7050 (varnumber_T)(regmatch.startp[0] - str);
6289 else 7051 else
6290 retvar->var_val.var_number = 7052 retvar->vval.v_number =
6291 (varnumber_T)(regmatch.endp[0] - str); 7053 (varnumber_T)(regmatch.endp[0] - str);
6292 retvar->var_val.var_number += str - expr; 7054 retvar->vval.v_number += str - expr;
6293 } 7055 }
6294 } 7056 }
6295 vim_free(regmatch.regprog); 7057 vim_free(regmatch.regprog);
6296 } 7058 }
6297 7059
6303 * "mode()" function 7065 * "mode()" function
6304 */ 7066 */
6305 /*ARGSUSED*/ 7067 /*ARGSUSED*/
6306 static void 7068 static void
6307 f_mode(argvars, retvar) 7069 f_mode(argvars, retvar)
6308 VAR argvars; 7070 typeval *argvars;
6309 VAR retvar; 7071 typeval *retvar;
6310 { 7072 {
6311 char_u buf[2]; 7073 char_u buf[2];
6312 7074
6313 #ifdef FEAT_VISUAL 7075 #ifdef FEAT_VISUAL
6314 if (VIsual_active) 7076 if (VIsual_active)
6333 buf[0] = 'c'; 7095 buf[0] = 'c';
6334 else 7096 else
6335 buf[0] = 'n'; 7097 buf[0] = 'n';
6336 7098
6337 buf[1] = NUL; 7099 buf[1] = NUL;
6338 retvar->var_val.var_string = vim_strsave(buf); 7100 retvar->vval.v_string = vim_strsave(buf);
6339 retvar->var_type = VAR_STRING; 7101 retvar->v_type = VAR_STRING;
6340 } 7102 }
6341 7103
6342 /* 7104 /*
6343 * "nr2char()" function 7105 * "nr2char()" function
6344 */ 7106 */
6345 static void 7107 static void
6346 f_nr2char(argvars, retvar) 7108 f_nr2char(argvars, retvar)
6347 VAR argvars; 7109 typeval *argvars;
6348 VAR retvar; 7110 typeval *retvar;
6349 { 7111 {
6350 char_u buf[NUMBUFLEN]; 7112 char_u buf[NUMBUFLEN];
6351 7113
6352 #ifdef FEAT_MBYTE 7114 #ifdef FEAT_MBYTE
6353 if (has_mbyte) 7115 if (has_mbyte)
6354 buf[(*mb_char2bytes)((int)get_var_number(&argvars[0]), buf)] = NUL; 7116 buf[(*mb_char2bytes)((int)get_vartv_number(&argvars[0]), buf)] = NUL;
6355 else 7117 else
6356 #endif 7118 #endif
6357 { 7119 {
6358 buf[0] = (char_u)get_var_number(&argvars[0]); 7120 buf[0] = (char_u)get_vartv_number(&argvars[0]);
6359 buf[1] = NUL; 7121 buf[1] = NUL;
6360 } 7122 }
6361 retvar->var_type = VAR_STRING; 7123 retvar->v_type = VAR_STRING;
6362 retvar->var_val.var_string = vim_strsave(buf); 7124 retvar->vval.v_string = vim_strsave(buf);
7125 }
7126
7127 /*
7128 * "remove({list}, {idx})" function
7129 */
7130 static void
7131 f_remove(argvars, retvar)
7132 typeval *argvars;
7133 typeval *retvar;
7134 {
7135 listvar *l;
7136 listitem *item;
7137 long idx;
7138
7139 if (argvars[0].v_type != VAR_LIST)
7140 EMSG(_("E999: First argument of remove() must be a list"));
7141 else if ((l = argvars[0].vval.v_list) != NULL)
7142 {
7143 idx = get_vartv_number(&argvars[1]);
7144 item = list_getrem(l, idx);
7145 if (item == NULL)
7146 EMSGN(_(e_listidx), idx);
7147 else
7148 {
7149 *retvar = item->li_tv;
7150 vim_free(item);
7151 }
7152 }
6363 } 7153 }
6364 7154
6365 /* 7155 /*
6366 * "rename({from}, {to})" function 7156 * "rename({from}, {to})" function
6367 */ 7157 */
6368 static void 7158 static void
6369 f_rename(argvars, retvar) 7159 f_rename(argvars, retvar)
6370 VAR argvars; 7160 typeval *argvars;
6371 VAR retvar; 7161 typeval *retvar;
6372 { 7162 {
6373 char_u buf[NUMBUFLEN]; 7163 char_u buf[NUMBUFLEN];
6374 7164
6375 if (check_restricted() || check_secure()) 7165 if (check_restricted() || check_secure())
6376 retvar->var_val.var_number = -1; 7166 retvar->vval.v_number = -1;
6377 else 7167 else
6378 retvar->var_val.var_number = vim_rename(get_var_string(&argvars[0]), 7168 retvar->vval.v_number = vim_rename(get_vartv_string(&argvars[0]),
6379 get_var_string_buf(&argvars[1], buf)); 7169 get_vartv_string_buf(&argvars[1], buf));
6380 } 7170 }
6381 7171
6382 /* 7172 /*
6383 * "resolve()" function 7173 * "resolve()" function
6384 */ 7174 */
6385 static void 7175 static void
6386 f_resolve(argvars, retvar) 7176 f_resolve(argvars, retvar)
6387 VAR argvars; 7177 typeval *argvars;
6388 VAR retvar; 7178 typeval *retvar;
6389 { 7179 {
6390 char_u *p; 7180 char_u *p;
6391 7181
6392 p = get_var_string(&argvars[0]); 7182 p = get_vartv_string(&argvars[0]);
6393 #ifdef FEAT_SHORTCUT 7183 #ifdef FEAT_SHORTCUT
6394 { 7184 {
6395 char_u *v = NULL; 7185 char_u *v = NULL;
6396 7186
6397 v = mch_resolve_shortcut(p); 7187 v = mch_resolve_shortcut(p);
6398 if (v != NULL) 7188 if (v != NULL)
6399 retvar->var_val.var_string = v; 7189 retvar->vval.v_string = v;
6400 else 7190 else
6401 retvar->var_val.var_string = vim_strsave(p); 7191 retvar->vval.v_string = vim_strsave(p);
6402 } 7192 }
6403 #else 7193 #else
6404 # ifdef HAVE_READLINK 7194 # ifdef HAVE_READLINK
6405 { 7195 {
6406 char_u buf[MAXPATHL + 1]; 7196 char_u buf[MAXPATHL + 1];
6443 if (limit-- == 0) 7233 if (limit-- == 0)
6444 { 7234 {
6445 vim_free(p); 7235 vim_free(p);
6446 vim_free(remain); 7236 vim_free(remain);
6447 EMSG(_("E655: Too many symbolic links (cycle?)")); 7237 EMSG(_("E655: Too many symbolic links (cycle?)"));
6448 retvar->var_val.var_string = NULL; 7238 retvar->vval.v_string = NULL;
6449 goto fail; 7239 goto fail;
6450 } 7240 }
6451 7241
6452 /* Ensure that the result will have a trailing path separator 7242 /* Ensure that the result will have a trailing path separator
6453 * if the argument has one. */ 7243 * if the argument has one. */
6563 q = p + STRLEN(p); 7353 q = p + STRLEN(p);
6564 if (after_pathsep(p, q)) 7354 if (after_pathsep(p, q))
6565 *gettail_sep(p) = NUL; 7355 *gettail_sep(p) = NUL;
6566 } 7356 }
6567 7357
6568 retvar->var_val.var_string = p; 7358 retvar->vval.v_string = p;
6569 } 7359 }
6570 # else 7360 # else
6571 retvar->var_val.var_string = vim_strsave(p); 7361 retvar->vval.v_string = vim_strsave(p);
6572 # endif 7362 # endif
6573 #endif 7363 #endif
6574 7364
6575 simplify_filename(retvar->var_val.var_string); 7365 simplify_filename(retvar->vval.v_string);
6576 7366
6577 #ifdef HAVE_READLINK 7367 #ifdef HAVE_READLINK
6578 fail: 7368 fail:
6579 #endif 7369 #endif
6580 retvar->var_type = VAR_STRING; 7370 retvar->v_type = VAR_STRING;
6581 } 7371 }
6582 7372
6583 /* 7373 /*
6584 * "simplify()" function 7374 * "simplify()" function
6585 */ 7375 */
6586 static void 7376 static void
6587 f_simplify(argvars, retvar) 7377 f_simplify(argvars, retvar)
6588 VAR argvars; 7378 typeval *argvars;
6589 VAR retvar; 7379 typeval *retvar;
6590 { 7380 {
6591 char_u *p; 7381 char_u *p;
6592 7382
6593 p = get_var_string(&argvars[0]); 7383 p = get_vartv_string(&argvars[0]);
6594 retvar->var_val.var_string = vim_strsave(p); 7384 retvar->vval.v_string = vim_strsave(p);
6595 simplify_filename(retvar->var_val.var_string); /* simplify in place */ 7385 simplify_filename(retvar->vval.v_string); /* simplify in place */
6596 retvar->var_type = VAR_STRING; 7386 retvar->v_type = VAR_STRING;
6597 } 7387 }
6598 7388
6599 #define SP_NOMOVE 1 /* don't move cursor */ 7389 #define SP_NOMOVE 1 /* don't move cursor */
6600 #define SP_REPEAT 2 /* repeat to find outer pair */ 7390 #define SP_REPEAT 2 /* repeat to find outer pair */
6601 #define SP_RETCOUNT 4 /* return matchcount */ 7391 #define SP_RETCOUNT 4 /* return matchcount */
6603 /* 7393 /*
6604 * "search()" function 7394 * "search()" function
6605 */ 7395 */
6606 static void 7396 static void
6607 f_search(argvars, retvar) 7397 f_search(argvars, retvar)
6608 VAR argvars; 7398 typeval *argvars;
6609 VAR retvar; 7399 typeval *retvar;
6610 { 7400 {
6611 char_u *pat; 7401 char_u *pat;
6612 pos_T pos; 7402 pos_T pos;
6613 pos_T save_cursor; 7403 pos_T save_cursor;
6614 int save_p_ws = p_ws; 7404 int save_p_ws = p_ws;
6615 int dir; 7405 int dir;
6616 int flags = 0; 7406 int flags = 0;
6617 7407
6618 retvar->var_val.var_number = 0; /* default: FAIL */ 7408 retvar->vval.v_number = 0; /* default: FAIL */
6619 7409
6620 pat = get_var_string(&argvars[0]); 7410 pat = get_vartv_string(&argvars[0]);
6621 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */ 7411 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */
6622 if (dir == 0) 7412 if (dir == 0)
6623 goto theend; 7413 goto theend;
6624 if ((flags & ~SP_NOMOVE) != 0) 7414 if ((flags & ~SP_NOMOVE) != 0)
6625 { 7415 {
6626 EMSG2(_(e_invarg2), get_var_string(&argvars[1])); 7416 EMSG2(_(e_invarg2), get_vartv_string(&argvars[1]));
6627 goto theend; 7417 goto theend;
6628 } 7418 }
6629 7419
6630 pos = save_cursor = curwin->w_cursor; 7420 pos = save_cursor = curwin->w_cursor;
6631 if (searchit(curwin, curbuf, &pos, dir, pat, 1L, 7421 if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
6632 SEARCH_KEEP, RE_SEARCH) != FAIL) 7422 SEARCH_KEEP, RE_SEARCH) != FAIL)
6633 { 7423 {
6634 retvar->var_val.var_number = pos.lnum; 7424 retvar->vval.v_number = pos.lnum;
6635 curwin->w_cursor = pos; 7425 curwin->w_cursor = pos;
6636 /* "/$" will put the cursor after the end of the line, may need to 7426 /* "/$" will put the cursor after the end of the line, may need to
6637 * correct that here */ 7427 * correct that here */
6638 check_cursor(); 7428 check_cursor();
6639 } 7429 }
6648 /* 7438 /*
6649 * "searchpair()" function 7439 * "searchpair()" function
6650 */ 7440 */
6651 static void 7441 static void
6652 f_searchpair(argvars, retvar) 7442 f_searchpair(argvars, retvar)
6653 VAR argvars; 7443 typeval *argvars;
6654 VAR retvar; 7444 typeval *retvar;
6655 { 7445 {
6656 char_u *spat, *mpat, *epat; 7446 char_u *spat, *mpat, *epat;
6657 char_u *skip; 7447 char_u *skip;
6658 char_u *pat, *pat2, *pat3; 7448 char_u *pat, *pat2, *pat3;
6659 pos_T pos; 7449 pos_T pos;
6670 int n; 7460 int n;
6671 int r; 7461 int r;
6672 int nest = 1; 7462 int nest = 1;
6673 int err; 7463 int err;
6674 7464
6675 retvar->var_val.var_number = 0; /* default: FAIL */ 7465 retvar->vval.v_number = 0; /* default: FAIL */
6676 7466
6677 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ 7467 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
6678 save_cpo = p_cpo; 7468 save_cpo = p_cpo;
6679 p_cpo = (char_u *)""; 7469 p_cpo = (char_u *)"";
6680 7470
6681 /* Get the three pattern arguments: start, middle, end. */ 7471 /* Get the three pattern arguments: start, middle, end. */
6682 spat = get_var_string(&argvars[0]); 7472 spat = get_vartv_string(&argvars[0]);
6683 mpat = get_var_string_buf(&argvars[1], nbuf1); 7473 mpat = get_vartv_string_buf(&argvars[1], nbuf1);
6684 epat = get_var_string_buf(&argvars[2], nbuf2); 7474 epat = get_vartv_string_buf(&argvars[2], nbuf2);
6685 7475
6686 /* Make two search patterns: start/end (pat2, for in nested pairs) and 7476 /* Make two search patterns: start/end (pat2, for in nested pairs) and
6687 * start/middle/end (pat3, for the top pair). */ 7477 * start/middle/end (pat3, for the top pair). */
6688 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15)); 7478 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15));
6689 pat3 = alloc((unsigned)(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23)); 7479 pat3 = alloc((unsigned)(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23));
6700 dir = get_search_arg(&argvars[3], &flags); /* may set p_ws */ 7490 dir = get_search_arg(&argvars[3], &flags); /* may set p_ws */
6701 if (dir == 0) 7491 if (dir == 0)
6702 goto theend; 7492 goto theend;
6703 7493
6704 /* Optional fifth argument: skip expresion */ 7494 /* Optional fifth argument: skip expresion */
6705 if (argvars[3].var_type == VAR_UNKNOWN 7495 if (argvars[3].v_type == VAR_UNKNOWN
6706 || argvars[4].var_type == VAR_UNKNOWN) 7496 || argvars[4].v_type == VAR_UNKNOWN)
6707 skip = (char_u *)""; 7497 skip = (char_u *)"";
6708 else 7498 else
6709 skip = get_var_string_buf(&argvars[4], nbuf3); 7499 skip = get_vartv_string_buf(&argvars[4], nbuf3);
6710 7500
6711 save_cursor = curwin->w_cursor; 7501 save_cursor = curwin->w_cursor;
6712 pos = curwin->w_cursor; 7502 pos = curwin->w_cursor;
6713 firstpos.lnum = 0; 7503 firstpos.lnum = 0;
6714 pat = pat3; 7504 pat = pat3;
6732 curwin->w_cursor = save_pos; 7522 curwin->w_cursor = save_pos;
6733 if (err) 7523 if (err)
6734 { 7524 {
6735 /* Evaluating {skip} caused an error, break here. */ 7525 /* Evaluating {skip} caused an error, break here. */
6736 curwin->w_cursor = save_cursor; 7526 curwin->w_cursor = save_cursor;
6737 retvar->var_val.var_number = -1; 7527 retvar->vval.v_number = -1;
6738 break; 7528 break;
6739 } 7529 }
6740 if (r) 7530 if (r)
6741 continue; 7531 continue;
6742 } 7532 }
6758 7548
6759 if (nest == 0) 7549 if (nest == 0)
6760 { 7550 {
6761 /* Found the match: return matchcount or line number. */ 7551 /* Found the match: return matchcount or line number. */
6762 if (flags & SP_RETCOUNT) 7552 if (flags & SP_RETCOUNT)
6763 ++retvar->var_val.var_number; 7553 ++retvar->vval.v_number;
6764 else 7554 else
6765 retvar->var_val.var_number = pos.lnum; 7555 retvar->vval.v_number = pos.lnum;
6766 curwin->w_cursor = pos; 7556 curwin->w_cursor = pos;
6767 if (!(flags & SP_REPEAT)) 7557 if (!(flags & SP_REPEAT))
6768 break; 7558 break;
6769 nest = 1; /* search for next unmatched */ 7559 nest = 1; /* search for next unmatched */
6770 } 7560 }
6771 } 7561 }
6772 7562
6773 /* If 'n' flag is used or search failed: restore cursor position. */ 7563 /* If 'n' flag is used or search failed: restore cursor position. */
6774 if ((flags & SP_NOMOVE) || retvar->var_val.var_number == 0) 7564 if ((flags & SP_NOMOVE) || retvar->vval.v_number == 0)
6775 curwin->w_cursor = save_cursor; 7565 curwin->w_cursor = save_cursor;
6776 7566
6777 theend: 7567 theend:
6778 vim_free(pat2); 7568 vim_free(pat2);
6779 vim_free(pat3); 7569 vim_free(pat3);
6786 * Possibly sets "p_ws". 7576 * Possibly sets "p_ws".
6787 * Returns BACKWARD, FORWARD or zero (for an error). 7577 * Returns BACKWARD, FORWARD or zero (for an error).
6788 */ 7578 */
6789 static int 7579 static int
6790 get_search_arg(varp, flagsp) 7580 get_search_arg(varp, flagsp)
6791 VAR varp; 7581 typeval *varp;
6792 int *flagsp; 7582 int *flagsp;
6793 { 7583 {
6794 int dir = FORWARD; 7584 int dir = FORWARD;
6795 char_u *flags; 7585 char_u *flags;
6796 char_u nbuf[NUMBUFLEN]; 7586 char_u nbuf[NUMBUFLEN];
6797 int mask; 7587 int mask;
6798 7588
6799 if (varp->var_type != VAR_UNKNOWN) 7589 if (varp->v_type != VAR_UNKNOWN)
6800 { 7590 {
6801 flags = get_var_string_buf(varp, nbuf); 7591 flags = get_vartv_string_buf(varp, nbuf);
6802 while (*flags != NUL) 7592 while (*flags != NUL)
6803 { 7593 {
6804 switch (*flags) 7594 switch (*flags)
6805 { 7595 {
6806 case 'b': dir = BACKWARD; break; 7596 case 'b': dir = BACKWARD; break;
6834 * "setbufvar()" function 7624 * "setbufvar()" function
6835 */ 7625 */
6836 /*ARGSUSED*/ 7626 /*ARGSUSED*/
6837 static void 7627 static void
6838 f_setbufvar(argvars, retvar) 7628 f_setbufvar(argvars, retvar)
6839 VAR argvars; 7629 typeval *argvars;
6840 VAR retvar; 7630 typeval *retvar;
6841 { 7631 {
6842 buf_T *buf; 7632 buf_T *buf;
6843 #ifdef FEAT_AUTOCMD 7633 #ifdef FEAT_AUTOCMD
6844 aco_save_T aco; 7634 aco_save_T aco;
6845 #else 7635 #else
6846 buf_T *save_curbuf; 7636 buf_T *save_curbuf;
6847 #endif 7637 #endif
6848 char_u *varname, *bufvarname; 7638 char_u *varname, *bufvarname;
6849 VAR varp; 7639 typeval *varp;
6850 char_u nbuf[NUMBUFLEN]; 7640 char_u nbuf[NUMBUFLEN];
6851 7641
6852 if (check_restricted() || check_secure()) 7642 if (check_restricted() || check_secure())
6853 return; 7643 return;
6854 ++emsg_off; 7644 ++emsg_off;
6855 buf = get_buf_var(&argvars[0]); 7645 buf = get_buf_vartv(&argvars[0]);
6856 varname = get_var_string(&argvars[1]); 7646 varname = get_vartv_string(&argvars[1]);
6857 varp = &argvars[2]; 7647 varp = &argvars[2];
6858 7648
6859 if (buf != NULL && varname != NULL && varp != NULL) 7649 if (buf != NULL && varname != NULL && varp != NULL)
6860 { 7650 {
6861 /* set curbuf to be our buf, temporarily */ 7651 /* set curbuf to be our buf, temporarily */
6867 #endif 7657 #endif
6868 7658
6869 if (*varname == '&') 7659 if (*varname == '&')
6870 { 7660 {
6871 ++varname; 7661 ++varname;
6872 set_option_value(varname, get_var_number(varp), 7662 set_option_value(varname, get_vartv_number(varp),
6873 get_var_string_buf(varp, nbuf), OPT_LOCAL); 7663 get_vartv_string_buf(varp, nbuf), OPT_LOCAL);
6874 } 7664 }
6875 else 7665 else
6876 { 7666 {
6877 bufvarname = alloc((unsigned)STRLEN(varname) + 3); 7667 bufvarname = alloc((unsigned)STRLEN(varname) + 3);
6878 if (bufvarname != NULL) 7668 if (bufvarname != NULL)
6897 /* 7687 /*
6898 * "setcmdpos()" function 7688 * "setcmdpos()" function
6899 */ 7689 */
6900 static void 7690 static void
6901 f_setcmdpos(argvars, retvar) 7691 f_setcmdpos(argvars, retvar)
6902 VAR argvars; 7692 typeval *argvars;
6903 VAR retvar; 7693 typeval *retvar;
6904 { 7694 {
6905 retvar->var_val.var_number = set_cmdline_pos( 7695 retvar->vval.v_number = set_cmdline_pos(
6906 (int)get_var_number(&argvars[0]) - 1); 7696 (int)get_vartv_number(&argvars[0]) - 1);
6907 } 7697 }
6908 7698
6909 /* 7699 /*
6910 * "setline()" function 7700 * "setline()" function
6911 */ 7701 */
6912 static void 7702 static void
6913 f_setline(argvars, retvar) 7703 f_setline(argvars, retvar)
6914 VAR argvars; 7704 typeval *argvars;
6915 VAR retvar; 7705 typeval *retvar;
6916 { 7706 {
6917 linenr_T lnum; 7707 linenr_T lnum;
6918 char_u *line; 7708 char_u *line;
6919 7709
6920 lnum = get_var_lnum(argvars); 7710 lnum = get_vartv_lnum(argvars);
6921 line = get_var_string(&argvars[1]); 7711 line = get_vartv_string(&argvars[1]);
6922 retvar->var_val.var_number = 1; /* FAIL is default */ 7712 retvar->vval.v_number = 1; /* FAIL is default */
6923 7713
6924 if (lnum >= 1 7714 if (lnum >= 1
6925 && lnum <= curbuf->b_ml.ml_line_count 7715 && lnum <= curbuf->b_ml.ml_line_count
6926 && u_savesub(lnum) == OK 7716 && u_savesub(lnum) == OK
6927 && ml_replace(lnum, line, TRUE) == OK) 7717 && ml_replace(lnum, line, TRUE) == OK)
6928 { 7718 {
6929 changed_bytes(lnum, 0); 7719 changed_bytes(lnum, 0);
6930 check_cursor_col(); 7720 check_cursor_col();
6931 retvar->var_val.var_number = 0; 7721 retvar->vval.v_number = 0;
6932 } 7722 }
6933 } 7723 }
6934 7724
6935 /* 7725 /*
6936 * "setreg()" function 7726 * "setreg()" function
6937 */ 7727 */
6938 static void 7728 static void
6939 f_setreg(argvars, retvar) 7729 f_setreg(argvars, retvar)
6940 VAR argvars; 7730 typeval *argvars;
6941 VAR retvar; 7731 typeval *retvar;
6942 { 7732 {
6943 int regname; 7733 int regname;
6944 char_u *strregname; 7734 char_u *strregname;
6945 char_u *stropt; 7735 char_u *stropt;
6946 int append; 7736 int append;
6949 7739
6950 block_len = -1; 7740 block_len = -1;
6951 yank_type = MAUTO; 7741 yank_type = MAUTO;
6952 append = FALSE; 7742 append = FALSE;
6953 7743
6954 strregname = get_var_string(argvars); 7744 strregname = get_vartv_string(argvars);
6955 retvar->var_val.var_number = 1; /* FAIL is default */ 7745 retvar->vval.v_number = 1; /* FAIL is default */
6956 7746
6957 regname = (strregname == NULL ? '"' : *strregname); 7747 regname = (strregname == NULL ? '"' : *strregname);
6958 if (regname == 0 || regname == '@') 7748 if (regname == 0 || regname == '@')
6959 regname = '"'; 7749 regname = '"';
6960 else if (regname == '=') 7750 else if (regname == '=')
6961 return; 7751 return;
6962 7752
6963 if (argvars[2].var_type != VAR_UNKNOWN) 7753 if (argvars[2].v_type != VAR_UNKNOWN)
6964 { 7754 {
6965 for (stropt = get_var_string(&argvars[2]); *stropt != NUL; ++stropt) 7755 for (stropt = get_vartv_string(&argvars[2]); *stropt != NUL; ++stropt)
6966 switch (*stropt) 7756 switch (*stropt)
6967 { 7757 {
6968 case 'a': case 'A': /* append */ 7758 case 'a': case 'A': /* append */
6969 append = TRUE; 7759 append = TRUE;
6970 break; 7760 break;
6986 break; 7776 break;
6987 #endif 7777 #endif
6988 } 7778 }
6989 } 7779 }
6990 7780
6991 write_reg_contents_ex(regname, get_var_string(&argvars[1]), -1, 7781 write_reg_contents_ex(regname, get_vartv_string(&argvars[1]), -1,
6992 append, yank_type, block_len); 7782 append, yank_type, block_len);
6993 retvar->var_val.var_number = 0; 7783 retvar->vval.v_number = 0;
6994 } 7784 }
6995 7785
6996 7786
6997 /* 7787 /*
6998 * "setwinvar(expr)" function 7788 * "setwinvar(expr)" function
6999 */ 7789 */
7000 /*ARGSUSED*/ 7790 /*ARGSUSED*/
7001 static void 7791 static void
7002 f_setwinvar(argvars, retvar) 7792 f_setwinvar(argvars, retvar)
7003 VAR argvars; 7793 typeval *argvars;
7004 VAR retvar; 7794 typeval *retvar;
7005 { 7795 {
7006 win_T *win; 7796 win_T *win;
7007 #ifdef FEAT_WINDOWS 7797 #ifdef FEAT_WINDOWS
7008 win_T *save_curwin; 7798 win_T *save_curwin;
7009 #endif 7799 #endif
7010 char_u *varname, *winvarname; 7800 char_u *varname, *winvarname;
7011 VAR varp; 7801 typeval *varp;
7012 char_u nbuf[NUMBUFLEN]; 7802 char_u nbuf[NUMBUFLEN];
7013 7803
7014 if (check_restricted() || check_secure()) 7804 if (check_restricted() || check_secure())
7015 return; 7805 return;
7016 ++emsg_off; 7806 ++emsg_off;
7017 win = find_win_by_nr(&argvars[0]); 7807 win = find_win_by_nr(&argvars[0]);
7018 varname = get_var_string(&argvars[1]); 7808 varname = get_vartv_string(&argvars[1]);
7019 varp = &argvars[2]; 7809 varp = &argvars[2];
7020 7810
7021 if (win != NULL && varname != NULL && varp != NULL) 7811 if (win != NULL && varname != NULL && varp != NULL)
7022 { 7812 {
7023 #ifdef FEAT_WINDOWS 7813 #ifdef FEAT_WINDOWS
7028 #endif 7818 #endif
7029 7819
7030 if (*varname == '&') 7820 if (*varname == '&')
7031 { 7821 {
7032 ++varname; 7822 ++varname;
7033 set_option_value(varname, get_var_number(varp), 7823 set_option_value(varname, get_vartv_number(varp),
7034 get_var_string_buf(varp, nbuf), OPT_LOCAL); 7824 get_vartv_string_buf(varp, nbuf), OPT_LOCAL);
7035 } 7825 }
7036 else 7826 else
7037 { 7827 {
7038 winvarname = alloc((unsigned)STRLEN(varname) + 3); 7828 winvarname = alloc((unsigned)STRLEN(varname) + 3);
7039 if (winvarname != NULL) 7829 if (winvarname != NULL)
7061 /* 7851 /*
7062 * "nextnonblank()" function 7852 * "nextnonblank()" function
7063 */ 7853 */
7064 static void 7854 static void
7065 f_nextnonblank(argvars, retvar) 7855 f_nextnonblank(argvars, retvar)
7066 VAR argvars; 7856 typeval *argvars;
7067 VAR retvar; 7857 typeval *retvar;
7068 { 7858 {
7069 linenr_T lnum; 7859 linenr_T lnum;
7070 7860
7071 for (lnum = get_var_lnum(argvars); ; ++lnum) 7861 for (lnum = get_vartv_lnum(argvars); ; ++lnum)
7072 { 7862 {
7073 if (lnum > curbuf->b_ml.ml_line_count) 7863 if (lnum > curbuf->b_ml.ml_line_count)
7074 { 7864 {
7075 lnum = 0; 7865 lnum = 0;
7076 break; 7866 break;
7077 } 7867 }
7078 if (*skipwhite(ml_get(lnum)) != NUL) 7868 if (*skipwhite(ml_get(lnum)) != NUL)
7079 break; 7869 break;
7080 } 7870 }
7081 retvar->var_val.var_number = lnum; 7871 retvar->vval.v_number = lnum;
7082 } 7872 }
7083 7873
7084 /* 7874 /*
7085 * "prevnonblank()" function 7875 * "prevnonblank()" function
7086 */ 7876 */
7087 static void 7877 static void
7088 f_prevnonblank(argvars, retvar) 7878 f_prevnonblank(argvars, retvar)
7089 VAR argvars; 7879 typeval *argvars;
7090 VAR retvar; 7880 typeval *retvar;
7091 { 7881 {
7092 linenr_T lnum; 7882 linenr_T lnum;
7093 7883
7094 lnum = get_var_lnum(argvars); 7884 lnum = get_vartv_lnum(argvars);
7095 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count) 7885 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
7096 lnum = 0; 7886 lnum = 0;
7097 else 7887 else
7098 while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL) 7888 while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL)
7099 --lnum; 7889 --lnum;
7100 retvar->var_val.var_number = lnum; 7890 retvar->vval.v_number = lnum;
7101 } 7891 }
7102 7892
7103 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11) 7893 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
7104 static void make_connection __ARGS((void)); 7894 static void make_connection __ARGS((void));
7105 static int check_connection __ARGS((void)); 7895 static int check_connection __ARGS((void));
7133 #endif 7923 #endif
7134 7924
7135 /*ARGSUSED*/ 7925 /*ARGSUSED*/
7136 static void 7926 static void
7137 f_serverlist(argvars, retvar) 7927 f_serverlist(argvars, retvar)
7138 VAR argvars; 7928 typeval *argvars;
7139 VAR retvar; 7929 typeval *retvar;
7140 { 7930 {
7141 char_u *r = NULL; 7931 char_u *r = NULL;
7142 7932
7143 #ifdef FEAT_CLIENTSERVER 7933 #ifdef FEAT_CLIENTSERVER
7144 # ifdef WIN32 7934 # ifdef WIN32
7147 make_connection(); 7937 make_connection();
7148 if (X_DISPLAY != NULL) 7938 if (X_DISPLAY != NULL)
7149 r = serverGetVimNames(X_DISPLAY); 7939 r = serverGetVimNames(X_DISPLAY);
7150 # endif 7940 # endif
7151 #endif 7941 #endif
7152 retvar->var_type = VAR_STRING; 7942 retvar->v_type = VAR_STRING;
7153 retvar->var_val.var_string = r; 7943 retvar->vval.v_string = r;
7154 } 7944 }
7155 7945
7156 /*ARGSUSED*/ 7946 /*ARGSUSED*/
7157 static void 7947 static void
7158 f_remote_peek(argvars, retvar) 7948 f_remote_peek(argvars, retvar)
7159 VAR argvars; 7949 typeval *argvars;
7160 VAR retvar; 7950 typeval *retvar;
7161 { 7951 {
7162 #ifdef FEAT_CLIENTSERVER 7952 #ifdef FEAT_CLIENTSERVER
7163 var v; 7953 var v;
7164 char_u *s = NULL; 7954 char_u *s = NULL;
7165 # ifdef WIN32 7955 # ifdef WIN32
7166 int n = 0; 7956 int n = 0;
7167 # endif 7957 # endif
7168 7958
7169 if (check_restricted() || check_secure()) 7959 if (check_restricted() || check_secure())
7170 { 7960 {
7171 retvar->var_val.var_number = -1; 7961 retvar->vval.v_number = -1;
7172 return; 7962 return;
7173 } 7963 }
7174 # ifdef WIN32 7964 # ifdef WIN32
7175 sscanf(get_var_string(&argvars[0]), "%x", &n); 7965 sscanf(get_vartv_string(&argvars[0]), "%x", &n);
7176 if (n == 0) 7966 if (n == 0)
7177 retvar->var_val.var_number = -1; 7967 retvar->vval.v_number = -1;
7178 else 7968 else
7179 { 7969 {
7180 s = serverGetReply((HWND)n, FALSE, FALSE, FALSE); 7970 s = serverGetReply((HWND)n, FALSE, FALSE, FALSE);
7181 retvar->var_val.var_number = (s != NULL); 7971 retvar->vval.v_number = (s != NULL);
7182 } 7972 }
7183 # else 7973 # else
7184 retvar->var_val.var_number = 0; 7974 retvar->vval.v_number = 0;
7185 if (check_connection() == FAIL) 7975 if (check_connection() == FAIL)
7186 return; 7976 return;
7187 7977
7188 retvar->var_val.var_number = serverPeekReply(X_DISPLAY, 7978 retvar->vval.v_number = serverPeekReply(X_DISPLAY,
7189 serverStrToWin(get_var_string(&argvars[0])), &s); 7979 serverStrToWin(get_vartv_string(&argvars[0])), &s);
7190 # endif 7980 # endif
7191 7981
7192 if (argvars[1].var_type != VAR_UNKNOWN && retvar->var_val.var_number > 0) 7982 if (argvars[1].v_type != VAR_UNKNOWN && retvar->vval.v_number > 0)
7193 { 7983 {
7194 v.var_type = VAR_STRING; 7984 v.tv.v_type = VAR_STRING;
7195 v.var_val.var_string = vim_strsave(s); 7985 v.tv.vval.v_string = vim_strsave(s);
7196 set_var(get_var_string(&argvars[1]), &v, FALSE); 7986 set_var(get_vartv_string(&argvars[1]), &v.tv, FALSE);
7197 vim_free(v.var_val.var_string); 7987 vim_free(v.tv.vval.v_string);
7198 } 7988 }
7199 #else 7989 #else
7200 retvar->var_val.var_number = -1; 7990 retvar->vval.v_number = -1;
7201 #endif 7991 #endif
7202 } 7992 }
7203 7993
7204 /*ARGSUSED*/ 7994 /*ARGSUSED*/
7205 static void 7995 static void
7206 f_remote_read(argvars, retvar) 7996 f_remote_read(argvars, retvar)
7207 VAR argvars; 7997 typeval *argvars;
7208 VAR retvar; 7998 typeval *retvar;
7209 { 7999 {
7210 char_u *r = NULL; 8000 char_u *r = NULL;
7211 8001
7212 #ifdef FEAT_CLIENTSERVER 8002 #ifdef FEAT_CLIENTSERVER
7213 if (!check_restricted() && !check_secure()) 8003 if (!check_restricted() && !check_secure())
7214 { 8004 {
7215 # ifdef WIN32 8005 # ifdef WIN32
7216 /* The server's HWND is encoded in the 'id' parameter */ 8006 /* The server's HWND is encoded in the 'id' parameter */
7217 int n = 0; 8007 int n = 0;
7218 8008
7219 sscanf(get_var_string(&argvars[0]), "%x", &n); 8009 sscanf(get_vartv_string(&argvars[0]), "%x", &n);
7220 if (n != 0) 8010 if (n != 0)
7221 r = serverGetReply((HWND)n, FALSE, TRUE, TRUE); 8011 r = serverGetReply((HWND)n, FALSE, TRUE, TRUE);
7222 if (r == NULL) 8012 if (r == NULL)
7223 # else 8013 # else
7224 if (check_connection() == FAIL || serverReadReply(X_DISPLAY, 8014 if (check_connection() == FAIL || serverReadReply(X_DISPLAY,
7225 serverStrToWin(get_var_string(&argvars[0])), &r, FALSE) < 0) 8015 serverStrToWin(get_vartv_string(&argvars[0])), &r, FALSE) < 0)
7226 # endif 8016 # endif
7227 EMSG(_("E277: Unable to read a server reply")); 8017 EMSG(_("E277: Unable to read a server reply"));
7228 } 8018 }
7229 #endif 8019 #endif
7230 retvar->var_type = VAR_STRING; 8020 retvar->v_type = VAR_STRING;
7231 retvar->var_val.var_string = r; 8021 retvar->vval.v_string = r;
7232 } 8022 }
7233 8023
7234 /*ARGSUSED*/ 8024 /*ARGSUSED*/
7235 static void 8025 static void
7236 f_server2client(argvars, retvar) 8026 f_server2client(argvars, retvar)
7237 VAR argvars; 8027 typeval *argvars;
7238 VAR retvar; 8028 typeval *retvar;
7239 { 8029 {
7240 #ifdef FEAT_CLIENTSERVER 8030 #ifdef FEAT_CLIENTSERVER
7241 char_u buf[NUMBUFLEN]; 8031 char_u buf[NUMBUFLEN];
7242 char_u *server = get_var_string(&argvars[0]); 8032 char_u *server = get_vartv_string(&argvars[0]);
7243 char_u *reply = get_var_string_buf(&argvars[1], buf); 8033 char_u *reply = get_vartv_string_buf(&argvars[1], buf);
7244 8034
7245 retvar->var_val.var_number = -1; 8035 retvar->vval.v_number = -1;
7246 if (check_restricted() || check_secure()) 8036 if (check_restricted() || check_secure())
7247 return; 8037 return;
7248 # ifdef FEAT_X11 8038 # ifdef FEAT_X11
7249 if (check_connection() == FAIL) 8039 if (check_connection() == FAIL)
7250 return; 8040 return;
7253 if (serverSendReply(server, reply) < 0) 8043 if (serverSendReply(server, reply) < 0)
7254 { 8044 {
7255 EMSG(_("E258: Unable to send to client")); 8045 EMSG(_("E258: Unable to send to client"));
7256 return; 8046 return;
7257 } 8047 }
7258 retvar->var_val.var_number = 0; 8048 retvar->vval.v_number = 0;
7259 #else 8049 #else
7260 retvar->var_val.var_number = -1; 8050 retvar->vval.v_number = -1;
7261 #endif 8051 #endif
7262 } 8052 }
7263 8053
7264 #ifdef FEAT_CLIENTSERVER 8054 #ifdef FEAT_CLIENTSERVER
7265 static void remote_common __ARGS((VAR argvars, VAR retvar, int expr)); 8055 static void remote_common __ARGS((typeval *argvars, typeval *retvar, int expr));
7266 8056
7267 static void 8057 static void
7268 remote_common(argvars, retvar, expr) 8058 remote_common(argvars, retvar, expr)
7269 VAR argvars; 8059 typeval *argvars;
7270 VAR retvar; 8060 typeval *retvar;
7271 int expr; 8061 int expr;
7272 { 8062 {
7273 char_u *server_name; 8063 char_u *server_name;
7274 char_u *keys; 8064 char_u *keys;
7275 char_u *r = NULL; 8065 char_u *r = NULL;
7286 # ifdef FEAT_X11 8076 # ifdef FEAT_X11
7287 if (check_connection() == FAIL) 8077 if (check_connection() == FAIL)
7288 return; 8078 return;
7289 # endif 8079 # endif
7290 8080
7291 server_name = get_var_string(&argvars[0]); 8081 server_name = get_vartv_string(&argvars[0]);
7292 keys = get_var_string_buf(&argvars[1], buf); 8082 keys = get_vartv_string_buf(&argvars[1], buf);
7293 # ifdef WIN32 8083 # ifdef WIN32
7294 if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0) 8084 if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0)
7295 # else 8085 # else
7296 if (serverSendToVim(X_DISPLAY, server_name, keys, &r, &w, expr, 0, TRUE) 8086 if (serverSendToVim(X_DISPLAY, server_name, keys, &r, &w, expr, 0, TRUE)
7297 < 0) 8087 < 0)
7302 else 8092 else
7303 EMSG2(_("E241: Unable to send to %s"), server_name); 8093 EMSG2(_("E241: Unable to send to %s"), server_name);
7304 return; 8094 return;
7305 } 8095 }
7306 8096
7307 retvar->var_val.var_string = r; 8097 retvar->vval.v_string = r;
7308 8098
7309 if (argvars[2].var_type != VAR_UNKNOWN) 8099 if (argvars[2].v_type != VAR_UNKNOWN)
7310 { 8100 {
7311 var v; 8101 var v;
7312 char_u str[30]; 8102 char_u str[30];
7313 8103
7314 sprintf((char *)str, "0x%x", (unsigned int)w); 8104 sprintf((char *)str, "0x%x", (unsigned int)w);
7315 v.var_type = VAR_STRING; 8105 v.tv.v_type = VAR_STRING;
7316 v.var_val.var_string = vim_strsave(str); 8106 v.tv.vval.v_string = vim_strsave(str);
7317 set_var(get_var_string(&argvars[2]), &v, FALSE); 8107 set_var(get_vartv_string(&argvars[2]), &v.tv, FALSE);
7318 vim_free(v.var_val.var_string); 8108 vim_free(v.tv.vval.v_string);
7319 } 8109 }
7320 } 8110 }
7321 #endif 8111 #endif
7322 8112
7323 /* 8113 /*
7324 * "remote_expr()" function 8114 * "remote_expr()" function
7325 */ 8115 */
7326 /*ARGSUSED*/ 8116 /*ARGSUSED*/
7327 static void 8117 static void
7328 f_remote_expr(argvars, retvar) 8118 f_remote_expr(argvars, retvar)
7329 VAR argvars; 8119 typeval *argvars;
7330 VAR retvar; 8120 typeval *retvar;
7331 { 8121 {
7332 retvar->var_type = VAR_STRING; 8122 retvar->v_type = VAR_STRING;
7333 retvar->var_val.var_string = NULL; 8123 retvar->vval.v_string = NULL;
7334 #ifdef FEAT_CLIENTSERVER 8124 #ifdef FEAT_CLIENTSERVER
7335 remote_common(argvars, retvar, TRUE); 8125 remote_common(argvars, retvar, TRUE);
7336 #endif 8126 #endif
7337 } 8127 }
7338 8128
7340 * "remote_send()" function 8130 * "remote_send()" function
7341 */ 8131 */
7342 /*ARGSUSED*/ 8132 /*ARGSUSED*/
7343 static void 8133 static void
7344 f_remote_send(argvars, retvar) 8134 f_remote_send(argvars, retvar)
7345 VAR argvars; 8135 typeval *argvars;
7346 VAR retvar; 8136 typeval *retvar;
7347 { 8137 {
7348 retvar->var_type = VAR_STRING; 8138 retvar->v_type = VAR_STRING;
7349 retvar->var_val.var_string = NULL; 8139 retvar->vval.v_string = NULL;
7350 #ifdef FEAT_CLIENTSERVER 8140 #ifdef FEAT_CLIENTSERVER
7351 remote_common(argvars, retvar, FALSE); 8141 remote_common(argvars, retvar, FALSE);
7352 #endif 8142 #endif
7353 } 8143 }
7354 8144
7356 * "remote_foreground()" function 8146 * "remote_foreground()" function
7357 */ 8147 */
7358 /*ARGSUSED*/ 8148 /*ARGSUSED*/
7359 static void 8149 static void
7360 f_remote_foreground(argvars, retvar) 8150 f_remote_foreground(argvars, retvar)
7361 VAR argvars; 8151 typeval *argvars;
7362 VAR retvar; 8152 typeval *retvar;
7363 { 8153 {
7364 retvar->var_val.var_number = 0; 8154 retvar->vval.v_number = 0;
7365 #ifdef FEAT_CLIENTSERVER 8155 #ifdef FEAT_CLIENTSERVER
7366 # ifdef WIN32 8156 # ifdef WIN32
7367 /* On Win32 it's done in this application. */ 8157 /* On Win32 it's done in this application. */
7368 serverForeground(get_var_string(&argvars[0])); 8158 serverForeground(get_vartv_string(&argvars[0]));
7369 # else 8159 # else
7370 /* Send a foreground() expression to the server. */ 8160 /* Send a foreground() expression to the server. */
7371 argvars[1].var_type = VAR_STRING; 8161 argvars[1].v_type = VAR_STRING;
7372 argvars[1].var_val.var_string = vim_strsave((char_u *)"foreground()"); 8162 argvars[1].vval.v_string = vim_strsave((char_u *)"foreground()");
7373 argvars[2].var_type = VAR_UNKNOWN; 8163 argvars[2].v_type = VAR_UNKNOWN;
7374 remote_common(argvars, retvar, TRUE); 8164 remote_common(argvars, retvar, TRUE);
7375 vim_free(argvars[1].var_val.var_string); 8165 vim_free(argvars[1].vval.v_string);
7376 # endif 8166 # endif
7377 #endif 8167 #endif
7378 } 8168 }
7379 8169
7380 /* 8170 /*
7381 * "repeat()" function 8171 * "repeat()" function
7382 */ 8172 */
7383 /*ARGSUSED*/ 8173 /*ARGSUSED*/
7384 static void 8174 static void
7385 f_repeat(argvars, retvar) 8175 f_repeat(argvars, retvar)
7386 VAR argvars; 8176 typeval *argvars;
7387 VAR retvar; 8177 typeval *retvar;
7388 { 8178 {
7389 char_u *p; 8179 char_u *p;
7390 int n; 8180 int n;
7391 int slen; 8181 int slen;
7392 int len; 8182 int len;
7393 char_u *r; 8183 char_u *r;
7394 int i; 8184 int i;
7395 8185
7396 p = get_var_string(&argvars[0]); 8186 p = get_vartv_string(&argvars[0]);
7397 n = get_var_number(&argvars[1]); 8187 n = get_vartv_number(&argvars[1]);
7398 8188
7399 retvar->var_type = VAR_STRING; 8189 retvar->v_type = VAR_STRING;
7400 retvar->var_val.var_string = NULL; 8190 retvar->vval.v_string = NULL;
7401 8191
7402 slen = (int)STRLEN(p); 8192 slen = (int)STRLEN(p);
7403 len = slen * n; 8193 len = slen * n;
7404 8194
7405 if (len <= 0) 8195 if (len <= 0)
7411 for (i = 0; i < n; i++) 8201 for (i = 0; i < n; i++)
7412 mch_memmove(r + i * slen, p, (size_t)slen); 8202 mch_memmove(r + i * slen, p, (size_t)slen);
7413 r[len] = NUL; 8203 r[len] = NUL;
7414 } 8204 }
7415 8205
7416 retvar->var_val.var_string = r; 8206 retvar->vval.v_string = r;
7417 } 8207 }
7418 8208
7419 #ifdef HAVE_STRFTIME 8209 #ifdef HAVE_STRFTIME
7420 /* 8210 /*
7421 * "strftime({format}[, {time}])" function 8211 * "strftime({format}[, {time}])" function
7422 */ 8212 */
7423 static void 8213 static void
7424 f_strftime(argvars, retvar) 8214 f_strftime(argvars, retvar)
7425 VAR argvars; 8215 typeval *argvars;
7426 VAR retvar; 8216 typeval *retvar;
7427 { 8217 {
7428 char_u result_buf[256]; 8218 char_u result_buf[256];
7429 struct tm *curtime; 8219 struct tm *curtime;
7430 time_t seconds; 8220 time_t seconds;
7431 char_u *p; 8221 char_u *p;
7432 8222
7433 retvar->var_type = VAR_STRING; 8223 retvar->v_type = VAR_STRING;
7434 8224
7435 p = get_var_string(&argvars[0]); 8225 p = get_vartv_string(&argvars[0]);
7436 if (argvars[1].var_type == VAR_UNKNOWN) 8226 if (argvars[1].v_type == VAR_UNKNOWN)
7437 seconds = time(NULL); 8227 seconds = time(NULL);
7438 else 8228 else
7439 seconds = (time_t)get_var_number(&argvars[1]); 8229 seconds = (time_t)get_vartv_number(&argvars[1]);
7440 curtime = localtime(&seconds); 8230 curtime = localtime(&seconds);
7441 /* MSVC returns NULL for an invalid value of seconds. */ 8231 /* MSVC returns NULL for an invalid value of seconds. */
7442 if (curtime == NULL) 8232 if (curtime == NULL)
7443 retvar->var_val.var_string = vim_strsave((char_u *)_("(Invalid)")); 8233 retvar->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
7444 else 8234 else
7445 { 8235 {
7446 # ifdef FEAT_MBYTE 8236 # ifdef FEAT_MBYTE
7447 vimconv_T conv; 8237 vimconv_T conv;
7448 char_u *enc; 8238 char_u *enc;
7462 # ifdef FEAT_MBYTE 8252 # ifdef FEAT_MBYTE
7463 if (conv.vc_type != CONV_NONE) 8253 if (conv.vc_type != CONV_NONE)
7464 vim_free(p); 8254 vim_free(p);
7465 convert_setup(&conv, enc, p_enc); 8255 convert_setup(&conv, enc, p_enc);
7466 if (conv.vc_type != CONV_NONE) 8256 if (conv.vc_type != CONV_NONE)
7467 retvar->var_val.var_string = 8257 retvar->vval.v_string = string_convert(&conv, result_buf, NULL);
7468 string_convert(&conv, result_buf, NULL);
7469 else 8258 else
7470 # endif 8259 # endif
7471 retvar->var_val.var_string = vim_strsave(result_buf); 8260 retvar->vval.v_string = vim_strsave(result_buf);
7472 8261
7473 # ifdef FEAT_MBYTE 8262 # ifdef FEAT_MBYTE
7474 /* Release conversion descriptors */ 8263 /* Release conversion descriptors */
7475 convert_setup(&conv, NULL, NULL); 8264 convert_setup(&conv, NULL, NULL);
7476 vim_free(enc); 8265 vim_free(enc);
7482 /* 8271 /*
7483 * "stridx()" function 8272 * "stridx()" function
7484 */ 8273 */
7485 static void 8274 static void
7486 f_stridx(argvars, retvar) 8275 f_stridx(argvars, retvar)
7487 VAR argvars; 8276 typeval *argvars;
7488 VAR retvar; 8277 typeval *retvar;
7489 { 8278 {
7490 char_u buf[NUMBUFLEN]; 8279 char_u buf[NUMBUFLEN];
7491 char_u *needle; 8280 char_u *needle;
7492 char_u *haystack; 8281 char_u *haystack;
7493 char_u *pos; 8282 char_u *pos;
7494 8283
7495 needle = get_var_string(&argvars[1]); 8284 needle = get_vartv_string(&argvars[1]);
7496 haystack = get_var_string_buf(&argvars[0], buf); 8285 haystack = get_vartv_string_buf(&argvars[0], buf);
7497 pos = (char_u *)strstr((char *)haystack, (char *)needle); 8286 pos = (char_u *)strstr((char *)haystack, (char *)needle);
7498 8287
7499 if (pos == NULL) 8288 if (pos == NULL)
7500 retvar->var_val.var_number = -1; 8289 retvar->vval.v_number = -1;
7501 else 8290 else
7502 retvar->var_val.var_number = (varnumber_T) (pos - haystack); 8291 retvar->vval.v_number = (varnumber_T) (pos - haystack);
7503 } 8292 }
7504 8293
7505 /* 8294 /*
7506 * "strridx()" function 8295 * "strridx()" function
7507 */ 8296 */
7508 static void 8297 static void
7509 f_strridx(argvars, retvar) 8298 f_strridx(argvars, retvar)
7510 VAR argvars; 8299 typeval *argvars;
7511 VAR retvar; 8300 typeval *retvar;
7512 { 8301 {
7513 char_u buf[NUMBUFLEN]; 8302 char_u buf[NUMBUFLEN];
7514 char_u *needle; 8303 char_u *needle;
7515 char_u *haystack; 8304 char_u *haystack;
7516 char_u *rest; 8305 char_u *rest;
7517 char_u *lastmatch = NULL; 8306 char_u *lastmatch = NULL;
7518 8307
7519 needle = get_var_string(&argvars[1]); 8308 needle = get_vartv_string(&argvars[1]);
7520 haystack = get_var_string_buf(&argvars[0], buf); 8309 haystack = get_vartv_string_buf(&argvars[0], buf);
7521 if (*needle == NUL) 8310 if (*needle == NUL)
7522 /* Empty string matches past the end. */ 8311 /* Empty string matches past the end. */
7523 lastmatch = haystack + STRLEN(haystack); 8312 lastmatch = haystack + STRLEN(haystack);
7524 else 8313 else
7525 for (rest = haystack; *rest != '\0'; ++rest) 8314 for (rest = haystack; *rest != '\0'; ++rest)
7529 break; 8318 break;
7530 lastmatch = rest; 8319 lastmatch = rest;
7531 } 8320 }
7532 8321
7533 if (lastmatch == NULL) 8322 if (lastmatch == NULL)
7534 retvar->var_val.var_number = -1; 8323 retvar->vval.v_number = -1;
7535 else 8324 else
7536 retvar->var_val.var_number = (varnumber_T)(lastmatch - haystack); 8325 retvar->vval.v_number = (varnumber_T)(lastmatch - haystack);
8326 }
8327
8328 /*
8329 * "string()" function
8330 */
8331 static void
8332 f_string(argvars, retvar)
8333 typeval *argvars;
8334 typeval *retvar;
8335 {
8336 char_u *tofree;
8337
8338 retvar->v_type = VAR_STRING;
8339 retvar->vval.v_string = tv2string(&argvars[0], &tofree);
8340 if (tofree == NULL)
8341 retvar->vval.v_string = vim_strsave(retvar->vval.v_string);
7537 } 8342 }
7538 8343
7539 /* 8344 /*
7540 * "strlen()" function 8345 * "strlen()" function
7541 */ 8346 */
7542 static void 8347 static void
7543 f_strlen(argvars, retvar) 8348 f_strlen(argvars, retvar)
7544 VAR argvars; 8349 typeval *argvars;
7545 VAR retvar; 8350 typeval *retvar;
7546 { 8351 {
7547 retvar->var_val.var_number = (varnumber_T) (STRLEN(get_var_string(&argvars[0]))); 8352 retvar->vval.v_number = (varnumber_T)(STRLEN(
8353 get_vartv_string(&argvars[0])));
7548 } 8354 }
7549 8355
7550 /* 8356 /*
7551 * "strpart()" function 8357 * "strpart()" function
7552 */ 8358 */
7553 static void 8359 static void
7554 f_strpart(argvars, retvar) 8360 f_strpart(argvars, retvar)
7555 VAR argvars; 8361 typeval *argvars;
7556 VAR retvar; 8362 typeval *retvar;
7557 { 8363 {
7558 char_u *p; 8364 char_u *p;
7559 int n; 8365 int n;
7560 int len; 8366 int len;
7561 int slen; 8367 int slen;
7562 8368
7563 p = get_var_string(&argvars[0]); 8369 p = get_vartv_string(&argvars[0]);
7564 slen = (int)STRLEN(p); 8370 slen = (int)STRLEN(p);
7565 8371
7566 n = get_var_number(&argvars[1]); 8372 n = get_vartv_number(&argvars[1]);
7567 if (argvars[2].var_type != VAR_UNKNOWN) 8373 if (argvars[2].v_type != VAR_UNKNOWN)
7568 len = get_var_number(&argvars[2]); 8374 len = get_vartv_number(&argvars[2]);
7569 else 8375 else
7570 len = slen - n; /* default len: all bytes that are available. */ 8376 len = slen - n; /* default len: all bytes that are available. */
7571 8377
7572 /* 8378 /*
7573 * Only return the overlap between the specified part and the actual 8379 * Only return the overlap between the specified part and the actual
7583 if (len < 0) 8389 if (len < 0)
7584 len = 0; 8390 len = 0;
7585 else if (n + len > slen) 8391 else if (n + len > slen)
7586 len = slen - n; 8392 len = slen - n;
7587 8393
7588 retvar->var_type = VAR_STRING; 8394 retvar->v_type = VAR_STRING;
7589 retvar->var_val.var_string = vim_strnsave(p + n, len); 8395 retvar->vval.v_string = vim_strnsave(p + n, len);
7590 } 8396 }
7591 8397
7592 /* 8398 /*
7593 * "strtrans()" function 8399 * "strtrans()" function
7594 */ 8400 */
7595 static void 8401 static void
7596 f_strtrans(argvars, retvar) 8402 f_strtrans(argvars, retvar)
7597 VAR argvars; 8403 typeval *argvars;
7598 VAR retvar; 8404 typeval *retvar;
7599 { 8405 {
7600 retvar->var_type = VAR_STRING; 8406 retvar->v_type = VAR_STRING;
7601 retvar->var_val.var_string = transstr(get_var_string(&argvars[0])); 8407 retvar->vval.v_string = transstr(get_vartv_string(&argvars[0]));
7602 } 8408 }
7603 8409
7604 /* 8410 /*
7605 * "synID(line, col, trans)" function 8411 * "synID(line, col, trans)" function
7606 */ 8412 */
7607 /*ARGSUSED*/ 8413 /*ARGSUSED*/
7608 static void 8414 static void
7609 f_synID(argvars, retvar) 8415 f_synID(argvars, retvar)
7610 VAR argvars; 8416 typeval *argvars;
7611 VAR retvar; 8417 typeval *retvar;
7612 { 8418 {
7613 int id = 0; 8419 int id = 0;
7614 #ifdef FEAT_SYN_HL 8420 #ifdef FEAT_SYN_HL
7615 long line; 8421 long line;
7616 long col; 8422 long col;
7617 int trans; 8423 int trans;
7618 8424
7619 line = get_var_lnum(argvars); 8425 line = get_vartv_lnum(argvars);
7620 col = get_var_number(&argvars[1]) - 1; 8426 col = get_vartv_number(&argvars[1]) - 1;
7621 trans = get_var_number(&argvars[2]); 8427 trans = get_vartv_number(&argvars[2]);
7622 8428
7623 if (line >= 1 && line <= curbuf->b_ml.ml_line_count 8429 if (line >= 1 && line <= curbuf->b_ml.ml_line_count
7624 && col >= 0 && col < (long)STRLEN(ml_get(line))) 8430 && col >= 0 && col < (long)STRLEN(ml_get(line)))
7625 id = syn_get_id(line, col, trans); 8431 id = syn_get_id(line, col, trans);
7626 #endif 8432 #endif
7627 8433
7628 retvar->var_val.var_number = id; 8434 retvar->vval.v_number = id;
7629 } 8435 }
7630 8436
7631 /* 8437 /*
7632 * "synIDattr(id, what [, mode])" function 8438 * "synIDattr(id, what [, mode])" function
7633 */ 8439 */
7634 /*ARGSUSED*/ 8440 /*ARGSUSED*/
7635 static void 8441 static void
7636 f_synIDattr(argvars, retvar) 8442 f_synIDattr(argvars, retvar)
7637 VAR argvars; 8443 typeval *argvars;
7638 VAR retvar; 8444 typeval *retvar;
7639 { 8445 {
7640 char_u *p = NULL; 8446 char_u *p = NULL;
7641 #ifdef FEAT_SYN_HL 8447 #ifdef FEAT_SYN_HL
7642 int id; 8448 int id;
7643 char_u *what; 8449 char_u *what;
7644 char_u *mode; 8450 char_u *mode;
7645 char_u modebuf[NUMBUFLEN]; 8451 char_u modebuf[NUMBUFLEN];
7646 int modec; 8452 int modec;
7647 8453
7648 id = get_var_number(&argvars[0]); 8454 id = get_vartv_number(&argvars[0]);
7649 what = get_var_string(&argvars[1]); 8455 what = get_vartv_string(&argvars[1]);
7650 if (argvars[2].var_type != VAR_UNKNOWN) 8456 if (argvars[2].v_type != VAR_UNKNOWN)
7651 { 8457 {
7652 mode = get_var_string_buf(&argvars[2], modebuf); 8458 mode = get_vartv_string_buf(&argvars[2], modebuf);
7653 modec = TOLOWER_ASC(mode[0]); 8459 modec = TOLOWER_ASC(mode[0]);
7654 if (modec != 't' && modec != 'c' 8460 if (modec != 't' && modec != 'c'
7655 #ifdef FEAT_GUI 8461 #ifdef FEAT_GUI
7656 && modec != 'g' 8462 && modec != 'g'
7657 #endif 8463 #endif
7710 } 8516 }
7711 8517
7712 if (p != NULL) 8518 if (p != NULL)
7713 p = vim_strsave(p); 8519 p = vim_strsave(p);
7714 #endif 8520 #endif
7715 retvar->var_type = VAR_STRING; 8521 retvar->v_type = VAR_STRING;
7716 retvar->var_val.var_string = p; 8522 retvar->vval.v_string = p;
7717 } 8523 }
7718 8524
7719 /* 8525 /*
7720 * "synIDtrans(id)" function 8526 * "synIDtrans(id)" function
7721 */ 8527 */
7722 /*ARGSUSED*/ 8528 /*ARGSUSED*/
7723 static void 8529 static void
7724 f_synIDtrans(argvars, retvar) 8530 f_synIDtrans(argvars, retvar)
7725 VAR argvars; 8531 typeval *argvars;
7726 VAR retvar; 8532 typeval *retvar;
7727 { 8533 {
7728 int id; 8534 int id;
7729 8535
7730 #ifdef FEAT_SYN_HL 8536 #ifdef FEAT_SYN_HL
7731 id = get_var_number(&argvars[0]); 8537 id = get_vartv_number(&argvars[0]);
7732 8538
7733 if (id > 0) 8539 if (id > 0)
7734 id = syn_get_final_id(id); 8540 id = syn_get_final_id(id);
7735 else 8541 else
7736 #endif 8542 #endif
7737 id = 0; 8543 id = 0;
7738 8544
7739 retvar->var_val.var_number = id; 8545 retvar->vval.v_number = id;
7740 } 8546 }
7741 8547
7742 /* 8548 /*
7743 * "system()" function 8549 * "system()" function
7744 */ 8550 */
7745 static void 8551 static void
7746 f_system(argvars, retvar) 8552 f_system(argvars, retvar)
7747 VAR argvars; 8553 typeval *argvars;
7748 VAR retvar; 8554 typeval *retvar;
7749 { 8555 {
7750 char_u *res = NULL; 8556 char_u *res = NULL;
7751 char_u *p; 8557 char_u *p;
7752 char_u *infile = NULL; 8558 char_u *infile = NULL;
7753 char_u buf[NUMBUFLEN]; 8559 char_u buf[NUMBUFLEN];
7754 int err = FALSE; 8560 int err = FALSE;
7755 FILE *fd; 8561 FILE *fd;
7756 8562
7757 if (argvars[1].var_type != VAR_UNKNOWN) 8563 if (argvars[1].v_type != VAR_UNKNOWN)
7758 { 8564 {
7759 /* 8565 /*
7760 * Write the string to a temp file, to be used for input of the shell 8566 * Write the string to a temp file, to be used for input of the shell
7761 * command. 8567 * command.
7762 */ 8568 */
7770 if (fd == NULL) 8576 if (fd == NULL)
7771 { 8577 {
7772 EMSG2(_(e_notopen), infile); 8578 EMSG2(_(e_notopen), infile);
7773 goto done; 8579 goto done;
7774 } 8580 }
7775 p = get_var_string_buf(&argvars[1], buf); 8581 p = get_vartv_string_buf(&argvars[1], buf);
7776 if (fwrite(p, STRLEN(p), 1, fd) != 1) 8582 if (fwrite(p, STRLEN(p), 1, fd) != 1)
7777 err = TRUE; 8583 err = TRUE;
7778 if (fclose(fd) != 0) 8584 if (fclose(fd) != 0)
7779 err = TRUE; 8585 err = TRUE;
7780 if (err) 8586 if (err)
7782 EMSG(_("E677: Error writing temp file")); 8588 EMSG(_("E677: Error writing temp file"));
7783 goto done; 8589 goto done;
7784 } 8590 }
7785 } 8591 }
7786 8592
7787 res = get_cmd_output(get_var_string(&argvars[0]), infile, SHELL_SILENT); 8593 res = get_cmd_output(get_vartv_string(&argvars[0]), infile, SHELL_SILENT);
7788 8594
7789 #ifdef USE_CR 8595 #ifdef USE_CR
7790 /* translate <CR> into <NL> */ 8596 /* translate <CR> into <NL> */
7791 if (res != NULL) 8597 if (res != NULL)
7792 { 8598 {
7821 if (infile != NULL) 8627 if (infile != NULL)
7822 { 8628 {
7823 mch_remove(infile); 8629 mch_remove(infile);
7824 vim_free(infile); 8630 vim_free(infile);
7825 } 8631 }
7826 retvar->var_type = VAR_STRING; 8632 retvar->v_type = VAR_STRING;
7827 retvar->var_val.var_string = res; 8633 retvar->vval.v_string = res;
7828 } 8634 }
7829 8635
7830 /* 8636 /*
7831 * "submatch()" function 8637 * "submatch()" function
7832 */ 8638 */
7833 static void 8639 static void
7834 f_submatch(argvars, retvar) 8640 f_submatch(argvars, retvar)
7835 VAR argvars; 8641 typeval *argvars;
7836 VAR retvar; 8642 typeval *retvar;
7837 { 8643 {
7838 retvar->var_type = VAR_STRING; 8644 retvar->v_type = VAR_STRING;
7839 retvar->var_val.var_string = reg_submatch((int)get_var_number(&argvars[0])); 8645 retvar->vval.v_string = reg_submatch((int)get_vartv_number(&argvars[0]));
7840 } 8646 }
7841 8647
7842 /* 8648 /*
7843 * "substitute()" function 8649 * "substitute()" function
7844 */ 8650 */
7845 static void 8651 static void
7846 f_substitute(argvars, retvar) 8652 f_substitute(argvars, retvar)
7847 VAR argvars; 8653 typeval *argvars;
7848 VAR retvar; 8654 typeval *retvar;
7849 { 8655 {
7850 char_u patbuf[NUMBUFLEN]; 8656 char_u patbuf[NUMBUFLEN];
7851 char_u subbuf[NUMBUFLEN]; 8657 char_u subbuf[NUMBUFLEN];
7852 char_u flagsbuf[NUMBUFLEN]; 8658 char_u flagsbuf[NUMBUFLEN];
7853 8659
7854 retvar->var_type = VAR_STRING; 8660 retvar->v_type = VAR_STRING;
7855 retvar->var_val.var_string = do_string_sub( 8661 retvar->vval.v_string = do_string_sub(
7856 get_var_string(&argvars[0]), 8662 get_vartv_string(&argvars[0]),
7857 get_var_string_buf(&argvars[1], patbuf), 8663 get_vartv_string_buf(&argvars[1], patbuf),
7858 get_var_string_buf(&argvars[2], subbuf), 8664 get_vartv_string_buf(&argvars[2], subbuf),
7859 get_var_string_buf(&argvars[3], flagsbuf)); 8665 get_vartv_string_buf(&argvars[3], flagsbuf));
7860 } 8666 }
7861 8667
7862 /* 8668 /*
7863 * "tempname()" function 8669 * "tempname()" function
7864 */ 8670 */
7865 /*ARGSUSED*/ 8671 /*ARGSUSED*/
7866 static void 8672 static void
7867 f_tempname(argvars, retvar) 8673 f_tempname(argvars, retvar)
7868 VAR argvars; 8674 typeval *argvars;
7869 VAR retvar; 8675 typeval *retvar;
7870 { 8676 {
7871 static int x = 'A'; 8677 static int x = 'A';
7872 8678
7873 retvar->var_type = VAR_STRING; 8679 retvar->v_type = VAR_STRING;
7874 retvar->var_val.var_string = vim_tempname(x); 8680 retvar->vval.v_string = vim_tempname(x);
7875 8681
7876 /* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different 8682 /* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different
7877 * names. Skip 'I' and 'O', they are used for shell redirection. */ 8683 * names. Skip 'I' and 'O', they are used for shell redirection. */
7878 do 8684 do
7879 { 8685 {
7898 /* 8704 /*
7899 * "tolower(string)" function 8705 * "tolower(string)" function
7900 */ 8706 */
7901 static void 8707 static void
7902 f_tolower(argvars, retvar) 8708 f_tolower(argvars, retvar)
7903 VAR argvars; 8709 typeval *argvars;
7904 VAR retvar; 8710 typeval *retvar;
7905 { 8711 {
7906 char_u *p; 8712 char_u *p;
7907 8713
7908 p = vim_strsave(get_var_string(&argvars[0])); 8714 p = vim_strsave(get_vartv_string(&argvars[0]));
7909 retvar->var_type = VAR_STRING; 8715 retvar->v_type = VAR_STRING;
7910 retvar->var_val.var_string = p; 8716 retvar->vval.v_string = p;
7911 8717
7912 if (p != NULL) 8718 if (p != NULL)
7913 while (*p != NUL) 8719 while (*p != NUL)
7914 { 8720 {
7915 #ifdef FEAT_MBYTE 8721 #ifdef FEAT_MBYTE
7941 /* 8747 /*
7942 * "toupper(string)" function 8748 * "toupper(string)" function
7943 */ 8749 */
7944 static void 8750 static void
7945 f_toupper(argvars, retvar) 8751 f_toupper(argvars, retvar)
7946 VAR argvars; 8752 typeval *argvars;
7947 VAR retvar; 8753 typeval *retvar;
7948 { 8754 {
7949 char_u *p; 8755 char_u *p;
7950 8756
7951 p = vim_strsave(get_var_string(&argvars[0])); 8757 p = vim_strsave(get_vartv_string(&argvars[0]));
7952 retvar->var_type = VAR_STRING; 8758 retvar->v_type = VAR_STRING;
7953 retvar->var_val.var_string = p; 8759 retvar->vval.v_string = p;
7954 8760
7955 if (p != NULL) 8761 if (p != NULL)
7956 while (*p != NUL) 8762 while (*p != NUL)
7957 { 8763 {
7958 #ifdef FEAT_MBYTE 8764 #ifdef FEAT_MBYTE
7984 /* 8790 /*
7985 * "tr(string, fromstr, tostr)" function 8791 * "tr(string, fromstr, tostr)" function
7986 */ 8792 */
7987 static void 8793 static void
7988 f_tr(argvars, retvar) 8794 f_tr(argvars, retvar)
7989 VAR argvars; 8795 typeval *argvars;
7990 VAR retvar; 8796 typeval *retvar;
7991 { 8797 {
7992 char_u *instr; 8798 char_u *instr;
7993 char_u *fromstr; 8799 char_u *fromstr;
7994 char_u *tostr; 8800 char_u *tostr;
7995 char_u *p; 8801 char_u *p;
8004 #endif 8810 #endif
8005 char_u buf[NUMBUFLEN]; 8811 char_u buf[NUMBUFLEN];
8006 char_u buf2[NUMBUFLEN]; 8812 char_u buf2[NUMBUFLEN];
8007 garray_T ga; 8813 garray_T ga;
8008 8814
8009 instr = get_var_string(&argvars[0]); 8815 instr = get_vartv_string(&argvars[0]);
8010 fromstr = get_var_string_buf(&argvars[1], buf); 8816 fromstr = get_vartv_string_buf(&argvars[1], buf);
8011 tostr = get_var_string_buf(&argvars[2], buf2); 8817 tostr = get_vartv_string_buf(&argvars[2], buf2);
8012 8818
8013 /* Default return value: empty string. */ 8819 /* Default return value: empty string. */
8014 retvar->var_type = VAR_STRING; 8820 retvar->v_type = VAR_STRING;
8015 retvar->var_val.var_string = NULL; 8821 retvar->vval.v_string = NULL;
8016 ga_init2(&ga, (int)sizeof(char), 80); 8822 ga_init2(&ga, (int)sizeof(char), 80);
8017 8823
8018 #ifdef FEAT_MBYTE 8824 #ifdef FEAT_MBYTE
8019 if (!has_mbyte) 8825 if (!has_mbyte)
8020 #endif 8826 #endif
8093 ga_append(&ga, *instr); 8899 ga_append(&ga, *instr);
8094 ++instr; 8900 ++instr;
8095 } 8901 }
8096 } 8902 }
8097 8903
8098 retvar->var_val.var_string = ga.ga_data; 8904 retvar->vval.v_string = ga.ga_data;
8099 } 8905 }
8100 8906
8101 /* 8907 /*
8102 * "type(expr)" function 8908 * "type(expr)" function
8103 */ 8909 */
8104 static void 8910 static void
8105 f_type(argvars, retvar) 8911 f_type(argvars, retvar)
8106 VAR argvars; 8912 typeval *argvars;
8107 VAR retvar; 8913 typeval *retvar;
8108 { 8914 {
8109 if (argvars[0].var_type == VAR_NUMBER) 8915 if (argvars[0].v_type == VAR_NUMBER)
8110 retvar->var_val.var_number = 0; 8916 retvar->vval.v_number = 0;
8111 else 8917 else
8112 retvar->var_val.var_number = 1; 8918 retvar->vval.v_number = 1;
8113 } 8919 }
8114 8920
8115 /* 8921 /*
8116 * "virtcol(string)" function 8922 * "virtcol(string)" function
8117 */ 8923 */
8118 static void 8924 static void
8119 f_virtcol(argvars, retvar) 8925 f_virtcol(argvars, retvar)
8120 VAR argvars; 8926 typeval *argvars;
8121 VAR retvar; 8927 typeval *retvar;
8122 { 8928 {
8123 colnr_T vcol = 0; 8929 colnr_T vcol = 0;
8124 pos_T *fp; 8930 pos_T *fp;
8125 8931
8126 fp = var2fpos(&argvars[0], FALSE); 8932 fp = var2fpos(&argvars[0], FALSE);
8128 { 8934 {
8129 getvvcol(curwin, fp, NULL, NULL, &vcol); 8935 getvvcol(curwin, fp, NULL, NULL, &vcol);
8130 ++vcol; 8936 ++vcol;
8131 } 8937 }
8132 8938
8133 retvar->var_val.var_number = vcol; 8939 retvar->vval.v_number = vcol;
8134 } 8940 }
8135 8941
8136 /* 8942 /*
8137 * "visualmode()" function 8943 * "visualmode()" function
8138 */ 8944 */
8139 /*ARGSUSED*/ 8945 /*ARGSUSED*/
8140 static void 8946 static void
8141 f_visualmode(argvars, retvar) 8947 f_visualmode(argvars, retvar)
8142 VAR argvars; 8948 typeval *argvars;
8143 VAR retvar; 8949 typeval *retvar;
8144 { 8950 {
8145 #ifdef FEAT_VISUAL 8951 #ifdef FEAT_VISUAL
8146 char_u str[2]; 8952 char_u str[2];
8147 8953
8148 retvar->var_type = VAR_STRING; 8954 retvar->v_type = VAR_STRING;
8149 str[0] = curbuf->b_visual_mode_eval; 8955 str[0] = curbuf->b_visual_mode_eval;
8150 str[1] = NUL; 8956 str[1] = NUL;
8151 retvar->var_val.var_string = vim_strsave(str); 8957 retvar->vval.v_string = vim_strsave(str);
8152 8958
8153 /* A non-zero number or non-empty string argument: reset mode. */ 8959 /* A non-zero number or non-empty string argument: reset mode. */
8154 if ((argvars[0].var_type == VAR_NUMBER 8960 if ((argvars[0].v_type == VAR_NUMBER
8155 && argvars[0].var_val.var_number != 0) 8961 && argvars[0].vval.v_number != 0)
8156 || (argvars[0].var_type == VAR_STRING 8962 || (argvars[0].v_type == VAR_STRING
8157 && *get_var_string(&argvars[0]) != NUL)) 8963 && *get_vartv_string(&argvars[0]) != NUL))
8158 curbuf->b_visual_mode_eval = NUL; 8964 curbuf->b_visual_mode_eval = NUL;
8159 #else 8965 #else
8160 retvar->var_val.var_number = 0; /* return anything, it won't work anyway */ 8966 retvar->vval.v_number = 0; /* return anything, it won't work anyway */
8161 #endif 8967 #endif
8162 } 8968 }
8163 8969
8164 /* 8970 /*
8165 * "winbufnr(nr)" function 8971 * "winbufnr(nr)" function
8166 */ 8972 */
8167 static void 8973 static void
8168 f_winbufnr(argvars, retvar) 8974 f_winbufnr(argvars, retvar)
8169 VAR argvars; 8975 typeval *argvars;
8170 VAR retvar; 8976 typeval *retvar;
8171 { 8977 {
8172 win_T *wp; 8978 win_T *wp;
8173 8979
8174 wp = find_win_by_nr(&argvars[0]); 8980 wp = find_win_by_nr(&argvars[0]);
8175 if (wp == NULL) 8981 if (wp == NULL)
8176 retvar->var_val.var_number = -1; 8982 retvar->vval.v_number = -1;
8177 else 8983 else
8178 retvar->var_val.var_number = wp->w_buffer->b_fnum; 8984 retvar->vval.v_number = wp->w_buffer->b_fnum;
8179 } 8985 }
8180 8986
8181 /* 8987 /*
8182 * "wincol()" function 8988 * "wincol()" function
8183 */ 8989 */
8184 /*ARGSUSED*/ 8990 /*ARGSUSED*/
8185 static void 8991 static void
8186 f_wincol(argvars, retvar) 8992 f_wincol(argvars, retvar)
8187 VAR argvars; 8993 typeval *argvars;
8188 VAR retvar; 8994 typeval *retvar;
8189 { 8995 {
8190 validate_cursor(); 8996 validate_cursor();
8191 retvar->var_val.var_number = curwin->w_wcol + 1; 8997 retvar->vval.v_number = curwin->w_wcol + 1;
8192 } 8998 }
8193 8999
8194 /* 9000 /*
8195 * "winheight(nr)" function 9001 * "winheight(nr)" function
8196 */ 9002 */
8197 static void 9003 static void
8198 f_winheight(argvars, retvar) 9004 f_winheight(argvars, retvar)
8199 VAR argvars; 9005 typeval *argvars;
8200 VAR retvar; 9006 typeval *retvar;
8201 { 9007 {
8202 win_T *wp; 9008 win_T *wp;
8203 9009
8204 wp = find_win_by_nr(&argvars[0]); 9010 wp = find_win_by_nr(&argvars[0]);
8205 if (wp == NULL) 9011 if (wp == NULL)
8206 retvar->var_val.var_number = -1; 9012 retvar->vval.v_number = -1;
8207 else 9013 else
8208 retvar->var_val.var_number = wp->w_height; 9014 retvar->vval.v_number = wp->w_height;
8209 } 9015 }
8210 9016
8211 /* 9017 /*
8212 * "winline()" function 9018 * "winline()" function
8213 */ 9019 */
8214 /*ARGSUSED*/ 9020 /*ARGSUSED*/
8215 static void 9021 static void
8216 f_winline(argvars, retvar) 9022 f_winline(argvars, retvar)
8217 VAR argvars; 9023 typeval *argvars;
8218 VAR retvar; 9024 typeval *retvar;
8219 { 9025 {
8220 validate_cursor(); 9026 validate_cursor();
8221 retvar->var_val.var_number = curwin->w_wrow + 1; 9027 retvar->vval.v_number = curwin->w_wrow + 1;
8222 } 9028 }
8223 9029
8224 /* 9030 /*
8225 * "winnr()" function 9031 * "winnr()" function
8226 */ 9032 */
8227 /* ARGSUSED */ 9033 /* ARGSUSED */
8228 static void 9034 static void
8229 f_winnr(argvars, retvar) 9035 f_winnr(argvars, retvar)
8230 VAR argvars; 9036 typeval *argvars;
8231 VAR retvar; 9037 typeval *retvar;
8232 { 9038 {
8233 int nr = 1; 9039 int nr = 1;
8234 #ifdef FEAT_WINDOWS 9040 #ifdef FEAT_WINDOWS
8235 win_T *wp; 9041 win_T *wp;
8236 win_T *twin = curwin; 9042 win_T *twin = curwin;
8237 char_u *arg; 9043 char_u *arg;
8238 9044
8239 if (argvars[0].var_type != VAR_UNKNOWN) 9045 if (argvars[0].v_type != VAR_UNKNOWN)
8240 { 9046 {
8241 arg = get_var_string(&argvars[0]); 9047 arg = get_vartv_string(&argvars[0]);
8242 if (STRCMP(arg, "$") == 0) 9048 if (STRCMP(arg, "$") == 0)
8243 twin = lastwin; 9049 twin = lastwin;
8244 else if (STRCMP(arg, "#") == 0) 9050 else if (STRCMP(arg, "#") == 0)
8245 { 9051 {
8246 twin = prevwin; 9052 twin = prevwin;
8256 9062
8257 if (nr > 0) 9063 if (nr > 0)
8258 for (wp = firstwin; wp != twin; wp = wp->w_next) 9064 for (wp = firstwin; wp != twin; wp = wp->w_next)
8259 ++nr; 9065 ++nr;
8260 #endif 9066 #endif
8261 retvar->var_val.var_number = nr; 9067 retvar->vval.v_number = nr;
8262 } 9068 }
8263 9069
8264 /* 9070 /*
8265 * "winrestcmd()" function 9071 * "winrestcmd()" function
8266 */ 9072 */
8267 /* ARGSUSED */ 9073 /* ARGSUSED */
8268 static void 9074 static void
8269 f_winrestcmd(argvars, retvar) 9075 f_winrestcmd(argvars, retvar)
8270 VAR argvars; 9076 typeval *argvars;
8271 VAR retvar; 9077 typeval *retvar;
8272 { 9078 {
8273 #ifdef FEAT_WINDOWS 9079 #ifdef FEAT_WINDOWS
8274 win_T *wp; 9080 win_T *wp;
8275 int winnr = 1; 9081 int winnr = 1;
8276 garray_T ga; 9082 garray_T ga;
8287 # endif 9093 # endif
8288 ++winnr; 9094 ++winnr;
8289 } 9095 }
8290 ga_append(&ga, NUL); 9096 ga_append(&ga, NUL);
8291 9097
8292 retvar->var_val.var_string = ga.ga_data; 9098 retvar->vval.v_string = ga.ga_data;
8293 #else 9099 #else
8294 retvar->var_val.var_string = NULL; 9100 retvar->vval.v_string = NULL;
8295 #endif 9101 #endif
8296 retvar->var_type = VAR_STRING; 9102 retvar->v_type = VAR_STRING;
8297 } 9103 }
8298 9104
8299 /* 9105 /*
8300 * "winwidth(nr)" function 9106 * "winwidth(nr)" function
8301 */ 9107 */
8302 static void 9108 static void
8303 f_winwidth(argvars, retvar) 9109 f_winwidth(argvars, retvar)
8304 VAR argvars; 9110 typeval *argvars;
8305 VAR retvar; 9111 typeval *retvar;
8306 { 9112 {
8307 win_T *wp; 9113 win_T *wp;
8308 9114
8309 wp = find_win_by_nr(&argvars[0]); 9115 wp = find_win_by_nr(&argvars[0]);
8310 if (wp == NULL) 9116 if (wp == NULL)
8311 retvar->var_val.var_number = -1; 9117 retvar->vval.v_number = -1;
8312 else 9118 else
8313 #ifdef FEAT_VERTSPLIT 9119 #ifdef FEAT_VERTSPLIT
8314 retvar->var_val.var_number = wp->w_width; 9120 retvar->vval.v_number = wp->w_width;
8315 #else 9121 #else
8316 retvar->var_val.var_number = Columns; 9122 retvar->vval.v_number = Columns;
8317 #endif 9123 #endif
8318 } 9124 }
8319 9125
8320 static win_T * 9126 static win_T *
8321 find_win_by_nr(vp) 9127 find_win_by_nr(vp)
8322 VAR vp; 9128 typeval *vp;
8323 { 9129 {
8324 #ifdef FEAT_WINDOWS 9130 #ifdef FEAT_WINDOWS
8325 win_T *wp; 9131 win_T *wp;
8326 #endif 9132 #endif
8327 int nr; 9133 int nr;
8328 9134
8329 nr = get_var_number(vp); 9135 nr = get_vartv_number(vp);
8330 9136
8331 #ifdef FEAT_WINDOWS 9137 #ifdef FEAT_WINDOWS
8332 if (nr == 0) 9138 if (nr == 0)
8333 return curwin; 9139 return curwin;
8334 9140
8346 /* 9152 /*
8347 * Translate a String variable into a position. 9153 * Translate a String variable into a position.
8348 */ 9154 */
8349 static pos_T * 9155 static pos_T *
8350 var2fpos(varp, lnum) 9156 var2fpos(varp, lnum)
8351 VAR varp; 9157 typeval *varp;
8352 int lnum; /* TRUE when $ is last line */ 9158 int lnum; /* TRUE when $ is last line */
8353 { 9159 {
8354 char_u *name; 9160 char_u *name;
8355 static pos_T pos; 9161 static pos_T pos;
8356 pos_T *pp; 9162 pos_T *pp;
8357 9163
8358 name = get_var_string(varp); 9164 name = get_vartv_string(varp);
8359 if (name[0] == '.') /* cursor */ 9165 if (name[0] == '.') /* cursor */
8360 return &curwin->w_cursor; 9166 return &curwin->w_cursor;
8361 if (name[0] == '\'') /* mark */ 9167 if (name[0] == '\'') /* mark */
8362 { 9168 {
8363 pp = getmark(name[1], FALSE); 9169 pp = getmark(name[1], FALSE);
8748 /* 9554 /*
8749 * Get the value of internal variable "name". 9555 * Get the value of internal variable "name".
8750 * Return OK or FAIL. 9556 * Return OK or FAIL.
8751 */ 9557 */
8752 static int 9558 static int
8753 get_var_var(name, len, retvar) 9559 get_var_vartv(name, len, retvar)
8754 char_u *name; 9560 char_u *name;
8755 int len; /* length of "name" */ 9561 int len; /* length of "name" */
8756 VAR retvar; /* NULL when only checking existence */ 9562 typeval *retvar; /* NULL when only checking existence */
8757 { 9563 {
8758 int ret = OK; 9564 int ret = OK;
8759 int type = VAR_UNKNOWN; 9565 typeval tv;
8760 long number = 1;
8761 char_u *string = NULL;
8762 VAR v; 9566 VAR v;
8763 int cc; 9567 int cc;
8764 int i; 9568 int i;
9569
9570 tv.v_type = VAR_UNKNOWN;
8765 9571
8766 /* truncate the name, so that we can use strcmp() */ 9572 /* truncate the name, so that we can use strcmp() */
8767 cc = name[len]; 9573 cc = name[len];
8768 name[len] = NUL; 9574 name[len] = NUL;
8769 9575
8770 /* 9576 /*
8771 * Check for "b:changedtick". 9577 * Check for "b:changedtick".
8772 */ 9578 */
8773 if (STRCMP(name, "b:changedtick") == 0) 9579 if (STRCMP(name, "b:changedtick") == 0)
8774 { 9580 {
8775 type = VAR_NUMBER; 9581 tv.v_type = VAR_NUMBER;
8776 number = curbuf->b_changedtick; 9582 tv.vval.v_number = curbuf->b_changedtick;
8777 } 9583 }
8778 9584
8779 /* 9585 /*
8780 * Check for built-in v: variables. 9586 * Check for built-in v: variables.
8781 */ 9587 */
8782 else if ((i = find_vim_var(name, len)) >= 0) 9588 else if ((i = find_vim_var(name, len)) >= 0)
8783 { 9589 {
8784 type = vimvars[i].type; 9590 tv.v_type = vimvars[i].type;
8785 number = (long)vimvars[i].val; 9591 if (tv.v_type == VAR_NUMBER)
8786 string = vimvars[i].val; 9592 tv.vval.v_number = (long)vimvars[i].val;
9593 else
9594 tv.vval.v_string = vimvars[i].val;
8787 } 9595 }
8788 9596
8789 /* 9597 /*
8790 * Check for user-defined variables. 9598 * Check for user-defined variables.
8791 */ 9599 */
8792 else 9600 else
8793 { 9601 {
8794 v = find_var(name, FALSE); 9602 v = find_var(name, FALSE);
8795 if (v != NULL) 9603 if (v != NULL)
8796 { 9604 tv = v->tv;
8797 type = v->var_type; 9605 }
8798 number = v->var_val.var_number; 9606
8799 string = v->var_val.var_string; 9607 if (tv.v_type == VAR_UNKNOWN)
8800 }
8801 }
8802
8803 if (type == VAR_UNKNOWN)
8804 { 9608 {
8805 if (retvar != NULL) 9609 if (retvar != NULL)
8806 EMSG2(_("E121: Undefined variable: %s"), name); 9610 EMSG2(_("E121: Undefined variable: %s"), name);
8807 ret = FAIL; 9611 ret = FAIL;
8808 } 9612 }
8809 else if (retvar != NULL) 9613 else if (retvar != NULL)
8810 { 9614 copy_vartv(&tv, retvar);
8811 retvar->var_type = type;
8812 if (type == VAR_NUMBER)
8813 retvar->var_val.var_number = number;
8814 else if (type == VAR_STRING)
8815 {
8816 if (string != NULL)
8817 string = vim_strsave(string);
8818 retvar->var_val.var_string = string;
8819 }
8820 }
8821 9615
8822 name[len] = cc; 9616 name[len] = cc;
8823 9617
8824 return ret; 9618 return ret;
8825 } 9619 }
8832 { 9626 {
8833 return (VAR)alloc_clear((unsigned)sizeof(var)); 9627 return (VAR)alloc_clear((unsigned)sizeof(var));
8834 } 9628 }
8835 9629
8836 /* 9630 /*
8837 * Allocate memory for a variable, and assign a string to it. 9631 * Allocate memory for a variable type-value, and make it emtpy (0 or NULL
9632 * value).
9633 */
9634 static typeval *
9635 alloc_vartv()
9636 {
9637 return (typeval *)alloc_clear((unsigned)sizeof(typeval));
9638 }
9639
9640 /*
9641 * Allocate memory for a variable type-value, and assign a string to it.
8838 * The string "s" must have been allocated, it is consumed. 9642 * The string "s" must have been allocated, it is consumed.
8839 * Return NULL for out of memory, the variable otherwise. 9643 * Return NULL for out of memory, the variable otherwise.
8840 */ 9644 */
8841 static VAR 9645 static typeval *
8842 alloc_string_var(s) 9646 alloc_string_vartv(s)
8843 char_u *s; 9647 char_u *s;
8844 { 9648 {
8845 VAR retvar; 9649 typeval *retvar;
8846 9650
8847 retvar = alloc_var(); 9651 retvar = alloc_vartv();
8848 if (retvar != NULL) 9652 if (retvar != NULL)
8849 { 9653 {
8850 retvar->var_type = VAR_STRING; 9654 retvar->v_type = VAR_STRING;
8851 retvar->var_val.var_string = s; 9655 retvar->vval.v_string = s;
8852 } 9656 }
8853 else 9657 else
8854 vim_free(s); 9658 vim_free(s);
8855 return retvar; 9659 return retvar;
8856 } 9660 }
8857 9661
8858 /* 9662 /*
8859 * Free the memory for a variable. 9663 * Free the memory for a variable type-value.
8860 */ 9664 */
8861 static void 9665 static void
8862 free_var(varp) 9666 free_vartv(varp)
8863 VAR varp; 9667 typeval *varp;
8864 { 9668 {
8865 if (varp != NULL) 9669 if (varp != NULL)
8866 { 9670 {
8867 if (varp->var_type == VAR_STRING) 9671 switch (varp->v_type)
8868 vim_free(varp->var_val.var_string); 9672 {
8869 vim_free(varp->var_name); 9673 case VAR_STRING:
9674 case VAR_FUNC:
9675 vim_free(varp->vval.v_string);
9676 break;
9677 case VAR_LIST:
9678 list_unref(varp->vval.v_list);
9679 break;
9680 default:
9681 break;
9682 }
8870 vim_free(varp); 9683 vim_free(varp);
8871 } 9684 }
8872 } 9685 }
8873 9686
8874 /* 9687 /*
8875 * Free the memory for a variable value and set the value to NULL or 0. 9688 * Free the memory for a variable value and set the value to NULL or 0.
8876 */ 9689 */
8877 static void 9690 static void
8878 clear_var(varp) 9691 clear_vartv(varp)
8879 VAR varp; 9692 typeval *varp;
8880 { 9693 {
8881 if (varp != NULL) 9694 if (varp != NULL)
8882 { 9695 {
8883 if (varp->var_type == VAR_STRING) 9696 switch (varp->v_type)
8884 { 9697 {
8885 vim_free(varp->var_val.var_string); 9698 case VAR_STRING:
8886 varp->var_val.var_string = NULL; 9699 case VAR_FUNC:
8887 } 9700 vim_free(varp->vval.v_string);
8888 else 9701 varp->vval.v_string = NULL;
8889 varp->var_val.var_number = 0; 9702 break;
9703 case VAR_LIST:
9704 list_unref(varp->vval.v_list);
9705 break;
9706 default:
9707 varp->vval.v_number = 0;
9708 break;
9709 }
8890 } 9710 }
8891 } 9711 }
8892 9712
8893 /* 9713 /*
8894 * Get the number value of a variable. 9714 * Get the number value of a variable.
8895 * If it is a String variable, uses vim_str2nr(). 9715 * If it is a String variable, uses vim_str2nr().
8896 */ 9716 */
8897 static long 9717 static long
8898 get_var_number(varp) 9718 get_vartv_number(varp)
8899 VAR varp; 9719 typeval *varp;
8900 { 9720 {
8901 long n; 9721 long n = 0L;
8902 9722
8903 if (varp->var_type == VAR_NUMBER) 9723 switch (varp->v_type)
8904 return (long)(varp->var_val.var_number); 9724 {
8905 else if (varp->var_type == VAR_UNKNOWN || varp->var_val.var_string == NULL) 9725 case VAR_NUMBER:
8906 return 0L; 9726 n = (long)(varp->vval.v_number);
8907 else 9727 break;
8908 { 9728 case VAR_FUNC:
8909 vim_str2nr(varp->var_val.var_string, NULL, NULL, TRUE, TRUE, &n, NULL); 9729 EMSG(_("E999: Using function reference as a number"));
8910 return n; 9730 break;
8911 } 9731 case VAR_STRING:
9732 if (varp->vval.v_string != NULL)
9733 vim_str2nr(varp->vval.v_string, NULL, NULL,
9734 TRUE, TRUE, &n, NULL);
9735 break;
9736 default:
9737 break;
9738 }
9739 return n;
8912 } 9740 }
8913 9741
8914 /* 9742 /*
8915 * Get the lnum from the first argument. Also accepts ".", "$", etc. 9743 * Get the lnum from the first argument. Also accepts ".", "$", etc.
8916 */ 9744 */
8917 static linenr_T 9745 static linenr_T
8918 get_var_lnum(argvars) 9746 get_vartv_lnum(argvars)
8919 VAR argvars; 9747 typeval *argvars;
8920 { 9748 {
8921 var retvar; 9749 typeval retvar;
8922 linenr_T lnum; 9750 linenr_T lnum;
8923 9751
8924 lnum = get_var_number(&argvars[0]); 9752 lnum = get_vartv_number(&argvars[0]);
8925 if (lnum == 0) /* no valid number, try using line() */ 9753 if (lnum == 0) /* no valid number, try using line() */
8926 { 9754 {
8927 retvar.var_type = VAR_NUMBER; 9755 retvar.v_type = VAR_NUMBER;
8928 f_line(argvars, &retvar); 9756 f_line(argvars, &retvar);
8929 lnum = retvar.var_val.var_number; 9757 lnum = retvar.vval.v_number;
8930 clear_var(&retvar); 9758 clear_vartv(&retvar);
8931 } 9759 }
8932 return lnum; 9760 return lnum;
8933 } 9761 }
8934 9762
8935 /* 9763 /*
8939 * get_var_string_buf() uses a given buffer. 9767 * get_var_string_buf() uses a given buffer.
8940 * If the String variable has never been set, return an empty string. 9768 * If the String variable has never been set, return an empty string.
8941 * Never returns NULL; 9769 * Never returns NULL;
8942 */ 9770 */
8943 static char_u * 9771 static char_u *
8944 get_var_string(varp) 9772 get_vartv_string(varp)
8945 VAR varp; 9773 typeval *varp;
8946 { 9774 {
8947 static char_u mybuf[NUMBUFLEN]; 9775 static char_u mybuf[NUMBUFLEN];
8948 9776
8949 return get_var_string_buf(varp, mybuf); 9777 return get_vartv_string_buf(varp, mybuf);
8950 } 9778 }
8951 9779
8952 static char_u * 9780 static char_u *
8953 get_var_string_buf(varp, buf) 9781 get_vartv_string_buf(varp, buf)
8954 VAR varp; 9782 typeval *varp;
8955 char_u *buf; 9783 char_u *buf;
8956 { 9784 {
8957 if (varp->var_type == VAR_NUMBER) 9785 switch (varp->v_type)
8958 { 9786 {
8959 sprintf((char *)buf, "%ld", (long)varp->var_val.var_number); 9787 case VAR_NUMBER:
8960 return buf; 9788 sprintf((char *)buf, "%ld", (long)varp->vval.v_number);
8961 } 9789 return buf;
8962 else if (varp->var_val.var_string == NULL) 9790 case VAR_FUNC:
8963 return (char_u *)""; 9791 EMSG(_("E99: using Funcref as a String"));
8964 else 9792 break;
8965 return varp->var_val.var_string; 9793 case VAR_LIST:
9794 EMSG(_("E99: using List as a String"));
9795 break;
9796 case VAR_STRING:
9797 if (varp->vval.v_string != NULL)
9798 return varp->vval.v_string;
9799 break;
9800 default:
9801 EMSG(_("E999: Internal error: get_vartv_string_buf()"));
9802 break;
9803 }
9804 return (char_u *)"";
8966 } 9805 }
8967 9806
8968 /* 9807 /*
8969 * Find variable "name" in the list of variables. 9808 * Find variable "name" in the list of variables.
8970 * Return a pointer to it if found, NULL if not found. 9809 * Return a pointer to it if found, NULL if not found.
9810 * Careful: "a:0" variables don't have a name.
8971 */ 9811 */
8972 static VAR 9812 static VAR
8973 find_var(name, writing) 9813 find_var(name, writing)
8974 char_u *name; 9814 char_u *name;
8975 int writing; 9815 int writing;
8976 { 9816 {
8977 int i; 9817 int i;
8978 char_u *varname; 9818 char_u *varname;
8979 garray_T *gap; 9819 garray_T *gap;
8980 9820
8981 /* Check for function arguments "a:" */
8982 if (name[0] == 'a' && name[1] == ':') 9821 if (name[0] == 'a' && name[1] == ':')
8983 { 9822 {
9823 /* Function arguments "a:".
9824 * NOTE: We use a typecast, because function arguments don't have a
9825 * name. The caller must not try to access the name! */
8984 if (writing) 9826 if (writing)
8985 { 9827 {
8986 EMSG2(_(e_readonlyvar), name); 9828 EMSG2(_(e_readonlyvar), name);
8987 return NULL; 9829 return NULL;
8988 } 9830 }
8995 if (i == 0) /* a:0 */ 9837 if (i == 0) /* a:0 */
8996 return &current_funccal->a0_var; 9838 return &current_funccal->a0_var;
8997 i += current_funccal->func->args.ga_len; 9839 i += current_funccal->func->args.ga_len;
8998 if (i > current_funccal->argcount) /* a:999 */ 9840 if (i > current_funccal->argcount) /* a:999 */
8999 return NULL; 9841 return NULL;
9000 return &(current_funccal->argvars[i - 1]); /* a:1, a:2, etc. */ 9842 return (VAR)&(current_funccal->argvars[i - 1]); /* a:1, a:2, etc. */
9001 } 9843 }
9002 if (STRCMP(name, "firstline") == 0) 9844 if (STRCMP(name, "firstline") == 0)
9003 return &(current_funccal->firstline); 9845 return &(current_funccal->firstline);
9004 if (STRCMP(name, "lastline") == 0) 9846 if (STRCMP(name, "lastline") == 0)
9005 return &(current_funccal->lastline); 9847 return &(current_funccal->lastline);
9006 for (i = 0; i < current_funccal->func->args.ga_len; ++i) 9848 for (i = 0; i < current_funccal->func->args.ga_len; ++i)
9007 if (STRCMP(name, ((char_u **) 9849 if (STRCMP(name, ((char_u **)
9008 (current_funccal->func->args.ga_data))[i]) == 0) 9850 (current_funccal->func->args.ga_data))[i]) == 0)
9009 return &(current_funccal->argvars[i]); /* a:name */ 9851 return (VAR)&(current_funccal->argvars[i]); /* a:name */
9010 return NULL; 9852 return NULL;
9011 } 9853 }
9012 9854
9013 gap = find_var_ga(name, &varname); 9855 gap = find_var_ga(name, &varname);
9014 if (gap == NULL) 9856 if (gap == NULL)
9022 char_u *varname; 9864 char_u *varname;
9023 { 9865 {
9024 int i; 9866 int i;
9025 9867
9026 for (i = gap->ga_len; --i >= 0; ) 9868 for (i = gap->ga_len; --i >= 0; )
9027 if (VAR_GAP_ENTRY(i, gap).var_name != NULL 9869 if (VAR_GAP_ENTRY(i, gap).v_name != NULL
9028 && STRCMP(VAR_GAP_ENTRY(i, gap).var_name, varname) == 0) 9870 && STRCMP(VAR_GAP_ENTRY(i, gap).v_name, varname) == 0)
9029 break; 9871 break;
9030 if (i < 0) 9872 if (i < 0)
9031 return NULL; 9873 return NULL;
9032 return &VAR_GAP_ENTRY(i, gap); 9874 return &VAR_GAP_ENTRY(i, gap);
9033 } 9875 }
9091 { 9933 {
9092 if (ga_grow(&ga_scripts, (int)(id - ga_scripts.ga_len)) == OK) 9934 if (ga_grow(&ga_scripts, (int)(id - ga_scripts.ga_len)) == OK)
9093 { 9935 {
9094 while (ga_scripts.ga_len < id) 9936 while (ga_scripts.ga_len < id)
9095 { 9937 {
9096 var_init(&SCRIPT_VARS(ga_scripts.ga_len + 1)); 9938 vars_init(&SCRIPT_VARS(ga_scripts.ga_len + 1));
9097 ++ga_scripts.ga_len; 9939 ++ga_scripts.ga_len;
9098 } 9940 }
9099 } 9941 }
9100 } 9942 }
9101 9943
9102 /* 9944 /*
9103 * Initialize internal variables for use. 9945 * Initialize internal variables for use.
9104 */ 9946 */
9105 void 9947 void
9106 var_init(gap) 9948 vars_init(gap)
9107 garray_T *gap; 9949 garray_T *gap;
9108 { 9950 {
9109 ga_init2(gap, (int)sizeof(var), 4); 9951 ga_init2(gap, (int)sizeof(var), 4);
9110 } 9952 }
9111 9953
9112 /* 9954 /*
9113 * Clean up a list of internal variables. 9955 * Clean up a list of internal variables.
9114 */ 9956 */
9115 void 9957 void
9116 var_clear(gap) 9958 vars_clear(gap)
9117 garray_T *gap; 9959 garray_T *gap;
9118 { 9960 {
9119 int i; 9961 int i;
9120 9962
9121 for (i = gap->ga_len; --i >= 0; ) 9963 for (i = gap->ga_len; --i >= 0; )
9122 var_free_one(&VAR_GAP_ENTRY(i, gap)); 9964 clear_var(&VAR_GAP_ENTRY(i, gap));
9123 ga_clear(gap); 9965 ga_clear(gap);
9124 } 9966 }
9125 9967
9126 static void 9968 static void
9127 var_free_one(v) 9969 clear_var(v)
9128 VAR v; 9970 VAR v;
9129 { 9971 {
9130 vim_free(v->var_name); 9972 vim_free(v->v_name);
9131 v->var_name = NULL; 9973 v->v_name = NULL;
9132 if (v->var_type == VAR_STRING) 9974 clear_vartv(&v->tv);
9133 vim_free(v->var_val.var_string);
9134 v->var_val.var_string = NULL;
9135 } 9975 }
9136 9976
9137 /* 9977 /*
9138 * List the value of one internal variable. 9978 * List the value of one internal variable.
9139 */ 9979 */
9140 static void 9980 static void
9141 list_one_var(v, prefix) 9981 list_one_var(v, prefix)
9142 VAR v; 9982 VAR v;
9143 char_u *prefix; 9983 char_u *prefix;
9144 { 9984 {
9145 list_one_var_a(prefix, v->var_name, v->var_type, get_var_string(v)); 9985 char_u *tofree;
9986 char_u *s;
9987
9988 s = tv2string(&v->tv, &tofree);
9989 list_one_var_a(prefix, v->v_name, v->tv.v_type,
9990 s == NULL ? (char_u *)"" : s);
9991 vim_free(tofree);
9146 } 9992 }
9147 9993
9148 /* 9994 /*
9149 * List the value of one "v:" variable. 9995 * List the value of one "v:" variable.
9150 */ 9996 */
9180 msg_puts(name); 10026 msg_puts(name);
9181 msg_putchar(' '); 10027 msg_putchar(' ');
9182 msg_advance(22); 10028 msg_advance(22);
9183 if (type == VAR_NUMBER) 10029 if (type == VAR_NUMBER)
9184 msg_putchar('#'); 10030 msg_putchar('#');
10031 else if (type == VAR_FUNC)
10032 msg_putchar('*');
10033 else if (type == VAR_LIST)
10034 {
10035 msg_putchar('[');
10036 if (*string == '[')
10037 ++string;
10038 }
9185 else 10039 else
9186 msg_putchar(' '); 10040 msg_putchar(' ');
10041
9187 msg_outtrans(string); 10042 msg_outtrans(string);
10043
10044 if (type == VAR_FUNC)
10045 msg_puts((char_u *)"()");
9188 } 10046 }
9189 10047
9190 /* 10048 /*
9191 * Set variable "name" to value in "varp". 10049 * Set variable "name" to value in "varp".
9192 * If the variable already exists, the value is updated. 10050 * If the variable already exists, the value is updated.
9193 * Otherwise the variable is created. 10051 * Otherwise the variable is created.
9194 */ 10052 */
9195 static void 10053 static void
9196 set_var(name, varp, copy) 10054 set_var(name, varp, copy)
9197 char_u *name; 10055 char_u *name;
9198 VAR varp; 10056 typeval *varp;
9199 int copy; /* make copy of value in "varp" */ 10057 int copy; /* make copy of value in "varp" */
9200 { 10058 {
9201 int i; 10059 int i;
9202 VAR v; 10060 VAR v;
9203 char_u *varname; 10061 char_u *varname;
9216 else 10074 else
9217 { 10075 {
9218 if (vimvars[i].type == VAR_STRING) 10076 if (vimvars[i].type == VAR_STRING)
9219 { 10077 {
9220 vim_free(vimvars[i].val); 10078 vim_free(vimvars[i].val);
9221 if (copy || varp->var_type != VAR_STRING) 10079 if (copy || varp->v_type != VAR_STRING)
9222 vimvars[i].val = vim_strsave(get_var_string(varp)); 10080 vimvars[i].val = vim_strsave(get_vartv_string(varp));
9223 else 10081 else
9224 { 10082 {
9225 /* Take over the string to avoid an extra alloc/free. */ 10083 /* Take over the string to avoid an extra alloc/free. */
9226 vimvars[i].val = varp->var_val.var_string; 10084 vimvars[i].val = varp->vval.v_string;
9227 varp->var_val.var_string = NULL; 10085 varp->vval.v_string = NULL;
9228 } 10086 }
9229 } 10087 }
9230 else 10088 else
9231 vimvars[i].val = (char_u *)get_var_number(varp); 10089 vimvars[i].val = (char_u *)get_vartv_number(varp);
9232 } 10090 }
9233 return; 10091 return;
10092 }
10093
10094 if (varp->v_type == VAR_FUNC)
10095 {
10096 if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':')
10097 && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
10098 ? name[2] : name[0]))
10099 {
10100 EMSG2(_("E999: Funcref variable name must start with a capital: %s"), name);
10101 return;
10102 }
10103 if (function_exists(name))
10104 {
10105 EMSG2(_("E999: Variable name conflicts with existing function: %s"), name);
10106 return;
10107 }
9234 } 10108 }
9235 10109
9236 v = find_var(name, TRUE); 10110 v = find_var(name, TRUE);
9237 if (v != NULL) /* existing variable, only need to free string */ 10111 if (v != NULL) /* existing variable, only need to free string */
9238 { 10112 {
9239 if (v->var_type == VAR_STRING) 10113 if (v->tv.v_type != varp->v_type
9240 vim_free(v->var_val.var_string); 10114 && !((v->tv.v_type == VAR_STRING
10115 || v->tv.v_type == VAR_NUMBER)
10116 && (varp->v_type == VAR_STRING
10117 || varp->v_type == VAR_NUMBER)))
10118 {
10119 EMSG2(_("E999: Variable type mismatch for: %s"), name);
10120 return;
10121 }
10122 if (v->tv.v_type == VAR_STRING || v->tv.v_type == VAR_FUNC)
10123 vim_free(v->tv.vval.v_string);
9241 } 10124 }
9242 else /* add a new variable */ 10125 else /* add a new variable */
9243 { 10126 {
9244 gap = find_var_ga(name, &varname); 10127 gap = find_var_ga(name, &varname);
9245 if (gap == NULL) /* illegal name */ 10128 if (gap == NULL) /* illegal name */
9248 return; 10131 return;
9249 } 10132 }
9250 10133
9251 /* Try to use an empty entry */ 10134 /* Try to use an empty entry */
9252 for (i = gap->ga_len; --i >= 0; ) 10135 for (i = gap->ga_len; --i >= 0; )
9253 if (VAR_GAP_ENTRY(i, gap).var_name == NULL) 10136 if (VAR_GAP_ENTRY(i, gap).v_name == NULL)
9254 break; 10137 break;
9255 if (i < 0) /* need to allocate more room */ 10138 if (i < 0) /* need to allocate more room */
9256 { 10139 {
9257 if (ga_grow(gap, 1) == FAIL) 10140 if (ga_grow(gap, 1) == FAIL)
9258 return; 10141 return;
9259 i = gap->ga_len; 10142 i = gap->ga_len;
9260 } 10143 }
9261 v = &VAR_GAP_ENTRY(i, gap); 10144 v = &VAR_GAP_ENTRY(i, gap);
9262 if ((v->var_name = vim_strsave(varname)) == NULL) 10145 if ((v->v_name = vim_strsave(varname)) == NULL)
9263 return; 10146 return;
9264 if (i == gap->ga_len) 10147 if (i == gap->ga_len)
9265 ++gap->ga_len; 10148 ++gap->ga_len;
9266 } 10149 }
9267 if (copy || varp->var_type != VAR_STRING) 10150 if (copy || (varp->v_type != VAR_STRING && varp->v_type != VAR_FUNC))
9268 copy_var(varp, v); 10151 copy_vartv(varp, &v->tv);
9269 else 10152 else
9270 { 10153 {
9271 v->var_type = varp->var_type; 10154 v->tv.v_type = varp->v_type;
9272 v->var_val.var_string = varp->var_val.var_string; 10155 v->tv.vval.v_string = varp->vval.v_string;
9273 } 10156 varp->vval.v_string = NULL;
9274 } 10157 }
9275 10158 }
9276 static void 10159
9277 copy_var(from, to) 10160 /*
9278 VAR from; 10161 * Copy the values from typeval "from" to typeval "to".
9279 VAR to; 10162 * When needed allocates string or increases reference count.
9280 { 10163 * Does not make a copy of a list!
9281 to->var_type = from->var_type; 10164 */
9282 if (from->var_type == VAR_STRING) 10165 static void
9283 to->var_val.var_string = vim_strsave(get_var_string(from)); 10166 copy_vartv(from, to)
9284 else 10167 typeval *from;
9285 to->var_val.var_number = from->var_val.var_number; 10168 typeval *to;
10169 {
10170 to->v_type = from->v_type;
10171 switch (from->v_type)
10172 {
10173 case VAR_NUMBER:
10174 to->vval.v_number = from->vval.v_number;
10175 break;
10176 case VAR_STRING:
10177 case VAR_FUNC:
10178 if (from->vval.v_string == NULL)
10179 to->vval.v_string = NULL;
10180 else
10181 to->vval.v_string = vim_strsave(from->vval.v_string);
10182 break;
10183 case VAR_LIST:
10184 if (from->vval.v_list == NULL)
10185 to->vval.v_list = NULL;
10186 else
10187 {
10188 to->vval.v_list = from->vval.v_list;
10189 ++to->vval.v_list->lv_refcount;
10190 }
10191 break;
10192 default:
10193 EMSG(_("E999: Internal error: copy_vartv()"));
10194 break;
10195 }
9286 } 10196 }
9287 10197
9288 /* 10198 /*
9289 * ":echo expr1 ..." print each argument separated with a space, add a 10199 * ":echo expr1 ..." print each argument separated with a space, add a
9290 * newline at the end. 10200 * newline at the end.
9293 void 10203 void
9294 ex_echo(eap) 10204 ex_echo(eap)
9295 exarg_T *eap; 10205 exarg_T *eap;
9296 { 10206 {
9297 char_u *arg = eap->arg; 10207 char_u *arg = eap->arg;
9298 var retvar; 10208 typeval retvar;
10209 char_u *tofree;
9299 char_u *p; 10210 char_u *p;
9300 int needclr = TRUE; 10211 int needclr = TRUE;
9301 int atstart = TRUE; 10212 int atstart = TRUE;
9302 10213
9303 if (eap->skip) 10214 if (eap->skip)
9326 if (eap->cmdidx == CMD_echo) 10237 if (eap->cmdidx == CMD_echo)
9327 msg_start(); 10238 msg_start();
9328 } 10239 }
9329 else if (eap->cmdidx == CMD_echo) 10240 else if (eap->cmdidx == CMD_echo)
9330 msg_puts_attr((char_u *)" ", echo_attr); 10241 msg_puts_attr((char_u *)" ", echo_attr);
9331 for (p = get_var_string(&retvar); *p != NUL && !got_int; ++p) 10242 for (p = tv2string(&retvar, &tofree); *p != NUL && !got_int; ++p)
9332 if (*p == '\n' || *p == '\r' || *p == TAB) 10243 if (*p == '\n' || *p == '\r' || *p == TAB)
9333 { 10244 {
9334 if (*p != TAB && needclr) 10245 if (*p != TAB && needclr)
9335 { 10246 {
9336 /* remove any text still there from the command */ 10247 /* remove any text still there from the command */
9351 } 10262 }
9352 else 10263 else
9353 #endif 10264 #endif
9354 (void)msg_outtrans_len_attr(p, 1, echo_attr); 10265 (void)msg_outtrans_len_attr(p, 1, echo_attr);
9355 } 10266 }
9356 } 10267 vim_free(tofree);
9357 clear_var(&retvar); 10268 }
10269 clear_vartv(&retvar);
9358 arg = skipwhite(arg); 10270 arg = skipwhite(arg);
9359 } 10271 }
9360 eap->nextcmd = check_nextcmd(arg); 10272 eap->nextcmd = check_nextcmd(arg);
9361 10273
9362 if (eap->skip) 10274 if (eap->skip)
9397 void 10309 void
9398 ex_execute(eap) 10310 ex_execute(eap)
9399 exarg_T *eap; 10311 exarg_T *eap;
9400 { 10312 {
9401 char_u *arg = eap->arg; 10313 char_u *arg = eap->arg;
9402 var retvar; 10314 typeval retvar;
9403 int ret = OK; 10315 int ret = OK;
9404 char_u *p; 10316 char_u *p;
9405 garray_T ga; 10317 garray_T ga;
9406 int len; 10318 int len;
9407 int save_did_emsg; 10319 int save_did_emsg;
9426 break; 10338 break;
9427 } 10339 }
9428 10340
9429 if (!eap->skip) 10341 if (!eap->skip)
9430 { 10342 {
9431 p = get_var_string(&retvar); 10343 p = get_vartv_string(&retvar);
9432 len = (int)STRLEN(p); 10344 len = (int)STRLEN(p);
9433 if (ga_grow(&ga, len + 2) == FAIL) 10345 if (ga_grow(&ga, len + 2) == FAIL)
9434 { 10346 {
9435 clear_var(&retvar); 10347 clear_vartv(&retvar);
9436 ret = FAIL; 10348 ret = FAIL;
9437 break; 10349 break;
9438 } 10350 }
9439 if (ga.ga_len) 10351 if (ga.ga_len)
9440 ((char_u *)(ga.ga_data))[ga.ga_len++] = ' '; 10352 ((char_u *)(ga.ga_data))[ga.ga_len++] = ' ';
9441 STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p); 10353 STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p);
9442 ga.ga_len += len; 10354 ga.ga_len += len;
9443 } 10355 }
9444 10356
9445 clear_var(&retvar); 10357 clear_vartv(&retvar);
9446 arg = skipwhite(arg); 10358 arg = skipwhite(arg);
9447 } 10359 }
9448 10360
9449 if (ret != FAIL && ga.ga_data != NULL) 10361 if (ret != FAIL && ga.ga_data != NULL)
9450 { 10362 {
9534 ufunc_T *fp; 10446 ufunc_T *fp;
9535 int indent; 10447 int indent;
9536 int nesting; 10448 int nesting;
9537 char_u *skip_until = NULL; 10449 char_u *skip_until = NULL;
9538 static char_u e_funcexts[] = N_("E122: Function %s already exists, add ! to replace it"); 10450 static char_u e_funcexts[] = N_("E122: Function %s already exists, add ! to replace it");
10451 VAR v;
9539 10452
9540 /* 10453 /*
9541 * ":function" without argument: list functions. 10454 * ":function" without argument: list functions.
9542 */ 10455 */
9543 if (ends_excmd(*eap->arg)) 10456 if (ends_excmd(*eap->arg))
9828 goto erret; 10741 goto erret;
9829 10742
9830 /* 10743 /*
9831 * If there are no errors, add the function 10744 * If there are no errors, add the function
9832 */ 10745 */
10746 v = find_var(name, FALSE);
10747 if (v != NULL && v->tv.v_type == VAR_FUNC)
10748 {
10749 EMSG2(_("E999: Function name conflicts with variable: %s"), name);
10750 goto erret;
10751 }
10752
9833 fp = find_func(name); 10753 fp = find_func(name);
9834 if (fp != NULL) 10754 if (fp != NULL)
9835 { 10755 {
9836 if (!eap->forceit) 10756 if (!eap->forceit)
9837 { 10757 {
10063 if (STRCMP(name, fp->name) == 0) 10983 if (STRCMP(name, fp->name) == 0)
10064 break; 10984 break;
10065 return fp; 10985 return fp;
10066 } 10986 }
10067 10987
10988 /*
10989 * Return TRUE if a function "name" exists.
10990 */
10991 static int
10992 function_exists(name)
10993 char_u *name;
10994 {
10995 char_u *p = name;
10996 int n = FALSE;
10997
10998 p = trans_function_name(&p, FALSE, TRUE);
10999 if (p != NULL)
11000 {
11001 if (ASCII_ISUPPER(*p) || p[0] == K_SPECIAL)
11002 n = (find_func(p) != NULL);
11003 else if (ASCII_ISLOWER(*p))
11004 n = (find_internal_func(p) >= 0);
11005 vim_free(p);
11006 }
11007 return n;
11008 }
11009
10068 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) 11010 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
10069 11011
10070 /* 11012 /*
10071 * Function given to ExpandGeneric() to obtain the list of user defined 11013 * Function given to ExpandGeneric() to obtain the list of user defined
10072 * function names. 11014 * function names.
10188 */ 11130 */
10189 static void 11131 static void
10190 call_user_func(fp, argcount, argvars, retvar, firstline, lastline) 11132 call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
10191 ufunc_T *fp; /* pointer to function */ 11133 ufunc_T *fp; /* pointer to function */
10192 int argcount; /* nr of args */ 11134 int argcount; /* nr of args */
10193 VAR argvars; /* arguments */ 11135 typeval *argvars; /* arguments */
10194 VAR retvar; /* return value */ 11136 typeval *retvar; /* return value */
10195 linenr_T firstline; /* first line of range */ 11137 linenr_T firstline; /* first line of range */
10196 linenr_T lastline; /* last line of range */ 11138 linenr_T lastline; /* last line of range */
10197 { 11139 {
10198 char_u *save_sourcing_name; 11140 char_u *save_sourcing_name;
10199 linenr_T save_sourcing_lnum; 11141 linenr_T save_sourcing_lnum;
10205 11147
10206 /* If depth of calling is getting too high, don't execute the function */ 11148 /* If depth of calling is getting too high, don't execute the function */
10207 if (depth >= p_mfd) 11149 if (depth >= p_mfd)
10208 { 11150 {
10209 EMSG(_("E132: Function call depth is higher than 'maxfuncdepth'")); 11151 EMSG(_("E132: Function call depth is higher than 'maxfuncdepth'"));
10210 retvar->var_type = VAR_NUMBER; 11152 retvar->v_type = VAR_NUMBER;
10211 retvar->var_val.var_number = -1; 11153 retvar->vval.v_number = -1;
10212 return; 11154 return;
10213 } 11155 }
10214 ++depth; 11156 ++depth;
10215 11157
10216 line_breakcheck(); /* check for CTRL-C hit */ 11158 line_breakcheck(); /* check for CTRL-C hit */
10217 11159
10218 /* set local variables */ 11160 /* set local variables */
10219 var_init(&fc.l_vars); 11161 vars_init(&fc.l_vars);
10220 fc.func = fp; 11162 fc.func = fp;
10221 fc.argcount = argcount; 11163 fc.argcount = argcount;
10222 fc.argvars = argvars; 11164 fc.argvars = argvars;
10223 fc.retvar = retvar; 11165 fc.retvar = retvar;
10224 retvar->var_val.var_number = 0; 11166 retvar->vval.v_number = 0;
10225 fc.linenr = 0; 11167 fc.linenr = 0;
10226 fc.returned = FALSE; 11168 fc.returned = FALSE;
10227 fc.level = ex_nesting_level; 11169 fc.level = ex_nesting_level;
10228 fc.a0_var.var_type = VAR_NUMBER; 11170 fc.a0_var.tv.v_type = VAR_NUMBER;
10229 fc.a0_var.var_val.var_number = argcount - fp->args.ga_len; 11171 fc.a0_var.tv.vval.v_number = argcount - fp->args.ga_len;
10230 fc.a0_var.var_name = NULL; 11172 fc.a0_var.v_name = NULL;
10231 current_funccal = &fc; 11173 current_funccal = &fc;
10232 fc.firstline.var_type = VAR_NUMBER; 11174 fc.firstline.tv.v_type = VAR_NUMBER;
10233 fc.firstline.var_val.var_number = firstline; 11175 fc.firstline.tv.vval.v_number = firstline;
10234 fc.firstline.var_name = NULL; 11176 fc.firstline.v_name = NULL;
10235 fc.lastline.var_type = VAR_NUMBER; 11177 fc.lastline.tv.v_type = VAR_NUMBER;
10236 fc.lastline.var_val.var_number = lastline; 11178 fc.lastline.tv.vval.v_number = lastline;
10237 fc.lastline.var_name = NULL; 11179 fc.lastline.v_name = NULL;
10238 /* Check if this function has a breakpoint. */ 11180 /* Check if this function has a breakpoint. */
10239 fc.breakpoint = dbg_find_breakpoint(FALSE, fp->name, (linenr_T)0); 11181 fc.breakpoint = dbg_find_breakpoint(FALSE, fp->name, (linenr_T)0);
10240 fc.dbg_tick = debug_tick; 11182 fc.dbg_tick = debug_tick;
10241 11183
10242 /* Don't redraw while executing the function. */ 11184 /* Don't redraw while executing the function. */
10268 msg_puts((char_u *)"("); 11210 msg_puts((char_u *)"(");
10269 for (i = 0; i < argcount; ++i) 11211 for (i = 0; i < argcount; ++i)
10270 { 11212 {
10271 if (i > 0) 11213 if (i > 0)
10272 msg_puts((char_u *)", "); 11214 msg_puts((char_u *)", ");
10273 if (argvars[i].var_type == VAR_NUMBER) 11215 if (argvars[i].v_type == VAR_NUMBER)
10274 msg_outnum((long)argvars[i].var_val.var_number); 11216 msg_outnum((long)argvars[i].vval.v_number);
10275 else 11217 else
10276 { 11218 {
10277 trunc_string(get_var_string(&argvars[i]), 11219 trunc_string(get_vartv_string(&argvars[i]),
10278 buf, MSG_BUF_LEN); 11220 buf, MSG_BUF_LEN);
10279 msg_puts((char_u *)"\""); 11221 msg_puts((char_u *)"\"");
10280 msg_puts(buf); 11222 msg_puts(buf);
10281 msg_puts((char_u *)"\""); 11223 msg_puts((char_u *)"\"");
10282 } 11224 }
10298 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT); 11240 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
10299 11241
10300 --RedrawingDisabled; 11242 --RedrawingDisabled;
10301 11243
10302 /* when the function was aborted because of an error, return -1 */ 11244 /* when the function was aborted because of an error, return -1 */
10303 if ((did_emsg && (fp->flags & FC_ABORT)) || retvar->var_type == VAR_UNKNOWN) 11245 if ((did_emsg && (fp->flags & FC_ABORT)) || retvar->v_type == VAR_UNKNOWN)
10304 { 11246 {
10305 clear_var(retvar); 11247 clear_vartv(retvar);
10306 retvar->var_type = VAR_NUMBER; 11248 retvar->v_type = VAR_NUMBER;
10307 retvar->var_val.var_number = -1; 11249 retvar->vval.v_number = -1;
10308 } 11250 }
10309 11251
10310 /* when being verbose, mention the return value */ 11252 /* when being verbose, mention the return value */
10311 if (p_verbose >= 12) 11253 if (p_verbose >= 12)
10312 { 11254 {
10320 if (STRLEN(sourcing_name) > IOSIZE / 2 - 50) 11262 if (STRLEN(sourcing_name) > IOSIZE / 2 - 50)
10321 sn = sourcing_name + STRLEN(sourcing_name) - (IOSIZE / 2 - 50); 11263 sn = sourcing_name + STRLEN(sourcing_name) - (IOSIZE / 2 - 50);
10322 11264
10323 if (aborting()) 11265 if (aborting())
10324 smsg((char_u *)_("%s aborted"), sn); 11266 smsg((char_u *)_("%s aborted"), sn);
10325 else if (fc.retvar->var_type == VAR_NUMBER) 11267 else if (fc.retvar->v_type == VAR_NUMBER)
10326 smsg((char_u *)_("%s returning #%ld"), sn, 11268 smsg((char_u *)_("%s returning #%ld"), sn,
10327 (long)fc.retvar->var_val.var_number); 11269 (long)fc.retvar->vval.v_number);
10328 else if (fc.retvar->var_type == VAR_STRING) 11270 else if (fc.retvar->v_type == VAR_STRING)
10329 { 11271 {
10330 val = get_var_string(fc.retvar); 11272 val = get_vartv_string(fc.retvar);
10331 if (STRLEN(val) > IOSIZE / 2 - 50) 11273 if (STRLEN(val) > IOSIZE / 2 - 50)
10332 val = val + STRLEN(val) - (IOSIZE / 2 - 50); 11274 val = val + STRLEN(val) - (IOSIZE / 2 - 50);
10333 smsg((char_u *)_("%s returning \"%s\""), sn, val); 11275 smsg((char_u *)_("%s returning \"%s\""), sn, val);
10334 } 11276 }
10335 msg_puts((char_u *)"\n"); /* don't overwrite this either */ 11277 msg_puts((char_u *)"\n"); /* don't overwrite this either */
10353 } 11295 }
10354 11296
10355 did_emsg |= save_did_emsg; 11297 did_emsg |= save_did_emsg;
10356 current_funccal = save_fcp; 11298 current_funccal = save_fcp;
10357 11299
10358 var_clear(&fc.l_vars); /* free all local variables */ 11300 vars_clear(&fc.l_vars); /* free all local variables */
10359 --depth; 11301 --depth;
10360 } 11302 }
10361 11303
10362 /* 11304 /*
10363 * ":return [expr]" 11305 * ":return [expr]"
10384 && eval0(arg, &retvar, &eap->nextcmd, !eap->skip) != FAIL) 11326 && eval0(arg, &retvar, &eap->nextcmd, !eap->skip) != FAIL)
10385 { 11327 {
10386 if (!eap->skip) 11328 if (!eap->skip)
10387 returning = do_return(eap, FALSE, TRUE, &retvar); 11329 returning = do_return(eap, FALSE, TRUE, &retvar);
10388 else 11330 else
10389 clear_var(&retvar); 11331 clear_vartv(&retvar.tv);
10390 } 11332 }
10391 /* It's safer to return also on error. */ 11333 /* It's safer to return also on error. */
10392 else if (!eap->skip) 11334 else if (!eap->skip)
10393 { 11335 {
10394 /* 11336 /*
10458 11400
10459 if (value != NULL) 11401 if (value != NULL)
10460 { 11402 {
10461 /* Store the value of the pending return. */ 11403 /* Store the value of the pending return. */
10462 if ((cstack->cs_retvar[idx] = alloc_var()) != NULL) 11404 if ((cstack->cs_retvar[idx] = alloc_var()) != NULL)
10463 *(VAR)cstack->cs_retvar[idx] = *(VAR)value; 11405 *(typeval *)cstack->cs_retvar[idx] = *(typeval *)value;
10464 else 11406 else
10465 EMSG(_(e_outofmem)); 11407 EMSG(_(e_outofmem));
10466 } 11408 }
10467 else 11409 else
10468 cstack->cs_retvar[idx] = NULL; 11410 cstack->cs_retvar[idx] = NULL;
10470 if (reanimate) 11412 if (reanimate)
10471 { 11413 {
10472 /* The pending return value could be overwritten by a ":return" 11414 /* The pending return value could be overwritten by a ":return"
10473 * without argument in a finally clause; reset the default 11415 * without argument in a finally clause; reset the default
10474 * return value. */ 11416 * return value. */
10475 current_funccal->retvar->var_type = VAR_NUMBER; 11417 current_funccal->retvar->v_type = VAR_NUMBER;
10476 current_funccal->retvar->var_val.var_number = 0; 11418 current_funccal->retvar->vval.v_number = 0;
10477 } 11419 }
10478 } 11420 }
10479 report_make_pending(CSTP_RETURN, value); 11421 report_make_pending(CSTP_RETURN, value);
10480 } 11422 }
10481 else 11423 else
10485 /* If the return is carried out now, store the return value. For 11427 /* If the return is carried out now, store the return value. For
10486 * a return immediately after reanimation, the value is already 11428 * a return immediately after reanimation, the value is already
10487 * there. */ 11429 * there. */
10488 if (!reanimate && value != NULL) 11430 if (!reanimate && value != NULL)
10489 { 11431 {
10490 clear_var(current_funccal->retvar); 11432 clear_vartv(current_funccal->retvar);
10491 *current_funccal->retvar = *(VAR)value; 11433 *current_funccal->retvar = *(typeval *)value;
10492 if (!is_cmd) 11434 if (!is_cmd)
10493 vim_free(value); 11435 vim_free(value);
10494 } 11436 }
10495 } 11437 }
10496 11438
10502 */ 11444 */
10503 void 11445 void
10504 discard_pending_return(retvar) 11446 discard_pending_return(retvar)
10505 void *retvar; 11447 void *retvar;
10506 { 11448 {
10507 /* The variable was copied from one with an undefined var_name. So we can't 11449 /* The variable was copied from one with an undefined v_name. So we can't
10508 * use free_var() to clear and free it. */ 11450 * use free_vartv() to clear and free it. */
10509 clear_var((VAR)retvar); 11451 clear_vartv(&((VAR)retvar)->tv);
10510 vim_free(retvar); 11452 vim_free(retvar);
10511 } 11453 }
10512 11454
10513 /* 11455 /*
10514 * Generate a return command for producing the value of "retvar". The result 11456 * Generate a return command for producing the value of "retvar". The result
10518 get_return_cmd(retvar) 11460 get_return_cmd(retvar)
10519 void *retvar; 11461 void *retvar;
10520 { 11462 {
10521 char_u *s = IObuff; 11463 char_u *s = IObuff;
10522 11464
10523 if (retvar == NULL || ((VAR)retvar)->var_type == VAR_UNKNOWN) 11465 if (retvar == NULL || ((VAR)retvar)->tv.v_type == VAR_UNKNOWN)
10524 s = (char_u *)":return"; 11466 s = (char_u *)":return";
10525 else if (((VAR)retvar)->var_type == VAR_STRING) 11467 else if (((VAR)retvar)->tv.v_type == VAR_STRING)
10526 sprintf((char *)IObuff, ":return \"%s\"", 11468 sprintf((char *)IObuff, ":return \"%s\"",
10527 ((VAR)retvar)->var_val.var_string); 11469 ((VAR)retvar)->tv.vval.v_string);
10528 else 11470 else
10529 sprintf((char *)IObuff, ":return %ld", 11471 sprintf((char *)IObuff, ":return %ld",
10530 (long)(((VAR)retvar)->var_val.var_number)); 11472 (long)(((VAR)retvar)->tv.vval.v_number));
10531 return vim_strsave(s); 11473 return vim_strsave(s);
10532 } 11474 }
10533 11475
10534 /* 11476 /*
10535 * Get next function line. 11477 * Get next function line.
10642 vir_T *virp; 11584 vir_T *virp;
10643 int writing; 11585 int writing;
10644 { 11586 {
10645 char_u *tab; 11587 char_u *tab;
10646 int is_string = FALSE; 11588 int is_string = FALSE;
10647 VAR varp = NULL; 11589 typeval *vartvp = NULL;
10648 char_u *val; 11590 char_u *val;
10649 11591
10650 if (!writing && (find_viminfo_parameter('!') != NULL)) 11592 if (!writing && (find_viminfo_parameter('!') != NULL))
10651 { 11593 {
10652 tab = vim_strchr(virp->vir_line + 1, '\t'); 11594 tab = vim_strchr(virp->vir_line + 1, '\t');
10663 if (is_string) 11605 if (is_string)
10664 { 11606 {
10665 val = viminfo_readstring(virp, 11607 val = viminfo_readstring(virp,
10666 (int)(tab - virp->vir_line + 1), TRUE); 11608 (int)(tab - virp->vir_line + 1), TRUE);
10667 if (val != NULL) 11609 if (val != NULL)
10668 varp = alloc_string_var(val); 11610 vartvp = alloc_string_vartv(val);
10669 } 11611 }
10670 else 11612 else
10671 { 11613 {
10672 varp = alloc_var(); 11614 vartvp = alloc_vartv();
10673 if (varp != NULL) 11615 if (vartvp != NULL)
10674 { 11616 {
10675 varp->var_type = VAR_NUMBER; 11617 vartvp->v_type = VAR_NUMBER;
10676 varp->var_val.var_number = atol((char *)tab + 1); 11618 vartvp->vval.v_number = atol((char *)tab + 1);
10677 } 11619 }
10678 } 11620 }
10679 /* assign the value to the variable */ 11621 /* assign the value to the variable */
10680 if (varp != NULL) 11622 if (vartvp != NULL)
10681 { 11623 {
10682 set_var(virp->vir_line + 1, varp, FALSE); 11624 set_var(virp->vir_line + 1, vartvp, FALSE);
10683 free_var(varp); 11625 free_vartv(vartvp);
10684 } 11626 }
10685 } 11627 }
10686 } 11628 }
10687 } 11629 }
10688 11630
10705 11647
10706 fprintf(fp, _("\n# global variables:\n")); 11648 fprintf(fp, _("\n# global variables:\n"));
10707 for (i = gap->ga_len; --i >= 0; ) 11649 for (i = gap->ga_len; --i >= 0; )
10708 { 11650 {
10709 this_var = &VAR_GAP_ENTRY(i, gap); 11651 this_var = &VAR_GAP_ENTRY(i, gap);
10710 if (this_var->var_name != NULL 11652 if (this_var->v_name != NULL
10711 && var_flavour(this_var->var_name) == VAR_FLAVOUR_VIMINFO) 11653 && var_flavour(this_var->v_name) == VAR_FLAVOUR_VIMINFO)
10712 { 11654 {
10713 fprintf(fp, "!%s\t%s\t", this_var->var_name, 11655 fprintf(fp, "!%s\t%s\t", this_var->v_name,
10714 (this_var->var_type == VAR_STRING) ? "STR" : "NUM"); 11656 (this_var->tv.v_type == VAR_STRING) ? "STR" : "NUM");
10715 viminfo_writestring(fp, get_var_string(this_var)); 11657 viminfo_writestring(fp, get_var_string(this_var));
10716 } 11658 }
10717 } 11659 }
10718 } 11660 }
10719 #endif 11661 #endif
10729 char_u *p, *t; 11671 char_u *p, *t;
10730 11672
10731 for (i = gap->ga_len; --i >= 0; ) 11673 for (i = gap->ga_len; --i >= 0; )
10732 { 11674 {
10733 this_var = &VAR_GAP_ENTRY(i, gap); 11675 this_var = &VAR_GAP_ENTRY(i, gap);
10734 if (this_var->var_name != NULL) 11676 if (this_var->v_name != NULL)
10735 { 11677 {
10736 if (var_flavour(this_var->var_name) == VAR_FLAVOUR_SESSION) 11678 if (var_flavour(this_var->v_name) == VAR_FLAVOUR_SESSION)
10737 { 11679 {
10738 /* Escapse special characters with a backslash. Turn a LF and 11680 /* Escapse special characters with a backslash. Turn a LF and
10739 * CR into \n and \r. */ 11681 * CR into \n and \r. */
10740 p = vim_strsave_escaped(get_var_string(this_var), 11682 p = vim_strsave_escaped(get_var_string(this_var),
10741 (char_u *)"\\\"\n\r"); 11683 (char_u *)"\\\"\n\r");
10745 if (*t == '\n') 11687 if (*t == '\n')
10746 *t = 'n'; 11688 *t = 'n';
10747 else if (*t == '\r') 11689 else if (*t == '\r')
10748 *t = 'r'; 11690 *t = 'r';
10749 if ((fprintf(fd, "let %s = %c%s%c", 11691 if ((fprintf(fd, "let %s = %c%s%c",
10750 this_var->var_name, 11692 this_var->v_name,
10751 (this_var->var_type == VAR_STRING) ? '"' : ' ', 11693 (this_var->tv.v_type == VAR_STRING) ? '"' : ' ',
10752 p, 11694 p,
10753 (this_var->var_type == VAR_STRING) ? '"' : ' ') < 0) 11695 (this_var->tv.v_type == VAR_STRING) ? '"' : ' ') < 0)
10754 || put_eol(fd) == FAIL) 11696 || put_eol(fd) == FAIL)
10755 { 11697 {
10756 vim_free(p); 11698 vim_free(p);
10757 return FAIL; 11699 return FAIL;
10758 } 11700 }