comparison src/eval.c @ 71:7557b6ea0fb1 v7.0030

updated for version 7.0030
author vimboss
date Tue, 04 Jan 2005 21:52:38 +0000
parents dbf53ece2e23
children 0ef9cebc4f5d
comparison
equal deleted inserted replaced
70:088a834ca0aa 71:7557b6ea0fb1
92 }; 92 };
93 93
94 typedef struct listvar_S listvar; 94 typedef struct listvar_S listvar;
95 95
96 #define VAR_LIST_MAXNEST 100 /* maximum nesting of lists */ 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"); 97 static char *e_letunexp = N_("E18: Unexpected characters in :let");
98 static char *e_listidx = N_("E999: list index out of range: %ld");
99 static char *e_undefvar = N_("E121: Undefined variable: %s");
100 static char *e_missbrac = N_("E111: Missing ']'");
101 static char *e_intern2 = N_("E999: Internal error: %s");
98 102
99 /* 103 /*
100 * All user-defined global variables are stored in "variables". 104 * All user-defined global variables are stored in "variables".
101 */ 105 */
102 garray_T variables = {0, 0, sizeof(var), 4, NULL}; 106 garray_T variables = {0, 0, sizeof(var), 4, NULL};
157 typeval *argvars; /* arguments */ 161 typeval *argvars; /* arguments */
158 var a0_var; /* "a:0" variable */ 162 var a0_var; /* "a:0" variable */
159 var firstline; /* "a:firstline" variable */ 163 var firstline; /* "a:firstline" variable */
160 var lastline; /* "a:lastline" variable */ 164 var lastline; /* "a:lastline" variable */
161 garray_T l_vars; /* local function variables */ 165 garray_T l_vars; /* local function variables */
162 typeval *retvar; /* return value variable */ 166 typeval *rettv; /* return value */
163 linenr_T breakpoint; /* next line with breakpoint or zero */ 167 linenr_T breakpoint; /* next line with breakpoint or zero */
164 int dbg_tick; /* debug_tick when breakpoint was set */ 168 int dbg_tick; /* debug_tick when breakpoint was set */
165 int level; /* top nesting level of executed function */ 169 int level; /* top nesting level of executed function */
166 }; 170 };
167 171
273 {"register", sizeof("register") - 1, NULL, VAR_STRING, VV_RO}, 277 {"register", sizeof("register") - 1, NULL, VAR_STRING, VV_RO},
274 {"cmdbang", sizeof("cmdbang") - 1, NULL, VAR_NUMBER, VV_RO}, 278 {"cmdbang", sizeof("cmdbang") - 1, NULL, VAR_NUMBER, VV_RO},
275 {"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO}, 279 {"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO},
276 }; 280 };
277 281
278 static int eval0 __ARGS((char_u *arg, VAR retvar, char_u **nextcmd, int evaluate)); 282 static int eval0 __ARGS((char_u *arg, typeval *rettv, char_u **nextcmd, int evaluate));
279 static int eval1 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 283 static int eval1 __ARGS((char_u **arg, typeval *rettv, int evaluate));
280 static int eval2 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 284 static int eval2 __ARGS((char_u **arg, typeval *rettv, int evaluate));
281 static int eval3 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 285 static int eval3 __ARGS((char_u **arg, typeval *rettv, int evaluate));
282 static int eval4 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 286 static int eval4 __ARGS((char_u **arg, typeval *rettv, int evaluate));
283 static int eval5 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 287 static int eval5 __ARGS((char_u **arg, typeval *rettv, int evaluate));
284 static int eval6 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 288 static int eval6 __ARGS((char_u **arg, typeval *rettv, int evaluate));
285 static int eval7 __ARGS((char_u **arg, typeval *retvar, int evaluate)); 289 static int eval7 __ARGS((char_u **arg, typeval *rettv, int evaluate));
286 static int eval_index __ARGS((char_u **arg, typeval *retvar, int evaluate)); 290 static int eval_index __ARGS((char_u **arg, typeval *rettv, int evaluate));
287 static int get_option_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); 291 static int get_option_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
288 static int get_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); 292 static int get_string_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
289 static int get_lit_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); 293 static int get_lit_string_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
290 static int get_list_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); 294 static int get_list_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
291 static listvar *list_alloc __ARGS((void)); 295 static listvar *list_alloc __ARGS((void));
292 static void list_unref __ARGS((listvar *l)); 296 static void list_unref __ARGS((listvar *l));
293 static void list_free __ARGS((listvar *l)); 297 static void list_free __ARGS((listvar *l));
294 static listitem *listitem_alloc __ARGS((void)); 298 static listitem *listitem_alloc __ARGS((void));
295 static void listitem_free __ARGS((listitem *item)); 299 static void listitem_free __ARGS((listitem *item));
299 static int list_append_tv __ARGS((listvar *l, typeval *tv)); 303 static int list_append_tv __ARGS((listvar *l, typeval *tv));
300 static listvar *list_copy __ARGS((listvar *orig, int deep)); 304 static listvar *list_copy __ARGS((listvar *orig, int deep));
301 static listitem *list_getrem __ARGS((listvar *l, long n)); 305 static listitem *list_getrem __ARGS((listvar *l, long n));
302 static char_u *list2string __ARGS((typeval *tv)); 306 static char_u *list2string __ARGS((typeval *tv));
303 static char_u *tv2string __ARGS((typeval *tv, char_u **tofree)); 307 static char_u *tv2string __ARGS((typeval *tv, char_u **tofree));
304 static int get_env_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate)); 308 static int get_env_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
305 static int find_internal_func __ARGS((char_u *name)); 309 static int find_internal_func __ARGS((char_u *name));
306 static char_u *deref_func_name __ARGS((char_u *name, int *lenp)); 310 static char_u *deref_func_name __ARGS((char_u *name, int *lenp));
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)); 311 static int get_func_tv __ARGS((char_u *name, int len, typeval *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
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)); 312 static int call_func __ARGS((char_u *name, int len, typeval *rettv, int argcount, typeval *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
309 static void f_append __ARGS((typeval *argvars, typeval *retvar)); 313 static void f_append __ARGS((typeval *argvars, typeval *rettv));
310 static void f_argc __ARGS((typeval *argvars, typeval *retvar)); 314 static void f_argc __ARGS((typeval *argvars, typeval *rettv));
311 static void f_argidx __ARGS((typeval *argvars, typeval *retvar)); 315 static void f_argidx __ARGS((typeval *argvars, typeval *rettv));
312 static void f_argv __ARGS((typeval *argvars, typeval *retvar)); 316 static void f_argv __ARGS((typeval *argvars, typeval *rettv));
313 static void f_browse __ARGS((typeval *argvars, typeval *retvar)); 317 static void f_browse __ARGS((typeval *argvars, typeval *rettv));
314 static void f_browsedir __ARGS((typeval *argvars, typeval *retvar)); 318 static void f_browsedir __ARGS((typeval *argvars, typeval *rettv));
315 static buf_T *find_buffer __ARGS((typeval *avar)); 319 static buf_T *find_buffer __ARGS((typeval *avar));
316 static void f_bufexists __ARGS((typeval *argvars, typeval *retvar)); 320 static void f_bufexists __ARGS((typeval *argvars, typeval *rettv));
317 static void f_buflisted __ARGS((typeval *argvars, typeval *retvar)); 321 static void f_buflisted __ARGS((typeval *argvars, typeval *rettv));
318 static void f_bufloaded __ARGS((typeval *argvars, typeval *retvar)); 322 static void f_bufloaded __ARGS((typeval *argvars, typeval *rettv));
319 static buf_T *get_buf_vartv __ARGS((typeval *avar)); 323 static buf_T *get_buf_tv __ARGS((typeval *tv));
320 static void f_bufname __ARGS((typeval *argvars, typeval *retvar)); 324 static void f_bufname __ARGS((typeval *argvars, typeval *rettv));
321 static void f_bufnr __ARGS((typeval *argvars, typeval *retvar)); 325 static void f_bufnr __ARGS((typeval *argvars, typeval *rettv));
322 static void f_bufwinnr __ARGS((typeval *argvars, typeval *retvar)); 326 static void f_bufwinnr __ARGS((typeval *argvars, typeval *rettv));
323 static void f_byte2line __ARGS((typeval *argvars, typeval *retvar)); 327 static void f_byte2line __ARGS((typeval *argvars, typeval *rettv));
324 static void f_byteidx __ARGS((typeval *argvars, typeval *retvar)); 328 static void f_byteidx __ARGS((typeval *argvars, typeval *rettv));
325 static void f_char2nr __ARGS((typeval *argvars, typeval *retvar)); 329 static void f_char2nr __ARGS((typeval *argvars, typeval *rettv));
326 static void f_cindent __ARGS((typeval *argvars, typeval *retvar)); 330 static void f_cindent __ARGS((typeval *argvars, typeval *rettv));
327 static void f_col __ARGS((typeval *argvars, typeval *retvar)); 331 static void f_col __ARGS((typeval *argvars, typeval *rettv));
328 static void f_confirm __ARGS((typeval *argvars, typeval *retvar)); 332 static void f_confirm __ARGS((typeval *argvars, typeval *rettv));
329 static void f_copy __ARGS((typeval *argvars, typeval *retvar)); 333 static void f_copy __ARGS((typeval *argvars, typeval *rettv));
330 static void f_cscope_connection __ARGS((typeval *argvars, typeval *retvar)); 334 static void f_cscope_connection __ARGS((typeval *argvars, typeval *rettv));
331 static void f_cursor __ARGS((typeval *argsvars, typeval *retvar)); 335 static void f_cursor __ARGS((typeval *argsvars, typeval *rettv));
332 static void f_deepcopy __ARGS((typeval *argvars, typeval *retvar)); 336 static void f_deepcopy __ARGS((typeval *argvars, typeval *rettv));
333 static void f_delete __ARGS((typeval *argvars, typeval *retvar)); 337 static void f_delete __ARGS((typeval *argvars, typeval *rettv));
334 static void f_did_filetype __ARGS((typeval *argvars, typeval *retvar)); 338 static void f_did_filetype __ARGS((typeval *argvars, typeval *rettv));
335 static void f_diff_filler __ARGS((typeval *argvars, typeval *retvar)); 339 static void f_diff_filler __ARGS((typeval *argvars, typeval *rettv));
336 static void f_diff_hlID __ARGS((typeval *argvars, typeval *retvar)); 340 static void f_diff_hlID __ARGS((typeval *argvars, typeval *rettv));
337 static void f_escape __ARGS((typeval *argvars, typeval *retvar)); 341 static void f_escape __ARGS((typeval *argvars, typeval *rettv));
338 static void f_eventhandler __ARGS((typeval *argvars, typeval *retvar)); 342 static void f_eventhandler __ARGS((typeval *argvars, typeval *rettv));
339 static void f_executable __ARGS((typeval *argvars, typeval *retvar)); 343 static void f_executable __ARGS((typeval *argvars, typeval *rettv));
340 static void f_exists __ARGS((typeval *argvars, typeval *retvar)); 344 static void f_exists __ARGS((typeval *argvars, typeval *rettv));
341 static void f_expand __ARGS((typeval *argvars, typeval *retvar)); 345 static void f_expand __ARGS((typeval *argvars, typeval *rettv));
342 static void f_filereadable __ARGS((typeval *argvars, typeval *retvar)); 346 static void f_filereadable __ARGS((typeval *argvars, typeval *rettv));
343 static void f_filewritable __ARGS((typeval *argvars, typeval *retvar)); 347 static void f_filewritable __ARGS((typeval *argvars, typeval *rettv));
344 static void f_finddir __ARGS((typeval *argvars, typeval *retvar)); 348 static void f_finddir __ARGS((typeval *argvars, typeval *rettv));
345 static void f_findfile __ARGS((typeval *argvars, typeval *retvar)); 349 static void f_findfile __ARGS((typeval *argvars, typeval *rettv));
346 static void f_findfilendir __ARGS((typeval *argvars, typeval *retvar, int dir)); 350 static void f_findfilendir __ARGS((typeval *argvars, typeval *rettv, int dir));
347 static void f_fnamemodify __ARGS((typeval *argvars, typeval *retvar)); 351 static void f_fnamemodify __ARGS((typeval *argvars, typeval *rettv));
348 static void f_foldclosed __ARGS((typeval *argvars, typeval *retvar)); 352 static void f_foldclosed __ARGS((typeval *argvars, typeval *rettv));
349 static void f_foldclosedend __ARGS((typeval *argvars, typeval *retvar)); 353 static void f_foldclosedend __ARGS((typeval *argvars, typeval *rettv));
350 static void foldclosed_both __ARGS((typeval *argvars, typeval *retvar, int end)); 354 static void foldclosed_both __ARGS((typeval *argvars, typeval *rettv, int end));
351 static void f_foldlevel __ARGS((typeval *argvars, typeval *retvar)); 355 static void f_foldlevel __ARGS((typeval *argvars, typeval *rettv));
352 static void f_foldtext __ARGS((typeval *argvars, typeval *retvar)); 356 static void f_foldtext __ARGS((typeval *argvars, typeval *rettv));
353 static void f_foldtextresult __ARGS((typeval *argvars, typeval *retvar)); 357 static void f_foldtextresult __ARGS((typeval *argvars, typeval *rettv));
354 static void f_foreground __ARGS((typeval *argvars, typeval *retvar)); 358 static void f_foreground __ARGS((typeval *argvars, typeval *rettv));
355 static void f_function __ARGS((typeval *argvars, typeval *retvar)); 359 static void f_function __ARGS((typeval *argvars, typeval *rettv));
356 static void f_getbufvar __ARGS((typeval *argvars, typeval *retvar)); 360 static void f_getbufvar __ARGS((typeval *argvars, typeval *rettv));
357 static void f_getchar __ARGS((typeval *argvars, typeval *retvar)); 361 static void f_getchar __ARGS((typeval *argvars, typeval *rettv));
358 static void f_getcharmod __ARGS((typeval *argvars, typeval *retvar)); 362 static void f_getcharmod __ARGS((typeval *argvars, typeval *rettv));
359 static void f_getcmdline __ARGS((typeval *argvars, typeval *retvar)); 363 static void f_getcmdline __ARGS((typeval *argvars, typeval *rettv));
360 static void f_getcmdpos __ARGS((typeval *argvars, typeval *retvar)); 364 static void f_getcmdpos __ARGS((typeval *argvars, typeval *rettv));
361 static void f_getcwd __ARGS((typeval *argvars, typeval *retvar)); 365 static void f_getcwd __ARGS((typeval *argvars, typeval *rettv));
362 static void f_getfontname __ARGS((typeval *argvars, typeval *retvar)); 366 static void f_getfontname __ARGS((typeval *argvars, typeval *rettv));
363 static void f_getfperm __ARGS((typeval *argvars, typeval *retvar)); 367 static void f_getfperm __ARGS((typeval *argvars, typeval *rettv));
364 static void f_getfsize __ARGS((typeval *argvars, typeval *retvar)); 368 static void f_getfsize __ARGS((typeval *argvars, typeval *rettv));
365 static void f_getftime __ARGS((typeval *argvars, typeval *retvar)); 369 static void f_getftime __ARGS((typeval *argvars, typeval *rettv));
366 static void f_getftype __ARGS((typeval *argvars, typeval *retvar)); 370 static void f_getftype __ARGS((typeval *argvars, typeval *rettv));
367 static void f_getline __ARGS((typeval *argvars, typeval *retvar)); 371 static void f_getline __ARGS((typeval *argvars, typeval *rettv));
368 static void f_getreg __ARGS((typeval *argvars, typeval *retvar)); 372 static void f_getreg __ARGS((typeval *argvars, typeval *rettv));
369 static void f_getregtype __ARGS((typeval *argvars, typeval *retvar)); 373 static void f_getregtype __ARGS((typeval *argvars, typeval *rettv));
370 static void f_getwinposx __ARGS((typeval *argvars, typeval *retvar)); 374 static void f_getwinposx __ARGS((typeval *argvars, typeval *rettv));
371 static void f_getwinposy __ARGS((typeval *argvars, typeval *retvar)); 375 static void f_getwinposy __ARGS((typeval *argvars, typeval *rettv));
372 static void f_getwinvar __ARGS((typeval *argvars, typeval *retvar)); 376 static void f_getwinvar __ARGS((typeval *argvars, typeval *rettv));
373 static void f_glob __ARGS((typeval *argvars, typeval *retvar)); 377 static void f_glob __ARGS((typeval *argvars, typeval *rettv));
374 static void f_globpath __ARGS((typeval *argvars, typeval *retvar)); 378 static void f_globpath __ARGS((typeval *argvars, typeval *rettv));
375 static void f_has __ARGS((typeval *argvars, typeval *retvar)); 379 static void f_has __ARGS((typeval *argvars, typeval *rettv));
376 static void f_hasmapto __ARGS((typeval *argvars, typeval *retvar)); 380 static void f_hasmapto __ARGS((typeval *argvars, typeval *rettv));
377 static void f_histadd __ARGS((typeval *argvars, typeval *retvar)); 381 static void f_histadd __ARGS((typeval *argvars, typeval *rettv));
378 static void f_histdel __ARGS((typeval *argvars, typeval *retvar)); 382 static void f_histdel __ARGS((typeval *argvars, typeval *rettv));
379 static void f_histget __ARGS((typeval *argvars, typeval *retvar)); 383 static void f_histget __ARGS((typeval *argvars, typeval *rettv));
380 static void f_histnr __ARGS((typeval *argvars, typeval *retvar)); 384 static void f_histnr __ARGS((typeval *argvars, typeval *rettv));
381 static void f_hlexists __ARGS((typeval *argvars, typeval *retvar)); 385 static void f_hlexists __ARGS((typeval *argvars, typeval *rettv));
382 static void f_hlID __ARGS((typeval *argvars, typeval *retvar)); 386 static void f_hlID __ARGS((typeval *argvars, typeval *rettv));
383 static void f_hostname __ARGS((typeval *argvars, typeval *retvar)); 387 static void f_hostname __ARGS((typeval *argvars, typeval *rettv));
384 static void f_iconv __ARGS((typeval *argvars, typeval *retvar)); 388 static void f_iconv __ARGS((typeval *argvars, typeval *rettv));
385 static void f_indent __ARGS((typeval *argvars, typeval *retvar)); 389 static void f_indent __ARGS((typeval *argvars, typeval *rettv));
386 static void f_insert __ARGS((typeval *argvars, typeval *retvar)); 390 static void f_insert __ARGS((typeval *argvars, typeval *rettv));
387 static void f_isdirectory __ARGS((typeval *argvars, typeval *retvar)); 391 static void f_isdirectory __ARGS((typeval *argvars, typeval *rettv));
388 static void f_input __ARGS((typeval *argvars, typeval *retvar)); 392 static void f_input __ARGS((typeval *argvars, typeval *rettv));
389 static void f_inputdialog __ARGS((typeval *argvars, typeval *retvar)); 393 static void f_inputdialog __ARGS((typeval *argvars, typeval *rettv));
390 static void f_inputrestore __ARGS((typeval *argvars, typeval *retvar)); 394 static void f_inputrestore __ARGS((typeval *argvars, typeval *rettv));
391 static void f_inputsave __ARGS((typeval *argvars, typeval *retvar)); 395 static void f_inputsave __ARGS((typeval *argvars, typeval *rettv));
392 static void f_inputsecret __ARGS((typeval *argvars, typeval *retvar)); 396 static void f_inputsecret __ARGS((typeval *argvars, typeval *rettv));
393 static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *retvar)); 397 static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *rettv));
394 static void f_len __ARGS((typeval *argvars, typeval *retvar)); 398 static void f_len __ARGS((typeval *argvars, typeval *rettv));
395 static void f_libcall __ARGS((typeval *argvars, typeval *retvar)); 399 static void f_libcall __ARGS((typeval *argvars, typeval *rettv));
396 static void f_libcallnr __ARGS((typeval *argvars, typeval *retvar)); 400 static void f_libcallnr __ARGS((typeval *argvars, typeval *rettv));
397 static void libcall_common __ARGS((typeval *argvars, typeval *retvar, int type)); 401 static void libcall_common __ARGS((typeval *argvars, typeval *rettv, int type));
398 static void f_line __ARGS((typeval *argvars, typeval *retvar)); 402 static void f_line __ARGS((typeval *argvars, typeval *rettv));
399 static void f_line2byte __ARGS((typeval *argvars, typeval *retvar)); 403 static void f_line2byte __ARGS((typeval *argvars, typeval *rettv));
400 static void f_lispindent __ARGS((typeval *argvars, typeval *retvar)); 404 static void f_lispindent __ARGS((typeval *argvars, typeval *rettv));
401 static void f_localtime __ARGS((typeval *argvars, typeval *retvar)); 405 static void f_localtime __ARGS((typeval *argvars, typeval *rettv));
402 static void f_maparg __ARGS((typeval *argvars, typeval *retvar)); 406 static void f_maparg __ARGS((typeval *argvars, typeval *rettv));
403 static void f_mapcheck __ARGS((typeval *argvars, typeval *retvar)); 407 static void f_mapcheck __ARGS((typeval *argvars, typeval *rettv));
404 static void get_maparg __ARGS((typeval *argvars, typeval *retvar, int exact)); 408 static void get_maparg __ARGS((typeval *argvars, typeval *rettv, int exact));
405 static void f_match __ARGS((typeval *argvars, typeval *retvar)); 409 static void f_match __ARGS((typeval *argvars, typeval *rettv));
406 static void f_matchend __ARGS((typeval *argvars, typeval *retvar)); 410 static void f_matchend __ARGS((typeval *argvars, typeval *rettv));
407 static void f_matchstr __ARGS((typeval *argvars, typeval *retvar)); 411 static void f_matchstr __ARGS((typeval *argvars, typeval *rettv));
408 static void f_mode __ARGS((typeval *argvars, typeval *retvar)); 412 static void f_mode __ARGS((typeval *argvars, typeval *rettv));
409 static void f_nextnonblank __ARGS((typeval *argvars, typeval *retvar)); 413 static void f_nextnonblank __ARGS((typeval *argvars, typeval *rettv));
410 static void f_nr2char __ARGS((typeval *argvars, typeval *retvar)); 414 static void f_nr2char __ARGS((typeval *argvars, typeval *rettv));
411 static void f_prevnonblank __ARGS((typeval *argvars, typeval *retvar)); 415 static void f_prevnonblank __ARGS((typeval *argvars, typeval *rettv));
412 static void f_setbufvar __ARGS((typeval *argvars, typeval *retvar)); 416 static void f_setbufvar __ARGS((typeval *argvars, typeval *rettv));
413 static void f_setcmdpos __ARGS((typeval *argvars, typeval *retvar)); 417 static void f_setcmdpos __ARGS((typeval *argvars, typeval *rettv));
414 static void f_setwinvar __ARGS((typeval *argvars, typeval *retvar)); 418 static void f_setwinvar __ARGS((typeval *argvars, typeval *rettv));
415 static void f_remove __ARGS((typeval *argvars, typeval *retvar)); 419 static void f_remove __ARGS((typeval *argvars, typeval *rettv));
416 static void f_rename __ARGS((typeval *argvars, typeval *retvar)); 420 static void f_rename __ARGS((typeval *argvars, typeval *rettv));
417 static void f_resolve __ARGS((typeval *argvars, typeval *retvar)); 421 static void f_resolve __ARGS((typeval *argvars, typeval *rettv));
418 static void f_search __ARGS((typeval *argvars, typeval *retvar)); 422 static void f_search __ARGS((typeval *argvars, typeval *rettv));
419 static void f_searchpair __ARGS((typeval *argvars, typeval *retvar)); 423 static void f_searchpair __ARGS((typeval *argvars, typeval *rettv));
420 static int get_search_arg __ARGS((typeval *varp, int *flagsp)); 424 static int get_search_arg __ARGS((typeval *varp, int *flagsp));
421 static void f_remote_expr __ARGS((typeval *argvars, typeval *retvar)); 425 static void f_remote_expr __ARGS((typeval *argvars, typeval *rettv));
422 static void f_remote_foreground __ARGS((typeval *argvars, typeval *retvar)); 426 static void f_remote_foreground __ARGS((typeval *argvars, typeval *rettv));
423 static void f_remote_peek __ARGS((typeval *argvars, typeval *retvar)); 427 static void f_remote_peek __ARGS((typeval *argvars, typeval *rettv));
424 static void f_remote_read __ARGS((typeval *argvars, typeval *retvar)); 428 static void f_remote_read __ARGS((typeval *argvars, typeval *rettv));
425 static void f_remote_send __ARGS((typeval *argvars, typeval *retvar)); 429 static void f_remote_send __ARGS((typeval *argvars, typeval *rettv));
426 static void f_repeat __ARGS((typeval *argvars, typeval *retvar)); 430 static void f_repeat __ARGS((typeval *argvars, typeval *rettv));
427 static void f_server2client __ARGS((typeval *argvars, typeval *retvar)); 431 static void f_server2client __ARGS((typeval *argvars, typeval *rettv));
428 static void f_serverlist __ARGS((typeval *argvars, typeval *retvar)); 432 static void f_serverlist __ARGS((typeval *argvars, typeval *rettv));
429 static void f_setline __ARGS((typeval *argvars, typeval *retvar)); 433 static void f_setline __ARGS((typeval *argvars, typeval *rettv));
430 static void f_setreg __ARGS((typeval *argvars, typeval *retvar)); 434 static void f_setreg __ARGS((typeval *argvars, typeval *rettv));
431 static void f_simplify __ARGS((typeval *argvars, typeval *retvar)); 435 static void f_simplify __ARGS((typeval *argvars, typeval *rettv));
432 static void find_some_match __ARGS((typeval *argvars, typeval *retvar, int start)); 436 static void find_some_match __ARGS((typeval *argvars, typeval *rettv, int start));
433 static void f_strftime __ARGS((typeval *argvars, typeval *retvar)); 437 static void f_strftime __ARGS((typeval *argvars, typeval *rettv));
434 static void f_stridx __ARGS((typeval *argvars, typeval *retvar)); 438 static void f_stridx __ARGS((typeval *argvars, typeval *rettv));
435 static void f_string __ARGS((typeval *argvars, typeval *retvar)); 439 static void f_string __ARGS((typeval *argvars, typeval *rettv));
436 static void f_strlen __ARGS((typeval *argvars, typeval *retvar)); 440 static void f_strlen __ARGS((typeval *argvars, typeval *rettv));
437 static void f_strpart __ARGS((typeval *argvars, typeval *retvar)); 441 static void f_strpart __ARGS((typeval *argvars, typeval *rettv));
438 static void f_strridx __ARGS((typeval *argvars, typeval *retvar)); 442 static void f_strridx __ARGS((typeval *argvars, typeval *rettv));
439 static void f_strtrans __ARGS((typeval *argvars, typeval *retvar)); 443 static void f_strtrans __ARGS((typeval *argvars, typeval *rettv));
440 static void f_synID __ARGS((typeval *argvars, typeval *retvar)); 444 static void f_synID __ARGS((typeval *argvars, typeval *rettv));
441 static void f_synIDattr __ARGS((typeval *argvars, typeval *retvar)); 445 static void f_synIDattr __ARGS((typeval *argvars, typeval *rettv));
442 static void f_synIDtrans __ARGS((typeval *argvars, typeval *retvar)); 446 static void f_synIDtrans __ARGS((typeval *argvars, typeval *rettv));
443 static void f_system __ARGS((typeval *argvars, typeval *retvar)); 447 static void f_system __ARGS((typeval *argvars, typeval *rettv));
444 static void f_submatch __ARGS((typeval *argvars, typeval *retvar)); 448 static void f_submatch __ARGS((typeval *argvars, typeval *rettv));
445 static void f_substitute __ARGS((typeval *argvars, typeval *retvar)); 449 static void f_substitute __ARGS((typeval *argvars, typeval *rettv));
446 static void f_tempname __ARGS((typeval *argvars, typeval *retvar)); 450 static void f_tempname __ARGS((typeval *argvars, typeval *rettv));
447 static void f_tolower __ARGS((typeval *argvars, typeval *retvar)); 451 static void f_tolower __ARGS((typeval *argvars, typeval *rettv));
448 static void f_toupper __ARGS((typeval *argvars, typeval *retvar)); 452 static void f_toupper __ARGS((typeval *argvars, typeval *rettv));
449 static void f_tr __ARGS((typeval *argvars, typeval *retvar)); 453 static void f_tr __ARGS((typeval *argvars, typeval *rettv));
450 static void f_type __ARGS((typeval *argvars, typeval *retvar)); 454 static void f_type __ARGS((typeval *argvars, typeval *rettv));
451 static void f_virtcol __ARGS((typeval *argvars, typeval *retvar)); 455 static void f_virtcol __ARGS((typeval *argvars, typeval *rettv));
452 static void f_visualmode __ARGS((typeval *argvars, typeval *retvar)); 456 static void f_visualmode __ARGS((typeval *argvars, typeval *rettv));
453 static void f_winbufnr __ARGS((typeval *argvars, typeval *retvar)); 457 static void f_winbufnr __ARGS((typeval *argvars, typeval *rettv));
454 static void f_wincol __ARGS((typeval *argvars, typeval *retvar)); 458 static void f_wincol __ARGS((typeval *argvars, typeval *rettv));
455 static void f_winheight __ARGS((typeval *argvars, typeval *retvar)); 459 static void f_winheight __ARGS((typeval *argvars, typeval *rettv));
456 static void f_winline __ARGS((typeval *argvars, typeval *retvar)); 460 static void f_winline __ARGS((typeval *argvars, typeval *rettv));
457 static void f_winnr __ARGS((typeval *argvars, typeval *retvar)); 461 static void f_winnr __ARGS((typeval *argvars, typeval *rettv));
458 static void f_winrestcmd __ARGS((typeval *argvars, typeval *retvar)); 462 static void f_winrestcmd __ARGS((typeval *argvars, typeval *rettv));
459 static void f_winwidth __ARGS((typeval *argvars, typeval *retvar)); 463 static void f_winwidth __ARGS((typeval *argvars, typeval *rettv));
460 static win_T *find_win_by_nr __ARGS((typeval *vp)); 464 static win_T *find_win_by_nr __ARGS((typeval *vp));
461 static pos_T *var2fpos __ARGS((typeval *varp, int lnum)); 465 static pos_T *var2fpos __ARGS((typeval *varp, int lnum));
462 static int get_env_len __ARGS((char_u **arg)); 466 static int get_env_len __ARGS((char_u **arg));
463 static int get_id_len __ARGS((char_u **arg)); 467 static int get_id_len __ARGS((char_u **arg));
464 static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate)); 468 static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate));
465 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end)); 469 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int incl_br));
466 static int eval_isnamec __ARGS((int c)); 470 static int eval_isnamec __ARGS((int c));
467 static int find_vim_var __ARGS((char_u *name, int len)); 471 static int find_vim_var __ARGS((char_u *name, int len));
468 static int get_var_vartv __ARGS((char_u *name, int len, typeval *retvar)); 472 static int get_var_tv __ARGS((char_u *name, int len, typeval *rettv));
469 static VAR alloc_var __ARGS((void)); 473 static typeval *alloc_tv __ARGS((void));
470 static typeval *alloc_vartv __ARGS((void)); 474 static typeval *alloc_string_tv __ARGS((char_u *string));
471 static typeval *alloc_string_vartv __ARGS((char_u *string)); 475 static void free_tv __ARGS((typeval *varp));
472 static void free_vartv __ARGS((typeval *varp)); 476 static void clear_tv __ARGS((typeval *varp));
473 static void clear_vartv __ARGS((typeval *varp)); 477 static void init_tv __ARGS((typeval *varp));
474 static long get_vartv_number __ARGS((typeval *varp)); 478 static long get_tv_number __ARGS((typeval *varp));
475 static linenr_T get_vartv_lnum __ARGS((typeval *argvars)); 479 static linenr_T get_tv_lnum __ARGS((typeval *argvars));
476 static char_u *get_vartv_string __ARGS((typeval *varp)); 480 static char_u *get_tv_string __ARGS((typeval *varp));
477 static char_u *get_vartv_string_buf __ARGS((typeval *varp, char_u *buf)); 481 static char_u *get_tv_string_buf __ARGS((typeval *varp, char_u *buf));
478 static VAR find_var __ARGS((char_u *name, int writing)); 482 static VAR find_var __ARGS((char_u *name, int writing));
479 static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname)); 483 static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname));
480 static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname)); 484 static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname));
481 static void clear_var __ARGS((VAR v)); 485 static void clear_var __ARGS((VAR v));
482 static void list_one_var __ARGS((VAR v, char_u *prefix)); 486 static void list_one_var __ARGS((VAR v, char_u *prefix));
483 static void list_vim_var __ARGS((int i)); 487 static void list_vim_var __ARGS((int i));
484 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string)); 488 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string));
485 static void set_var __ARGS((char_u *name, typeval *varp, int copy)); 489 static void set_var __ARGS((char_u *name, typeval *varp, int copy));
486 static void copy_vartv __ARGS((typeval *from, typeval *to)); 490 static void copy_tv __ARGS((typeval *from, typeval *to));
487 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags)); 491 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
488 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal)); 492 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal));
489 static int eval_fname_script __ARGS((char_u *p)); 493 static int eval_fname_script __ARGS((char_u *p));
490 static int eval_fname_sid __ARGS((char_u *p)); 494 static int eval_fname_sid __ARGS((char_u *p));
491 static void list_func_head __ARGS((ufunc_T *fp, int indent)); 495 static void list_func_head __ARGS((ufunc_T *fp, int indent));
492 static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); 496 static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp));
493 static ufunc_T *find_func __ARGS((char_u *name)); 497 static ufunc_T *find_func __ARGS((char_u *name));
494 static int function_exists __ARGS((char_u *name)); 498 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)); 499 static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *rettv, linenr_T firstline, linenr_T lastline));
496 500
497 #define get_var_string(p) get_vartv_string(&(p)->tv) 501 #define get_var_string(p) get_tv_string(&(p)->tv)
498 #define get_var_string_buf(p, b) get_vartv_string_buf(&(p)->tv, (b)) 502 #define get_var_string_buf(p, b) get_tv_string_buf(&(p)->tv, (b))
499 #define get_var_number(p) get_vartv_number(&((p)->tv)) 503 #define get_var_number(p) get_tv_number(&((p)->tv))
500 504
501 /* Magic braces are always enabled, otherwise Vim scripts would not be
502 * portable. */
503 #define FEAT_MAGIC_BRACES
504
505 #ifdef FEAT_MAGIC_BRACES
506 static char_u * make_expanded_name __ARGS((char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end)); 505 static char_u * make_expanded_name __ARGS((char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end));
507 #endif 506
507 static void list_all_vars __ARGS((void));
508 static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg));
509 static char_u *ex_let_one __ARGS((char_u *arg, typeval *tv, int copy, char_u *endchars));
510 static char_u *set_var_idx __ARGS((char_u *name, char_u *ip, typeval *rettv, int copy, char_u *endchars));
508 511
509 /* 512 /*
510 * Set an internal variable to a string value. Creates the variable if it does 513 * Set an internal variable to a string value. Creates the variable if it does
511 * not already exist. 514 * not already exist.
512 */ 515 */
519 typeval *tvp; 522 typeval *tvp;
520 523
521 val = vim_strsave(value); 524 val = vim_strsave(value);
522 if (val != NULL) 525 if (val != NULL)
523 { 526 {
524 tvp = alloc_string_vartv(val); 527 tvp = alloc_string_tv(val);
525 if (tvp != NULL) 528 if (tvp != NULL)
526 { 529 {
527 set_var(name, tvp, FALSE); 530 set_var(name, tvp, FALSE);
528 free_vartv(tvp); 531 free_tv(tvp);
529 } 532 }
530 } 533 }
531 } 534 }
532 535
533 # if defined(FEAT_MBYTE) || defined(PROTO) 536 # if defined(FEAT_MBYTE) || defined(PROTO)
627 char_u *arg; 630 char_u *arg;
628 int *error; 631 int *error;
629 char_u **nextcmd; 632 char_u **nextcmd;
630 int skip; /* only parse, don't execute */ 633 int skip; /* only parse, don't execute */
631 { 634 {
632 var retvar; 635 typeval tv;
633 int retval = FALSE; 636 int retval = FALSE;
634 637
635 if (skip) 638 if (skip)
636 ++emsg_skip; 639 ++emsg_skip;
637 if (eval0(arg, &retvar, nextcmd, !skip) == FAIL) 640 if (eval0(arg, &tv, nextcmd, !skip) == FAIL)
638 {
639 *error = TRUE; 641 *error = TRUE;
640 }
641 else 642 else
642 { 643 {
643 *error = FALSE; 644 *error = FALSE;
644 if (!skip) 645 if (!skip)
645 { 646 {
646 retval = (get_var_number(&retvar) != 0); 647 retval = (get_tv_number(&tv) != 0);
647 clear_vartv(&retvar.tv); 648 clear_tv(&tv);
648 } 649 }
649 } 650 }
650 if (skip) 651 if (skip)
651 --emsg_skip; 652 --emsg_skip;
652 653
662 eval_to_string_skip(arg, nextcmd, skip) 663 eval_to_string_skip(arg, nextcmd, skip)
663 char_u *arg; 664 char_u *arg;
664 char_u **nextcmd; 665 char_u **nextcmd;
665 int skip; /* only parse, don't execute */ 666 int skip; /* only parse, don't execute */
666 { 667 {
667 var retvar; 668 typeval tv;
668 char_u *retval; 669 char_u *retval;
669 670
670 if (skip) 671 if (skip)
671 ++emsg_skip; 672 ++emsg_skip;
672 if (eval0(arg, &retvar, nextcmd, !skip) == FAIL || skip) 673 if (eval0(arg, &tv, nextcmd, !skip) == FAIL || skip)
673 retval = NULL; 674 retval = NULL;
674 else 675 else
675 { 676 {
676 retval = vim_strsave(get_var_string(&retvar)); 677 retval = vim_strsave(get_tv_string(&tv));
677 clear_vartv(&retvar.tv); 678 clear_tv(&tv);
678 } 679 }
679 if (skip) 680 if (skip)
680 --emsg_skip; 681 --emsg_skip;
681 682
682 return retval; 683 return retval;
688 */ 689 */
689 int 690 int
690 skip_expr(pp) 691 skip_expr(pp)
691 char_u **pp; 692 char_u **pp;
692 { 693 {
693 typeval retvar; 694 typeval rettv;
694 695
695 *pp = skipwhite(*pp); 696 *pp = skipwhite(*pp);
696 return eval1(pp, &retvar, FALSE); 697 return eval1(pp, &rettv, FALSE);
697 } 698 }
698 699
699 /* 700 /*
700 * Top level evaluation function, returning a string. 701 * Top level evaluation function, returning a string.
701 * Return pointer to allocated memory, or NULL for failure. 702 * Return pointer to allocated memory, or NULL for failure.
703 char_u * 704 char_u *
704 eval_to_string(arg, nextcmd) 705 eval_to_string(arg, nextcmd)
705 char_u *arg; 706 char_u *arg;
706 char_u **nextcmd; 707 char_u **nextcmd;
707 { 708 {
708 var retvar; 709 typeval tv;
709 char_u *retval; 710 char_u *retval;
710 711
711 if (eval0(arg, &retvar, nextcmd, TRUE) == FAIL) 712 if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
712 retval = NULL; 713 retval = NULL;
713 else 714 else
714 { 715 {
715 retval = vim_strsave(get_var_string(&retvar)); 716 retval = vim_strsave(get_tv_string(&tv));
716 clear_vartv(&retvar.tv); 717 clear_tv(&tv);
717 } 718 }
718 719
719 return retval; 720 return retval;
720 } 721 }
721 722
747 */ 748 */
748 char_u * 749 char_u *
749 eval_arg_to_string(arg) 750 eval_arg_to_string(arg)
750 char_u **arg; 751 char_u **arg;
751 { 752 {
752 typeval retvar; 753 typeval rettv;
753 char_u *retval; 754 char_u *retval;
754 int ret; 755 int ret;
755 756
756 ++emsg_off; 757 ++emsg_off;
757 758
758 ret = eval1(arg, &retvar, TRUE); 759 ret = eval1(arg, &rettv, TRUE);
759 if (ret == FAIL) 760 if (ret == FAIL)
760 retval = NULL; 761 retval = NULL;
761 else 762 else
762 { 763 {
763 retval = vim_strsave(get_vartv_string(&retvar)); 764 retval = vim_strsave(get_tv_string(&rettv));
764 clear_vartv(&retvar); 765 clear_tv(&rettv);
765 } 766 }
766 767
767 --emsg_off; 768 --emsg_off;
768 769
769 return retval; 770 return retval;
777 */ 778 */
778 int 779 int
779 eval_to_number(expr) 780 eval_to_number(expr)
780 char_u *expr; 781 char_u *expr;
781 { 782 {
782 typeval retvar; 783 typeval rettv;
783 int retval; 784 int retval;
784 char_u *p = expr; 785 char_u *p = expr;
785 786
786 ++emsg_off; 787 ++emsg_off;
787 788
788 if (eval1(&p, &retvar, TRUE) == FAIL) 789 if (eval1(&p, &rettv, TRUE) == FAIL)
789 retval = -1; 790 retval = -1;
790 else 791 else
791 { 792 {
792 retval = get_vartv_number(&retvar); 793 retval = get_tv_number(&rettv);
793 clear_vartv(&retvar); 794 clear_tv(&rettv);
794 } 795 }
795 --emsg_off; 796 --emsg_off;
796 797
797 return retval; 798 return retval;
798 } 799 }
808 int argc; 809 int argc;
809 char_u **argv; 810 char_u **argv;
810 int safe; /* use the sandbox */ 811 int safe; /* use the sandbox */
811 { 812 {
812 char_u *retval = NULL; 813 char_u *retval = NULL;
813 var retvar; 814 typeval rettv;
814 typeval *argvars; 815 typeval *argvars;
815 long n; 816 long n;
816 int len; 817 int len;
817 int i; 818 int i;
818 int doesrange; 819 int doesrange;
850 { 851 {
851 save_funccalp = save_funccal(); 852 save_funccalp = save_funccal();
852 ++sandbox; 853 ++sandbox;
853 } 854 }
854 855
855 retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */ 856 rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
856 if (call_func(func, (int)STRLEN(func), &retvar.tv, argc, argvars, 857 if (call_func(func, (int)STRLEN(func), &rettv, argc, argvars,
857 curwin->w_cursor.lnum, curwin->w_cursor.lnum, 858 curwin->w_cursor.lnum, curwin->w_cursor.lnum,
858 &doesrange, TRUE) == OK) 859 &doesrange, TRUE) == OK)
859 retval = vim_strsave(get_var_string(&retvar)); 860 retval = vim_strsave(get_tv_string(&rettv));
860 861
861 clear_vartv(&retvar.tv); 862 clear_tv(&rettv);
862 vim_free(argvars); 863 vim_free(argvars);
863 864
864 if (safe) 865 if (safe)
865 { 866 {
866 --sandbox; 867 --sandbox;
899 int 900 int
900 eval_foldexpr(arg, cp) 901 eval_foldexpr(arg, cp)
901 char_u *arg; 902 char_u *arg;
902 int *cp; 903 int *cp;
903 { 904 {
904 var retvar; 905 typeval tv;
905 int retval; 906 int retval;
906 char_u *s; 907 char_u *s;
907 908
908 ++emsg_off; 909 ++emsg_off;
909 ++sandbox; 910 ++sandbox;
910 *cp = NUL; 911 *cp = NUL;
911 if (eval0(arg, &retvar, NULL, TRUE) == FAIL) 912 if (eval0(arg, &tv, NULL, TRUE) == FAIL)
912 retval = 0; 913 retval = 0;
913 else 914 else
914 { 915 {
915 /* If the result is a number, just return the number. */ 916 /* If the result is a number, just return the number. */
916 if (retvar.tv.v_type == VAR_NUMBER) 917 if (tv.v_type == VAR_NUMBER)
917 retval = retvar.tv.vval.v_number; 918 retval = tv.vval.v_number;
918 else if (retvar.tv.v_type == VAR_UNKNOWN 919 else if (tv.v_type == VAR_UNKNOWN
919 || retvar.tv.vval.v_string == NULL) 920 || tv.vval.v_string == NULL)
920 retval = 0; 921 retval = 0;
921 else 922 else
922 { 923 {
923 /* If the result is a string, check if there is a non-digit before 924 /* If the result is a string, check if there is a non-digit before
924 * the number. */ 925 * the number. */
925 s = retvar.tv.vval.v_string; 926 s = tv.vval.v_string;
926 if (!VIM_ISDIGIT(*s) && *s != '-') 927 if (!VIM_ISDIGIT(*s) && *s != '-')
927 *cp = *s++; 928 *cp = *s++;
928 retval = atol((char *)s); 929 retval = atol((char *)s);
929 } 930 }
930 clear_vartv(&retvar.tv); 931 clear_tv(&tv);
931 } 932 }
932 --emsg_off; 933 --emsg_off;
933 --sandbox; 934 --sandbox;
934 935
935 return retval; 936 return retval;
936 } 937 }
937 #endif 938 #endif
938 939
939 #ifdef FEAT_MAGIC_BRACES
940 /* 940 /*
941 * Expands out the 'magic' {}'s in a variable/function name. 941 * Expands out the 'magic' {}'s in a variable/function name.
942 * Note that this can call itself recursively, to deal with 942 * Note that this can call itself recursively, to deal with
943 * constructs like foo{bar}{baz}{bam} 943 * constructs like foo{bar}{baz}{bam}
944 * The four pointer arguments point to "foo{expre}ss{ion}bar" 944 * The four pointer arguments point to "foo{expre}ss{ion}bar"
988 *expr_start = '{'; 988 *expr_start = '{';
989 *expr_end = '}'; 989 *expr_end = '}';
990 990
991 if (retval != NULL) 991 if (retval != NULL)
992 { 992 {
993 temp_result = find_name_end(retval, &expr_start, &expr_end); 993 temp_result = find_name_end(retval, &expr_start, &expr_end, FALSE);
994 if (expr_start != NULL) 994 if (expr_start != NULL)
995 { 995 {
996 /* Further expansion! */ 996 /* Further expansion! */
997 temp_result = make_expanded_name(retval, expr_start, 997 temp_result = make_expanded_name(retval, expr_start,
998 expr_end, temp_result); 998 expr_end, temp_result);
1002 } 1002 }
1003 1003
1004 return retval; 1004 return retval;
1005 1005
1006 } 1006 }
1007 #endif /* FEAT_MAGIC_BRACES */ 1007
1008 1008 /*
1009 /* 1009 * ":let" list all variable values
1010 * ":let var = expr" assignment command. 1010 * ":let var1 var2" list variable values
1011 * ":let var" list one variable value 1011 * ":let var = expr" assignment command.
1012 * ":let" list all variable values 1012 * ":let [var1, var2] = expr" unpack list.
1013 */ 1013 */
1014 void 1014 void
1015 ex_let(eap) 1015 ex_let(eap)
1016 exarg_T *eap; 1016 exarg_T *eap;
1017 { 1017 {
1018 char_u *arg = eap->arg; 1018 char_u *arg = eap->arg;
1019 char_u *expr; 1019 char_u *expr = NULL;
1020 char_u *name; 1020 typeval rettv;
1021 VAR varp;
1022 var retvar;
1023 char_u *p;
1024 int c1 = 0, c2;
1025 int i; 1021 int i;
1022 int var_count = 0;
1023 int semicolon = 0;
1024 listvar *l;
1025 listitem *item;
1026
1027 if (*arg != '[')
1028 expr = vim_strchr(find_name_end(arg, NULL, NULL, TRUE), '=');
1029 if (*arg != '[' && expr == NULL)
1030 {
1031 if (!ends_excmd(*arg))
1032 /* ":let var1 var2" */
1033 arg = list_arg_vars(eap, arg);
1034 else if (!eap->skip)
1035 /* ":let" */
1036 list_all_vars();
1037 eap->nextcmd = check_nextcmd(arg);
1038 }
1039 else
1040 {
1041 if (*arg == '[')
1042 {
1043 /* ":let [a, b] = expr": find the matching ']' to get to the
1044 * expression. */
1045 while (1)
1046 {
1047 arg = skipwhite(arg + 1);
1048 if (vim_strchr((char_u *)"$@&", *arg) != NULL)
1049 ++arg;
1050 expr = find_name_end(arg, NULL, NULL, TRUE);
1051 if (expr == arg)
1052 {
1053 EMSG2(_(e_invarg2), arg);
1054 return;
1055 }
1056 ++var_count;
1057
1058 arg = skipwhite(expr);
1059 if (*arg == ']')
1060 break;
1061 else if (*arg == ';')
1062 {
1063 if (semicolon == 1)
1064 {
1065 EMSG(_("Double ; in :let"));
1066 return;
1067 }
1068 semicolon = 1;
1069 }
1070 else if (*arg != ',')
1071 {
1072 EMSG2(_(e_invarg2), arg);
1073 return;
1074 }
1075 }
1076
1077 /* check for '=' after the ']' */
1078 expr = skipwhite(arg + 1);
1079 if (*expr != '=')
1080 {
1081 EMSG(_(e_letunexp));
1082 return;
1083 }
1084 }
1085
1086 if (eap->skip)
1087 ++emsg_skip;
1088 i = eval0(expr + 1, &rettv, &eap->nextcmd, !eap->skip);
1089 if (eap->skip)
1090 {
1091 if (i != FAIL)
1092 clear_tv(&rettv);
1093 --emsg_skip;
1094 }
1095 else if (i != FAIL)
1096 {
1097 /* Move "arg" back to the variable name(s). */
1098 arg = eap->arg;
1099 if (*arg != '[')
1100 {
1101 /* ":let var = expr" */
1102 (void)ex_let_one(arg, &rettv, FALSE, (char_u *)"=");
1103 }
1104 else
1105 {
1106 /* ":let [v1, v2] = list" */
1107 l = rettv.vval.v_list;
1108 if (rettv.v_type != VAR_LIST || l == NULL)
1109 EMSG(_("E999: List required"));
1110 else
1111 {
1112 i = list_len(l);
1113 if (semicolon == 0 && var_count < i)
1114 EMSG(_("E999: Less targets than List items"));
1115 else if (var_count - semicolon > i)
1116 EMSG(_("E999: More targets than List items"));
1117 else
1118 {
1119 item = l->lv_first;
1120 while (*arg != ']')
1121 {
1122 arg = skipwhite(arg + 1);
1123 arg = ex_let_one(arg, &item->li_tv,
1124 TRUE, (char_u *)",;]");
1125 item = item->li_next;
1126 if (arg == NULL)
1127 break;
1128
1129 arg = skipwhite(arg);
1130 if (*arg == ';')
1131 {
1132 /* Put the rest of the list (may be empty) in
1133 * the var after ';'. */
1134 l = list_alloc();
1135 if (l == NULL)
1136 break;
1137 while (item != NULL)
1138 {
1139 list_append_tv(l, &item->li_tv);
1140 item = item->li_next;
1141 }
1142 list_unref(rettv.vval.v_list);
1143 rettv.vval.v_list = l;
1144 l->lv_refcount = 1;
1145 (void)ex_let_one(skipwhite(arg + 1), &rettv,
1146 FALSE, (char_u *)"]");
1147 break;
1148 }
1149 else if (*arg != ',' && *arg != ']')
1150 {
1151 EMSG2(_(e_intern2), "ex_let()");
1152 break;
1153 }
1154 }
1155 }
1156 }
1157 }
1158 clear_tv(&rettv);
1159 }
1160 }
1161 }
1162
1163 static void
1164 list_all_vars()
1165 {
1166 int i;
1167
1168 /*
1169 * List all variables.
1170 */
1171 for (i = 0; i < variables.ga_len && !got_int; ++i)
1172 if (VAR_ENTRY(i).v_name != NULL)
1173 list_one_var(&VAR_ENTRY(i), (char_u *)"");
1174 for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i)
1175 if (BVAR_ENTRY(i).v_name != NULL)
1176 list_one_var(&BVAR_ENTRY(i), (char_u *)"b:");
1177 for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i)
1178 if (WVAR_ENTRY(i).v_name != NULL)
1179 list_one_var(&WVAR_ENTRY(i), (char_u *)"w:");
1180 for (i = 0; i < VV_LEN && !got_int; ++i)
1181 if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL)
1182 list_vim_var(i);
1183 }
1184
1185 /*
1186 * List variables in "arg".
1187 */
1188 static char_u *
1189 list_arg_vars(eap, arg)
1190 exarg_T *eap;
1191 char_u *arg;
1192 {
1193 int error = FALSE;
1194 char_u *temp_string = NULL;
1195 int arg_len;
1026 char_u *expr_start; 1196 char_u *expr_start;
1027 char_u *expr_end; 1197 char_u *expr_end;
1028 char_u *name_end; 1198 char_u *name_end;
1029 1199 int c1 = 0, c2;
1030 name_end = find_name_end(arg, &expr_start, &expr_end); 1200 int i;
1031 expr = vim_strchr(name_end, '='); 1201 VAR varp;
1032 if (expr == NULL) 1202 char_u *name;
1033 { 1203
1034 if (ends_excmd(*arg)) 1204 while (!ends_excmd(*arg) && !got_int)
1035 { 1205 {
1036 if (!eap->skip) 1206 /* Find the end of the name. */
1207 name_end = find_name_end(arg, &expr_start, &expr_end, FALSE);
1208
1209 if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
1210 {
1211 emsg_severe = TRUE;
1212 EMSG(_(e_trailing));
1213 break;
1214 }
1215 if (!error && !eap->skip)
1216 {
1217 if (expr_start != NULL)
1037 { 1218 {
1038 /* 1219 temp_string = make_expanded_name(arg, expr_start,
1039 * List all variables. 1220 expr_end, name_end);
1040 */ 1221 if (temp_string == NULL)
1041 for (i = 0; i < variables.ga_len && !got_int; ++i) 1222 {
1042 if (VAR_ENTRY(i).v_name != NULL) 1223 /*
1043 list_one_var(&VAR_ENTRY(i), (char_u *)""); 1224 * Report an invalid expression in braces, unless
1044 for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i) 1225 * the expression evaluation has been cancelled due
1045 if (BVAR_ENTRY(i).v_name != NULL) 1226 * to an aborting error, an interrupt, or an
1046 list_one_var(&BVAR_ENTRY(i), (char_u *)"b:"); 1227 * exception.
1047 for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i) 1228 */
1048 if (WVAR_ENTRY(i).v_name != NULL) 1229 if (!aborting())
1049 list_one_var(&WVAR_ENTRY(i), (char_u *)"w:"); 1230 {
1050 for (i = 0; i < VV_LEN && !got_int; ++i) 1231 emsg_severe = TRUE;
1051 if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL) 1232 EMSG2(_(e_invarg2), arg);
1052 list_vim_var(i); 1233 break;
1234 }
1235 error = TRUE;
1236 arg = skipwhite(name_end);
1237 continue;
1238 }
1239 arg = temp_string;
1240 arg_len = STRLEN(temp_string);
1053 } 1241 }
1054 } 1242 else
1055 else
1056 {
1057 int error = FALSE;
1058
1059 /*
1060 * List variables.
1061 */
1062 while (!ends_excmd(*arg) && !got_int)
1063 { 1243 {
1064 char_u *temp_string = NULL; 1244 c1 = *name_end;
1065 int arg_len; 1245 *name_end = NUL;
1066 1246 arg_len = (int)(name_end - arg);
1067 /* Find the end of the name. */ 1247 }
1068 name_end = find_name_end(arg, &expr_start, &expr_end); 1248 i = find_vim_var(arg, arg_len);
1069 1249 if (i >= 0)
1070 if (!vim_iswhite(*name_end) && !ends_excmd(*name_end)) 1250 list_vim_var(i);
1251 else if (STRCMP("b:changedtick", arg) == 0)
1252 {
1253 char_u numbuf[NUMBUFLEN];
1254
1255 sprintf((char *)numbuf, "%ld",
1256 (long)curbuf->b_changedtick);
1257 list_one_var_a((char_u *)"b:", (char_u *)"changedtick",
1258 VAR_NUMBER, numbuf);
1259 }
1260 else
1261 {
1262 varp = find_var(arg, FALSE);
1263 if (varp == NULL)
1071 { 1264 {
1072 emsg_severe = TRUE; 1265 /* Skip further arguments but do continue to
1073 EMSG(_(e_trailing)); 1266 * search for a trailing command. */
1074 break; 1267 EMSG2(_("E106: Unknown variable: \"%s\""), arg);
1268 error = TRUE;
1075 } 1269 }
1076 if (!error && !eap->skip) 1270 else
1077 { 1271 {
1078 #ifdef FEAT_MAGIC_BRACES 1272 name = vim_strchr(arg, ':');
1079 if (expr_start != NULL) 1273 if (name != NULL)
1080 { 1274 {
1081 temp_string = make_expanded_name(arg, expr_start, 1275 /* "a:" vars have no name stored, use whole arg */
1082 expr_end, name_end); 1276 if (arg[0] == 'a' && arg[1] == ':')
1083 if (temp_string == NULL) 1277 c2 = NUL;
1278 else
1084 { 1279 {
1085 /* 1280 c2 = *++name;
1086 * Report an invalid expression in braces, unless 1281 *name = NUL;
1087 * the expression evaluation has been cancelled due
1088 * to an aborting error, an interrupt, or an
1089 * exception.
1090 */
1091 if (!aborting())
1092 {
1093 emsg_severe = TRUE;
1094 EMSG2(_(e_invarg2), arg);
1095 break;
1096 }
1097 error = TRUE;
1098 arg = skipwhite(name_end);
1099 continue;
1100 } 1282 }
1101 arg = temp_string; 1283 list_one_var(varp, arg);
1102 arg_len = STRLEN(temp_string); 1284 if (c2 != NUL)
1285 *name = c2;
1103 } 1286 }
1104 else 1287 else
1105 #endif 1288 list_one_var(varp, (char_u *)"");
1106 {
1107 c1 = *name_end;
1108 *name_end = NUL;
1109 arg_len = (int)(name_end - arg);
1110 }
1111 i = find_vim_var(arg, arg_len);
1112 if (i >= 0)
1113 list_vim_var(i);
1114 else if (STRCMP("b:changedtick", arg) == 0)
1115 {
1116 char_u numbuf[NUMBUFLEN];
1117
1118 sprintf((char *)numbuf, "%ld",
1119 (long)curbuf->b_changedtick);
1120 list_one_var_a((char_u *)"b:", (char_u *)"changedtick",
1121 VAR_NUMBER, numbuf);
1122 }
1123 else
1124 {
1125 varp = find_var(arg, FALSE);
1126 if (varp == NULL)
1127 {
1128 /* Skip further arguments but do continue to
1129 * search for a trailing command. */
1130 EMSG2(_("E106: Unknown variable: \"%s\""), arg);
1131 error = TRUE;
1132 }
1133 else
1134 {
1135 name = vim_strchr(arg, ':');
1136 if (name != NULL)
1137 {
1138 /* "a:" vars have no name stored, use whole
1139 * arg */
1140 if (arg[0] == 'a' && arg[1] == ':')
1141 c2 = NUL;
1142 else
1143 {
1144 c2 = *++name;
1145 *name = NUL;
1146 }
1147 list_one_var(varp, arg);
1148 if (c2 != NUL)
1149 *name = c2;
1150 }
1151 else
1152 list_one_var(varp, (char_u *)"");
1153 }
1154 }
1155 #ifdef FEAT_MAGIC_BRACES
1156 if (expr_start != NULL)
1157 vim_free(temp_string);
1158 else
1159 #endif
1160 *name_end = c1;
1161 }
1162 arg = skipwhite(name_end);
1163 }
1164 }
1165 eap->nextcmd = check_nextcmd(arg);
1166 }
1167 else
1168 {
1169 if (eap->skip)
1170 ++emsg_skip;
1171 i = eval0(expr + 1, &retvar, &eap->nextcmd, !eap->skip);
1172 if (eap->skip)
1173 {
1174 if (i != FAIL)
1175 clear_vartv(&retvar.tv);
1176 --emsg_skip;
1177 }
1178 else if (i != FAIL)
1179 {
1180 /*
1181 * ":let $VAR = expr": Set environment variable.
1182 */
1183 if (*arg == '$')
1184 {
1185 int len;
1186 int cc;
1187
1188 /* Find the end of the name. */
1189 ++arg;
1190 name = arg;
1191 len = get_env_len(&arg);
1192 if (len == 0)
1193 EMSG2(_(e_invarg2), name - 1);
1194 else
1195 {
1196 if (*skipwhite(arg) != '=')
1197 EMSG(_(e_letunexp));
1198 else
1199 {
1200 cc = name[len];
1201 name[len] = NUL;
1202 p = get_var_string(&retvar);
1203 vim_setenv(name, p);
1204 if (STRICMP(name, "HOME") == 0)
1205 init_homedir();
1206 else if (didset_vim && STRICMP(name, "VIM") == 0)
1207 didset_vim = FALSE;
1208 else if (didset_vimruntime
1209 && STRICMP(name, "VIMRUNTIME") == 0)
1210 didset_vimruntime = FALSE;
1211 name[len] = cc;
1212 }
1213 } 1289 }
1214 } 1290 }
1215 1291 if (expr_start != NULL)
1216 /* 1292 vim_free(temp_string);
1217 * ":let &option = expr": Set option value. 1293 else
1218 * ":let &l:option = expr": Set local option value. 1294 *name_end = c1;
1219 * ":let &g:option = expr": Set global option value. 1295 }
1220 */ 1296 arg = skipwhite(name_end);
1221 else if (*arg == '&') 1297 }
1222 { 1298
1223 int opt_flags; 1299 return arg;
1224 1300 }
1225 /* 1301
1226 * Find the end of the name; 1302 /*
1227 */ 1303 * Set one item of ":let var = expr" or ":let [v1, v2] = list" to its value.
1228 p = find_option_end(&arg, &opt_flags); 1304 * Returns a pointer to the char just after the var name.
1229 if (p == NULL || *skipwhite(p) != '=') 1305 * Returns NULL if there is an error.
1230 EMSG(_(e_letunexp)); 1306 */
1231 else 1307 static char_u *
1232 { 1308 ex_let_one(arg, tv, copy, endchars)
1233 c1 = *p; 1309 char_u *arg; /* points to variable name */
1234 *p = NUL; 1310 typeval *tv; /* value to assign to variable */
1235 set_option_value(arg, get_var_number(&retvar), 1311 int copy; /* copy value from "tv" */
1236 get_var_string(&retvar), opt_flags); 1312 char_u *endchars; /* valid chars after variable name */
1237 *p = c1; /* put back for error messages */ 1313 {
1238 } 1314 int c1;
1239 } 1315 char_u *name;
1240 1316 char_u *p;
1241 /* 1317 char_u *arg_end = NULL;
1242 * ":let @r = expr": Set register contents. 1318 int len;
1243 */ 1319 int opt_flags;
1244 else if (*arg == '@') 1320
1245 { 1321 /*
1246 ++arg; 1322 * ":let $VAR = expr": Set environment variable.
1247 if (*skipwhite(arg + 1) != '=') 1323 */
1248 EMSG(_(e_letunexp)); 1324 if (*arg == '$')
1249 else 1325 {
1250 write_reg_contents(*arg == '@' ? '"' : *arg, 1326 /* Find the end of the name. */
1251 get_var_string(&retvar), -1, FALSE); 1327 ++arg;
1252 } 1328 name = arg;
1253 1329 len = get_env_len(&arg);
1254 /* 1330 if (len == 0)
1255 * ":let var = expr": Set internal variable. 1331 EMSG2(_(e_invarg2), name - 1);
1256 */ 1332 else
1257 else if (eval_isnamec(*arg) && !VIM_ISDIGIT(*arg)) 1333 {
1258 { 1334 if (vim_strchr(endchars, *skipwhite(arg)) == NULL)
1259 /* Find the end of the name. */ 1335 EMSG(_(e_letunexp));
1260 p = find_name_end(arg, &expr_start, &expr_end);
1261
1262 if (*skipwhite(p) != '=')
1263 EMSG(_(e_letunexp));
1264 else if (p - arg == 13
1265 && STRNCMP(arg, "b:changedtick", 13) == 0)
1266 EMSG2(_(e_readonlyvar), arg);
1267 #ifdef FEAT_MAGIC_BRACES
1268 else if (expr_start != NULL)
1269 {
1270 char_u *temp_string;
1271
1272 temp_string = make_expanded_name(arg, expr_start,
1273 expr_end, p);
1274 if (temp_string == NULL)
1275 {
1276 /*
1277 * Report an invalid expression in braces, unless the
1278 * expression evaluation has been cancelled due to an
1279 * aborting error, an interrupt, or an exception.
1280 */
1281 if (!aborting())
1282 EMSG2(_(e_invarg2), arg);
1283 }
1284 else
1285 {
1286 set_var(temp_string, &retvar.tv, TRUE);
1287 vim_free(temp_string);
1288 }
1289 }
1290 #endif
1291 else
1292 {
1293 c1 = *p;
1294 *p = NUL;
1295 set_var(arg, &retvar.tv, TRUE);
1296 *p = c1; /* put char back for error messages */
1297 }
1298 }
1299
1300 else 1336 else
1301 { 1337 {
1338 c1 = name[len];
1339 name[len] = NUL;
1340 p = get_tv_string(tv);
1341 vim_setenv(name, p);
1342 if (STRICMP(name, "HOME") == 0)
1343 init_homedir();
1344 else if (didset_vim && STRICMP(name, "VIM") == 0)
1345 didset_vim = FALSE;
1346 else if (didset_vimruntime && STRICMP(name, "VIMRUNTIME") == 0)
1347 didset_vimruntime = FALSE;
1348 name[len] = c1;
1349 arg_end = arg;
1350 }
1351 }
1352 }
1353
1354 /*
1355 * ":let &option = expr": Set option value.
1356 * ":let &l:option = expr": Set local option value.
1357 * ":let &g:option = expr": Set global option value.
1358 */
1359 else if (*arg == '&')
1360 {
1361 /* Find the end of the name. */
1362 p = find_option_end(&arg, &opt_flags);
1363 if (p == NULL || vim_strchr(endchars, *skipwhite(p)) == NULL)
1364 EMSG(_(e_letunexp));
1365 else
1366 {
1367 c1 = *p;
1368 *p = NUL;
1369 set_option_value(arg, get_tv_number(tv),
1370 get_tv_string(tv), opt_flags);
1371 *p = c1;
1372 arg_end = p;
1373 }
1374 }
1375
1376 /*
1377 * ":let @r = expr": Set register contents.
1378 */
1379 else if (*arg == '@')
1380 {
1381 ++arg;
1382 if (vim_strchr(endchars, *skipwhite(arg + 1)) == NULL)
1383 EMSG(_(e_letunexp));
1384 else
1385 {
1386 write_reg_contents(*arg == '@' ? '"' : *arg,
1387 get_tv_string(tv), -1, FALSE);
1388 arg_end = arg + 1;
1389 }
1390 }
1391
1392 /*
1393 * ":let var = expr": Set internal variable.
1394 */
1395 else if (eval_isnamec(*arg) && !VIM_ISDIGIT(*arg))
1396 {
1397 char_u *exp_name = NULL;
1398 char_u *expr_start, *expr_end;
1399
1400 /* Find the end of the name. */
1401 p = find_name_end(arg, &expr_start, &expr_end, FALSE);
1402 if (expr_start != NULL)
1403 {
1404 exp_name = make_expanded_name(arg, expr_start, expr_end, p);
1405 arg = exp_name;
1406 }
1407
1408 if (arg == NULL)
1409 {
1410 /* Report an invalid expression in braces, unless the
1411 * expression evaluation has been cancelled due to an
1412 * aborting error, an interrupt, or an exception. */
1413 if (!aborting())
1302 EMSG2(_(e_invarg2), arg); 1414 EMSG2(_(e_invarg2), arg);
1415 }
1416 else if (*p == '[')
1417 arg_end = set_var_idx(arg, p, tv, copy, endchars);
1418 else if (vim_strchr(endchars, *skipwhite(p)) == NULL)
1419 EMSG(_(e_letunexp));
1420 else if (STRNCMP(arg, "b:changedtick", 13) == 0
1421 && !eval_isnamec(arg[13]))
1422 EMSG2(_(e_readonlyvar), arg);
1423 else
1424 {
1425 c1 = *p;
1426 *p = NUL;
1427 set_var(arg, tv, copy);
1428 *p = c1;
1429 arg_end = p;
1430 }
1431
1432 vim_free(exp_name);
1433 }
1434
1435 else
1436 EMSG2(_(e_invarg2), arg);
1437
1438 return arg_end;
1439 }
1440
1441 /*
1442 * Set a variable with an index: "name[expr]", "name[expr][expr]", etc.
1443 * Only works if "name" is an existing List.
1444 * "ip" points to the first '['.
1445 * Returns a pointer to just after the last used ']'; NULL for error.
1446 */
1447 static char_u *
1448 set_var_idx(name, ip, rettv, copy, endchars)
1449 char_u *name;
1450 char_u *ip;
1451 typeval *rettv;
1452 int copy;
1453 char_u *endchars;
1454 {
1455 VAR v;
1456 int c1;
1457 char_u *p;
1458 typeval var1;
1459 typeval *tv;
1460 long n;
1461 listitem *item;
1462
1463 c1 = *ip;
1464 *ip = NUL;
1465 v = find_var(name, TRUE);
1466 if (v == NULL)
1467 EMSG2(_(e_undefvar), name);
1468 *ip = c1;
1469 if (v == NULL)
1470 return NULL;
1471
1472 tv = &v->tv;
1473 for (p = ip; *p == '['; p = skipwhite(p + 1))
1474 {
1475 if (tv->v_type != VAR_LIST || tv->vval.v_list == NULL)
1476 {
1477 EMSG(_("E999: Can only index a List"));
1478 p = NULL;
1479 break;
1480 }
1481 p = skipwhite(p + 1);
1482 if (eval1(&p, &var1, TRUE) == FAIL) /* recursive! */
1483 {
1484 p = NULL;
1485 break;
1486 }
1487 if (*p != ']')
1488 {
1489 EMSG(_(e_missbrac));
1490 clear_tv(&var1);
1491 p = NULL;
1492 break;
1493 }
1494 n = get_tv_number(&var1);
1495 clear_tv(&var1);
1496 item = list_find(tv->vval.v_list, n);
1497 if (item == NULL)
1498 {
1499 EMSGN(_(e_listidx), n);
1500 p = NULL;
1501 break;
1502 }
1503 tv = &item->li_tv;
1504 }
1505
1506 if (p != NULL)
1507 {
1508 if (vim_strchr(endchars, *p) == NULL)
1509 {
1510 EMSG(_(e_letunexp));
1511 p = NULL;
1512 }
1513 else
1514 {
1515 clear_tv(tv);
1516 if (copy)
1517 copy_tv(tv, rettv);
1518 else
1519 {
1520 *tv = *rettv;
1521 init_tv(rettv);
1303 } 1522 }
1304 1523 }
1305 clear_vartv(&retvar.tv); 1524 }
1306 } 1525 return p;
1307 }
1308 } 1526 }
1309 1527
1310 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) 1528 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
1311 1529
1312 void 1530 void
1403 { 1621 {
1404 char_u *arg = eap->arg; 1622 char_u *arg = eap->arg;
1405 char_u *startarg; 1623 char_u *startarg;
1406 char_u *alias; 1624 char_u *alias;
1407 char_u *name; 1625 char_u *name;
1408 var retvar; 1626 typeval rettv;
1409 int len; 1627 int len;
1410 linenr_T lnum; 1628 linenr_T lnum;
1411 int doesrange; 1629 int doesrange;
1412 int failed = FALSE; 1630 int failed = FALSE;
1413 1631
1417 goto end; 1635 goto end;
1418 if (alias != NULL) 1636 if (alias != NULL)
1419 name = alias; 1637 name = alias;
1420 1638
1421 startarg = arg; 1639 startarg = arg;
1422 retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */ 1640 rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
1423 1641
1424 if (*startarg != '(') 1642 if (*startarg != '(')
1425 { 1643 {
1426 EMSG2(_("E107: Missing braces: %s"), name); 1644 EMSG2(_("E107: Missing braces: %s"), name);
1427 goto end; 1645 goto end;
1446 { 1664 {
1447 curwin->w_cursor.lnum = lnum; 1665 curwin->w_cursor.lnum = lnum;
1448 curwin->w_cursor.col = 0; 1666 curwin->w_cursor.col = 0;
1449 } 1667 }
1450 arg = startarg; 1668 arg = startarg;
1451 if (get_func_vartv(name, len, &retvar.tv, &arg, 1669 if (get_func_tv(name, len, &rettv, &arg,
1452 eap->line1, eap->line2, &doesrange, !eap->skip) == FAIL) 1670 eap->line1, eap->line2, &doesrange, !eap->skip) == FAIL)
1453 { 1671 {
1454 failed = TRUE; 1672 failed = TRUE;
1455 break; 1673 break;
1456 } 1674 }
1457 clear_vartv(&retvar.tv); 1675 clear_tv(&rettv);
1458 if (doesrange || eap->skip) 1676 if (doesrange || eap->skip)
1459 break; 1677 break;
1460 /* Stop when immediately aborting on error, or when an interrupt 1678 /* Stop when immediately aborting on error, or when an interrupt
1461 * occurred or an exception was thrown but not caught. 1679 * occurred or an exception was thrown but not caught.
1462 * get_func_vartv() returned OK, so that the check for trailing 1680 * get_func_tv() returned OK, so that the check for trailing
1463 * characters below is executed. */ 1681 * characters below is executed. */
1464 if (aborting()) 1682 if (aborting())
1465 break; 1683 break;
1466 } 1684 }
1467 if (eap->skip) 1685 if (eap->skip)
1499 int error = FALSE; 1717 int error = FALSE;
1500 1718
1501 do 1719 do
1502 { 1720 {
1503 /* Find the end of the name. */ 1721 /* Find the end of the name. */
1504 name_end = find_name_end(arg, &expr_start, &expr_end); 1722 name_end = find_name_end(arg, &expr_start, &expr_end, FALSE);
1505 1723
1506 if (!vim_iswhite(*name_end) && !ends_excmd(*name_end)) 1724 if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
1507 { 1725 {
1508 emsg_severe = TRUE; 1726 emsg_severe = TRUE;
1509 EMSG(_(e_trailing)); 1727 EMSG(_(e_trailing));
1510 break; 1728 break;
1511 } 1729 }
1512 1730
1513 if (!error && !eap->skip) 1731 if (!error && !eap->skip)
1514 { 1732 {
1515 #ifdef FEAT_MAGIC_BRACES
1516 if (expr_start != NULL) 1733 if (expr_start != NULL)
1517 { 1734 {
1518 char_u *temp_string; 1735 char_u *temp_string;
1519 1736
1520 temp_string = make_expanded_name(arg, expr_start, 1737 temp_string = make_expanded_name(arg, expr_start,
1543 } 1760 }
1544 vim_free(temp_string); 1761 vim_free(temp_string);
1545 } 1762 }
1546 } 1763 }
1547 else 1764 else
1548 #endif
1549 { 1765 {
1550 cc = *name_end; 1766 cc = *name_end;
1551 *name_end = NUL; 1767 *name_end = NUL;
1552 1768
1553 if (do_unlet(arg) == FAIL && !eap->forceit) 1769 if (do_unlet(arg) == FAIL && !eap->forceit)
1720 , TYPE_NOMATCH /* !~ */ 1936 , TYPE_NOMATCH /* !~ */
1721 } exptype_T; 1937 } exptype_T;
1722 1938
1723 /* 1939 /*
1724 * The "evaluate" argument: When FALSE, the argument is only parsed but not 1940 * The "evaluate" argument: When FALSE, the argument is only parsed but not
1725 * executed. The function may return OK, but the retvar will be of type 1941 * executed. The function may return OK, but the rettv will be of type
1726 * VAR_UNKNOWN. The function still returns FAIL for a syntax error. 1942 * VAR_UNKNOWN. The function still returns FAIL for a syntax error.
1727 */ 1943 */
1728 1944
1729 /* 1945 /*
1730 * Handle zero level expression. 1946 * Handle zero level expression.
1731 * This calls eval1() and handles error message and nextcmd. 1947 * This calls eval1() and handles error message and nextcmd.
1948 * Put the result in "rettv" when returning OK and "evaluate" is TRUE.
1732 * Return OK or FAIL. 1949 * Return OK or FAIL.
1733 */ 1950 */
1734 static int 1951 static int
1735 eval0(arg, retvar, nextcmd, evaluate) 1952 eval0(arg, rettv, nextcmd, evaluate)
1736 char_u *arg; 1953 char_u *arg;
1737 VAR retvar; 1954 typeval *rettv;
1738 char_u **nextcmd; 1955 char_u **nextcmd;
1739 int evaluate; 1956 int evaluate;
1740 { 1957 {
1741 int ret; 1958 int ret;
1742 char_u *p; 1959 char_u *p;
1743 1960
1744 p = skipwhite(arg); 1961 p = skipwhite(arg);
1745 ret = eval1(&p, &retvar->tv, evaluate); 1962 ret = eval1(&p, rettv, evaluate);
1746 if (ret == FAIL || !ends_excmd(*p)) 1963 if (ret == FAIL || !ends_excmd(*p))
1747 { 1964 {
1748 if (ret != FAIL) 1965 if (ret != FAIL)
1749 clear_vartv(&retvar->tv); 1966 clear_tv(rettv);
1750 /* 1967 /*
1751 * Report the invalid expression unless the expression evaluation has 1968 * Report the invalid expression unless the expression evaluation has
1752 * been cancelled due to an aborting error, an interrupt, or an 1969 * been cancelled due to an aborting error, an interrupt, or an
1753 * exception. 1970 * exception.
1754 */ 1971 */
1770 * "arg" is advanced to the next non-white after the recognized expression. 1987 * "arg" is advanced to the next non-white after the recognized expression.
1771 * 1988 *
1772 * Return OK or FAIL. 1989 * Return OK or FAIL.
1773 */ 1990 */
1774 static int 1991 static int
1775 eval1(arg, retvar, evaluate) 1992 eval1(arg, rettv, evaluate)
1776 char_u **arg; 1993 char_u **arg;
1777 typeval *retvar; 1994 typeval *rettv;
1778 int evaluate; 1995 int evaluate;
1779 { 1996 {
1780 int result; 1997 int result;
1781 typeval var2; 1998 typeval var2;
1782 1999
1783 /* 2000 /*
1784 * Get the first variable. 2001 * Get the first variable.
1785 */ 2002 */
1786 if (eval2(arg, retvar, evaluate) == FAIL) 2003 if (eval2(arg, rettv, evaluate) == FAIL)
1787 return FAIL; 2004 return FAIL;
1788 2005
1789 if ((*arg)[0] == '?') 2006 if ((*arg)[0] == '?')
1790 { 2007 {
1791 result = FALSE; 2008 result = FALSE;
1792 if (evaluate) 2009 if (evaluate)
1793 { 2010 {
1794 if (get_vartv_number(retvar) != 0) 2011 if (get_tv_number(rettv) != 0)
1795 result = TRUE; 2012 result = TRUE;
1796 clear_vartv(retvar); 2013 clear_tv(rettv);
1797 } 2014 }
1798 2015
1799 /* 2016 /*
1800 * Get the second variable. 2017 * Get the second variable.
1801 */ 2018 */
1802 *arg = skipwhite(*arg + 1); 2019 *arg = skipwhite(*arg + 1);
1803 if (eval1(arg, retvar, evaluate && result) == FAIL) /* recursive! */ 2020 if (eval1(arg, rettv, evaluate && result) == FAIL) /* recursive! */
1804 return FAIL; 2021 return FAIL;
1805 2022
1806 /* 2023 /*
1807 * Check for the ":". 2024 * Check for the ":".
1808 */ 2025 */
1809 if ((*arg)[0] != ':') 2026 if ((*arg)[0] != ':')
1810 { 2027 {
1811 EMSG(_("E109: Missing ':' after '?'")); 2028 EMSG(_("E109: Missing ':' after '?'"));
1812 if (evaluate && result) 2029 if (evaluate && result)
1813 clear_vartv(retvar); 2030 clear_tv(rettv);
1814 return FAIL; 2031 return FAIL;
1815 } 2032 }
1816 2033
1817 /* 2034 /*
1818 * Get the third variable. 2035 * Get the third variable.
1819 */ 2036 */
1820 *arg = skipwhite(*arg + 1); 2037 *arg = skipwhite(*arg + 1);
1821 if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */ 2038 if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */
1822 { 2039 {
1823 if (evaluate && result) 2040 if (evaluate && result)
1824 clear_vartv(retvar); 2041 clear_tv(rettv);
1825 return FAIL; 2042 return FAIL;
1826 } 2043 }
1827 if (evaluate && !result) 2044 if (evaluate && !result)
1828 *retvar = var2; 2045 *rettv = var2;
1829 } 2046 }
1830 2047
1831 return OK; 2048 return OK;
1832 } 2049 }
1833 2050
1839 * "arg" is advanced to the next non-white after the recognized expression. 2056 * "arg" is advanced to the next non-white after the recognized expression.
1840 * 2057 *
1841 * Return OK or FAIL. 2058 * Return OK or FAIL.
1842 */ 2059 */
1843 static int 2060 static int
1844 eval2(arg, retvar, evaluate) 2061 eval2(arg, rettv, evaluate)
1845 char_u **arg; 2062 char_u **arg;
1846 typeval *retvar; 2063 typeval *rettv;
1847 int evaluate; 2064 int evaluate;
1848 { 2065 {
1849 typeval var2; 2066 typeval var2;
1850 long result; 2067 long result;
1851 int first; 2068 int first;
1852 2069
1853 /* 2070 /*
1854 * Get the first variable. 2071 * Get the first variable.
1855 */ 2072 */
1856 if (eval3(arg, retvar, evaluate) == FAIL) 2073 if (eval3(arg, rettv, evaluate) == FAIL)
1857 return FAIL; 2074 return FAIL;
1858 2075
1859 /* 2076 /*
1860 * Repeat until there is no following "||". 2077 * Repeat until there is no following "||".
1861 */ 2078 */
1863 result = FALSE; 2080 result = FALSE;
1864 while ((*arg)[0] == '|' && (*arg)[1] == '|') 2081 while ((*arg)[0] == '|' && (*arg)[1] == '|')
1865 { 2082 {
1866 if (evaluate && first) 2083 if (evaluate && first)
1867 { 2084 {
1868 if (get_vartv_number(retvar) != 0) 2085 if (get_tv_number(rettv) != 0)
1869 result = TRUE; 2086 result = TRUE;
1870 clear_vartv(retvar); 2087 clear_tv(rettv);
1871 first = FALSE; 2088 first = FALSE;
1872 } 2089 }
1873 2090
1874 /* 2091 /*
1875 * Get the second variable. 2092 * Get the second variable.
1881 /* 2098 /*
1882 * Compute the result. 2099 * Compute the result.
1883 */ 2100 */
1884 if (evaluate && !result) 2101 if (evaluate && !result)
1885 { 2102 {
1886 if (get_vartv_number(&var2) != 0) 2103 if (get_tv_number(&var2) != 0)
1887 result = TRUE; 2104 result = TRUE;
1888 clear_vartv(&var2); 2105 clear_tv(&var2);
1889 } 2106 }
1890 if (evaluate) 2107 if (evaluate)
1891 { 2108 {
1892 retvar->v_type = VAR_NUMBER; 2109 rettv->v_type = VAR_NUMBER;
1893 retvar->vval.v_number = result; 2110 rettv->vval.v_number = result;
1894 } 2111 }
1895 } 2112 }
1896 2113
1897 return OK; 2114 return OK;
1898 } 2115 }
1905 * "arg" is advanced to the next non-white after the recognized expression. 2122 * "arg" is advanced to the next non-white after the recognized expression.
1906 * 2123 *
1907 * Return OK or FAIL. 2124 * Return OK or FAIL.
1908 */ 2125 */
1909 static int 2126 static int
1910 eval3(arg, retvar, evaluate) 2127 eval3(arg, rettv, evaluate)
1911 char_u **arg; 2128 char_u **arg;
1912 typeval *retvar; 2129 typeval *rettv;
1913 int evaluate; 2130 int evaluate;
1914 { 2131 {
1915 typeval var2; 2132 typeval var2;
1916 long result; 2133 long result;
1917 int first; 2134 int first;
1918 2135
1919 /* 2136 /*
1920 * Get the first variable. 2137 * Get the first variable.
1921 */ 2138 */
1922 if (eval4(arg, retvar, evaluate) == FAIL) 2139 if (eval4(arg, rettv, evaluate) == FAIL)
1923 return FAIL; 2140 return FAIL;
1924 2141
1925 /* 2142 /*
1926 * Repeat until there is no following "&&". 2143 * Repeat until there is no following "&&".
1927 */ 2144 */
1929 result = TRUE; 2146 result = TRUE;
1930 while ((*arg)[0] == '&' && (*arg)[1] == '&') 2147 while ((*arg)[0] == '&' && (*arg)[1] == '&')
1931 { 2148 {
1932 if (evaluate && first) 2149 if (evaluate && first)
1933 { 2150 {
1934 if (get_vartv_number(retvar) == 0) 2151 if (get_tv_number(rettv) == 0)
1935 result = FALSE; 2152 result = FALSE;
1936 clear_vartv(retvar); 2153 clear_tv(rettv);
1937 first = FALSE; 2154 first = FALSE;
1938 } 2155 }
1939 2156
1940 /* 2157 /*
1941 * Get the second variable. 2158 * Get the second variable.
1947 /* 2164 /*
1948 * Compute the result. 2165 * Compute the result.
1949 */ 2166 */
1950 if (evaluate && result) 2167 if (evaluate && result)
1951 { 2168 {
1952 if (get_vartv_number(&var2) == 0) 2169 if (get_tv_number(&var2) == 0)
1953 result = FALSE; 2170 result = FALSE;
1954 clear_vartv(&var2); 2171 clear_tv(&var2);
1955 } 2172 }
1956 if (evaluate) 2173 if (evaluate)
1957 { 2174 {
1958 retvar->v_type = VAR_NUMBER; 2175 rettv->v_type = VAR_NUMBER;
1959 retvar->vval.v_number = result; 2176 rettv->vval.v_number = result;
1960 } 2177 }
1961 } 2178 }
1962 2179
1963 return OK; 2180 return OK;
1964 } 2181 }
1978 * "arg" is advanced to the next non-white after the recognized expression. 2195 * "arg" is advanced to the next non-white after the recognized expression.
1979 * 2196 *
1980 * Return OK or FAIL. 2197 * Return OK or FAIL.
1981 */ 2198 */
1982 static int 2199 static int
1983 eval4(arg, retvar, evaluate) 2200 eval4(arg, rettv, evaluate)
1984 char_u **arg; 2201 char_u **arg;
1985 typeval *retvar; 2202 typeval *rettv;
1986 int evaluate; 2203 int evaluate;
1987 { 2204 {
1988 typeval var2; 2205 typeval var2;
1989 char_u *p; 2206 char_u *p;
1990 int i; 2207 int i;
1998 char_u *save_cpo; 2215 char_u *save_cpo;
1999 2216
2000 /* 2217 /*
2001 * Get the first variable. 2218 * Get the first variable.
2002 */ 2219 */
2003 if (eval5(arg, retvar, evaluate) == FAIL) 2220 if (eval5(arg, rettv, evaluate) == FAIL)
2004 return FAIL; 2221 return FAIL;
2005 2222
2006 p = *arg; 2223 p = *arg;
2007 switch (p[0]) 2224 switch (p[0])
2008 { 2225 {
2059 * Get the second variable. 2276 * Get the second variable.
2060 */ 2277 */
2061 *arg = skipwhite(p + len); 2278 *arg = skipwhite(p + len);
2062 if (eval5(arg, &var2, evaluate) == FAIL) 2279 if (eval5(arg, &var2, evaluate) == FAIL)
2063 { 2280 {
2064 clear_vartv(retvar); 2281 clear_tv(rettv);
2065 return FAIL; 2282 return FAIL;
2066 } 2283 }
2067 2284
2068 if (evaluate) 2285 if (evaluate)
2069 { 2286 {
2070 /* 2287 /*
2071 * If one of the two variables is a number, compare as a number. 2288 * If one of the two variables is a number, compare as a number.
2072 * When using "=~" or "!~", always compare as string. 2289 * When using "=~" or "!~", always compare as string.
2073 */ 2290 */
2074 if ((retvar->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER) 2291 if ((rettv->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
2075 && type != TYPE_MATCH && type != TYPE_NOMATCH) 2292 && type != TYPE_MATCH && type != TYPE_NOMATCH)
2076 { 2293 {
2077 n1 = get_vartv_number(retvar); 2294 n1 = get_tv_number(rettv);
2078 n2 = get_vartv_number(&var2); 2295 n2 = get_tv_number(&var2);
2079 switch (type) 2296 switch (type)
2080 { 2297 {
2081 case TYPE_EQUAL: n1 = (n1 == n2); break; 2298 case TYPE_EQUAL: n1 = (n1 == n2); break;
2082 case TYPE_NEQUAL: n1 = (n1 != n2); break; 2299 case TYPE_NEQUAL: n1 = (n1 != n2); break;
2083 case TYPE_GREATER: n1 = (n1 > n2); break; 2300 case TYPE_GREATER: n1 = (n1 > n2); break;
2089 case TYPE_NOMATCH: break; /* avoid gcc warning */ 2306 case TYPE_NOMATCH: break; /* avoid gcc warning */
2090 } 2307 }
2091 } 2308 }
2092 else 2309 else
2093 { 2310 {
2094 s1 = get_vartv_string_buf(retvar, buf1); 2311 s1 = get_tv_string_buf(rettv, buf1);
2095 s2 = get_vartv_string_buf(&var2, buf2); 2312 s2 = get_tv_string_buf(&var2, buf2);
2096 if (type != TYPE_MATCH && type != TYPE_NOMATCH) 2313 if (type != TYPE_MATCH && type != TYPE_NOMATCH)
2097 i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2); 2314 i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2);
2098 else 2315 else
2099 i = 0; 2316 i = 0;
2100 n1 = FALSE; 2317 n1 = FALSE;
2126 break; 2343 break;
2127 2344
2128 case TYPE_UNKNOWN: break; /* avoid gcc warning */ 2345 case TYPE_UNKNOWN: break; /* avoid gcc warning */
2129 } 2346 }
2130 } 2347 }
2131 clear_vartv(retvar); 2348 clear_tv(rettv);
2132 clear_vartv(&var2); 2349 clear_tv(&var2);
2133 retvar->v_type = VAR_NUMBER; 2350 rettv->v_type = VAR_NUMBER;
2134 retvar->vval.v_number = n1; 2351 rettv->vval.v_number = n1;
2135 } 2352 }
2136 } 2353 }
2137 2354
2138 return OK; 2355 return OK;
2139 } 2356 }
2148 * "arg" is advanced to the next non-white after the recognized expression. 2365 * "arg" is advanced to the next non-white after the recognized expression.
2149 * 2366 *
2150 * Return OK or FAIL. 2367 * Return OK or FAIL.
2151 */ 2368 */
2152 static int 2369 static int
2153 eval5(arg, retvar, evaluate) 2370 eval5(arg, rettv, evaluate)
2154 char_u **arg; 2371 char_u **arg;
2155 typeval *retvar; 2372 typeval *rettv;
2156 int evaluate; 2373 int evaluate;
2157 { 2374 {
2158 typeval var2; 2375 typeval var2;
2159 int op; 2376 int op;
2160 long n1, n2; 2377 long n1, n2;
2163 char_u *p; 2380 char_u *p;
2164 2381
2165 /* 2382 /*
2166 * Get the first variable. 2383 * Get the first variable.
2167 */ 2384 */
2168 if (eval6(arg, retvar, evaluate) == FAIL) 2385 if (eval6(arg, rettv, evaluate) == FAIL)
2169 return FAIL; 2386 return FAIL;
2170 2387
2171 /* 2388 /*
2172 * Repeat computing, until no '+', '-' or '.' is following. 2389 * Repeat computing, until no '+', '-' or '.' is following.
2173 */ 2390 */
2181 * Get the second variable. 2398 * Get the second variable.
2182 */ 2399 */
2183 *arg = skipwhite(*arg + 1); 2400 *arg = skipwhite(*arg + 1);
2184 if (eval6(arg, &var2, evaluate) == FAIL) 2401 if (eval6(arg, &var2, evaluate) == FAIL)
2185 { 2402 {
2186 clear_vartv(retvar); 2403 clear_tv(rettv);
2187 return FAIL; 2404 return FAIL;
2188 } 2405 }
2189 2406
2190 if (evaluate) 2407 if (evaluate)
2191 { 2408 {
2192 /* 2409 /*
2193 * Compute the result. 2410 * Compute the result.
2194 */ 2411 */
2195 if (op == '.') 2412 if (op == '.')
2196 { 2413 {
2197 s1 = get_vartv_string_buf(retvar, buf1); 2414 s1 = get_tv_string_buf(rettv, buf1);
2198 s2 = get_vartv_string_buf(&var2, buf2); 2415 s2 = get_tv_string_buf(&var2, buf2);
2199 op = (int)STRLEN(s1); 2416 op = (int)STRLEN(s1);
2200 p = alloc((unsigned)(op + STRLEN(s2) + 1)); 2417 p = alloc((unsigned)(op + STRLEN(s2) + 1));
2201 if (p != NULL) 2418 if (p != NULL)
2202 { 2419 {
2203 STRCPY(p, s1); 2420 STRCPY(p, s1);
2204 STRCPY(p + op, s2); 2421 STRCPY(p + op, s2);
2205 } 2422 }
2206 clear_vartv(retvar); 2423 clear_tv(rettv);
2207 retvar->v_type = VAR_STRING; 2424 rettv->v_type = VAR_STRING;
2208 retvar->vval.v_string = p; 2425 rettv->vval.v_string = p;
2209 } 2426 }
2210 else 2427 else
2211 { 2428 {
2212 n1 = get_vartv_number(retvar); 2429 n1 = get_tv_number(rettv);
2213 n2 = get_vartv_number(&var2); 2430 n2 = get_tv_number(&var2);
2214 clear_vartv(retvar); 2431 clear_tv(rettv);
2215 if (op == '+') 2432 if (op == '+')
2216 n1 = n1 + n2; 2433 n1 = n1 + n2;
2217 else 2434 else
2218 n1 = n1 - n2; 2435 n1 = n1 - n2;
2219 retvar->v_type = VAR_NUMBER; 2436 rettv->v_type = VAR_NUMBER;
2220 retvar->vval.v_number = n1; 2437 rettv->vval.v_number = n1;
2221 } 2438 }
2222 clear_vartv(&var2); 2439 clear_tv(&var2);
2223 } 2440 }
2224 } 2441 }
2225 return OK; 2442 return OK;
2226 } 2443 }
2227 2444
2235 * "arg" is advanced to the next non-white after the recognized expression. 2452 * "arg" is advanced to the next non-white after the recognized expression.
2236 * 2453 *
2237 * Return OK or FAIL. 2454 * Return OK or FAIL.
2238 */ 2455 */
2239 static int 2456 static int
2240 eval6(arg, retvar, evaluate) 2457 eval6(arg, rettv, evaluate)
2241 char_u **arg; 2458 char_u **arg;
2242 typeval *retvar; 2459 typeval *rettv;
2243 int evaluate; 2460 int evaluate;
2244 { 2461 {
2245 typeval var2; 2462 typeval var2;
2246 int op; 2463 int op;
2247 long n1, n2; 2464 long n1, n2;
2248 2465
2249 /* 2466 /*
2250 * Get the first variable. 2467 * Get the first variable.
2251 */ 2468 */
2252 if (eval7(arg, retvar, evaluate) == FAIL) 2469 if (eval7(arg, rettv, evaluate) == FAIL)
2253 return FAIL; 2470 return FAIL;
2254 2471
2255 /* 2472 /*
2256 * Repeat computing, until no '*', '/' or '%' is following. 2473 * Repeat computing, until no '*', '/' or '%' is following.
2257 */ 2474 */
2261 if (op != '*' && op != '/' && op != '%') 2478 if (op != '*' && op != '/' && op != '%')
2262 break; 2479 break;
2263 2480
2264 if (evaluate) 2481 if (evaluate)
2265 { 2482 {
2266 n1 = get_vartv_number(retvar); 2483 n1 = get_tv_number(rettv);
2267 clear_vartv(retvar); 2484 clear_tv(rettv);
2268 } 2485 }
2269 else 2486 else
2270 n1 = 0; 2487 n1 = 0;
2271 2488
2272 /* 2489 /*
2276 if (eval7(arg, &var2, evaluate) == FAIL) 2493 if (eval7(arg, &var2, evaluate) == FAIL)
2277 return FAIL; 2494 return FAIL;
2278 2495
2279 if (evaluate) 2496 if (evaluate)
2280 { 2497 {
2281 n2 = get_vartv_number(&var2); 2498 n2 = get_tv_number(&var2);
2282 clear_vartv(&var2); 2499 clear_tv(&var2);
2283 2500
2284 /* 2501 /*
2285 * Compute the result. 2502 * Compute the result.
2286 */ 2503 */
2287 if (op == '*') 2504 if (op == '*')
2298 if (n2 == 0) /* give an error message? */ 2515 if (n2 == 0) /* give an error message? */
2299 n1 = 0; 2516 n1 = 0;
2300 else 2517 else
2301 n1 = n1 % n2; 2518 n1 = n1 % n2;
2302 } 2519 }
2303 retvar->v_type = VAR_NUMBER; 2520 rettv->v_type = VAR_NUMBER;
2304 retvar->vval.v_number = n1; 2521 rettv->vval.v_number = n1;
2305 } 2522 }
2306 } 2523 }
2307 2524
2308 return OK; 2525 return OK;
2309 } 2526 }
2330 * "arg" is advanced to the next non-white after the recognized expression. 2547 * "arg" is advanced to the next non-white after the recognized expression.
2331 * 2548 *
2332 * Return OK or FAIL. 2549 * Return OK or FAIL.
2333 */ 2550 */
2334 static int 2551 static int
2335 eval7(arg, retvar, evaluate) 2552 eval7(arg, rettv, evaluate)
2336 char_u **arg; 2553 char_u **arg;
2337 typeval *retvar; 2554 typeval *rettv;
2338 int evaluate; 2555 int evaluate;
2339 { 2556 {
2340 long n; 2557 long n;
2341 int len; 2558 int len;
2342 char_u *s; 2559 char_u *s;
2344 char_u *start_leader, *end_leader; 2561 char_u *start_leader, *end_leader;
2345 int ret = OK; 2562 int ret = OK;
2346 char_u *alias; 2563 char_u *alias;
2347 2564
2348 /* 2565 /*
2349 * Initialise variable so that clear_vartv() can't mistake this for a 2566 * Initialise variable so that clear_tv() can't mistake this for a
2350 * string and free a string that isn't there. 2567 * string and free a string that isn't there.
2351 */ 2568 */
2352 retvar->v_type = VAR_UNKNOWN; 2569 rettv->v_type = VAR_UNKNOWN;
2353 2570
2354 /* 2571 /*
2355 * Skip '!' and '-' characters. They are handled later. 2572 * Skip '!' and '-' characters. They are handled later.
2356 */ 2573 */
2357 start_leader = *arg; 2574 start_leader = *arg;
2376 case '9': 2593 case '9':
2377 vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL); 2594 vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL);
2378 *arg += len; 2595 *arg += len;
2379 if (evaluate) 2596 if (evaluate)
2380 { 2597 {
2381 retvar->v_type = VAR_NUMBER; 2598 rettv->v_type = VAR_NUMBER;
2382 retvar->vval.v_number = n; 2599 rettv->vval.v_number = n;
2383 } 2600 }
2384 break; 2601 break;
2385 2602
2386 /* 2603 /*
2387 * String constant: "string". 2604 * String constant: "string".
2388 */ 2605 */
2389 case '"': ret = get_string_vartv(arg, retvar, evaluate); 2606 case '"': ret = get_string_tv(arg, rettv, evaluate);
2390 break; 2607 break;
2391 2608
2392 /* 2609 /*
2393 * Literal string constant: 'string'. 2610 * Literal string constant: 'string'.
2394 */ 2611 */
2395 case '\'': ret = get_lit_string_vartv(arg, retvar, evaluate); 2612 case '\'': ret = get_lit_string_tv(arg, rettv, evaluate);
2396 break; 2613 break;
2397 2614
2398 /* 2615 /*
2399 * List: [expr, expr] 2616 * List: [expr, expr]
2400 */ 2617 */
2401 case '[': ret = get_list_vartv(arg, retvar, evaluate); 2618 case '[': ret = get_list_tv(arg, rettv, evaluate);
2402 break; 2619 break;
2403 2620
2404 /* 2621 /*
2405 * Option value: &name 2622 * Option value: &name
2406 */ 2623 */
2407 case '&': ret = get_option_vartv(arg, retvar, evaluate); 2624 case '&': ret = get_option_tv(arg, rettv, evaluate);
2408 break; 2625 break;
2409 2626
2410 /* 2627 /*
2411 * Environment variable: $VAR. 2628 * Environment variable: $VAR.
2412 */ 2629 */
2413 case '$': ret = get_env_vartv(arg, retvar, evaluate); 2630 case '$': ret = get_env_tv(arg, rettv, evaluate);
2414 break; 2631 break;
2415 2632
2416 /* 2633 /*
2417 * Register contents: @r. 2634 * Register contents: @r.
2418 */ 2635 */
2419 case '@': ++*arg; 2636 case '@': ++*arg;
2420 if (evaluate) 2637 if (evaluate)
2421 { 2638 {
2422 retvar->v_type = VAR_STRING; 2639 rettv->v_type = VAR_STRING;
2423 retvar->vval.v_string = get_reg_contents(**arg, FALSE); 2640 rettv->vval.v_string = get_reg_contents(**arg, FALSE);
2424 } 2641 }
2425 if (**arg != NUL) 2642 if (**arg != NUL)
2426 ++*arg; 2643 ++*arg;
2427 break; 2644 break;
2428 2645
2429 /* 2646 /*
2430 * nested expression: (expression). 2647 * nested expression: (expression).
2431 */ 2648 */
2432 case '(': *arg = skipwhite(*arg + 1); 2649 case '(': *arg = skipwhite(*arg + 1);
2433 ret = eval1(arg, retvar, evaluate); /* recursive! */ 2650 ret = eval1(arg, rettv, evaluate); /* recursive! */
2434 if (**arg == ')') 2651 if (**arg == ')')
2435 ++*arg; 2652 ++*arg;
2436 else if (ret == OK) 2653 else if (ret == OK)
2437 { 2654 {
2438 EMSG(_("E110: Missing ')'")); 2655 EMSG(_("E110: Missing ')'"));
2439 clear_vartv(retvar); 2656 clear_tv(rettv);
2440 ret = FAIL; 2657 ret = FAIL;
2441 } 2658 }
2442 break; 2659 break;
2443 2660
2444 /* 2661 /*
2458 /* If "s" is the name of a variable of type VAR_FUNC 2675 /* If "s" is the name of a variable of type VAR_FUNC
2459 * use its contents. */ 2676 * use its contents. */
2460 s = deref_func_name(s, &len); 2677 s = deref_func_name(s, &len);
2461 2678
2462 /* Invoke the function. */ 2679 /* Invoke the function. */
2463 ret = get_func_vartv(s, len, retvar, arg, 2680 ret = get_func_tv(s, len, rettv, arg,
2464 curwin->w_cursor.lnum, curwin->w_cursor.lnum, 2681 curwin->w_cursor.lnum, curwin->w_cursor.lnum,
2465 &len, evaluate); 2682 &len, evaluate);
2466 /* Stop the expression evaluation when immediately 2683 /* Stop the expression evaluation when immediately
2467 * aborting on error, or when an interrupt occurred or 2684 * aborting on error, or when an interrupt occurred or
2468 * an exception was thrown but not caught. */ 2685 * an exception was thrown but not caught. */
2469 if (aborting()) 2686 if (aborting())
2470 { 2687 {
2471 if (ret == OK) 2688 if (ret == OK)
2472 clear_vartv(retvar); 2689 clear_tv(rettv);
2473 ret = FAIL; 2690 ret = FAIL;
2474 } 2691 }
2475 } 2692 }
2476 else if (evaluate) 2693 else if (evaluate)
2477 ret = get_var_vartv(s, len, retvar); 2694 ret = get_var_tv(s, len, rettv);
2478 } 2695 }
2479 2696
2480 if (alias != NULL) 2697 if (alias != NULL)
2481 vim_free(alias); 2698 vim_free(alias);
2482 2699
2487 /* 2704 /*
2488 * Handle expr[expr] and expr[expr:expr] subscript. 2705 * Handle expr[expr] and expr[expr:expr] subscript.
2489 */ 2706 */
2490 while (**arg == '[' && ret == OK) 2707 while (**arg == '[' && ret == OK)
2491 { 2708 {
2492 if (eval_index(arg, retvar, evaluate) == FAIL) 2709 if (eval_index(arg, rettv, evaluate) == FAIL)
2493 { 2710 {
2494 clear_vartv(retvar); 2711 clear_tv(rettv);
2495 return FAIL; 2712 return FAIL;
2496 } 2713 }
2497 } 2714 }
2498 2715
2499 /* 2716 /*
2500 * Apply logical NOT and unary '-', from right to left, ignore '+'. 2717 * Apply logical NOT and unary '-', from right to left, ignore '+'.
2501 */ 2718 */
2502 if (ret == OK && evaluate && end_leader > start_leader) 2719 if (ret == OK && evaluate && end_leader > start_leader)
2503 { 2720 {
2504 val = get_vartv_number(retvar); 2721 val = get_tv_number(rettv);
2505 while (end_leader > start_leader) 2722 while (end_leader > start_leader)
2506 { 2723 {
2507 --end_leader; 2724 --end_leader;
2508 if (*end_leader == '!') 2725 if (*end_leader == '!')
2509 val = !val; 2726 val = !val;
2510 else if (*end_leader == '-') 2727 else if (*end_leader == '-')
2511 val = -val; 2728 val = -val;
2512 } 2729 }
2513 clear_vartv(retvar); 2730 clear_tv(rettv);
2514 retvar->v_type = VAR_NUMBER; 2731 rettv->v_type = VAR_NUMBER;
2515 retvar->vval.v_number = val; 2732 rettv->vval.v_number = val;
2516 } 2733 }
2517 2734
2518 return ret; 2735 return ret;
2519 } 2736 }
2520 2737
2522 * Evaluate an "[expr]" or "[expr:expr]" index. 2739 * Evaluate an "[expr]" or "[expr:expr]" index.
2523 * "*arg" points to the '['. 2740 * "*arg" points to the '['.
2524 * Returns FAIL or OK. "*arg" is advanced to after the ']'. 2741 * Returns FAIL or OK. "*arg" is advanced to after the ']'.
2525 */ 2742 */
2526 static int 2743 static int
2527 eval_index(arg, retvar, evaluate) 2744 eval_index(arg, rettv, evaluate)
2528 char_u **arg; 2745 char_u **arg;
2529 typeval *retvar; 2746 typeval *rettv;
2530 int evaluate; 2747 int evaluate;
2531 { 2748 {
2532 int empty1 = FALSE, empty2 = FALSE; 2749 int empty1 = FALSE, empty2 = FALSE;
2533 typeval var1, var2; 2750 typeval var1, var2;
2534 long n1, n2 = 0; 2751 long n1, n2 = 0;
2535 long len; 2752 long len;
2536 int range; 2753 int range;
2537 char_u *s; 2754 char_u *s;
2538 2755
2539 if (retvar->v_type == VAR_FUNC) 2756 if (rettv->v_type == VAR_FUNC)
2540 { 2757 {
2541 EMSG(_("E999: Cannot index a Funcref")); 2758 EMSG(_("E999: Cannot index a Funcref"));
2542 return FAIL; 2759 return FAIL;
2543 } 2760 }
2544 2761
2560 *arg = skipwhite(*arg + 1); 2777 *arg = skipwhite(*arg + 1);
2561 if (**arg == ']') 2778 if (**arg == ']')
2562 empty2 = TRUE; 2779 empty2 = TRUE;
2563 else if (eval1(arg, &var2, evaluate) == FAIL) /* recursive! */ 2780 else if (eval1(arg, &var2, evaluate) == FAIL) /* recursive! */
2564 { 2781 {
2565 clear_vartv(&var1); 2782 clear_tv(&var1);
2566 return FAIL; 2783 return FAIL;
2567 } 2784 }
2568 } 2785 }
2569 else 2786 else
2570 range = FALSE; 2787 range = FALSE;
2571 2788
2572 /* Check for the ']'. */ 2789 /* Check for the ']'. */
2573 if (**arg != ']') 2790 if (**arg != ']')
2574 { 2791 {
2575 EMSG(_("E111: Missing ']'")); 2792 EMSG(_(e_missbrac));
2576 clear_vartv(&var1); 2793 clear_tv(&var1);
2577 if (range) 2794 if (range)
2578 clear_vartv(&var2); 2795 clear_tv(&var2);
2579 return FAIL; 2796 return FAIL;
2580 } 2797 }
2581 2798
2582 if (evaluate) 2799 if (evaluate)
2583 { 2800 {
2584 if (empty1) 2801 if (empty1)
2585 n1 = 0; 2802 n1 = 0;
2586 else 2803 else
2587 { 2804 {
2588 n1 = get_vartv_number(&var1); 2805 n1 = get_tv_number(&var1);
2589 clear_vartv(&var1); 2806 clear_tv(&var1);
2590 } 2807 }
2591 if (range) 2808 if (range)
2592 { 2809 {
2593 if (empty2) 2810 if (empty2)
2594 n2 = -1; 2811 n2 = -1;
2595 else 2812 else
2596 { 2813 {
2597 n2 = get_vartv_number(&var2); 2814 n2 = get_tv_number(&var2);
2598 clear_vartv(&var2); 2815 clear_tv(&var2);
2599 } 2816 }
2600 } 2817 }
2601 2818
2602 switch (retvar->v_type) 2819 switch (rettv->v_type)
2603 { 2820 {
2604 case VAR_NUMBER: 2821 case VAR_NUMBER:
2605 case VAR_STRING: 2822 case VAR_STRING:
2606 s = get_vartv_string(retvar); 2823 s = get_tv_string(rettv);
2607 len = (long)STRLEN(s); 2824 len = (long)STRLEN(s);
2608 if (range) 2825 if (range)
2609 { 2826 {
2610 /* The resulting variable is a substring. If the indexes 2827 /* The resulting variable is a substring. If the indexes
2611 * are out of range the result is empty. */ 2828 * are out of range the result is empty. */
2632 if (n1 >= len || n1 < 0) 2849 if (n1 >= len || n1 < 0)
2633 s = NULL; 2850 s = NULL;
2634 else 2851 else
2635 s = vim_strnsave(s + n1, 1); 2852 s = vim_strnsave(s + n1, 1);
2636 } 2853 }
2637 clear_vartv(retvar); 2854 clear_tv(rettv);
2638 retvar->v_type = VAR_STRING; 2855 rettv->v_type = VAR_STRING;
2639 retvar->vval.v_string = s; 2856 rettv->vval.v_string = s;
2640 break; 2857 break;
2641 2858
2642 case VAR_LIST: 2859 case VAR_LIST:
2643 len = list_len(retvar->vval.v_list); 2860 len = list_len(rettv->vval.v_list);
2644 if (n1 < 0) 2861 if (n1 < 0)
2645 n1 = len + n1; 2862 n1 = len + n1;
2646 if (!empty1 && (n1 < 0 || n1 >= len)) 2863 if (!empty1 && (n1 < 0 || n1 >= len))
2647 { 2864 {
2648 EMSGN(_(e_listidx), n1); 2865 EMSGN(_(e_listidx), n1);
2661 return FAIL; 2878 return FAIL;
2662 } 2879 }
2663 l = list_alloc(); 2880 l = list_alloc();
2664 if (l == NULL) 2881 if (l == NULL)
2665 return FAIL; 2882 return FAIL;
2666 for (item = list_find(retvar->vval.v_list, n1); 2883 for (item = list_find(rettv->vval.v_list, n1);
2667 n1 <= n2; ++n1) 2884 n1 <= n2; ++n1)
2668 { 2885 {
2669 if (list_append_tv(l, &item->li_tv) == FAIL) 2886 if (list_append_tv(l, &item->li_tv) == FAIL)
2670 { 2887 {
2671 list_free(l); 2888 list_free(l);
2672 return FAIL; 2889 return FAIL;
2673 } 2890 }
2674 item = item->li_next; 2891 item = item->li_next;
2675 } 2892 }
2676 clear_vartv(retvar); 2893 clear_tv(rettv);
2677 retvar->v_type = VAR_LIST; 2894 rettv->v_type = VAR_LIST;
2678 retvar->vval.v_list = l; 2895 rettv->vval.v_list = l;
2679 } 2896 }
2680 else 2897 else
2681 { 2898 {
2682 copy_vartv(&list_find(retvar->vval.v_list, n1)->li_tv, 2899 copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv,
2683 &var1); 2900 &var1);
2684 clear_vartv(retvar); 2901 clear_tv(rettv);
2685 *retvar = var1; 2902 *rettv = var1;
2686 } 2903 }
2687 break; 2904 break;
2688 } 2905 }
2689 } 2906 }
2690 2907
2697 * "arg" points to the '&' or '+' before the option name. 2914 * "arg" points to the '&' or '+' before the option name.
2698 * "arg" is advanced to character after the option name. 2915 * "arg" is advanced to character after the option name.
2699 * Return OK or FAIL. 2916 * Return OK or FAIL.
2700 */ 2917 */
2701 static int 2918 static int
2702 get_option_vartv(arg, retvar, evaluate) 2919 get_option_tv(arg, rettv, evaluate)
2703 char_u **arg; 2920 char_u **arg;
2704 typeval *retvar; /* when NULL, only check if option exists */ 2921 typeval *rettv; /* when NULL, only check if option exists */
2705 int evaluate; 2922 int evaluate;
2706 { 2923 {
2707 char_u *option_end; 2924 char_u *option_end;
2708 long numval; 2925 long numval;
2709 char_u *stringval; 2926 char_u *stringval;
2717 * Isolate the option name and find its value. 2934 * Isolate the option name and find its value.
2718 */ 2935 */
2719 option_end = find_option_end(arg, &opt_flags); 2936 option_end = find_option_end(arg, &opt_flags);
2720 if (option_end == NULL) 2937 if (option_end == NULL)
2721 { 2938 {
2722 if (retvar != NULL) 2939 if (rettv != NULL)
2723 EMSG2(_("E112: Option name missing: %s"), *arg); 2940 EMSG2(_("E112: Option name missing: %s"), *arg);
2724 return FAIL; 2941 return FAIL;
2725 } 2942 }
2726 2943
2727 if (!evaluate) 2944 if (!evaluate)
2731 } 2948 }
2732 2949
2733 c = *option_end; 2950 c = *option_end;
2734 *option_end = NUL; 2951 *option_end = NUL;
2735 opt_type = get_option_value(*arg, &numval, 2952 opt_type = get_option_value(*arg, &numval,
2736 retvar == NULL ? NULL : &stringval, opt_flags); 2953 rettv == NULL ? NULL : &stringval, opt_flags);
2737 2954
2738 if (opt_type == -3) /* invalid name */ 2955 if (opt_type == -3) /* invalid name */
2739 { 2956 {
2740 if (retvar != NULL) 2957 if (rettv != NULL)
2741 EMSG2(_("E113: Unknown option: %s"), *arg); 2958 EMSG2(_("E113: Unknown option: %s"), *arg);
2742 ret = FAIL; 2959 ret = FAIL;
2743 } 2960 }
2744 else if (retvar != NULL) 2961 else if (rettv != NULL)
2745 { 2962 {
2746 if (opt_type == -2) /* hidden string option */ 2963 if (opt_type == -2) /* hidden string option */
2747 { 2964 {
2748 retvar->v_type = VAR_STRING; 2965 rettv->v_type = VAR_STRING;
2749 retvar->vval.v_string = NULL; 2966 rettv->vval.v_string = NULL;
2750 } 2967 }
2751 else if (opt_type == -1) /* hidden number option */ 2968 else if (opt_type == -1) /* hidden number option */
2752 { 2969 {
2753 retvar->v_type = VAR_NUMBER; 2970 rettv->v_type = VAR_NUMBER;
2754 retvar->vval.v_number = 0; 2971 rettv->vval.v_number = 0;
2755 } 2972 }
2756 else if (opt_type == 1) /* number option */ 2973 else if (opt_type == 1) /* number option */
2757 { 2974 {
2758 retvar->v_type = VAR_NUMBER; 2975 rettv->v_type = VAR_NUMBER;
2759 retvar->vval.v_number = numval; 2976 rettv->vval.v_number = numval;
2760 } 2977 }
2761 else /* string option */ 2978 else /* string option */
2762 { 2979 {
2763 retvar->v_type = VAR_STRING; 2980 rettv->v_type = VAR_STRING;
2764 retvar->vval.v_string = stringval; 2981 rettv->vval.v_string = stringval;
2765 } 2982 }
2766 } 2983 }
2767 else if (working && (opt_type == -2 || opt_type == -1)) 2984 else if (working && (opt_type == -2 || opt_type == -1))
2768 ret = FAIL; 2985 ret = FAIL;
2769 2986
2776 /* 2993 /*
2777 * Allocate a variable for a string constant. 2994 * Allocate a variable for a string constant.
2778 * Return OK or FAIL. 2995 * Return OK or FAIL.
2779 */ 2996 */
2780 static int 2997 static int
2781 get_string_vartv(arg, retvar, evaluate) 2998 get_string_tv(arg, rettv, evaluate)
2782 char_u **arg; 2999 char_u **arg;
2783 typeval *retvar; 3000 typeval *rettv;
2784 int evaluate; 3001 int evaluate;
2785 { 3002 {
2786 char_u *p; 3003 char_u *p;
2787 char_u *name; 3004 char_u *name;
2788 int i; 3005 int i;
2921 #endif 3138 #endif
2922 } 3139 }
2923 name[i] = NUL; 3140 name[i] = NUL;
2924 *arg = p + 1; 3141 *arg = p + 1;
2925 3142
2926 retvar->v_type = VAR_STRING; 3143 rettv->v_type = VAR_STRING;
2927 retvar->vval.v_string = name; 3144 rettv->vval.v_string = name;
2928 3145
2929 return OK; 3146 return OK;
2930 } 3147 }
2931 3148
2932 /* 3149 /*
2933 * Allocate a variable for an backtick-string constant. 3150 * Allocate a variable for an backtick-string constant.
2934 * Return OK or FAIL. 3151 * Return OK or FAIL.
2935 */ 3152 */
2936 static int 3153 static int
2937 get_lit_string_vartv(arg, retvar, evaluate) 3154 get_lit_string_tv(arg, rettv, evaluate)
2938 char_u **arg; 3155 char_u **arg;
2939 typeval *retvar; 3156 typeval *rettv;
2940 int evaluate; 3157 int evaluate;
2941 { 3158 {
2942 char_u *p; 3159 char_u *p;
2943 char_u *name; 3160 char_u *name;
2944 3161
2959 */ 3176 */
2960 name = vim_strnsave(*arg + 1, (int)(p - (*arg + 1))); 3177 name = vim_strnsave(*arg + 1, (int)(p - (*arg + 1)));
2961 if (name == NULL) 3178 if (name == NULL)
2962 return FAIL; 3179 return FAIL;
2963 3180
2964 retvar->v_type = VAR_STRING; 3181 rettv->v_type = VAR_STRING;
2965 retvar->vval.v_string = name; 3182 rettv->vval.v_string = name;
2966 } 3183 }
2967 3184
2968 *arg = p + 1; 3185 *arg = p + 1;
2969 3186
2970 return OK; 3187 return OK;
2973 /* 3190 /*
2974 * Allocate a variable for a List and fill it from "*arg". 3191 * Allocate a variable for a List and fill it from "*arg".
2975 * Return OK or FAIL. 3192 * Return OK or FAIL.
2976 */ 3193 */
2977 static int 3194 static int
2978 get_list_vartv(arg, retvar, evaluate) 3195 get_list_tv(arg, rettv, evaluate)
2979 char_u **arg; 3196 char_u **arg;
2980 typeval *retvar; 3197 typeval *rettv;
2981 int evaluate; 3198 int evaluate;
2982 { 3199 {
2983 listvar *l = NULL; 3200 listvar *l = NULL;
2984 typeval tv; 3201 typeval tv;
2985 listitem *item; 3202 listitem *item;
3026 } 3243 }
3027 3244
3028 *arg = skipwhite(*arg + 1); 3245 *arg = skipwhite(*arg + 1);
3029 if (evaluate) 3246 if (evaluate)
3030 { 3247 {
3031 retvar->v_type = VAR_LIST; 3248 rettv->v_type = VAR_LIST;
3032 retvar->vval.v_list = l; 3249 rettv->vval.v_list = l;
3033 ++l->lv_refcount; 3250 ++l->lv_refcount;
3034 } 3251 }
3035 3252
3036 return OK; 3253 return OK;
3037 } 3254 }
3090 */ 3307 */
3091 static void 3308 static void
3092 listitem_free(item) 3309 listitem_free(item)
3093 listitem *item; 3310 listitem *item;
3094 { 3311 {
3095 clear_vartv(&item->li_tv); 3312 clear_tv(&item->li_tv);
3096 vim_free(item); 3313 vim_free(item);
3097 } 3314 }
3098 3315
3099 /* 3316 /*
3100 * Get the number of items in a list. 3317 * Get the number of items in a list.
3179 { 3396 {
3180 listitem *ni = listitem_alloc(); 3397 listitem *ni = listitem_alloc();
3181 3398
3182 if (ni == NULL) 3399 if (ni == NULL)
3183 return FAIL; 3400 return FAIL;
3184 copy_vartv(tv, &ni->li_tv); 3401 copy_tv(tv, &ni->li_tv);
3185 list_append(l, ni); 3402 list_append(l, ni);
3186 return OK; 3403 return OK;
3187 } 3404 }
3188 3405
3189 /* 3406 /*
3228 vim_free(ni); 3445 vim_free(ni);
3229 break; 3446 break;
3230 } 3447 }
3231 } 3448 }
3232 else 3449 else
3233 copy_vartv(&item->li_tv, &ni->li_tv); 3450 copy_tv(&item->li_tv, &ni->li_tv);
3234 list_append(copy, ni); 3451 list_append(copy, ni);
3235 } 3452 }
3236 ++copy->lv_refcount; 3453 ++copy->lv_refcount;
3237 } 3454 }
3238 3455
3321 *tofree = NULL; 3538 *tofree = NULL;
3322 return tv->vval.v_string; 3539 return tv->vval.v_string;
3323 case VAR_LIST: 3540 case VAR_LIST:
3324 *tofree = list2string(tv); 3541 *tofree = list2string(tv);
3325 return *tofree; 3542 return *tofree;
3543 case VAR_STRING:
3544 case VAR_NUMBER:
3545 break;
3326 default: 3546 default:
3327 break; 3547 EMSG2(_(e_intern2), "tv2string()");
3328 } 3548 }
3329 *tofree = NULL; 3549 *tofree = NULL;
3330 return get_vartv_string(tv); 3550 return get_tv_string(tv);
3331 } 3551 }
3332 3552
3333 /* 3553 /*
3334 * Get the value of an environment variable. 3554 * Get the value of an environment variable.
3335 * "arg" is pointing to the '$'. It is advanced to after the name. 3555 * "arg" is pointing to the '$'. It is advanced to after the name.
3336 * If the environment variable was not set, silently assume it is empty. 3556 * If the environment variable was not set, silently assume it is empty.
3337 * Always return OK. 3557 * Always return OK.
3338 */ 3558 */
3339 static int 3559 static int
3340 get_env_vartv(arg, retvar, evaluate) 3560 get_env_tv(arg, rettv, evaluate)
3341 char_u **arg; 3561 char_u **arg;
3342 typeval *retvar; 3562 typeval *rettv;
3343 int evaluate; 3563 int evaluate;
3344 { 3564 {
3345 char_u *string = NULL; 3565 char_u *string = NULL;
3346 int len; 3566 int len;
3347 int cc; 3567 int cc;
3370 string = NULL; 3590 string = NULL;
3371 } 3591 }
3372 } 3592 }
3373 name[len] = cc; 3593 name[len] = cc;
3374 } 3594 }
3375 retvar->v_type = VAR_STRING; 3595 rettv->v_type = VAR_STRING;
3376 retvar->vval.v_string = string; 3596 rettv->vval.v_string = string;
3377 } 3597 }
3378 3598
3379 return OK; 3599 return OK;
3380 } 3600 }
3381 3601
3668 /* 3888 /*
3669 * Allocate a variable for the result of a function. 3889 * Allocate a variable for the result of a function.
3670 * Return OK or FAIL. 3890 * Return OK or FAIL.
3671 */ 3891 */
3672 static int 3892 static int
3673 get_func_vartv(name, len, retvar, arg, firstline, lastline, doesrange, evaluate) 3893 get_func_tv(name, len, rettv, arg, firstline, lastline, doesrange, evaluate)
3674 char_u *name; /* name of the function */ 3894 char_u *name; /* name of the function */
3675 int len; /* length of "name" */ 3895 int len; /* length of "name" */
3676 typeval *retvar; 3896 typeval *rettv;
3677 char_u **arg; /* argument, pointing to the '(' */ 3897 char_u **arg; /* argument, pointing to the '(' */
3678 linenr_T firstline; /* first line of range */ 3898 linenr_T firstline; /* first line of range */
3679 linenr_T lastline; /* last line of range */ 3899 linenr_T lastline; /* last line of range */
3680 int *doesrange; /* return: function handled range */ 3900 int *doesrange; /* return: function handled range */
3681 int evaluate; 3901 int evaluate;
3708 ++argp; 3928 ++argp;
3709 else 3929 else
3710 ret = FAIL; 3930 ret = FAIL;
3711 3931
3712 if (ret == OK) 3932 if (ret == OK)
3713 ret = call_func(name, len, retvar, argcount, argvars, 3933 ret = call_func(name, len, rettv, argcount, argvars,
3714 firstline, lastline, doesrange, evaluate); 3934 firstline, lastline, doesrange, evaluate);
3715 else if (!aborting()) 3935 else if (!aborting())
3716 EMSG2(_("E116: Invalid arguments for function %s"), name); 3936 EMSG2(_("E116: Invalid arguments for function %s"), name);
3717 3937
3718 while (--argcount >= 0) 3938 while (--argcount >= 0)
3719 clear_vartv(&argvars[argcount]); 3939 clear_tv(&argvars[argcount]);
3720 3940
3721 *arg = skipwhite(argp); 3941 *arg = skipwhite(argp);
3722 return ret; 3942 return ret;
3723 } 3943 }
3724 3944
3726 /* 3946 /*
3727 * Call a function with its resolved parameters 3947 * Call a function with its resolved parameters
3728 * Return OK or FAIL. 3948 * Return OK or FAIL.
3729 */ 3949 */
3730 static int 3950 static int
3731 call_func(name, len, retvar, argcount, argvars, firstline, lastline, 3951 call_func(name, len, rettv, argcount, argvars, firstline, lastline,
3732 doesrange, evaluate) 3952 doesrange, evaluate)
3733 char_u *name; /* name of the function */ 3953 char_u *name; /* name of the function */
3734 int len; /* length of "name" */ 3954 int len; /* length of "name" */
3735 typeval *retvar; /* return value goes here */ 3955 typeval *rettv; /* return value goes here */
3736 int argcount; /* number of "argvars" */ 3956 int argcount; /* number of "argvars" */
3737 typeval *argvars; /* vars for arguments */ 3957 typeval *argvars; /* vars for arguments */
3738 linenr_T firstline; /* first line of range */ 3958 linenr_T firstline; /* first line of range */
3739 linenr_T lastline; /* last line of range */ 3959 linenr_T lastline; /* last line of range */
3740 int *doesrange; /* return: function handled range */ 3960 int *doesrange; /* return: function handled range */
3810 4030
3811 4031
3812 /* execute the function if no errors detected and executing */ 4032 /* execute the function if no errors detected and executing */
3813 if (evaluate && error == ERROR_NONE) 4033 if (evaluate && error == ERROR_NONE)
3814 { 4034 {
3815 retvar->v_type = VAR_NUMBER; /* default is number retvar */ 4035 rettv->v_type = VAR_NUMBER; /* default is number rettv */
3816 error = ERROR_UNKNOWN; 4036 error = ERROR_UNKNOWN;
3817 4037
3818 if (!ASCII_ISLOWER(fname[0])) 4038 if (!ASCII_ISLOWER(fname[0]))
3819 { 4039 {
3820 /* 4040 /*
3849 * redo buffer. 4069 * redo buffer.
3850 */ 4070 */
3851 save_search_patterns(); 4071 save_search_patterns();
3852 saveRedobuff(); 4072 saveRedobuff();
3853 ++fp->calls; 4073 ++fp->calls;
3854 call_user_func(fp, argcount, argvars, retvar, 4074 call_user_func(fp, argcount, argvars, rettv,
3855 firstline, lastline); 4075 firstline, lastline);
3856 --fp->calls; 4076 --fp->calls;
3857 restoreRedobuff(); 4077 restoreRedobuff();
3858 restore_search_patterns(); 4078 restore_search_patterns();
3859 error = ERROR_NONE; 4079 error = ERROR_NONE;
3873 else if (argcount > functions[i].f_max_argc) 4093 else if (argcount > functions[i].f_max_argc)
3874 error = ERROR_TOOMANY; 4094 error = ERROR_TOOMANY;
3875 else 4095 else
3876 { 4096 {
3877 argvars[argcount].v_type = VAR_UNKNOWN; 4097 argvars[argcount].v_type = VAR_UNKNOWN;
3878 functions[i].f_func(argvars, retvar); 4098 functions[i].f_func(argvars, rettv);
3879 error = ERROR_NONE; 4099 error = ERROR_NONE;
3880 } 4100 }
3881 } 4101 }
3882 } 4102 }
3883 /* 4103 /*
3916 /* 4136 /*
3917 * "append(lnum, string)" function 4137 * "append(lnum, string)" function
3918 * or "append(list, item)" function 4138 * or "append(list, item)" function
3919 */ 4139 */
3920 static void 4140 static void
3921 f_append(argvars, retvar) 4141 f_append(argvars, rettv)
3922 typeval *argvars; 4142 typeval *argvars;
3923 typeval *retvar; 4143 typeval *rettv;
3924 { 4144 {
3925 long lnum; 4145 long lnum;
3926 4146
3927 retvar->vval.v_number = 1; /* Default: Failed */ 4147 rettv->vval.v_number = 1; /* Default: Failed */
3928 if (argvars[0].v_type == VAR_LIST) 4148 if (argvars[0].v_type == VAR_LIST)
3929 { 4149 {
3930 if (argvars[0].vval.v_list != NULL 4150 if (argvars[0].vval.v_list != NULL
3931 && list_append_tv(argvars[0].vval.v_list, &argvars[1]) == OK) 4151 && list_append_tv(argvars[0].vval.v_list, &argvars[1]) == OK)
3932 copy_vartv(&argvars[0], retvar); 4152 copy_tv(&argvars[0], rettv);
3933 } 4153 }
3934 else 4154 else
3935 { 4155 {
3936 lnum = get_vartv_lnum(argvars); 4156 lnum = get_tv_lnum(argvars);
3937 if (lnum >= 0 4157 if (lnum >= 0
3938 && lnum <= curbuf->b_ml.ml_line_count 4158 && lnum <= curbuf->b_ml.ml_line_count
3939 && u_save(lnum, lnum + 1) == OK) 4159 && u_save(lnum, lnum + 1) == OK)
3940 { 4160 {
3941 ml_append(lnum, get_vartv_string(&argvars[1]), (colnr_T)0, FALSE); 4161 ml_append(lnum, get_tv_string(&argvars[1]), (colnr_T)0, FALSE);
3942 if (curwin->w_cursor.lnum > lnum) 4162 if (curwin->w_cursor.lnum > lnum)
3943 ++curwin->w_cursor.lnum; 4163 ++curwin->w_cursor.lnum;
3944 appended_lines_mark(lnum, 1L); 4164 appended_lines_mark(lnum, 1L);
3945 retvar->vval.v_number = 0; 4165 rettv->vval.v_number = 0;
3946 } 4166 }
3947 } 4167 }
3948 } 4168 }
3949 4169
3950 /* 4170 /*
3951 * "argc()" function 4171 * "argc()" function
3952 */ 4172 */
3953 /* ARGSUSED */ 4173 /* ARGSUSED */
3954 static void 4174 static void
3955 f_argc(argvars, retvar) 4175 f_argc(argvars, rettv)
3956 typeval *argvars; 4176 typeval *argvars;
3957 typeval *retvar; 4177 typeval *rettv;
3958 { 4178 {
3959 retvar->vval.v_number = ARGCOUNT; 4179 rettv->vval.v_number = ARGCOUNT;
3960 } 4180 }
3961 4181
3962 /* 4182 /*
3963 * "argidx()" function 4183 * "argidx()" function
3964 */ 4184 */
3965 /* ARGSUSED */ 4185 /* ARGSUSED */
3966 static void 4186 static void
3967 f_argidx(argvars, retvar) 4187 f_argidx(argvars, rettv)
3968 typeval *argvars; 4188 typeval *argvars;
3969 typeval *retvar; 4189 typeval *rettv;
3970 { 4190 {
3971 retvar->vval.v_number = curwin->w_arg_idx; 4191 rettv->vval.v_number = curwin->w_arg_idx;
3972 } 4192 }
3973 4193
3974 /* 4194 /*
3975 * "argv(nr)" function 4195 * "argv(nr)" function
3976 */ 4196 */
3977 static void 4197 static void
3978 f_argv(argvars, retvar) 4198 f_argv(argvars, rettv)
3979 typeval *argvars; 4199 typeval *argvars;
3980 typeval *retvar; 4200 typeval *rettv;
3981 { 4201 {
3982 int idx; 4202 int idx;
3983 4203
3984 idx = get_vartv_number(&argvars[0]); 4204 idx = get_tv_number(&argvars[0]);
3985 if (idx >= 0 && idx < ARGCOUNT) 4205 if (idx >= 0 && idx < ARGCOUNT)
3986 retvar->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx])); 4206 rettv->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
3987 else 4207 else
3988 retvar->vval.v_string = NULL; 4208 rettv->vval.v_string = NULL;
3989 retvar->v_type = VAR_STRING; 4209 rettv->v_type = VAR_STRING;
3990 } 4210 }
3991 4211
3992 /* 4212 /*
3993 * "browse(save, title, initdir, default)" function 4213 * "browse(save, title, initdir, default)" function
3994 */ 4214 */
3995 /* ARGSUSED */ 4215 /* ARGSUSED */
3996 static void 4216 static void
3997 f_browse(argvars, retvar) 4217 f_browse(argvars, rettv)
3998 typeval *argvars; 4218 typeval *argvars;
3999 typeval *retvar; 4219 typeval *rettv;
4000 { 4220 {
4001 #ifdef FEAT_BROWSE 4221 #ifdef FEAT_BROWSE
4002 int save; 4222 int save;
4003 char_u *title; 4223 char_u *title;
4004 char_u *initdir; 4224 char_u *initdir;
4005 char_u *defname; 4225 char_u *defname;
4006 char_u buf[NUMBUFLEN]; 4226 char_u buf[NUMBUFLEN];
4007 char_u buf2[NUMBUFLEN]; 4227 char_u buf2[NUMBUFLEN];
4008 4228
4009 save = get_vartv_number(&argvars[0]); 4229 save = get_tv_number(&argvars[0]);
4010 title = get_vartv_string(&argvars[1]); 4230 title = get_tv_string(&argvars[1]);
4011 initdir = get_vartv_string_buf(&argvars[2], buf); 4231 initdir = get_tv_string_buf(&argvars[2], buf);
4012 defname = get_vartv_string_buf(&argvars[3], buf2); 4232 defname = get_tv_string_buf(&argvars[3], buf2);
4013 4233
4014 retvar->vval.v_string = 4234 rettv->vval.v_string =
4015 do_browse(save ? BROWSE_SAVE : 0, 4235 do_browse(save ? BROWSE_SAVE : 0,
4016 title, defname, NULL, initdir, NULL, curbuf); 4236 title, defname, NULL, initdir, NULL, curbuf);
4017 #else 4237 #else
4018 retvar->vval.v_string = NULL; 4238 rettv->vval.v_string = NULL;
4019 #endif 4239 #endif
4020 retvar->v_type = VAR_STRING; 4240 rettv->v_type = VAR_STRING;
4021 } 4241 }
4022 4242
4023 /* 4243 /*
4024 * "browsedir(title, initdir)" function 4244 * "browsedir(title, initdir)" function
4025 */ 4245 */
4026 /* ARGSUSED */ 4246 /* ARGSUSED */
4027 static void 4247 static void
4028 f_browsedir(argvars, retvar) 4248 f_browsedir(argvars, rettv)
4029 typeval *argvars; 4249 typeval *argvars;
4030 typeval *retvar; 4250 typeval *rettv;
4031 { 4251 {
4032 #ifdef FEAT_BROWSE 4252 #ifdef FEAT_BROWSE
4033 char_u *title; 4253 char_u *title;
4034 char_u *initdir; 4254 char_u *initdir;
4035 char_u buf[NUMBUFLEN]; 4255 char_u buf[NUMBUFLEN];
4036 4256
4037 title = get_vartv_string(&argvars[0]); 4257 title = get_tv_string(&argvars[0]);
4038 initdir = get_vartv_string_buf(&argvars[1], buf); 4258 initdir = get_tv_string_buf(&argvars[1], buf);
4039 4259
4040 retvar->vval.v_string = do_browse(BROWSE_DIR, 4260 rettv->vval.v_string = do_browse(BROWSE_DIR,
4041 title, NULL, NULL, initdir, NULL, curbuf); 4261 title, NULL, NULL, initdir, NULL, curbuf);
4042 #else 4262 #else
4043 retvar->vval.v_string = NULL; 4263 rettv->vval.v_string = NULL;
4044 #endif 4264 #endif
4045 retvar->v_type = VAR_STRING; 4265 rettv->v_type = VAR_STRING;
4046 } 4266 }
4047 4267
4048 /* 4268 /*
4049 * Find a buffer by number or exact name. 4269 * Find a buffer by number or exact name.
4050 */ 4270 */
4079 4299
4080 /* 4300 /*
4081 * "bufexists(expr)" function 4301 * "bufexists(expr)" function
4082 */ 4302 */
4083 static void 4303 static void
4084 f_bufexists(argvars, retvar) 4304 f_bufexists(argvars, rettv)
4085 typeval *argvars; 4305 typeval *argvars;
4086 typeval *retvar; 4306 typeval *rettv;
4087 { 4307 {
4088 retvar->vval.v_number = (find_buffer(&argvars[0]) != NULL); 4308 rettv->vval.v_number = (find_buffer(&argvars[0]) != NULL);
4089 } 4309 }
4090 4310
4091 /* 4311 /*
4092 * "buflisted(expr)" function 4312 * "buflisted(expr)" function
4093 */ 4313 */
4094 static void 4314 static void
4095 f_buflisted(argvars, retvar) 4315 f_buflisted(argvars, rettv)
4096 typeval *argvars; 4316 typeval *argvars;
4097 typeval *retvar; 4317 typeval *rettv;
4098 { 4318 {
4099 buf_T *buf; 4319 buf_T *buf;
4100 4320
4101 buf = find_buffer(&argvars[0]); 4321 buf = find_buffer(&argvars[0]);
4102 retvar->vval.v_number = (buf != NULL && buf->b_p_bl); 4322 rettv->vval.v_number = (buf != NULL && buf->b_p_bl);
4103 } 4323 }
4104 4324
4105 /* 4325 /*
4106 * "bufloaded(expr)" function 4326 * "bufloaded(expr)" function
4107 */ 4327 */
4108 static void 4328 static void
4109 f_bufloaded(argvars, retvar) 4329 f_bufloaded(argvars, rettv)
4110 typeval *argvars; 4330 typeval *argvars;
4111 typeval *retvar; 4331 typeval *rettv;
4112 { 4332 {
4113 buf_T *buf; 4333 buf_T *buf;
4114 4334
4115 buf = find_buffer(&argvars[0]); 4335 buf = find_buffer(&argvars[0]);
4116 retvar->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL); 4336 rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
4117 } 4337 }
4118 4338
4119 /* 4339 /*
4120 * Get buffer by number or pattern. 4340 * Get buffer by number or pattern.
4121 */ 4341 */
4122 static buf_T * 4342 static buf_T *
4123 get_buf_vartv(avar) 4343 get_buf_tv(tv)
4124 typeval *avar; 4344 typeval *tv;
4125 { 4345 {
4126 char_u *name = avar->vval.v_string; 4346 char_u *name = tv->vval.v_string;
4127 int save_magic; 4347 int save_magic;
4128 char_u *save_cpo; 4348 char_u *save_cpo;
4129 buf_T *buf; 4349 buf_T *buf;
4130 4350
4131 if (avar->v_type == VAR_NUMBER) 4351 if (tv->v_type == VAR_NUMBER)
4132 return buflist_findnr((int)avar->vval.v_number); 4352 return buflist_findnr((int)tv->vval.v_number);
4133 if (name == NULL || *name == NUL) 4353 if (name == NULL || *name == NUL)
4134 return curbuf; 4354 return curbuf;
4135 if (name[0] == '$' && name[1] == NUL) 4355 if (name[0] == '$' && name[1] == NUL)
4136 return lastbuf; 4356 return lastbuf;
4137 4357
4147 p_magic = save_magic; 4367 p_magic = save_magic;
4148 p_cpo = save_cpo; 4368 p_cpo = save_cpo;
4149 4369
4150 /* If not found, try expanding the name, like done for bufexists(). */ 4370 /* If not found, try expanding the name, like done for bufexists(). */
4151 if (buf == NULL) 4371 if (buf == NULL)
4152 buf = find_buffer(avar); 4372 buf = find_buffer(tv);
4153 4373
4154 return buf; 4374 return buf;
4155 } 4375 }
4156 4376
4157 /* 4377 /*
4158 * "bufname(expr)" function 4378 * "bufname(expr)" function
4159 */ 4379 */
4160 static void 4380 static void
4161 f_bufname(argvars, retvar) 4381 f_bufname(argvars, rettv)
4162 typeval *argvars; 4382 typeval *argvars;
4163 typeval *retvar; 4383 typeval *rettv;
4164 { 4384 {
4165 buf_T *buf; 4385 buf_T *buf;
4166 4386
4167 ++emsg_off; 4387 ++emsg_off;
4168 buf = get_buf_vartv(&argvars[0]); 4388 buf = get_buf_tv(&argvars[0]);
4169 retvar->v_type = VAR_STRING; 4389 rettv->v_type = VAR_STRING;
4170 if (buf != NULL && buf->b_fname != NULL) 4390 if (buf != NULL && buf->b_fname != NULL)
4171 retvar->vval.v_string = vim_strsave(buf->b_fname); 4391 rettv->vval.v_string = vim_strsave(buf->b_fname);
4172 else 4392 else
4173 retvar->vval.v_string = NULL; 4393 rettv->vval.v_string = NULL;
4174 --emsg_off; 4394 --emsg_off;
4175 } 4395 }
4176 4396
4177 /* 4397 /*
4178 * "bufnr(expr)" function 4398 * "bufnr(expr)" function
4179 */ 4399 */
4180 static void 4400 static void
4181 f_bufnr(argvars, retvar) 4401 f_bufnr(argvars, rettv)
4182 typeval *argvars; 4402 typeval *argvars;
4183 typeval *retvar; 4403 typeval *rettv;
4184 { 4404 {
4185 buf_T *buf; 4405 buf_T *buf;
4186 4406
4187 ++emsg_off; 4407 ++emsg_off;
4188 buf = get_buf_vartv(&argvars[0]); 4408 buf = get_buf_tv(&argvars[0]);
4189 if (buf != NULL) 4409 if (buf != NULL)
4190 retvar->vval.v_number = buf->b_fnum; 4410 rettv->vval.v_number = buf->b_fnum;
4191 else 4411 else
4192 retvar->vval.v_number = -1; 4412 rettv->vval.v_number = -1;
4193 --emsg_off; 4413 --emsg_off;
4194 } 4414 }
4195 4415
4196 /* 4416 /*
4197 * "bufwinnr(nr)" function 4417 * "bufwinnr(nr)" function
4198 */ 4418 */
4199 static void 4419 static void
4200 f_bufwinnr(argvars, retvar) 4420 f_bufwinnr(argvars, rettv)
4201 typeval *argvars; 4421 typeval *argvars;
4202 typeval *retvar; 4422 typeval *rettv;
4203 { 4423 {
4204 #ifdef FEAT_WINDOWS 4424 #ifdef FEAT_WINDOWS
4205 win_T *wp; 4425 win_T *wp;
4206 int winnr = 0; 4426 int winnr = 0;
4207 #endif 4427 #endif
4208 buf_T *buf; 4428 buf_T *buf;
4209 4429
4210 ++emsg_off; 4430 ++emsg_off;
4211 buf = get_buf_vartv(&argvars[0]); 4431 buf = get_buf_tv(&argvars[0]);
4212 #ifdef FEAT_WINDOWS 4432 #ifdef FEAT_WINDOWS
4213 for (wp = firstwin; wp; wp = wp->w_next) 4433 for (wp = firstwin; wp; wp = wp->w_next)
4214 { 4434 {
4215 ++winnr; 4435 ++winnr;
4216 if (wp->w_buffer == buf) 4436 if (wp->w_buffer == buf)
4217 break; 4437 break;
4218 } 4438 }
4219 retvar->vval.v_number = (wp != NULL ? winnr : -1); 4439 rettv->vval.v_number = (wp != NULL ? winnr : -1);
4220 #else 4440 #else
4221 retvar->vval.v_number = (curwin->w_buffer == buf ? 1 : -1); 4441 rettv->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
4222 #endif 4442 #endif
4223 --emsg_off; 4443 --emsg_off;
4224 } 4444 }
4225 4445
4226 /* 4446 /*
4227 * "byte2line(byte)" function 4447 * "byte2line(byte)" function
4228 */ 4448 */
4229 /*ARGSUSED*/ 4449 /*ARGSUSED*/
4230 static void 4450 static void
4231 f_byte2line(argvars, retvar) 4451 f_byte2line(argvars, rettv)
4232 typeval *argvars; 4452 typeval *argvars;
4233 typeval *retvar; 4453 typeval *rettv;
4234 { 4454 {
4235 #ifndef FEAT_BYTEOFF 4455 #ifndef FEAT_BYTEOFF
4236 retvar->vval.v_number = -1; 4456 rettv->vval.v_number = -1;
4237 #else 4457 #else
4238 long boff = 0; 4458 long boff = 0;
4239 4459
4240 boff = get_vartv_number(&argvars[0]) - 1; 4460 boff = get_tv_number(&argvars[0]) - 1;
4241 if (boff < 0) 4461 if (boff < 0)
4242 retvar->vval.v_number = -1; 4462 rettv->vval.v_number = -1;
4243 else 4463 else
4244 retvar->vval.v_number = ml_find_line_or_offset(curbuf, 4464 rettv->vval.v_number = ml_find_line_or_offset(curbuf,
4245 (linenr_T)0, &boff); 4465 (linenr_T)0, &boff);
4246 #endif 4466 #endif
4247 } 4467 }
4248 4468
4249 /* 4469 /*
4250 * "byteidx()" function 4470 * "byteidx()" function
4251 */ 4471 */
4252 /*ARGSUSED*/ 4472 /*ARGSUSED*/
4253 static void 4473 static void
4254 f_byteidx(argvars, retvar) 4474 f_byteidx(argvars, rettv)
4255 typeval *argvars; 4475 typeval *argvars;
4256 typeval *retvar; 4476 typeval *rettv;
4257 { 4477 {
4258 #ifdef FEAT_MBYTE 4478 #ifdef FEAT_MBYTE
4259 char_u *t; 4479 char_u *t;
4260 #endif 4480 #endif
4261 char_u *str; 4481 char_u *str;
4262 long idx; 4482 long idx;
4263 4483
4264 str = get_vartv_string(&argvars[0]); 4484 str = get_tv_string(&argvars[0]);
4265 idx = get_vartv_number(&argvars[1]); 4485 idx = get_tv_number(&argvars[1]);
4266 retvar->vval.v_number = -1; 4486 rettv->vval.v_number = -1;
4267 if (idx < 0) 4487 if (idx < 0)
4268 return; 4488 return;
4269 4489
4270 #ifdef FEAT_MBYTE 4490 #ifdef FEAT_MBYTE
4271 t = str; 4491 t = str;
4273 { 4493 {
4274 if (*t == NUL) /* EOL reached */ 4494 if (*t == NUL) /* EOL reached */
4275 return; 4495 return;
4276 t += mb_ptr2len_check(t); 4496 t += mb_ptr2len_check(t);
4277 } 4497 }
4278 retvar->vval.v_number = t - str; 4498 rettv->vval.v_number = t - str;
4279 #else 4499 #else
4280 if (idx <= STRLEN(str)) 4500 if (idx <= STRLEN(str))
4281 retvar->vval.v_number = idx; 4501 rettv->vval.v_number = idx;
4282 #endif 4502 #endif
4283 } 4503 }
4284 4504
4285 /* 4505 /*
4286 * "char2nr(string)" function 4506 * "char2nr(string)" function
4287 */ 4507 */
4288 static void 4508 static void
4289 f_char2nr(argvars, retvar) 4509 f_char2nr(argvars, rettv)
4290 typeval *argvars; 4510 typeval *argvars;
4291 typeval *retvar; 4511 typeval *rettv;
4292 { 4512 {
4293 #ifdef FEAT_MBYTE 4513 #ifdef FEAT_MBYTE
4294 if (has_mbyte) 4514 if (has_mbyte)
4295 retvar->vval.v_number = 4515 rettv->vval.v_number =
4296 (*mb_ptr2char)(get_vartv_string(&argvars[0])); 4516 (*mb_ptr2char)(get_tv_string(&argvars[0]));
4297 else 4517 else
4298 #endif 4518 #endif
4299 retvar->vval.v_number = get_vartv_string(&argvars[0])[0]; 4519 rettv->vval.v_number = get_tv_string(&argvars[0])[0];
4300 } 4520 }
4301 4521
4302 /* 4522 /*
4303 * "cindent(lnum)" function 4523 * "cindent(lnum)" function
4304 */ 4524 */
4305 static void 4525 static void
4306 f_cindent(argvars, retvar) 4526 f_cindent(argvars, rettv)
4307 typeval *argvars; 4527 typeval *argvars;
4308 typeval *retvar; 4528 typeval *rettv;
4309 { 4529 {
4310 #ifdef FEAT_CINDENT 4530 #ifdef FEAT_CINDENT
4311 pos_T pos; 4531 pos_T pos;
4312 linenr_T lnum; 4532 linenr_T lnum;
4313 4533
4314 pos = curwin->w_cursor; 4534 pos = curwin->w_cursor;
4315 lnum = get_vartv_lnum(argvars); 4535 lnum = get_tv_lnum(argvars);
4316 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 4536 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
4317 { 4537 {
4318 curwin->w_cursor.lnum = lnum; 4538 curwin->w_cursor.lnum = lnum;
4319 retvar->vval.v_number = get_c_indent(); 4539 rettv->vval.v_number = get_c_indent();
4320 curwin->w_cursor = pos; 4540 curwin->w_cursor = pos;
4321 } 4541 }
4322 else 4542 else
4323 #endif 4543 #endif
4324 retvar->vval.v_number = -1; 4544 rettv->vval.v_number = -1;
4325 } 4545 }
4326 4546
4327 /* 4547 /*
4328 * "col(string)" function 4548 * "col(string)" function
4329 */ 4549 */
4330 static void 4550 static void
4331 f_col(argvars, retvar) 4551 f_col(argvars, rettv)
4332 typeval *argvars; 4552 typeval *argvars;
4333 typeval *retvar; 4553 typeval *rettv;
4334 { 4554 {
4335 colnr_T col = 0; 4555 colnr_T col = 0;
4336 pos_T *fp; 4556 pos_T *fp;
4337 4557
4338 fp = var2fpos(&argvars[0], FALSE); 4558 fp = var2fpos(&argvars[0], FALSE);
4371 } 4591 }
4372 } 4592 }
4373 #endif 4593 #endif
4374 } 4594 }
4375 } 4595 }
4376 retvar->vval.v_number = col; 4596 rettv->vval.v_number = col;
4377 } 4597 }
4378 4598
4379 /* 4599 /*
4380 * "confirm(message, buttons[, default [, type]])" function 4600 * "confirm(message, buttons[, default [, type]])" function
4381 */ 4601 */
4382 /*ARGSUSED*/ 4602 /*ARGSUSED*/
4383 static void 4603 static void
4384 f_confirm(argvars, retvar) 4604 f_confirm(argvars, rettv)
4385 typeval *argvars; 4605 typeval *argvars;
4386 typeval *retvar; 4606 typeval *rettv;
4387 { 4607 {
4388 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) 4608 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
4389 char_u *message; 4609 char_u *message;
4390 char_u *buttons = NULL; 4610 char_u *buttons = NULL;
4391 char_u buf[NUMBUFLEN]; 4611 char_u buf[NUMBUFLEN];
4392 char_u buf2[NUMBUFLEN]; 4612 char_u buf2[NUMBUFLEN];
4393 int def = 1; 4613 int def = 1;
4394 int type = VIM_GENERIC; 4614 int type = VIM_GENERIC;
4395 int c; 4615 int c;
4396 4616
4397 message = get_vartv_string(&argvars[0]); 4617 message = get_tv_string(&argvars[0]);
4398 if (argvars[1].v_type != VAR_UNKNOWN) 4618 if (argvars[1].v_type != VAR_UNKNOWN)
4399 { 4619 {
4400 buttons = get_vartv_string_buf(&argvars[1], buf); 4620 buttons = get_tv_string_buf(&argvars[1], buf);
4401 if (argvars[2].v_type != VAR_UNKNOWN) 4621 if (argvars[2].v_type != VAR_UNKNOWN)
4402 { 4622 {
4403 def = get_vartv_number(&argvars[2]); 4623 def = get_tv_number(&argvars[2]);
4404 if (argvars[3].v_type != VAR_UNKNOWN) 4624 if (argvars[3].v_type != VAR_UNKNOWN)
4405 { 4625 {
4406 /* avoid that TOUPPER_ASC calls get_var_string_buf() twice */ 4626 /* avoid that TOUPPER_ASC calls get_var_string_buf() twice */
4407 c = *get_vartv_string_buf(&argvars[3], buf2); 4627 c = *get_tv_string_buf(&argvars[3], buf2);
4408 switch (TOUPPER_ASC(c)) 4628 switch (TOUPPER_ASC(c))
4409 { 4629 {
4410 case 'E': type = VIM_ERROR; break; 4630 case 'E': type = VIM_ERROR; break;
4411 case 'Q': type = VIM_QUESTION; break; 4631 case 'Q': type = VIM_QUESTION; break;
4412 case 'I': type = VIM_INFO; break; 4632 case 'I': type = VIM_INFO; break;
4418 } 4638 }
4419 4639
4420 if (buttons == NULL || *buttons == NUL) 4640 if (buttons == NULL || *buttons == NUL)
4421 buttons = (char_u *)_("&Ok"); 4641 buttons = (char_u *)_("&Ok");
4422 4642
4423 retvar->vval.v_number = do_dialog(type, NULL, message, buttons, 4643 rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
4424 def, NULL); 4644 def, NULL);
4425 #else 4645 #else
4426 retvar->vval.v_number = 0; 4646 rettv->vval.v_number = 0;
4427 #endif 4647 #endif
4428 } 4648 }
4429 4649
4430 /* 4650 /*
4431 * "copy()" function 4651 * "copy()" function
4432 */ 4652 */
4433 static void 4653 static void
4434 f_copy(argvars, retvar) 4654 f_copy(argvars, rettv)
4435 typeval *argvars; 4655 typeval *argvars;
4436 typeval *retvar; 4656 typeval *rettv;
4437 { 4657 {
4438 if (argvars[0].v_type == VAR_LIST) 4658 if (argvars[0].v_type == VAR_LIST)
4439 { 4659 {
4440 retvar->v_type = VAR_LIST; 4660 rettv->v_type = VAR_LIST;
4441 retvar->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE); 4661 rettv->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE);
4442 } 4662 }
4443 else 4663 else
4444 copy_vartv(&argvars[0], retvar); 4664 copy_tv(&argvars[0], rettv);
4445 } 4665 }
4446 4666
4447 /* 4667 /*
4448 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function 4668 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function
4449 * 4669 *
4450 * Checks the existence of a cscope connection. 4670 * Checks the existence of a cscope connection.
4451 */ 4671 */
4452 /*ARGSUSED*/ 4672 /*ARGSUSED*/
4453 static void 4673 static void
4454 f_cscope_connection(argvars, retvar) 4674 f_cscope_connection(argvars, rettv)
4455 typeval *argvars; 4675 typeval *argvars;
4456 typeval *retvar; 4676 typeval *rettv;
4457 { 4677 {
4458 #ifdef FEAT_CSCOPE 4678 #ifdef FEAT_CSCOPE
4459 int num = 0; 4679 int num = 0;
4460 char_u *dbpath = NULL; 4680 char_u *dbpath = NULL;
4461 char_u *prepend = NULL; 4681 char_u *prepend = NULL;
4462 char_u buf[NUMBUFLEN]; 4682 char_u buf[NUMBUFLEN];
4463 4683
4464 if (argvars[0].v_type != VAR_UNKNOWN 4684 if (argvars[0].v_type != VAR_UNKNOWN
4465 && argvars[1].v_type != VAR_UNKNOWN) 4685 && argvars[1].v_type != VAR_UNKNOWN)
4466 { 4686 {
4467 num = (int)get_vartv_number(&argvars[0]); 4687 num = (int)get_tv_number(&argvars[0]);
4468 dbpath = get_vartv_string(&argvars[1]); 4688 dbpath = get_tv_string(&argvars[1]);
4469 if (argvars[2].v_type != VAR_UNKNOWN) 4689 if (argvars[2].v_type != VAR_UNKNOWN)
4470 prepend = get_vartv_string_buf(&argvars[2], buf); 4690 prepend = get_tv_string_buf(&argvars[2], buf);
4471 } 4691 }
4472 4692
4473 retvar->vval.v_number = cs_connection(num, dbpath, prepend); 4693 rettv->vval.v_number = cs_connection(num, dbpath, prepend);
4474 #else 4694 #else
4475 retvar->vval.v_number = 0; 4695 rettv->vval.v_number = 0;
4476 #endif 4696 #endif
4477 } 4697 }
4478 4698
4479 /* 4699 /*
4480 * "cursor(lnum, col)" function 4700 * "cursor(lnum, col)" function
4481 * 4701 *
4482 * Moves the cursor to the specified line and column 4702 * Moves the cursor to the specified line and column
4483 */ 4703 */
4484 /*ARGSUSED*/ 4704 /*ARGSUSED*/
4485 static void 4705 static void
4486 f_cursor(argvars, retvar) 4706 f_cursor(argvars, rettv)
4487 typeval *argvars; 4707 typeval *argvars;
4488 typeval *retvar; 4708 typeval *rettv;
4489 { 4709 {
4490 long line, col; 4710 long line, col;
4491 4711
4492 line = get_vartv_lnum(argvars); 4712 line = get_tv_lnum(argvars);
4493 if (line > 0) 4713 if (line > 0)
4494 curwin->w_cursor.lnum = line; 4714 curwin->w_cursor.lnum = line;
4495 col = get_vartv_number(&argvars[1]); 4715 col = get_tv_number(&argvars[1]);
4496 if (col > 0) 4716 if (col > 0)
4497 curwin->w_cursor.col = col - 1; 4717 curwin->w_cursor.col = col - 1;
4498 #ifdef FEAT_VIRTUALEDIT 4718 #ifdef FEAT_VIRTUALEDIT
4499 curwin->w_cursor.coladd = 0; 4719 curwin->w_cursor.coladd = 0;
4500 #endif 4720 #endif
4512 4732
4513 /* 4733 /*
4514 * "deepcopy()" function 4734 * "deepcopy()" function
4515 */ 4735 */
4516 static void 4736 static void
4517 f_deepcopy(argvars, retvar) 4737 f_deepcopy(argvars, rettv)
4518 typeval *argvars; 4738 typeval *argvars;
4519 typeval *retvar; 4739 typeval *rettv;
4520 { 4740 {
4521 if (argvars[0].v_type == VAR_LIST) 4741 if (argvars[0].v_type == VAR_LIST)
4522 { 4742 {
4523 retvar->v_type = VAR_LIST; 4743 rettv->v_type = VAR_LIST;
4524 retvar->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE); 4744 rettv->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE);
4525 } 4745 }
4526 else 4746 else
4527 copy_vartv(&argvars[0], retvar); 4747 copy_tv(&argvars[0], rettv);
4528 } 4748 }
4529 4749
4530 /* 4750 /*
4531 * "delete()" function 4751 * "delete()" function
4532 */ 4752 */
4533 static void 4753 static void
4534 f_delete(argvars, retvar) 4754 f_delete(argvars, rettv)
4535 typeval *argvars; 4755 typeval *argvars;
4536 typeval *retvar; 4756 typeval *rettv;
4537 { 4757 {
4538 if (check_restricted() || check_secure()) 4758 if (check_restricted() || check_secure())
4539 retvar->vval.v_number = -1; 4759 rettv->vval.v_number = -1;
4540 else 4760 else
4541 retvar->vval.v_number = mch_remove(get_vartv_string(&argvars[0])); 4761 rettv->vval.v_number = mch_remove(get_tv_string(&argvars[0]));
4542 } 4762 }
4543 4763
4544 /* 4764 /*
4545 * "did_filetype()" function 4765 * "did_filetype()" function
4546 */ 4766 */
4547 /*ARGSUSED*/ 4767 /*ARGSUSED*/
4548 static void 4768 static void
4549 f_did_filetype(argvars, retvar) 4769 f_did_filetype(argvars, rettv)
4550 typeval *argvars; 4770 typeval *argvars;
4551 typeval *retvar; 4771 typeval *rettv;
4552 { 4772 {
4553 #ifdef FEAT_AUTOCMD 4773 #ifdef FEAT_AUTOCMD
4554 retvar->vval.v_number = did_filetype; 4774 rettv->vval.v_number = did_filetype;
4555 #else 4775 #else
4556 retvar->vval.v_number = 0; 4776 rettv->vval.v_number = 0;
4557 #endif 4777 #endif
4558 } 4778 }
4559 4779
4560 /* 4780 /*
4561 * "diff_filler()" function 4781 * "diff_filler()" function
4562 */ 4782 */
4563 /*ARGSUSED*/ 4783 /*ARGSUSED*/
4564 static void 4784 static void
4565 f_diff_filler(argvars, retvar) 4785 f_diff_filler(argvars, rettv)
4566 typeval *argvars; 4786 typeval *argvars;
4567 typeval *retvar; 4787 typeval *rettv;
4568 { 4788 {
4569 #ifdef FEAT_DIFF 4789 #ifdef FEAT_DIFF
4570 retvar->vval.v_number = diff_check_fill(curwin, get_vartv_lnum(argvars)); 4790 rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
4571 #endif 4791 #endif
4572 } 4792 }
4573 4793
4574 /* 4794 /*
4575 * "diff_hlID()" function 4795 * "diff_hlID()" function
4576 */ 4796 */
4577 /*ARGSUSED*/ 4797 /*ARGSUSED*/
4578 static void 4798 static void
4579 f_diff_hlID(argvars, retvar) 4799 f_diff_hlID(argvars, rettv)
4580 typeval *argvars; 4800 typeval *argvars;
4581 typeval *retvar; 4801 typeval *rettv;
4582 { 4802 {
4583 #ifdef FEAT_DIFF 4803 #ifdef FEAT_DIFF
4584 linenr_T lnum = get_vartv_lnum(argvars); 4804 linenr_T lnum = get_tv_lnum(argvars);
4585 static linenr_T prev_lnum = 0; 4805 static linenr_T prev_lnum = 0;
4586 static int changedtick = 0; 4806 static int changedtick = 0;
4587 static int fnum = 0; 4807 static int fnum = 0;
4588 static int change_start = 0; 4808 static int change_start = 0;
4589 static int change_end = 0; 4809 static int change_end = 0;
4618 fnum = curbuf->b_fnum; 4838 fnum = curbuf->b_fnum;
4619 } 4839 }
4620 4840
4621 if (hlID == HLF_CHD || hlID == HLF_TXD) 4841 if (hlID == HLF_CHD || hlID == HLF_TXD)
4622 { 4842 {
4623 col = get_vartv_number(&argvars[1]) - 1; 4843 col = get_tv_number(&argvars[1]) - 1;
4624 if (col >= change_start && col <= change_end) 4844 if (col >= change_start && col <= change_end)
4625 hlID = HLF_TXD; /* changed text */ 4845 hlID = HLF_TXD; /* changed text */
4626 else 4846 else
4627 hlID = HLF_CHD; /* changed line */ 4847 hlID = HLF_CHD; /* changed line */
4628 } 4848 }
4629 retvar->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID; 4849 rettv->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID;
4630 #endif 4850 #endif
4631 } 4851 }
4632 4852
4633 /* 4853 /*
4634 * "escape({string}, {chars})" function 4854 * "escape({string}, {chars})" function
4635 */ 4855 */
4636 static void 4856 static void
4637 f_escape(argvars, retvar) 4857 f_escape(argvars, rettv)
4638 typeval *argvars; 4858 typeval *argvars;
4639 typeval *retvar; 4859 typeval *rettv;
4640 { 4860 {
4641 char_u buf[NUMBUFLEN]; 4861 char_u buf[NUMBUFLEN];
4642 4862
4643 retvar->vval.v_string = 4863 rettv->vval.v_string =
4644 vim_strsave_escaped(get_vartv_string(&argvars[0]), 4864 vim_strsave_escaped(get_tv_string(&argvars[0]),
4645 get_vartv_string_buf(&argvars[1], buf)); 4865 get_tv_string_buf(&argvars[1], buf));
4646 retvar->v_type = VAR_STRING; 4866 rettv->v_type = VAR_STRING;
4647 } 4867 }
4648 4868
4649 /* 4869 /*
4650 * "eventhandler()" function 4870 * "eventhandler()" function
4651 */ 4871 */
4652 /*ARGSUSED*/ 4872 /*ARGSUSED*/
4653 static void 4873 static void
4654 f_eventhandler(argvars, retvar) 4874 f_eventhandler(argvars, rettv)
4655 typeval *argvars; 4875 typeval *argvars;
4656 typeval *retvar; 4876 typeval *rettv;
4657 { 4877 {
4658 retvar->vval.v_number = vgetc_busy; 4878 rettv->vval.v_number = vgetc_busy;
4659 } 4879 }
4660 4880
4661 /* 4881 /*
4662 * "executable()" function 4882 * "executable()" function
4663 */ 4883 */
4664 static void 4884 static void
4665 f_executable(argvars, retvar) 4885 f_executable(argvars, rettv)
4666 typeval *argvars; 4886 typeval *argvars;
4667 typeval *retvar; 4887 typeval *rettv;
4668 { 4888 {
4669 retvar->vval.v_number = mch_can_exe(get_vartv_string(&argvars[0])); 4889 rettv->vval.v_number = mch_can_exe(get_tv_string(&argvars[0]));
4670 } 4890 }
4671 4891
4672 /* 4892 /*
4673 * "exists()" function 4893 * "exists()" function
4674 */ 4894 */
4675 static void 4895 static void
4676 f_exists(argvars, retvar) 4896 f_exists(argvars, rettv)
4677 typeval *argvars; 4897 typeval *argvars;
4678 typeval *retvar; 4898 typeval *rettv;
4679 { 4899 {
4680 char_u *p; 4900 char_u *p;
4681 char_u *name; 4901 char_u *name;
4682 int n = FALSE; 4902 int n = FALSE;
4683 int len = 0; 4903 int len = 0;
4684 4904
4685 p = get_vartv_string(&argvars[0]); 4905 p = get_tv_string(&argvars[0]);
4686 if (*p == '$') /* environment variable */ 4906 if (*p == '$') /* environment variable */
4687 { 4907 {
4688 /* first try "normal" environment variables (fast) */ 4908 /* first try "normal" environment variables (fast) */
4689 if (mch_getenv(p + 1) != NULL) 4909 if (mch_getenv(p + 1) != NULL)
4690 n = TRUE; 4910 n = TRUE;
4696 n = TRUE; 4916 n = TRUE;
4697 vim_free(p); 4917 vim_free(p);
4698 } 4918 }
4699 } 4919 }
4700 else if (*p == '&' || *p == '+') /* option */ 4920 else if (*p == '&' || *p == '+') /* option */
4701 n = (get_option_vartv(&p, NULL, TRUE) == OK); 4921 n = (get_option_tv(&p, NULL, TRUE) == OK);
4702 else if (*p == '*') /* internal or user defined function */ 4922 else if (*p == '*') /* internal or user defined function */
4703 { 4923 {
4704 n = function_exists(p + 1); 4924 n = function_exists(p + 1);
4705 } 4925 }
4706 else if (*p == ':') 4926 else if (*p == ':')
4718 n = au_exists(name, name + STRLEN(name), NULL); 4938 n = au_exists(name, name + STRLEN(name), NULL);
4719 #endif 4939 #endif
4720 } 4940 }
4721 else /* internal variable */ 4941 else /* internal variable */
4722 { 4942 {
4723 #ifdef FEAT_MAGIC_BRACES
4724 char_u *expr_start; 4943 char_u *expr_start;
4725 char_u *expr_end; 4944 char_u *expr_end;
4726 char_u *temp_string = NULL; 4945 char_u *temp_string = NULL;
4727 char_u *s; 4946 char_u *s;
4728 #endif
4729 name = p; 4947 name = p;
4730 4948
4731 #ifdef FEAT_MAGIC_BRACES
4732 /* Find the end of the name. */ 4949 /* Find the end of the name. */
4733 s = find_name_end(name, &expr_start, &expr_end); 4950 s = find_name_end(name, &expr_start, &expr_end, FALSE);
4734 if (expr_start != NULL) 4951 if (expr_start != NULL)
4735 { 4952 {
4736 temp_string = make_expanded_name(name, expr_start, expr_end, s); 4953 temp_string = make_expanded_name(name, expr_start, expr_end, s);
4737 if (temp_string != NULL) 4954 if (temp_string != NULL)
4738 { 4955 {
4739 len = STRLEN(temp_string); 4956 len = STRLEN(temp_string);
4740 name = temp_string; 4957 name = temp_string;
4741 } 4958 }
4742 } 4959 }
4743 #endif
4744 if (len == 0) 4960 if (len == 0)
4745 len = get_id_len(&p); 4961 len = get_id_len(&p);
4746 if (len != 0) 4962 if (len != 0)
4747 n = (get_var_vartv(name, len, NULL) == OK); 4963 n = (get_var_tv(name, len, NULL) == OK);
4748 4964
4749 #ifdef FEAT_MAGIC_BRACES
4750 vim_free(temp_string); 4965 vim_free(temp_string);
4751 #endif 4966 }
4752 } 4967
4753 4968 rettv->vval.v_number = n;
4754 retvar->vval.v_number = n;
4755 } 4969 }
4756 4970
4757 /* 4971 /*
4758 * "expand()" function 4972 * "expand()" function
4759 */ 4973 */
4760 static void 4974 static void
4761 f_expand(argvars, retvar) 4975 f_expand(argvars, rettv)
4762 typeval *argvars; 4976 typeval *argvars;
4763 typeval *retvar; 4977 typeval *rettv;
4764 { 4978 {
4765 char_u *s; 4979 char_u *s;
4766 int len; 4980 int len;
4767 char_u *errormsg; 4981 char_u *errormsg;
4768 int flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND; 4982 int flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
4769 expand_T xpc; 4983 expand_T xpc;
4770 4984
4771 retvar->v_type = VAR_STRING; 4985 rettv->v_type = VAR_STRING;
4772 s = get_vartv_string(&argvars[0]); 4986 s = get_tv_string(&argvars[0]);
4773 if (*s == '%' || *s == '#' || *s == '<') 4987 if (*s == '%' || *s == '#' || *s == '<')
4774 { 4988 {
4775 ++emsg_off; 4989 ++emsg_off;
4776 retvar->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s); 4990 rettv->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
4777 --emsg_off; 4991 --emsg_off;
4778 } 4992 }
4779 else 4993 else
4780 { 4994 {
4781 /* When the optional second argument is non-zero, don't remove matches 4995 /* When the optional second argument is non-zero, don't remove matches
4782 * for 'suffixes' and 'wildignore' */ 4996 * for 'suffixes' and 'wildignore' */
4783 if (argvars[1].v_type != VAR_UNKNOWN && get_vartv_number(&argvars[1])) 4997 if (argvars[1].v_type != VAR_UNKNOWN && get_tv_number(&argvars[1]))
4784 flags |= WILD_KEEP_ALL; 4998 flags |= WILD_KEEP_ALL;
4785 ExpandInit(&xpc); 4999 ExpandInit(&xpc);
4786 xpc.xp_context = EXPAND_FILES; 5000 xpc.xp_context = EXPAND_FILES;
4787 retvar->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL); 5001 rettv->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
4788 ExpandCleanup(&xpc); 5002 ExpandCleanup(&xpc);
4789 } 5003 }
4790 } 5004 }
4791 5005
4792 /* 5006 /*
4793 * "filereadable()" function 5007 * "filereadable()" function
4794 */ 5008 */
4795 static void 5009 static void
4796 f_filereadable(argvars, retvar) 5010 f_filereadable(argvars, rettv)
4797 typeval *argvars; 5011 typeval *argvars;
4798 typeval *retvar; 5012 typeval *rettv;
4799 { 5013 {
4800 FILE *fd; 5014 FILE *fd;
4801 char_u *p; 5015 char_u *p;
4802 int n; 5016 int n;
4803 5017
4804 p = get_vartv_string(&argvars[0]); 5018 p = get_tv_string(&argvars[0]);
4805 if (*p && !mch_isdir(p) && (fd = mch_fopen((char *)p, "r")) != NULL) 5019 if (*p && !mch_isdir(p) && (fd = mch_fopen((char *)p, "r")) != NULL)
4806 { 5020 {
4807 n = TRUE; 5021 n = TRUE;
4808 fclose(fd); 5022 fclose(fd);
4809 } 5023 }
4810 else 5024 else
4811 n = FALSE; 5025 n = FALSE;
4812 5026
4813 retvar->vval.v_number = n; 5027 rettv->vval.v_number = n;
4814 } 5028 }
4815 5029
4816 /* 5030 /*
4817 * return 0 for not writable, 1 for writable file, 2 for a dir which we have 5031 * return 0 for not writable, 1 for writable file, 2 for a dir which we have
4818 * rights to write into. 5032 * rights to write into.
4819 */ 5033 */
4820 static void 5034 static void
4821 f_filewritable(argvars, retvar) 5035 f_filewritable(argvars, rettv)
4822 typeval *argvars; 5036 typeval *argvars;
4823 typeval *retvar; 5037 typeval *rettv;
4824 { 5038 {
4825 char_u *p; 5039 char_u *p;
4826 int retval = 0; 5040 int retval = 0;
4827 #if defined(UNIX) || defined(VMS) 5041 #if defined(UNIX) || defined(VMS)
4828 int perm = 0; 5042 int perm = 0;
4829 #endif 5043 #endif
4830 5044
4831 p = get_vartv_string(&argvars[0]); 5045 p = get_tv_string(&argvars[0]);
4832 #if defined(UNIX) || defined(VMS) 5046 #if defined(UNIX) || defined(VMS)
4833 perm = mch_getperm(p); 5047 perm = mch_getperm(p);
4834 #endif 5048 #endif
4835 #ifndef MACOS_CLASSIC /* TODO: get either mch_writable or mch_access */ 5049 #ifndef MACOS_CLASSIC /* TODO: get either mch_writable or mch_access */
4836 if ( 5050 if (
4847 { 5061 {
4848 ++retval; 5062 ++retval;
4849 if (mch_isdir(p)) 5063 if (mch_isdir(p))
4850 ++retval; 5064 ++retval;
4851 } 5065 }
4852 retvar->vval.v_number = retval; 5066 rettv->vval.v_number = retval;
4853 } 5067 }
4854 5068
4855 /* 5069 /*
4856 * "finddir({fname}[, {path}[, {count}]])" function 5070 * "finddir({fname}[, {path}[, {count}]])" function
4857 */ 5071 */
4858 static void 5072 static void
4859 f_finddir(argvars, retvar) 5073 f_finddir(argvars, rettv)
4860 typeval *argvars; 5074 typeval *argvars;
4861 typeval *retvar; 5075 typeval *rettv;
4862 { 5076 {
4863 f_findfilendir(argvars, retvar, TRUE); 5077 f_findfilendir(argvars, rettv, TRUE);
4864 } 5078 }
4865 5079
4866 /* 5080 /*
4867 * "findfile({fname}[, {path}[, {count}]])" function 5081 * "findfile({fname}[, {path}[, {count}]])" function
4868 */ 5082 */
4869 static void 5083 static void
4870 f_findfile(argvars, retvar) 5084 f_findfile(argvars, rettv)
4871 typeval *argvars; 5085 typeval *argvars;
4872 typeval *retvar; 5086 typeval *rettv;
4873 { 5087 {
4874 f_findfilendir(argvars, retvar, FALSE); 5088 f_findfilendir(argvars, rettv, FALSE);
4875 } 5089 }
4876 5090
4877 static void 5091 static void
4878 f_findfilendir(argvars, retvar, dir) 5092 f_findfilendir(argvars, rettv, dir)
4879 typeval *argvars; 5093 typeval *argvars;
4880 typeval *retvar; 5094 typeval *rettv;
4881 int dir; 5095 int dir;
4882 { 5096 {
4883 #ifdef FEAT_SEARCHPATH 5097 #ifdef FEAT_SEARCHPATH
4884 char_u *fname; 5098 char_u *fname;
4885 char_u *fresult = NULL; 5099 char_u *fresult = NULL;
4887 char_u *p; 5101 char_u *p;
4888 char_u pathbuf[NUMBUFLEN]; 5102 char_u pathbuf[NUMBUFLEN];
4889 int count = 1; 5103 int count = 1;
4890 int first = TRUE; 5104 int first = TRUE;
4891 5105
4892 fname = get_vartv_string(&argvars[0]); 5106 fname = get_tv_string(&argvars[0]);
4893 5107
4894 if (argvars[1].v_type != VAR_UNKNOWN) 5108 if (argvars[1].v_type != VAR_UNKNOWN)
4895 { 5109 {
4896 p = get_vartv_string_buf(&argvars[1], pathbuf); 5110 p = get_tv_string_buf(&argvars[1], pathbuf);
4897 if (*p != NUL) 5111 if (*p != NUL)
4898 path = p; 5112 path = p;
4899 5113
4900 if (argvars[2].v_type != VAR_UNKNOWN) 5114 if (argvars[2].v_type != VAR_UNKNOWN)
4901 count = get_vartv_number(&argvars[2]); 5115 count = get_tv_number(&argvars[2]);
4902 } 5116 }
4903 5117
4904 do 5118 do
4905 { 5119 {
4906 vim_free(fresult); 5120 vim_free(fresult);
4908 first ? (int)STRLEN(fname) : 0, 5122 first ? (int)STRLEN(fname) : 0,
4909 0, first, path, dir, NULL); 5123 0, first, path, dir, NULL);
4910 first = FALSE; 5124 first = FALSE;
4911 } while (--count > 0 && fresult != NULL); 5125 } while (--count > 0 && fresult != NULL);
4912 5126
4913 retvar->vval.v_string = fresult; 5127 rettv->vval.v_string = fresult;
4914 #else 5128 #else
4915 retvar->vval.v_string = NULL; 5129 rettv->vval.v_string = NULL;
4916 #endif 5130 #endif
4917 retvar->v_type = VAR_STRING; 5131 rettv->v_type = VAR_STRING;
4918 } 5132 }
4919 5133
4920 /* 5134 /*
4921 * "fnamemodify({fname}, {mods})" function 5135 * "fnamemodify({fname}, {mods})" function
4922 */ 5136 */
4923 static void 5137 static void
4924 f_fnamemodify(argvars, retvar) 5138 f_fnamemodify(argvars, rettv)
4925 typeval *argvars; 5139 typeval *argvars;
4926 typeval *retvar; 5140 typeval *rettv;
4927 { 5141 {
4928 char_u *fname; 5142 char_u *fname;
4929 char_u *mods; 5143 char_u *mods;
4930 int usedlen = 0; 5144 int usedlen = 0;
4931 int len; 5145 int len;
4932 char_u *fbuf = NULL; 5146 char_u *fbuf = NULL;
4933 char_u buf[NUMBUFLEN]; 5147 char_u buf[NUMBUFLEN];
4934 5148
4935 fname = get_vartv_string(&argvars[0]); 5149 fname = get_tv_string(&argvars[0]);
4936 mods = get_vartv_string_buf(&argvars[1], buf); 5150 mods = get_tv_string_buf(&argvars[1], buf);
4937 len = (int)STRLEN(fname); 5151 len = (int)STRLEN(fname);
4938 5152
4939 (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len); 5153 (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
4940 5154
4941 retvar->v_type = VAR_STRING; 5155 rettv->v_type = VAR_STRING;
4942 if (fname == NULL) 5156 if (fname == NULL)
4943 retvar->vval.v_string = NULL; 5157 rettv->vval.v_string = NULL;
4944 else 5158 else
4945 retvar->vval.v_string = vim_strnsave(fname, len); 5159 rettv->vval.v_string = vim_strnsave(fname, len);
4946 vim_free(fbuf); 5160 vim_free(fbuf);
4947 } 5161 }
4948 5162
4949 /* 5163 /*
4950 * "foldclosed()" function 5164 * "foldclosed()" function
4951 */ 5165 */
4952 static void 5166 static void
4953 f_foldclosed(argvars, retvar) 5167 f_foldclosed(argvars, rettv)
4954 typeval *argvars; 5168 typeval *argvars;
4955 typeval *retvar; 5169 typeval *rettv;
4956 { 5170 {
4957 foldclosed_both(argvars, retvar, FALSE); 5171 foldclosed_both(argvars, rettv, FALSE);
4958 } 5172 }
4959 5173
4960 /* 5174 /*
4961 * "foldclosedend()" function 5175 * "foldclosedend()" function
4962 */ 5176 */
4963 static void 5177 static void
4964 f_foldclosedend(argvars, retvar) 5178 f_foldclosedend(argvars, rettv)
4965 typeval *argvars; 5179 typeval *argvars;
4966 typeval *retvar; 5180 typeval *rettv;
4967 { 5181 {
4968 foldclosed_both(argvars, retvar, TRUE); 5182 foldclosed_both(argvars, rettv, TRUE);
4969 } 5183 }
4970 5184
4971 /* 5185 /*
4972 * "foldclosed()" function 5186 * "foldclosed()" function
4973 */ 5187 */
4974 static void 5188 static void
4975 foldclosed_both(argvars, retvar, end) 5189 foldclosed_both(argvars, rettv, end)
4976 typeval *argvars; 5190 typeval *argvars;
4977 typeval *retvar; 5191 typeval *rettv;
4978 int end; 5192 int end;
4979 { 5193 {
4980 #ifdef FEAT_FOLDING 5194 #ifdef FEAT_FOLDING
4981 linenr_T lnum; 5195 linenr_T lnum;
4982 linenr_T first, last; 5196 linenr_T first, last;
4983 5197
4984 lnum = get_vartv_lnum(argvars); 5198 lnum = get_tv_lnum(argvars);
4985 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 5199 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
4986 { 5200 {
4987 if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL)) 5201 if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
4988 { 5202 {
4989 if (end) 5203 if (end)
4990 retvar->vval.v_number = (varnumber_T)last; 5204 rettv->vval.v_number = (varnumber_T)last;
4991 else 5205 else
4992 retvar->vval.v_number = (varnumber_T)first; 5206 rettv->vval.v_number = (varnumber_T)first;
4993 return; 5207 return;
4994 } 5208 }
4995 } 5209 }
4996 #endif 5210 #endif
4997 retvar->vval.v_number = -1; 5211 rettv->vval.v_number = -1;
4998 } 5212 }
4999 5213
5000 /* 5214 /*
5001 * "foldlevel()" function 5215 * "foldlevel()" function
5002 */ 5216 */
5003 static void 5217 static void
5004 f_foldlevel(argvars, retvar) 5218 f_foldlevel(argvars, rettv)
5005 typeval *argvars; 5219 typeval *argvars;
5006 typeval *retvar; 5220 typeval *rettv;
5007 { 5221 {
5008 #ifdef FEAT_FOLDING 5222 #ifdef FEAT_FOLDING
5009 linenr_T lnum; 5223 linenr_T lnum;
5010 5224
5011 lnum = get_vartv_lnum(argvars); 5225 lnum = get_tv_lnum(argvars);
5012 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 5226 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
5013 retvar->vval.v_number = foldLevel(lnum); 5227 rettv->vval.v_number = foldLevel(lnum);
5014 else 5228 else
5015 #endif 5229 #endif
5016 retvar->vval.v_number = 0; 5230 rettv->vval.v_number = 0;
5017 } 5231 }
5018 5232
5019 /* 5233 /*
5020 * "foldtext()" function 5234 * "foldtext()" function
5021 */ 5235 */
5022 /*ARGSUSED*/ 5236 /*ARGSUSED*/
5023 static void 5237 static void
5024 f_foldtext(argvars, retvar) 5238 f_foldtext(argvars, rettv)
5025 typeval *argvars; 5239 typeval *argvars;
5026 typeval *retvar; 5240 typeval *rettv;
5027 { 5241 {
5028 #ifdef FEAT_FOLDING 5242 #ifdef FEAT_FOLDING
5029 linenr_T lnum; 5243 linenr_T lnum;
5030 char_u *s; 5244 char_u *s;
5031 char_u *r; 5245 char_u *r;
5032 int len; 5246 int len;
5033 char *txt; 5247 char *txt;
5034 #endif 5248 #endif
5035 5249
5036 retvar->v_type = VAR_STRING; 5250 rettv->v_type = VAR_STRING;
5037 retvar->vval.v_string = NULL; 5251 rettv->vval.v_string = NULL;
5038 #ifdef FEAT_FOLDING 5252 #ifdef FEAT_FOLDING
5039 if ((linenr_T)vimvars[VV_FOLDSTART].val > 0 5253 if ((linenr_T)vimvars[VV_FOLDSTART].val > 0
5040 && (linenr_T)vimvars[VV_FOLDEND].val <= curbuf->b_ml.ml_line_count 5254 && (linenr_T)vimvars[VV_FOLDEND].val <= curbuf->b_ml.ml_line_count
5041 && vimvars[VV_FOLDDASHES].val != NULL) 5255 && vimvars[VV_FOLDDASHES].val != NULL)
5042 { 5256 {
5075 - (linenr_T)vimvars[VV_FOLDSTART].val + 1)); 5289 - (linenr_T)vimvars[VV_FOLDSTART].val + 1));
5076 len = (int)STRLEN(r); 5290 len = (int)STRLEN(r);
5077 STRCAT(r, s); 5291 STRCAT(r, s);
5078 /* remove 'foldmarker' and 'commentstring' */ 5292 /* remove 'foldmarker' and 'commentstring' */
5079 foldtext_cleanup(r + len); 5293 foldtext_cleanup(r + len);
5080 retvar->vval.v_string = r; 5294 rettv->vval.v_string = r;
5081 } 5295 }
5082 } 5296 }
5083 #endif 5297 #endif
5084 } 5298 }
5085 5299
5086 /* 5300 /*
5087 * "foldtextresult(lnum)" function 5301 * "foldtextresult(lnum)" function
5088 */ 5302 */
5089 /*ARGSUSED*/ 5303 /*ARGSUSED*/
5090 static void 5304 static void
5091 f_foldtextresult(argvars, retvar) 5305 f_foldtextresult(argvars, rettv)
5092 typeval *argvars; 5306 typeval *argvars;
5093 typeval *retvar; 5307 typeval *rettv;
5094 { 5308 {
5095 #ifdef FEAT_FOLDING 5309 #ifdef FEAT_FOLDING
5096 linenr_T lnum; 5310 linenr_T lnum;
5097 char_u *text; 5311 char_u *text;
5098 char_u buf[51]; 5312 char_u buf[51];
5099 foldinfo_T foldinfo; 5313 foldinfo_T foldinfo;
5100 int fold_count; 5314 int fold_count;
5101 #endif 5315 #endif
5102 5316
5103 retvar->v_type = VAR_STRING; 5317 rettv->v_type = VAR_STRING;
5104 retvar->vval.v_string = NULL; 5318 rettv->vval.v_string = NULL;
5105 #ifdef FEAT_FOLDING 5319 #ifdef FEAT_FOLDING
5106 lnum = get_vartv_lnum(argvars); 5320 lnum = get_tv_lnum(argvars);
5107 fold_count = foldedCount(curwin, lnum, &foldinfo); 5321 fold_count = foldedCount(curwin, lnum, &foldinfo);
5108 if (fold_count > 0) 5322 if (fold_count > 0)
5109 { 5323 {
5110 text = get_foldtext(curwin, lnum, lnum + fold_count - 1, 5324 text = get_foldtext(curwin, lnum, lnum + fold_count - 1,
5111 &foldinfo, buf); 5325 &foldinfo, buf);
5112 if (text == buf) 5326 if (text == buf)
5113 text = vim_strsave(text); 5327 text = vim_strsave(text);
5114 retvar->vval.v_string = text; 5328 rettv->vval.v_string = text;
5115 } 5329 }
5116 #endif 5330 #endif
5117 } 5331 }
5118 5332
5119 /* 5333 /*
5120 * "foreground()" function 5334 * "foreground()" function
5121 */ 5335 */
5122 /*ARGSUSED*/ 5336 /*ARGSUSED*/
5123 static void 5337 static void
5124 f_foreground(argvars, retvar) 5338 f_foreground(argvars, rettv)
5125 typeval *argvars; 5339 typeval *argvars;
5126 typeval *retvar; 5340 typeval *rettv;
5127 { 5341 {
5128 retvar->vval.v_number = 0; 5342 rettv->vval.v_number = 0;
5129 #ifdef FEAT_GUI 5343 #ifdef FEAT_GUI
5130 if (gui.in_use) 5344 if (gui.in_use)
5131 gui_mch_set_foreground(); 5345 gui_mch_set_foreground();
5132 #else 5346 #else
5133 # ifdef WIN32 5347 # ifdef WIN32
5139 /* 5353 /*
5140 * "function()" function 5354 * "function()" function
5141 */ 5355 */
5142 /*ARGSUSED*/ 5356 /*ARGSUSED*/
5143 static void 5357 static void
5144 f_function(argvars, retvar) 5358 f_function(argvars, rettv)
5145 typeval *argvars; 5359 typeval *argvars;
5146 typeval *retvar; 5360 typeval *rettv;
5147 { 5361 {
5148 char_u *s; 5362 char_u *s;
5149 5363
5150 s = get_vartv_string(&argvars[0]); 5364 s = get_tv_string(&argvars[0]);
5151 if (s == NULL || *s == NUL || isdigit(*s)) 5365 if (s == NULL || *s == NUL || isdigit(*s))
5152 EMSG2(_(e_invarg2), s); 5366 EMSG2(_(e_invarg2), s);
5153 else if (!function_exists(s)) 5367 else if (!function_exists(s))
5154 EMSG2(_("E999: Unknown function: %s"), s); 5368 EMSG2(_("E999: Unknown function: %s"), s);
5155 else 5369 else
5156 { 5370 {
5157 retvar->vval.v_string = vim_strsave(s); 5371 rettv->vval.v_string = vim_strsave(s);
5158 retvar->v_type = VAR_FUNC; 5372 rettv->v_type = VAR_FUNC;
5159 } 5373 }
5160 } 5374 }
5161 5375
5162 /* 5376 /*
5163 * "getchar()" function 5377 * "getchar()" function
5164 */ 5378 */
5165 static void 5379 static void
5166 f_getchar(argvars, retvar) 5380 f_getchar(argvars, rettv)
5167 typeval *argvars; 5381 typeval *argvars;
5168 typeval *retvar; 5382 typeval *rettv;
5169 { 5383 {
5170 varnumber_T n; 5384 varnumber_T n;
5171 5385
5172 ++no_mapping; 5386 ++no_mapping;
5173 ++allow_keys; 5387 ++allow_keys;
5174 if (argvars[0].v_type == VAR_UNKNOWN) 5388 if (argvars[0].v_type == VAR_UNKNOWN)
5175 /* getchar(): blocking wait. */ 5389 /* getchar(): blocking wait. */
5176 n = safe_vgetc(); 5390 n = safe_vgetc();
5177 else if (get_vartv_number(&argvars[0]) == 1) 5391 else if (get_tv_number(&argvars[0]) == 1)
5178 /* getchar(1): only check if char avail */ 5392 /* getchar(1): only check if char avail */
5179 n = vpeekc(); 5393 n = vpeekc();
5180 else if (vpeekc() == NUL) 5394 else if (vpeekc() == NUL)
5181 /* getchar(0) and no char avail: return zero */ 5395 /* getchar(0) and no char avail: return zero */
5182 n = 0; 5396 n = 0;
5184 /* getchar(0) and char avail: return char */ 5398 /* getchar(0) and char avail: return char */
5185 n = safe_vgetc(); 5399 n = safe_vgetc();
5186 --no_mapping; 5400 --no_mapping;
5187 --allow_keys; 5401 --allow_keys;
5188 5402
5189 retvar->vval.v_number = n; 5403 rettv->vval.v_number = n;
5190 if (IS_SPECIAL(n) || mod_mask != 0) 5404 if (IS_SPECIAL(n) || mod_mask != 0)
5191 { 5405 {
5192 char_u temp[10]; /* modifier: 3, mbyte-char: 6, NUL: 1 */ 5406 char_u temp[10]; /* modifier: 3, mbyte-char: 6, NUL: 1 */
5193 int i = 0; 5407 int i = 0;
5194 5408
5210 i += (*mb_char2bytes)(n, temp + i); 5424 i += (*mb_char2bytes)(n, temp + i);
5211 #endif 5425 #endif
5212 else 5426 else
5213 temp[i++] = n; 5427 temp[i++] = n;
5214 temp[i++] = NUL; 5428 temp[i++] = NUL;
5215 retvar->v_type = VAR_STRING; 5429 rettv->v_type = VAR_STRING;
5216 retvar->vval.v_string = vim_strsave(temp); 5430 rettv->vval.v_string = vim_strsave(temp);
5217 } 5431 }
5218 } 5432 }
5219 5433
5220 /* 5434 /*
5221 * "getcharmod()" function 5435 * "getcharmod()" function
5222 */ 5436 */
5223 /*ARGSUSED*/ 5437 /*ARGSUSED*/
5224 static void 5438 static void
5225 f_getcharmod(argvars, retvar) 5439 f_getcharmod(argvars, rettv)
5226 typeval *argvars; 5440 typeval *argvars;
5227 typeval *retvar; 5441 typeval *rettv;
5228 { 5442 {
5229 retvar->vval.v_number = mod_mask; 5443 rettv->vval.v_number = mod_mask;
5230 } 5444 }
5231 5445
5232 /* 5446 /*
5233 * "getcmdline()" function 5447 * "getcmdline()" function
5234 */ 5448 */
5235 /*ARGSUSED*/ 5449 /*ARGSUSED*/
5236 static void 5450 static void
5237 f_getcmdline(argvars, retvar) 5451 f_getcmdline(argvars, rettv)
5238 typeval *argvars; 5452 typeval *argvars;
5239 typeval *retvar; 5453 typeval *rettv;
5240 { 5454 {
5241 retvar->v_type = VAR_STRING; 5455 rettv->v_type = VAR_STRING;
5242 retvar->vval.v_string = get_cmdline_str(); 5456 rettv->vval.v_string = get_cmdline_str();
5243 } 5457 }
5244 5458
5245 /* 5459 /*
5246 * "getcmdpos()" function 5460 * "getcmdpos()" function
5247 */ 5461 */
5248 /*ARGSUSED*/ 5462 /*ARGSUSED*/
5249 static void 5463 static void
5250 f_getcmdpos(argvars, retvar) 5464 f_getcmdpos(argvars, rettv)
5251 typeval *argvars; 5465 typeval *argvars;
5252 typeval *retvar; 5466 typeval *rettv;
5253 { 5467 {
5254 retvar->vval.v_number = get_cmdline_pos() + 1; 5468 rettv->vval.v_number = get_cmdline_pos() + 1;
5255 } 5469 }
5256 5470
5257 /* 5471 /*
5258 * "getbufvar()" function 5472 * "getbufvar()" function
5259 */ 5473 */
5260 static void 5474 static void
5261 f_getbufvar(argvars, retvar) 5475 f_getbufvar(argvars, rettv)
5262 typeval *argvars; 5476 typeval *argvars;
5263 typeval *retvar; 5477 typeval *rettv;
5264 { 5478 {
5265 buf_T *buf; 5479 buf_T *buf;
5266 buf_T *save_curbuf; 5480 buf_T *save_curbuf;
5267 char_u *varname; 5481 char_u *varname;
5268 VAR v; 5482 VAR v;
5269 5483
5270 ++emsg_off; 5484 ++emsg_off;
5271 buf = get_buf_vartv(&argvars[0]); 5485 buf = get_buf_tv(&argvars[0]);
5272 varname = get_vartv_string(&argvars[1]); 5486 varname = get_tv_string(&argvars[1]);
5273 5487
5274 retvar->v_type = VAR_STRING; 5488 rettv->v_type = VAR_STRING;
5275 retvar->vval.v_string = NULL; 5489 rettv->vval.v_string = NULL;
5276 5490
5277 if (buf != NULL && varname != NULL) 5491 if (buf != NULL && varname != NULL)
5278 { 5492 {
5279 if (*varname == '&') /* buffer-local-option */ 5493 if (*varname == '&') /* buffer-local-option */
5280 { 5494 {
5281 /* set curbuf to be our buf, temporarily */ 5495 /* set curbuf to be our buf, temporarily */
5282 save_curbuf = curbuf; 5496 save_curbuf = curbuf;
5283 curbuf = buf; 5497 curbuf = buf;
5284 5498
5285 get_option_vartv(&varname, retvar, TRUE); 5499 get_option_tv(&varname, rettv, TRUE);
5286 5500
5287 /* restore previous notion of curbuf */ 5501 /* restore previous notion of curbuf */
5288 curbuf = save_curbuf; 5502 curbuf = save_curbuf;
5289 } 5503 }
5290 else 5504 else
5291 { 5505 {
5292 /* look up the variable */ 5506 /* look up the variable */
5293 v = find_var_in_ga(&buf->b_vars, varname); 5507 v = find_var_in_ga(&buf->b_vars, varname);
5294 if (v != NULL) 5508 if (v != NULL)
5295 copy_vartv(&v->tv, retvar); 5509 copy_tv(&v->tv, rettv);
5296 } 5510 }
5297 } 5511 }
5298 5512
5299 --emsg_off; 5513 --emsg_off;
5300 } 5514 }
5302 /* 5516 /*
5303 * "getcwd()" function 5517 * "getcwd()" function
5304 */ 5518 */
5305 /*ARGSUSED*/ 5519 /*ARGSUSED*/
5306 static void 5520 static void
5307 f_getcwd(argvars, retvar) 5521 f_getcwd(argvars, rettv)
5308 typeval *argvars; 5522 typeval *argvars;
5309 typeval *retvar; 5523 typeval *rettv;
5310 { 5524 {
5311 char_u cwd[MAXPATHL]; 5525 char_u cwd[MAXPATHL];
5312 5526
5313 retvar->v_type = VAR_STRING; 5527 rettv->v_type = VAR_STRING;
5314 if (mch_dirname(cwd, MAXPATHL) == FAIL) 5528 if (mch_dirname(cwd, MAXPATHL) == FAIL)
5315 retvar->vval.v_string = NULL; 5529 rettv->vval.v_string = NULL;
5316 else 5530 else
5317 { 5531 {
5318 retvar->vval.v_string = vim_strsave(cwd); 5532 rettv->vval.v_string = vim_strsave(cwd);
5319 #ifdef BACKSLASH_IN_FILENAME 5533 #ifdef BACKSLASH_IN_FILENAME
5320 slash_adjust(retvar->vval.v_string); 5534 slash_adjust(rettv->vval.v_string);
5321 #endif 5535 #endif
5322 } 5536 }
5323 } 5537 }
5324 5538
5325 /* 5539 /*
5326 * "getfontname()" function 5540 * "getfontname()" function
5327 */ 5541 */
5328 /*ARGSUSED*/ 5542 /*ARGSUSED*/
5329 static void 5543 static void
5330 f_getfontname(argvars, retvar) 5544 f_getfontname(argvars, rettv)
5331 typeval *argvars; 5545 typeval *argvars;
5332 typeval *retvar; 5546 typeval *rettv;
5333 { 5547 {
5334 retvar->v_type = VAR_STRING; 5548 rettv->v_type = VAR_STRING;
5335 retvar->vval.v_string = NULL; 5549 rettv->vval.v_string = NULL;
5336 #ifdef FEAT_GUI 5550 #ifdef FEAT_GUI
5337 if (gui.in_use) 5551 if (gui.in_use)
5338 { 5552 {
5339 GuiFont font; 5553 GuiFont font;
5340 char_u *name = NULL; 5554 char_u *name = NULL;
5346 font = gui.norm_font; 5560 font = gui.norm_font;
5347 name = hl_get_font_name(); 5561 name = hl_get_font_name();
5348 } 5562 }
5349 else 5563 else
5350 { 5564 {
5351 name = get_vartv_string(&argvars[0]); 5565 name = get_tv_string(&argvars[0]);
5352 if (STRCMP(name, "*") == 0) /* don't use font dialog */ 5566 if (STRCMP(name, "*") == 0) /* don't use font dialog */
5353 return; 5567 return;
5354 font = gui_mch_get_font(name, FALSE); 5568 font = gui_mch_get_font(name, FALSE);
5355 if (font == NOFONT) 5569 if (font == NOFONT)
5356 return; /* Invalid font name, return empty string. */ 5570 return; /* Invalid font name, return empty string. */
5357 } 5571 }
5358 retvar->vval.v_string = gui_mch_get_fontname(font, name); 5572 rettv->vval.v_string = gui_mch_get_fontname(font, name);
5359 if (argvars[0].v_type != VAR_UNKNOWN) 5573 if (argvars[0].v_type != VAR_UNKNOWN)
5360 gui_mch_free_font(font); 5574 gui_mch_free_font(font);
5361 } 5575 }
5362 #endif 5576 #endif
5363 } 5577 }
5364 5578
5365 /* 5579 /*
5366 * "getfperm({fname})" function 5580 * "getfperm({fname})" function
5367 */ 5581 */
5368 static void 5582 static void
5369 f_getfperm(argvars, retvar) 5583 f_getfperm(argvars, rettv)
5370 typeval *argvars; 5584 typeval *argvars;
5371 typeval *retvar; 5585 typeval *rettv;
5372 { 5586 {
5373 char_u *fname; 5587 char_u *fname;
5374 struct stat st; 5588 struct stat st;
5375 char_u *perm = NULL; 5589 char_u *perm = NULL;
5376 char_u flags[] = "rwx"; 5590 char_u flags[] = "rwx";
5377 int i; 5591 int i;
5378 5592
5379 fname = get_vartv_string(&argvars[0]); 5593 fname = get_tv_string(&argvars[0]);
5380 5594
5381 retvar->v_type = VAR_STRING; 5595 rettv->v_type = VAR_STRING;
5382 if (mch_stat((char *)fname, &st) >= 0) 5596 if (mch_stat((char *)fname, &st) >= 0)
5383 { 5597 {
5384 perm = vim_strsave((char_u *)"---------"); 5598 perm = vim_strsave((char_u *)"---------");
5385 if (perm != NULL) 5599 if (perm != NULL)
5386 { 5600 {
5389 if (st.st_mode & (1 << (8 - i))) 5603 if (st.st_mode & (1 << (8 - i)))
5390 perm[i] = flags[i % 3]; 5604 perm[i] = flags[i % 3];
5391 } 5605 }
5392 } 5606 }
5393 } 5607 }
5394 retvar->vval.v_string = perm; 5608 rettv->vval.v_string = perm;
5395 } 5609 }
5396 5610
5397 /* 5611 /*
5398 * "getfsize({fname})" function 5612 * "getfsize({fname})" function
5399 */ 5613 */
5400 static void 5614 static void
5401 f_getfsize(argvars, retvar) 5615 f_getfsize(argvars, rettv)
5402 typeval *argvars; 5616 typeval *argvars;
5403 typeval *retvar; 5617 typeval *rettv;
5404 { 5618 {
5405 char_u *fname; 5619 char_u *fname;
5406 struct stat st; 5620 struct stat st;
5407 5621
5408 fname = get_vartv_string(&argvars[0]); 5622 fname = get_tv_string(&argvars[0]);
5409 5623
5410 retvar->v_type = VAR_NUMBER; 5624 rettv->v_type = VAR_NUMBER;
5411 5625
5412 if (mch_stat((char *)fname, &st) >= 0) 5626 if (mch_stat((char *)fname, &st) >= 0)
5413 { 5627 {
5414 if (mch_isdir(fname)) 5628 if (mch_isdir(fname))
5415 retvar->vval.v_number = 0; 5629 rettv->vval.v_number = 0;
5416 else 5630 else
5417 retvar->vval.v_number = (varnumber_T)st.st_size; 5631 rettv->vval.v_number = (varnumber_T)st.st_size;
5418 } 5632 }
5419 else 5633 else
5420 retvar->vval.v_number = -1; 5634 rettv->vval.v_number = -1;
5421 } 5635 }
5422 5636
5423 /* 5637 /*
5424 * "getftime({fname})" function 5638 * "getftime({fname})" function
5425 */ 5639 */
5426 static void 5640 static void
5427 f_getftime(argvars, retvar) 5641 f_getftime(argvars, rettv)
5428 typeval *argvars; 5642 typeval *argvars;
5429 typeval *retvar; 5643 typeval *rettv;
5430 { 5644 {
5431 char_u *fname; 5645 char_u *fname;
5432 struct stat st; 5646 struct stat st;
5433 5647
5434 fname = get_vartv_string(&argvars[0]); 5648 fname = get_tv_string(&argvars[0]);
5435 5649
5436 if (mch_stat((char *)fname, &st) >= 0) 5650 if (mch_stat((char *)fname, &st) >= 0)
5437 retvar->vval.v_number = (varnumber_T)st.st_mtime; 5651 rettv->vval.v_number = (varnumber_T)st.st_mtime;
5438 else 5652 else
5439 retvar->vval.v_number = -1; 5653 rettv->vval.v_number = -1;
5440 } 5654 }
5441 5655
5442 /* 5656 /*
5443 * "getftype({fname})" function 5657 * "getftype({fname})" function
5444 */ 5658 */
5445 static void 5659 static void
5446 f_getftype(argvars, retvar) 5660 f_getftype(argvars, rettv)
5447 typeval *argvars; 5661 typeval *argvars;
5448 typeval *retvar; 5662 typeval *rettv;
5449 { 5663 {
5450 char_u *fname; 5664 char_u *fname;
5451 struct stat st; 5665 struct stat st;
5452 char_u *type = NULL; 5666 char_u *type = NULL;
5453 char *t; 5667 char *t;
5454 5668
5455 fname = get_vartv_string(&argvars[0]); 5669 fname = get_tv_string(&argvars[0]);
5456 5670
5457 retvar->v_type = VAR_STRING; 5671 rettv->v_type = VAR_STRING;
5458 if (mch_lstat((char *)fname, &st) >= 0) 5672 if (mch_lstat((char *)fname, &st) >= 0)
5459 { 5673 {
5460 #ifdef S_ISREG 5674 #ifdef S_ISREG
5461 if (S_ISREG(st.st_mode)) 5675 if (S_ISREG(st.st_mode))
5462 t = "file"; 5676 t = "file";
5514 t = "file"; 5728 t = "file";
5515 # endif 5729 # endif
5516 #endif 5730 #endif
5517 type = vim_strsave((char_u *)t); 5731 type = vim_strsave((char_u *)t);
5518 } 5732 }
5519 retvar->vval.v_string = type; 5733 rettv->vval.v_string = type;
5520 } 5734 }
5521 5735
5522 /* 5736 /*
5523 * "getreg()" function 5737 * "getreg()" function
5524 */ 5738 */
5525 static void 5739 static void
5526 f_getreg(argvars, retvar) 5740 f_getreg(argvars, rettv)
5527 typeval *argvars; 5741 typeval *argvars;
5528 typeval *retvar; 5742 typeval *rettv;
5529 { 5743 {
5530 char_u *strregname; 5744 char_u *strregname;
5531 int regname; 5745 int regname;
5532 5746
5533 if (argvars[0].v_type != VAR_UNKNOWN) 5747 if (argvars[0].v_type != VAR_UNKNOWN)
5534 strregname = get_vartv_string(&argvars[0]); 5748 strregname = get_tv_string(&argvars[0]);
5535 else 5749 else
5536 strregname = vimvars[VV_REG].val; 5750 strregname = vimvars[VV_REG].val;
5537 regname = (strregname == NULL ? '"' : *strregname); 5751 regname = (strregname == NULL ? '"' : *strregname);
5538 if (regname == 0) 5752 if (regname == 0)
5539 regname = '"'; 5753 regname = '"';
5540 5754
5541 retvar->v_type = VAR_STRING; 5755 rettv->v_type = VAR_STRING;
5542 retvar->vval.v_string = get_reg_contents(regname, TRUE); 5756 rettv->vval.v_string = get_reg_contents(regname, TRUE);
5543 } 5757 }
5544 5758
5545 /* 5759 /*
5546 * "getregtype()" function 5760 * "getregtype()" function
5547 */ 5761 */
5548 static void 5762 static void
5549 f_getregtype(argvars, retvar) 5763 f_getregtype(argvars, rettv)
5550 typeval *argvars; 5764 typeval *argvars;
5551 typeval *retvar; 5765 typeval *rettv;
5552 { 5766 {
5553 char_u *strregname; 5767 char_u *strregname;
5554 int regname; 5768 int regname;
5555 char_u buf[NUMBUFLEN + 2]; 5769 char_u buf[NUMBUFLEN + 2];
5556 long reglen = 0; 5770 long reglen = 0;
5557 5771
5558 if (argvars[0].v_type != VAR_UNKNOWN) 5772 if (argvars[0].v_type != VAR_UNKNOWN)
5559 strregname = get_vartv_string(&argvars[0]); 5773 strregname = get_tv_string(&argvars[0]);
5560 else 5774 else
5561 /* Default to v:register */ 5775 /* Default to v:register */
5562 strregname = vimvars[VV_REG].val; 5776 strregname = vimvars[VV_REG].val;
5563 5777
5564 regname = (strregname == NULL ? '"' : *strregname); 5778 regname = (strregname == NULL ? '"' : *strregname);
5576 buf[0] = Ctrl_V; 5790 buf[0] = Ctrl_V;
5577 sprintf((char *)buf + 1, "%ld", reglen + 1); 5791 sprintf((char *)buf + 1, "%ld", reglen + 1);
5578 break; 5792 break;
5579 #endif 5793 #endif
5580 } 5794 }
5581 retvar->v_type = VAR_STRING; 5795 rettv->v_type = VAR_STRING;
5582 retvar->vval.v_string = vim_strsave(buf); 5796 rettv->vval.v_string = vim_strsave(buf);
5583 } 5797 }
5584 5798
5585 /* 5799 /*
5586 * "getline(lnum)" function 5800 * "getline(lnum)" function
5587 */ 5801 */
5588 static void 5802 static void
5589 f_getline(argvars, retvar) 5803 f_getline(argvars, rettv)
5590 typeval *argvars; 5804 typeval *argvars;
5591 typeval *retvar; 5805 typeval *rettv;
5592 { 5806 {
5593 linenr_T lnum; 5807 linenr_T lnum;
5594 char_u *p; 5808 char_u *p;
5595 5809
5596 lnum = get_vartv_lnum(argvars); 5810 lnum = get_tv_lnum(argvars);
5597 5811
5598 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 5812 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
5599 p = ml_get(lnum); 5813 p = ml_get(lnum);
5600 else 5814 else
5601 p = (char_u *)""; 5815 p = (char_u *)"";
5602 5816
5603 retvar->v_type = VAR_STRING; 5817 rettv->v_type = VAR_STRING;
5604 retvar->vval.v_string = vim_strsave(p); 5818 rettv->vval.v_string = vim_strsave(p);
5605 } 5819 }
5606 5820
5607 /* 5821 /*
5608 * "getwinposx()" function 5822 * "getwinposx()" function
5609 */ 5823 */
5610 /*ARGSUSED*/ 5824 /*ARGSUSED*/
5611 static void 5825 static void
5612 f_getwinposx(argvars, retvar) 5826 f_getwinposx(argvars, rettv)
5613 typeval *argvars; 5827 typeval *argvars;
5614 typeval *retvar; 5828 typeval *rettv;
5615 { 5829 {
5616 retvar->vval.v_number = -1; 5830 rettv->vval.v_number = -1;
5617 #ifdef FEAT_GUI 5831 #ifdef FEAT_GUI
5618 if (gui.in_use) 5832 if (gui.in_use)
5619 { 5833 {
5620 int x, y; 5834 int x, y;
5621 5835
5622 if (gui_mch_get_winpos(&x, &y) == OK) 5836 if (gui_mch_get_winpos(&x, &y) == OK)
5623 retvar->vval.v_number = x; 5837 rettv->vval.v_number = x;
5624 } 5838 }
5625 #endif 5839 #endif
5626 } 5840 }
5627 5841
5628 /* 5842 /*
5629 * "getwinposy()" function 5843 * "getwinposy()" function
5630 */ 5844 */
5631 /*ARGSUSED*/ 5845 /*ARGSUSED*/
5632 static void 5846 static void
5633 f_getwinposy(argvars, retvar) 5847 f_getwinposy(argvars, rettv)
5634 typeval *argvars; 5848 typeval *argvars;
5635 typeval *retvar; 5849 typeval *rettv;
5636 { 5850 {
5637 retvar->vval.v_number = -1; 5851 rettv->vval.v_number = -1;
5638 #ifdef FEAT_GUI 5852 #ifdef FEAT_GUI
5639 if (gui.in_use) 5853 if (gui.in_use)
5640 { 5854 {
5641 int x, y; 5855 int x, y;
5642 5856
5643 if (gui_mch_get_winpos(&x, &y) == OK) 5857 if (gui_mch_get_winpos(&x, &y) == OK)
5644 retvar->vval.v_number = y; 5858 rettv->vval.v_number = y;
5645 } 5859 }
5646 #endif 5860 #endif
5647 } 5861 }
5648 5862
5649 /* 5863 /*
5650 * "getwinvar()" function 5864 * "getwinvar()" function
5651 */ 5865 */
5652 static void 5866 static void
5653 f_getwinvar(argvars, retvar) 5867 f_getwinvar(argvars, rettv)
5654 typeval *argvars; 5868 typeval *argvars;
5655 typeval *retvar; 5869 typeval *rettv;
5656 { 5870 {
5657 win_T *win, *oldcurwin; 5871 win_T *win, *oldcurwin;
5658 char_u *varname; 5872 char_u *varname;
5659 VAR v; 5873 VAR v;
5660 5874
5661 ++emsg_off; 5875 ++emsg_off;
5662 win = find_win_by_nr(&argvars[0]); 5876 win = find_win_by_nr(&argvars[0]);
5663 varname = get_vartv_string(&argvars[1]); 5877 varname = get_tv_string(&argvars[1]);
5664 5878
5665 retvar->v_type = VAR_STRING; 5879 rettv->v_type = VAR_STRING;
5666 retvar->vval.v_string = NULL; 5880 rettv->vval.v_string = NULL;
5667 5881
5668 if (win != NULL && varname != NULL) 5882 if (win != NULL && varname != NULL)
5669 { 5883 {
5670 if (*varname == '&') /* window-local-option */ 5884 if (*varname == '&') /* window-local-option */
5671 { 5885 {
5672 /* set curwin to be our win, temporarily */ 5886 /* set curwin to be our win, temporarily */
5673 oldcurwin = curwin; 5887 oldcurwin = curwin;
5674 curwin = win; 5888 curwin = win;
5675 5889
5676 get_option_vartv(&varname, retvar, 1); 5890 get_option_tv(&varname, rettv, 1);
5677 5891
5678 /* restore previous notion of curwin */ 5892 /* restore previous notion of curwin */
5679 curwin = oldcurwin; 5893 curwin = oldcurwin;
5680 } 5894 }
5681 else 5895 else
5682 { 5896 {
5683 /* look up the variable */ 5897 /* look up the variable */
5684 v = find_var_in_ga(&win->w_vars, varname); 5898 v = find_var_in_ga(&win->w_vars, varname);
5685 if (v != NULL) 5899 if (v != NULL)
5686 copy_vartv(&v->tv, retvar); 5900 copy_tv(&v->tv, rettv);
5687 } 5901 }
5688 } 5902 }
5689 5903
5690 --emsg_off; 5904 --emsg_off;
5691 } 5905 }
5692 5906
5693 /* 5907 /*
5694 * "glob()" function 5908 * "glob()" function
5695 */ 5909 */
5696 static void 5910 static void
5697 f_glob(argvars, retvar) 5911 f_glob(argvars, rettv)
5698 typeval *argvars; 5912 typeval *argvars;
5699 typeval *retvar; 5913 typeval *rettv;
5700 { 5914 {
5701 expand_T xpc; 5915 expand_T xpc;
5702 5916
5703 ExpandInit(&xpc); 5917 ExpandInit(&xpc);
5704 xpc.xp_context = EXPAND_FILES; 5918 xpc.xp_context = EXPAND_FILES;
5705 retvar->v_type = VAR_STRING; 5919 rettv->v_type = VAR_STRING;
5706 retvar->vval.v_string = ExpandOne(&xpc, get_vartv_string(&argvars[0]), 5920 rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
5707 NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL); 5921 NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
5708 ExpandCleanup(&xpc); 5922 ExpandCleanup(&xpc);
5709 } 5923 }
5710 5924
5711 /* 5925 /*
5712 * "globpath()" function 5926 * "globpath()" function
5713 */ 5927 */
5714 static void 5928 static void
5715 f_globpath(argvars, retvar) 5929 f_globpath(argvars, rettv)
5716 typeval *argvars; 5930 typeval *argvars;
5717 typeval *retvar; 5931 typeval *rettv;
5718 { 5932 {
5719 char_u buf1[NUMBUFLEN]; 5933 char_u buf1[NUMBUFLEN];
5720 5934
5721 retvar->v_type = VAR_STRING; 5935 rettv->v_type = VAR_STRING;
5722 retvar->vval.v_string = globpath(get_vartv_string(&argvars[0]), 5936 rettv->vval.v_string = globpath(get_tv_string(&argvars[0]),
5723 get_vartv_string_buf(&argvars[1], buf1)); 5937 get_tv_string_buf(&argvars[1], buf1));
5724 } 5938 }
5725 5939
5726 /* 5940 /*
5727 * "has()" function 5941 * "has()" function
5728 */ 5942 */
5729 static void 5943 static void
5730 f_has(argvars, retvar) 5944 f_has(argvars, rettv)
5731 typeval *argvars; 5945 typeval *argvars;
5732 typeval *retvar; 5946 typeval *rettv;
5733 { 5947 {
5734 int i; 5948 int i;
5735 char_u *name; 5949 char_u *name;
5736 int n = FALSE; 5950 int n = FALSE;
5737 static char *(has_list[]) = 5951 static char *(has_list[]) =
5889 # ifdef FEAT_GUI_NEXTAW 6103 # ifdef FEAT_GUI_NEXTAW
5890 "gui_neXtaw", 6104 "gui_neXtaw",
5891 # else 6105 # else
5892 "gui_athena", 6106 "gui_athena",
5893 # endif 6107 # endif
5894 #endif
5895 #ifdef FEAT_GUI_BEOS
5896 "gui_beos",
5897 #endif 6108 #endif
5898 #ifdef FEAT_GUI_KDE 6109 #ifdef FEAT_GUI_KDE
5899 "gui_kde", 6110 "gui_kde",
5900 #endif 6111 #endif
5901 #ifdef FEAT_GUI_GTK 6112 #ifdef FEAT_GUI_GTK
6155 "X11", 6366 "X11",
6156 #endif 6367 #endif
6157 NULL 6368 NULL
6158 }; 6369 };
6159 6370
6160 name = get_vartv_string(&argvars[0]); 6371 name = get_tv_string(&argvars[0]);
6161 for (i = 0; has_list[i] != NULL; ++i) 6372 for (i = 0; has_list[i] != NULL; ++i)
6162 if (STRICMP(name, has_list[i]) == 0) 6373 if (STRICMP(name, has_list[i]) == 0)
6163 { 6374 {
6164 n = TRUE; 6375 n = TRUE;
6165 break; 6376 break;
6215 else if (STRICMP(name, "netbeans_enabled") == 0) 6426 else if (STRICMP(name, "netbeans_enabled") == 0)
6216 n = usingNetbeans; 6427 n = usingNetbeans;
6217 #endif 6428 #endif
6218 } 6429 }
6219 6430
6220 retvar->vval.v_number = n; 6431 rettv->vval.v_number = n;
6221 } 6432 }
6222 6433
6223 /* 6434 /*
6224 * "hasmapto()" function 6435 * "hasmapto()" function
6225 */ 6436 */
6226 static void 6437 static void
6227 f_hasmapto(argvars, retvar) 6438 f_hasmapto(argvars, rettv)
6228 typeval *argvars; 6439 typeval *argvars;
6229 typeval *retvar; 6440 typeval *rettv;
6230 { 6441 {
6231 char_u *name; 6442 char_u *name;
6232 char_u *mode; 6443 char_u *mode;
6233 char_u buf[NUMBUFLEN]; 6444 char_u buf[NUMBUFLEN];
6234 6445
6235 name = get_vartv_string(&argvars[0]); 6446 name = get_tv_string(&argvars[0]);
6236 if (argvars[1].v_type == VAR_UNKNOWN) 6447 if (argvars[1].v_type == VAR_UNKNOWN)
6237 mode = (char_u *)"nvo"; 6448 mode = (char_u *)"nvo";
6238 else 6449 else
6239 mode = get_vartv_string_buf(&argvars[1], buf); 6450 mode = get_tv_string_buf(&argvars[1], buf);
6240 6451
6241 if (map_to_exists(name, mode)) 6452 if (map_to_exists(name, mode))
6242 retvar->vval.v_number = TRUE; 6453 rettv->vval.v_number = TRUE;
6243 else 6454 else
6244 retvar->vval.v_number = FALSE; 6455 rettv->vval.v_number = FALSE;
6245 } 6456 }
6246 6457
6247 /* 6458 /*
6248 * "histadd()" function 6459 * "histadd()" function
6249 */ 6460 */
6250 /*ARGSUSED*/ 6461 /*ARGSUSED*/
6251 static void 6462 static void
6252 f_histadd(argvars, retvar) 6463 f_histadd(argvars, rettv)
6253 typeval *argvars; 6464 typeval *argvars;
6254 typeval *retvar; 6465 typeval *rettv;
6255 { 6466 {
6256 #ifdef FEAT_CMDHIST 6467 #ifdef FEAT_CMDHIST
6257 int histype; 6468 int histype;
6258 char_u *str; 6469 char_u *str;
6259 char_u buf[NUMBUFLEN]; 6470 char_u buf[NUMBUFLEN];
6260 #endif 6471 #endif
6261 6472
6262 retvar->vval.v_number = FALSE; 6473 rettv->vval.v_number = FALSE;
6263 if (check_restricted() || check_secure()) 6474 if (check_restricted() || check_secure())
6264 return; 6475 return;
6265 #ifdef FEAT_CMDHIST 6476 #ifdef FEAT_CMDHIST
6266 histype = get_histtype(get_vartv_string(&argvars[0])); 6477 histype = get_histtype(get_tv_string(&argvars[0]));
6267 if (histype >= 0) 6478 if (histype >= 0)
6268 { 6479 {
6269 str = get_vartv_string_buf(&argvars[1], buf); 6480 str = get_tv_string_buf(&argvars[1], buf);
6270 if (*str != NUL) 6481 if (*str != NUL)
6271 { 6482 {
6272 add_to_history(histype, str, FALSE, NUL); 6483 add_to_history(histype, str, FALSE, NUL);
6273 retvar->vval.v_number = TRUE; 6484 rettv->vval.v_number = TRUE;
6274 return; 6485 return;
6275 } 6486 }
6276 } 6487 }
6277 #endif 6488 #endif
6278 } 6489 }
6280 /* 6491 /*
6281 * "histdel()" function 6492 * "histdel()" function
6282 */ 6493 */
6283 /*ARGSUSED*/ 6494 /*ARGSUSED*/
6284 static void 6495 static void
6285 f_histdel(argvars, retvar) 6496 f_histdel(argvars, rettv)
6286 typeval *argvars; 6497 typeval *argvars;
6287 typeval *retvar; 6498 typeval *rettv;
6288 { 6499 {
6289 #ifdef FEAT_CMDHIST 6500 #ifdef FEAT_CMDHIST
6290 int n; 6501 int n;
6291 char_u buf[NUMBUFLEN]; 6502 char_u buf[NUMBUFLEN];
6292 6503
6293 if (argvars[1].v_type == VAR_UNKNOWN) 6504 if (argvars[1].v_type == VAR_UNKNOWN)
6294 /* only one argument: clear entire history */ 6505 /* only one argument: clear entire history */
6295 n = clr_history(get_histtype(get_vartv_string(&argvars[0]))); 6506 n = clr_history(get_histtype(get_tv_string(&argvars[0])));
6296 else if (argvars[1].v_type == VAR_NUMBER) 6507 else if (argvars[1].v_type == VAR_NUMBER)
6297 /* index given: remove that entry */ 6508 /* index given: remove that entry */
6298 n = del_history_idx(get_histtype(get_vartv_string(&argvars[0])), 6509 n = del_history_idx(get_histtype(get_tv_string(&argvars[0])),
6299 (int)get_vartv_number(&argvars[1])); 6510 (int)get_tv_number(&argvars[1]));
6300 else 6511 else
6301 /* string given: remove all matching entries */ 6512 /* string given: remove all matching entries */
6302 n = del_history_entry(get_histtype(get_vartv_string(&argvars[0])), 6513 n = del_history_entry(get_histtype(get_tv_string(&argvars[0])),
6303 get_vartv_string_buf(&argvars[1], buf)); 6514 get_tv_string_buf(&argvars[1], buf));
6304 retvar->vval.v_number = n; 6515 rettv->vval.v_number = n;
6305 #else 6516 #else
6306 retvar->vval.v_number = 0; 6517 rettv->vval.v_number = 0;
6307 #endif 6518 #endif
6308 } 6519 }
6309 6520
6310 /* 6521 /*
6311 * "histget()" function 6522 * "histget()" function
6312 */ 6523 */
6313 /*ARGSUSED*/ 6524 /*ARGSUSED*/
6314 static void 6525 static void
6315 f_histget(argvars, retvar) 6526 f_histget(argvars, rettv)
6316 typeval *argvars; 6527 typeval *argvars;
6317 typeval *retvar; 6528 typeval *rettv;
6318 { 6529 {
6319 #ifdef FEAT_CMDHIST 6530 #ifdef FEAT_CMDHIST
6320 int type; 6531 int type;
6321 int idx; 6532 int idx;
6322 6533
6323 type = get_histtype(get_vartv_string(&argvars[0])); 6534 type = get_histtype(get_tv_string(&argvars[0]));
6324 if (argvars[1].v_type == VAR_UNKNOWN) 6535 if (argvars[1].v_type == VAR_UNKNOWN)
6325 idx = get_history_idx(type); 6536 idx = get_history_idx(type);
6326 else 6537 else
6327 idx = (int)get_vartv_number(&argvars[1]); 6538 idx = (int)get_tv_number(&argvars[1]);
6328 retvar->vval.v_string = vim_strsave(get_history_entry(type, idx)); 6539 rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
6329 #else 6540 #else
6330 retvar->vval.v_string = NULL; 6541 rettv->vval.v_string = NULL;
6331 #endif 6542 #endif
6332 retvar->v_type = VAR_STRING; 6543 rettv->v_type = VAR_STRING;
6333 } 6544 }
6334 6545
6335 /* 6546 /*
6336 * "histnr()" function 6547 * "histnr()" function
6337 */ 6548 */
6338 /*ARGSUSED*/ 6549 /*ARGSUSED*/
6339 static void 6550 static void
6340 f_histnr(argvars, retvar) 6551 f_histnr(argvars, rettv)
6341 typeval *argvars; 6552 typeval *argvars;
6342 typeval *retvar; 6553 typeval *rettv;
6343 { 6554 {
6344 int i; 6555 int i;
6345 6556
6346 #ifdef FEAT_CMDHIST 6557 #ifdef FEAT_CMDHIST
6347 i = get_histtype(get_vartv_string(&argvars[0])); 6558 i = get_histtype(get_tv_string(&argvars[0]));
6348 if (i >= HIST_CMD && i < HIST_COUNT) 6559 if (i >= HIST_CMD && i < HIST_COUNT)
6349 i = get_history_idx(i); 6560 i = get_history_idx(i);
6350 else 6561 else
6351 #endif 6562 #endif
6352 i = -1; 6563 i = -1;
6353 retvar->vval.v_number = i; 6564 rettv->vval.v_number = i;
6354 } 6565 }
6355 6566
6356 /* 6567 /*
6357 * "highlight_exists()" function 6568 * "highlight_exists()" function
6358 */ 6569 */
6359 static void 6570 static void
6360 f_hlexists(argvars, retvar) 6571 f_hlexists(argvars, rettv)
6361 typeval *argvars; 6572 typeval *argvars;
6362 typeval *retvar; 6573 typeval *rettv;
6363 { 6574 {
6364 retvar->vval.v_number = highlight_exists(get_vartv_string(&argvars[0])); 6575 rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0]));
6365 } 6576 }
6366 6577
6367 /* 6578 /*
6368 * "highlightID(name)" function 6579 * "highlightID(name)" function
6369 */ 6580 */
6370 static void 6581 static void
6371 f_hlID(argvars, retvar) 6582 f_hlID(argvars, rettv)
6372 typeval *argvars; 6583 typeval *argvars;
6373 typeval *retvar; 6584 typeval *rettv;
6374 { 6585 {
6375 retvar->vval.v_number = syn_name2id(get_vartv_string(&argvars[0])); 6586 rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0]));
6376 } 6587 }
6377 6588
6378 /* 6589 /*
6379 * "hostname()" function 6590 * "hostname()" function
6380 */ 6591 */
6381 /*ARGSUSED*/ 6592 /*ARGSUSED*/
6382 static void 6593 static void
6383 f_hostname(argvars, retvar) 6594 f_hostname(argvars, rettv)
6384 typeval *argvars; 6595 typeval *argvars;
6385 typeval *retvar; 6596 typeval *rettv;
6386 { 6597 {
6387 char_u hostname[256]; 6598 char_u hostname[256];
6388 6599
6389 mch_get_host_name(hostname, 256); 6600 mch_get_host_name(hostname, 256);
6390 retvar->v_type = VAR_STRING; 6601 rettv->v_type = VAR_STRING;
6391 retvar->vval.v_string = vim_strsave(hostname); 6602 rettv->vval.v_string = vim_strsave(hostname);
6392 } 6603 }
6393 6604
6394 /* 6605 /*
6395 * iconv() function 6606 * iconv() function
6396 */ 6607 */
6397 /*ARGSUSED*/ 6608 /*ARGSUSED*/
6398 static void 6609 static void
6399 f_iconv(argvars, retvar) 6610 f_iconv(argvars, rettv)
6400 typeval *argvars; 6611 typeval *argvars;
6401 typeval *retvar; 6612 typeval *rettv;
6402 { 6613 {
6403 #ifdef FEAT_MBYTE 6614 #ifdef FEAT_MBYTE
6404 char_u buf1[NUMBUFLEN]; 6615 char_u buf1[NUMBUFLEN];
6405 char_u buf2[NUMBUFLEN]; 6616 char_u buf2[NUMBUFLEN];
6406 char_u *from, *to, *str; 6617 char_u *from, *to, *str;
6407 vimconv_T vimconv; 6618 vimconv_T vimconv;
6408 #endif 6619 #endif
6409 6620
6410 retvar->v_type = VAR_STRING; 6621 rettv->v_type = VAR_STRING;
6411 retvar->vval.v_string = NULL; 6622 rettv->vval.v_string = NULL;
6412 6623
6413 #ifdef FEAT_MBYTE 6624 #ifdef FEAT_MBYTE
6414 str = get_vartv_string(&argvars[0]); 6625 str = get_tv_string(&argvars[0]);
6415 from = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[1], buf1))); 6626 from = enc_canonize(enc_skip(get_tv_string_buf(&argvars[1], buf1)));
6416 to = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[2], buf2))); 6627 to = enc_canonize(enc_skip(get_tv_string_buf(&argvars[2], buf2)));
6417 vimconv.vc_type = CONV_NONE; 6628 vimconv.vc_type = CONV_NONE;
6418 convert_setup(&vimconv, from, to); 6629 convert_setup(&vimconv, from, to);
6419 6630
6420 /* If the encodings are equal, no conversion needed. */ 6631 /* If the encodings are equal, no conversion needed. */
6421 if (vimconv.vc_type == CONV_NONE) 6632 if (vimconv.vc_type == CONV_NONE)
6422 retvar->vval.v_string = vim_strsave(str); 6633 rettv->vval.v_string = vim_strsave(str);
6423 else 6634 else
6424 retvar->vval.v_string = string_convert(&vimconv, str, NULL); 6635 rettv->vval.v_string = string_convert(&vimconv, str, NULL);
6425 6636
6426 convert_setup(&vimconv, NULL, NULL); 6637 convert_setup(&vimconv, NULL, NULL);
6427 vim_free(from); 6638 vim_free(from);
6428 vim_free(to); 6639 vim_free(to);
6429 #endif 6640 #endif
6431 6642
6432 /* 6643 /*
6433 * "indent()" function 6644 * "indent()" function
6434 */ 6645 */
6435 static void 6646 static void
6436 f_indent(argvars, retvar) 6647 f_indent(argvars, rettv)
6437 typeval *argvars; 6648 typeval *argvars;
6438 typeval *retvar; 6649 typeval *rettv;
6439 { 6650 {
6440 linenr_T lnum; 6651 linenr_T lnum;
6441 6652
6442 lnum = get_vartv_lnum(argvars); 6653 lnum = get_tv_lnum(argvars);
6443 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 6654 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
6444 retvar->vval.v_number = get_indent_lnum(lnum); 6655 rettv->vval.v_number = get_indent_lnum(lnum);
6445 else 6656 else
6446 retvar->vval.v_number = -1; 6657 rettv->vval.v_number = -1;
6447 } 6658 }
6448 6659
6449 static int inputsecret_flag = 0; 6660 static int inputsecret_flag = 0;
6450 6661
6451 /* 6662 /*
6452 * "input()" function 6663 * "input()" function
6453 * Also handles inputsecret() when inputsecret is set. 6664 * Also handles inputsecret() when inputsecret is set.
6454 */ 6665 */
6455 static void 6666 static void
6456 f_input(argvars, retvar) 6667 f_input(argvars, rettv)
6457 typeval *argvars; 6668 typeval *argvars;
6458 typeval *retvar; 6669 typeval *rettv;
6459 { 6670 {
6460 char_u *prompt = get_vartv_string(&argvars[0]); 6671 char_u *prompt = get_tv_string(&argvars[0]);
6461 char_u *p = NULL; 6672 char_u *p = NULL;
6462 int c; 6673 int c;
6463 char_u buf[NUMBUFLEN]; 6674 char_u buf[NUMBUFLEN];
6464 int cmd_silent_save = cmd_silent; 6675 int cmd_silent_save = cmd_silent;
6465 6676
6466 retvar->v_type = VAR_STRING; 6677 rettv->v_type = VAR_STRING;
6467 6678
6468 #ifdef NO_CONSOLE_INPUT 6679 #ifdef NO_CONSOLE_INPUT
6469 /* While starting up, there is no place to enter text. */ 6680 /* While starting up, there is no place to enter text. */
6470 if (no_console_input()) 6681 if (no_console_input())
6471 { 6682 {
6472 retvar->vval.v_string = NULL; 6683 rettv->vval.v_string = NULL;
6473 return; 6684 return;
6474 } 6685 }
6475 #endif 6686 #endif
6476 6687
6477 cmd_silent = FALSE; /* Want to see the prompt. */ 6688 cmd_silent = FALSE; /* Want to see the prompt. */
6496 } 6707 }
6497 cmdline_row = msg_row; 6708 cmdline_row = msg_row;
6498 } 6709 }
6499 6710
6500 if (argvars[1].v_type != VAR_UNKNOWN) 6711 if (argvars[1].v_type != VAR_UNKNOWN)
6501 stuffReadbuffSpec(get_vartv_string_buf(&argvars[1], buf)); 6712 stuffReadbuffSpec(get_tv_string_buf(&argvars[1], buf));
6502 6713
6503 retvar->vval.v_string = 6714 rettv->vval.v_string =
6504 getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr); 6715 getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr);
6505 6716
6506 /* since the user typed this, no need to wait for return */ 6717 /* since the user typed this, no need to wait for return */
6507 need_wait_return = FALSE; 6718 need_wait_return = FALSE;
6508 msg_didout = FALSE; 6719 msg_didout = FALSE;
6511 6722
6512 /* 6723 /*
6513 * "inputdialog()" function 6724 * "inputdialog()" function
6514 */ 6725 */
6515 static void 6726 static void
6516 f_inputdialog(argvars, retvar) 6727 f_inputdialog(argvars, rettv)
6517 typeval *argvars; 6728 typeval *argvars;
6518 typeval *retvar; 6729 typeval *rettv;
6519 { 6730 {
6520 #if defined(FEAT_GUI_TEXTDIALOG) 6731 #if defined(FEAT_GUI_TEXTDIALOG)
6521 /* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */ 6732 /* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */
6522 if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL) 6733 if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL)
6523 { 6734 {
6524 char_u *message; 6735 char_u *message;
6525 char_u buf[NUMBUFLEN]; 6736 char_u buf[NUMBUFLEN];
6526 6737
6527 message = get_vartv_string(&argvars[0]); 6738 message = get_tv_string(&argvars[0]);
6528 if (argvars[1].v_type != VAR_UNKNOWN) 6739 if (argvars[1].v_type != VAR_UNKNOWN)
6529 { 6740 {
6530 STRNCPY(IObuff, get_vartv_string_buf(&argvars[1], buf), IOSIZE); 6741 STRNCPY(IObuff, get_tv_string_buf(&argvars[1], buf), IOSIZE);
6531 IObuff[IOSIZE - 1] = NUL; 6742 IObuff[IOSIZE - 1] = NUL;
6532 } 6743 }
6533 else 6744 else
6534 IObuff[0] = NUL; 6745 IObuff[0] = NUL;
6535 if (do_dialog(VIM_QUESTION, NULL, message, (char_u *)_("&OK\n&Cancel"), 6746 if (do_dialog(VIM_QUESTION, NULL, message, (char_u *)_("&OK\n&Cancel"),
6536 1, IObuff) == 1) 6747 1, IObuff) == 1)
6537 retvar->vval.v_string = vim_strsave(IObuff); 6748 rettv->vval.v_string = vim_strsave(IObuff);
6538 else 6749 else
6539 { 6750 {
6540 if (argvars[1].v_type != VAR_UNKNOWN 6751 if (argvars[1].v_type != VAR_UNKNOWN
6541 && argvars[2].v_type != VAR_UNKNOWN) 6752 && argvars[2].v_type != VAR_UNKNOWN)
6542 retvar->vval.v_string = vim_strsave( 6753 rettv->vval.v_string = vim_strsave(
6543 get_vartv_string_buf(&argvars[2], buf)); 6754 get_tv_string_buf(&argvars[2], buf));
6544 else 6755 else
6545 retvar->vval.v_string = NULL; 6756 rettv->vval.v_string = NULL;
6546 } 6757 }
6547 retvar->v_type = VAR_STRING; 6758 rettv->v_type = VAR_STRING;
6548 } 6759 }
6549 else 6760 else
6550 #endif 6761 #endif
6551 f_input(argvars, retvar); 6762 f_input(argvars, rettv);
6552 } 6763 }
6553 6764
6554 static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL}; 6765 static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
6555 6766
6556 /* 6767 /*
6557 * "inputrestore()" function 6768 * "inputrestore()" function
6558 */ 6769 */
6559 /*ARGSUSED*/ 6770 /*ARGSUSED*/
6560 static void 6771 static void
6561 f_inputrestore(argvars, retvar) 6772 f_inputrestore(argvars, rettv)
6562 typeval *argvars; 6773 typeval *argvars;
6563 typeval *retvar; 6774 typeval *rettv;
6564 { 6775 {
6565 if (ga_userinput.ga_len > 0) 6776 if (ga_userinput.ga_len > 0)
6566 { 6777 {
6567 --ga_userinput.ga_len; 6778 --ga_userinput.ga_len;
6568 restore_typeahead((tasave_T *)(ga_userinput.ga_data) 6779 restore_typeahead((tasave_T *)(ga_userinput.ga_data)
6569 + ga_userinput.ga_len); 6780 + ga_userinput.ga_len);
6570 retvar->vval.v_number = 0; /* OK */ 6781 rettv->vval.v_number = 0; /* OK */
6571 } 6782 }
6572 else if (p_verbose > 1) 6783 else if (p_verbose > 1)
6573 { 6784 {
6574 msg((char_u *)_("called inputrestore() more often than inputsave()")); 6785 msg((char_u *)_("called inputrestore() more often than inputsave()"));
6575 retvar->vval.v_number = 1; /* Failed */ 6786 rettv->vval.v_number = 1; /* Failed */
6576 } 6787 }
6577 } 6788 }
6578 6789
6579 /* 6790 /*
6580 * "inputsave()" function 6791 * "inputsave()" function
6581 */ 6792 */
6582 /*ARGSUSED*/ 6793 /*ARGSUSED*/
6583 static void 6794 static void
6584 f_inputsave(argvars, retvar) 6795 f_inputsave(argvars, rettv)
6585 typeval *argvars; 6796 typeval *argvars;
6586 typeval *retvar; 6797 typeval *rettv;
6587 { 6798 {
6588 /* Add an entry to the stack of typehead storage. */ 6799 /* Add an entry to the stack of typehead storage. */
6589 if (ga_grow(&ga_userinput, 1) == OK) 6800 if (ga_grow(&ga_userinput, 1) == OK)
6590 { 6801 {
6591 save_typeahead((tasave_T *)(ga_userinput.ga_data) 6802 save_typeahead((tasave_T *)(ga_userinput.ga_data)
6592 + ga_userinput.ga_len); 6803 + ga_userinput.ga_len);
6593 ++ga_userinput.ga_len; 6804 ++ga_userinput.ga_len;
6594 retvar->vval.v_number = 0; /* OK */ 6805 rettv->vval.v_number = 0; /* OK */
6595 } 6806 }
6596 else 6807 else
6597 retvar->vval.v_number = 1; /* Failed */ 6808 rettv->vval.v_number = 1; /* Failed */
6598 } 6809 }
6599 6810
6600 /* 6811 /*
6601 * "inputsecret()" function 6812 * "inputsecret()" function
6602 */ 6813 */
6603 static void 6814 static void
6604 f_inputsecret(argvars, retvar) 6815 f_inputsecret(argvars, rettv)
6605 typeval *argvars; 6816 typeval *argvars;
6606 typeval *retvar; 6817 typeval *rettv;
6607 { 6818 {
6608 ++cmdline_star; 6819 ++cmdline_star;
6609 ++inputsecret_flag; 6820 ++inputsecret_flag;
6610 f_input(argvars, retvar); 6821 f_input(argvars, rettv);
6611 --cmdline_star; 6822 --cmdline_star;
6612 --inputsecret_flag; 6823 --inputsecret_flag;
6613 } 6824 }
6614 6825
6615 /* 6826 /*
6616 * "insert()" function 6827 * "insert()" function
6617 */ 6828 */
6618 static void 6829 static void
6619 f_insert(argvars, retvar) 6830 f_insert(argvars, rettv)
6620 typeval *argvars; 6831 typeval *argvars;
6621 typeval *retvar; 6832 typeval *rettv;
6622 { 6833 {
6623 long before = 0; 6834 long before = 0;
6624 long n; 6835 long n;
6625 listitem *item; 6836 listitem *item;
6626 listitem *ni; 6837 listitem *ni;
6629 if (argvars[0].v_type != VAR_LIST) 6840 if (argvars[0].v_type != VAR_LIST)
6630 EMSG(_("E999: First argument of insert() must be a list")); 6841 EMSG(_("E999: First argument of insert() must be a list"));
6631 else if ((l = argvars[0].vval.v_list) != NULL) 6842 else if ((l = argvars[0].vval.v_list) != NULL)
6632 { 6843 {
6633 if (argvars[2].v_type != VAR_UNKNOWN) 6844 if (argvars[2].v_type != VAR_UNKNOWN)
6634 before = get_vartv_number(&argvars[2]); 6845 before = get_tv_number(&argvars[2]);
6635 6846
6636 if (before < 0) 6847 if (before < 0)
6637 { 6848 {
6638 /* Count from the end: -1 is before last item. */ 6849 /* Count from the end: -1 is before last item. */
6639 item = l->lv_last; 6850 item = l->lv_last;
6654 else 6865 else
6655 { 6866 {
6656 ni = listitem_alloc(); 6867 ni = listitem_alloc();
6657 if (ni != NULL) 6868 if (ni != NULL)
6658 { 6869 {
6659 copy_vartv(&argvars[1], &ni->li_tv); 6870 copy_tv(&argvars[1], &ni->li_tv);
6660 if (item == NULL) 6871 if (item == NULL)
6661 /* Append new item at end of list. */ 6872 /* Append new item at end of list. */
6662 list_append(l, ni); 6873 list_append(l, ni);
6663 else 6874 else
6664 { 6875 {
6669 l->lv_first = ni; 6880 l->lv_first = ni;
6670 else 6881 else
6671 item->li_prev->li_next = ni; 6882 item->li_prev->li_next = ni;
6672 item->li_prev = ni; 6883 item->li_prev = ni;
6673 } 6884 }
6674 copy_vartv(&argvars[0], retvar); 6885 copy_tv(&argvars[0], rettv);
6675 } 6886 }
6676 } 6887 }
6677 } 6888 }
6678 } 6889 }
6679 6890
6680 /* 6891 /*
6681 * "isdirectory()" function 6892 * "isdirectory()" function
6682 */ 6893 */
6683 static void 6894 static void
6684 f_isdirectory(argvars, retvar) 6895 f_isdirectory(argvars, rettv)
6685 typeval *argvars; 6896 typeval *argvars;
6686 typeval *retvar; 6897 typeval *rettv;
6687 { 6898 {
6688 retvar->vval.v_number = mch_isdir(get_vartv_string(&argvars[0])); 6899 rettv->vval.v_number = mch_isdir(get_tv_string(&argvars[0]));
6689 } 6900 }
6690 6901
6691 /* 6902 /*
6692 * "last_buffer_nr()" function. 6903 * "last_buffer_nr()" function.
6693 */ 6904 */
6694 /*ARGSUSED*/ 6905 /*ARGSUSED*/
6695 static void 6906 static void
6696 f_last_buffer_nr(argvars, retvar) 6907 f_last_buffer_nr(argvars, rettv)
6697 typeval *argvars; 6908 typeval *argvars;
6698 typeval *retvar; 6909 typeval *rettv;
6699 { 6910 {
6700 int n = 0; 6911 int n = 0;
6701 buf_T *buf; 6912 buf_T *buf;
6702 6913
6703 for (buf = firstbuf; buf != NULL; buf = buf->b_next) 6914 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
6704 if (n < buf->b_fnum) 6915 if (n < buf->b_fnum)
6705 n = buf->b_fnum; 6916 n = buf->b_fnum;
6706 6917
6707 retvar->vval.v_number = n; 6918 rettv->vval.v_number = n;
6708 } 6919 }
6709 6920
6710 /* 6921 /*
6711 * "len()" function 6922 * "len()" function
6712 */ 6923 */
6713 static void 6924 static void
6714 f_len(argvars, retvar) 6925 f_len(argvars, rettv)
6715 typeval *argvars; 6926 typeval *argvars;
6716 typeval *retvar; 6927 typeval *rettv;
6717 { 6928 {
6718 switch (argvars[0].v_type) 6929 switch (argvars[0].v_type)
6719 { 6930 {
6720 case VAR_STRING: 6931 case VAR_STRING:
6721 case VAR_NUMBER: 6932 case VAR_NUMBER:
6722 retvar->vval.v_number = (varnumber_T)STRLEN( 6933 rettv->vval.v_number = (varnumber_T)STRLEN(
6723 get_vartv_string(&argvars[0])); 6934 get_tv_string(&argvars[0]));
6724 break; 6935 break;
6725 case VAR_LIST: 6936 case VAR_LIST:
6726 retvar->vval.v_number = list_len(argvars[0].vval.v_list); 6937 rettv->vval.v_number = list_len(argvars[0].vval.v_list);
6727 break; 6938 break;
6728 default: 6939 default:
6729 EMSG(_("E999: Invalid type for len()")); 6940 EMSG(_("E999: Invalid type for len()"));
6730 break; 6941 break;
6731 } 6942 }
6733 6944
6734 /* 6945 /*
6735 * "libcall()" function 6946 * "libcall()" function
6736 */ 6947 */
6737 static void 6948 static void
6738 f_libcall(argvars, retvar) 6949 f_libcall(argvars, rettv)
6739 typeval *argvars; 6950 typeval *argvars;
6740 typeval *retvar; 6951 typeval *rettv;
6741 { 6952 {
6742 libcall_common(argvars, retvar, VAR_STRING); 6953 libcall_common(argvars, rettv, VAR_STRING);
6743 } 6954 }
6744 6955
6745 /* 6956 /*
6746 * "libcallnr()" function 6957 * "libcallnr()" function
6747 */ 6958 */
6748 static void 6959 static void
6749 f_libcallnr(argvars, retvar) 6960 f_libcallnr(argvars, rettv)
6750 typeval *argvars; 6961 typeval *argvars;
6751 typeval *retvar; 6962 typeval *rettv;
6752 { 6963 {
6753 libcall_common(argvars, retvar, VAR_NUMBER); 6964 libcall_common(argvars, rettv, VAR_NUMBER);
6754 } 6965 }
6755 6966
6756 static void 6967 static void
6757 libcall_common(argvars, retvar, type) 6968 libcall_common(argvars, rettv, type)
6758 typeval *argvars; 6969 typeval *argvars;
6759 typeval *retvar; 6970 typeval *rettv;
6760 int type; 6971 int type;
6761 { 6972 {
6762 #ifdef FEAT_LIBCALL 6973 #ifdef FEAT_LIBCALL
6763 char_u *string_in; 6974 char_u *string_in;
6764 char_u **string_result; 6975 char_u **string_result;
6765 int nr_result; 6976 int nr_result;
6766 #endif 6977 #endif
6767 6978
6768 retvar->v_type = type; 6979 rettv->v_type = type;
6769 if (type == VAR_NUMBER) 6980 if (type == VAR_NUMBER)
6770 retvar->vval.v_number = 0; 6981 rettv->vval.v_number = 0;
6771 else 6982 else
6772 retvar->vval.v_string = NULL; 6983 rettv->vval.v_string = NULL;
6773 6984
6774 if (check_restricted() || check_secure()) 6985 if (check_restricted() || check_secure())
6775 return; 6986 return;
6776 6987
6777 #ifdef FEAT_LIBCALL 6988 #ifdef FEAT_LIBCALL
6783 else 6994 else
6784 string_in = argvars[2].vval.v_string; 6995 string_in = argvars[2].vval.v_string;
6785 if (type == VAR_NUMBER) 6996 if (type == VAR_NUMBER)
6786 string_result = NULL; 6997 string_result = NULL;
6787 else 6998 else
6788 string_result = &retvar->vval.v_string; 6999 string_result = &rettv->vval.v_string;
6789 if (mch_libcall(argvars[0].vval.v_string, 7000 if (mch_libcall(argvars[0].vval.v_string,
6790 argvars[1].vval.v_string, 7001 argvars[1].vval.v_string,
6791 string_in, 7002 string_in,
6792 argvars[2].vval.v_number, 7003 argvars[2].vval.v_number,
6793 string_result, 7004 string_result,
6794 &nr_result) == OK 7005 &nr_result) == OK
6795 && type == VAR_NUMBER) 7006 && type == VAR_NUMBER)
6796 retvar->vval.v_number = nr_result; 7007 rettv->vval.v_number = nr_result;
6797 } 7008 }
6798 #endif 7009 #endif
6799 } 7010 }
6800 7011
6801 /* 7012 /*
6802 * "line(string)" function 7013 * "line(string)" function
6803 */ 7014 */
6804 static void 7015 static void
6805 f_line(argvars, retvar) 7016 f_line(argvars, rettv)
6806 typeval *argvars; 7017 typeval *argvars;
6807 typeval *retvar; 7018 typeval *rettv;
6808 { 7019 {
6809 linenr_T lnum = 0; 7020 linenr_T lnum = 0;
6810 pos_T *fp; 7021 pos_T *fp;
6811 7022
6812 fp = var2fpos(&argvars[0], TRUE); 7023 fp = var2fpos(&argvars[0], TRUE);
6813 if (fp != NULL) 7024 if (fp != NULL)
6814 lnum = fp->lnum; 7025 lnum = fp->lnum;
6815 retvar->vval.v_number = lnum; 7026 rettv->vval.v_number = lnum;
6816 } 7027 }
6817 7028
6818 /* 7029 /*
6819 * "line2byte(lnum)" function 7030 * "line2byte(lnum)" function
6820 */ 7031 */
6821 /*ARGSUSED*/ 7032 /*ARGSUSED*/
6822 static void 7033 static void
6823 f_line2byte(argvars, retvar) 7034 f_line2byte(argvars, rettv)
6824 typeval *argvars; 7035 typeval *argvars;
6825 typeval *retvar; 7036 typeval *rettv;
6826 { 7037 {
6827 #ifndef FEAT_BYTEOFF 7038 #ifndef FEAT_BYTEOFF
6828 retvar->vval.v_number = -1; 7039 rettv->vval.v_number = -1;
6829 #else 7040 #else
6830 linenr_T lnum; 7041 linenr_T lnum;
6831 7042
6832 lnum = get_vartv_lnum(argvars); 7043 lnum = get_tv_lnum(argvars);
6833 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1) 7044 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
6834 retvar->vval.v_number = -1; 7045 rettv->vval.v_number = -1;
6835 else 7046 else
6836 retvar->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL); 7047 rettv->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
6837 if (retvar->vval.v_number >= 0) 7048 if (rettv->vval.v_number >= 0)
6838 ++retvar->vval.v_number; 7049 ++rettv->vval.v_number;
6839 #endif 7050 #endif
6840 } 7051 }
6841 7052
6842 /* 7053 /*
6843 * "lispindent(lnum)" function 7054 * "lispindent(lnum)" function
6844 */ 7055 */
6845 static void 7056 static void
6846 f_lispindent(argvars, retvar) 7057 f_lispindent(argvars, rettv)
6847 typeval *argvars; 7058 typeval *argvars;
6848 typeval *retvar; 7059 typeval *rettv;
6849 { 7060 {
6850 #ifdef FEAT_LISP 7061 #ifdef FEAT_LISP
6851 pos_T pos; 7062 pos_T pos;
6852 linenr_T lnum; 7063 linenr_T lnum;
6853 7064
6854 pos = curwin->w_cursor; 7065 pos = curwin->w_cursor;
6855 lnum = get_vartv_lnum(argvars); 7066 lnum = get_tv_lnum(argvars);
6856 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) 7067 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
6857 { 7068 {
6858 curwin->w_cursor.lnum = lnum; 7069 curwin->w_cursor.lnum = lnum;
6859 retvar->vval.v_number = get_lisp_indent(); 7070 rettv->vval.v_number = get_lisp_indent();
6860 curwin->w_cursor = pos; 7071 curwin->w_cursor = pos;
6861 } 7072 }
6862 else 7073 else
6863 #endif 7074 #endif
6864 retvar->vval.v_number = -1; 7075 rettv->vval.v_number = -1;
6865 } 7076 }
6866 7077
6867 /* 7078 /*
6868 * "localtime()" function 7079 * "localtime()" function
6869 */ 7080 */
6870 /*ARGSUSED*/ 7081 /*ARGSUSED*/
6871 static void 7082 static void
6872 f_localtime(argvars, retvar) 7083 f_localtime(argvars, rettv)
6873 typeval *argvars; 7084 typeval *argvars;
6874 typeval *retvar; 7085 typeval *rettv;
6875 { 7086 {
6876 retvar->vval.v_number = (varnumber_T)time(NULL); 7087 rettv->vval.v_number = (varnumber_T)time(NULL);
6877 } 7088 }
6878 7089
6879 /* 7090 /*
6880 * "maparg()" function 7091 * "maparg()" function
6881 */ 7092 */
6882 static void 7093 static void
6883 f_maparg(argvars, retvar) 7094 f_maparg(argvars, rettv)
6884 typeval *argvars; 7095 typeval *argvars;
6885 typeval *retvar; 7096 typeval *rettv;
6886 { 7097 {
6887 get_maparg(argvars, retvar, TRUE); 7098 get_maparg(argvars, rettv, TRUE);
6888 } 7099 }
6889 7100
6890 /* 7101 /*
6891 * "mapcheck()" function 7102 * "mapcheck()" function
6892 */ 7103 */
6893 static void 7104 static void
6894 f_mapcheck(argvars, retvar) 7105 f_mapcheck(argvars, rettv)
6895 typeval *argvars; 7106 typeval *argvars;
6896 typeval *retvar; 7107 typeval *rettv;
6897 { 7108 {
6898 get_maparg(argvars, retvar, FALSE); 7109 get_maparg(argvars, rettv, FALSE);
6899 } 7110 }
6900 7111
6901 static void 7112 static void
6902 get_maparg(argvars, retvar, exact) 7113 get_maparg(argvars, rettv, exact)
6903 typeval *argvars; 7114 typeval *argvars;
6904 typeval *retvar; 7115 typeval *rettv;
6905 int exact; 7116 int exact;
6906 { 7117 {
6907 char_u *keys; 7118 char_u *keys;
6908 char_u *which; 7119 char_u *which;
6909 char_u buf[NUMBUFLEN]; 7120 char_u buf[NUMBUFLEN];
6911 char_u *rhs; 7122 char_u *rhs;
6912 int mode; 7123 int mode;
6913 garray_T ga; 7124 garray_T ga;
6914 7125
6915 /* return empty string for failure */ 7126 /* return empty string for failure */
6916 retvar->v_type = VAR_STRING; 7127 rettv->v_type = VAR_STRING;
6917 retvar->vval.v_string = NULL; 7128 rettv->vval.v_string = NULL;
6918 7129
6919 keys = get_vartv_string(&argvars[0]); 7130 keys = get_tv_string(&argvars[0]);
6920 if (*keys == NUL) 7131 if (*keys == NUL)
6921 return; 7132 return;
6922 7133
6923 if (argvars[1].v_type != VAR_UNKNOWN) 7134 if (argvars[1].v_type != VAR_UNKNOWN)
6924 which = get_vartv_string_buf(&argvars[1], buf); 7135 which = get_tv_string_buf(&argvars[1], buf);
6925 else 7136 else
6926 which = (char_u *)""; 7137 which = (char_u *)"";
6927 mode = get_map_mode(&which, 0); 7138 mode = get_map_mode(&which, 0);
6928 7139
6929 keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE); 7140 keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE);
6937 7148
6938 while (*rhs != NUL) 7149 while (*rhs != NUL)
6939 ga_concat(&ga, str2special(&rhs, FALSE)); 7150 ga_concat(&ga, str2special(&rhs, FALSE));
6940 7151
6941 ga_append(&ga, NUL); 7152 ga_append(&ga, NUL);
6942 retvar->vval.v_string = (char_u *)ga.ga_data; 7153 rettv->vval.v_string = (char_u *)ga.ga_data;
6943 } 7154 }
6944 } 7155 }
6945 7156
6946 /* 7157 /*
6947 * "match()" function 7158 * "match()" function
6948 */ 7159 */
6949 static void 7160 static void
6950 f_match(argvars, retvar) 7161 f_match(argvars, rettv)
6951 typeval *argvars; 7162 typeval *argvars;
6952 typeval *retvar; 7163 typeval *rettv;
6953 { 7164 {
6954 find_some_match(argvars, retvar, 1); 7165 find_some_match(argvars, rettv, 1);
6955 } 7166 }
6956 7167
6957 /* 7168 /*
6958 * "matchend()" function 7169 * "matchend()" function
6959 */ 7170 */
6960 static void 7171 static void
6961 f_matchend(argvars, retvar) 7172 f_matchend(argvars, rettv)
6962 typeval *argvars; 7173 typeval *argvars;
6963 typeval *retvar; 7174 typeval *rettv;
6964 { 7175 {
6965 find_some_match(argvars, retvar, 0); 7176 find_some_match(argvars, rettv, 0);
6966 } 7177 }
6967 7178
6968 /* 7179 /*
6969 * "matchstr()" function 7180 * "matchstr()" function
6970 */ 7181 */
6971 static void 7182 static void
6972 f_matchstr(argvars, retvar) 7183 f_matchstr(argvars, rettv)
6973 typeval *argvars; 7184 typeval *argvars;
6974 typeval *retvar; 7185 typeval *rettv;
6975 { 7186 {
6976 find_some_match(argvars, retvar, 2); 7187 find_some_match(argvars, rettv, 2);
6977 } 7188 }
6978 7189
6979 static void 7190 static void
6980 find_some_match(argvars, retvar, type) 7191 find_some_match(argvars, rettv, type)
6981 typeval *argvars; 7192 typeval *argvars;
6982 typeval *retvar; 7193 typeval *rettv;
6983 int type; 7194 int type;
6984 { 7195 {
6985 char_u *str; 7196 char_u *str;
6986 char_u *expr; 7197 char_u *expr;
6987 char_u *pat; 7198 char_u *pat;
6994 7205
6995 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ 7206 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
6996 save_cpo = p_cpo; 7207 save_cpo = p_cpo;
6997 p_cpo = (char_u *)""; 7208 p_cpo = (char_u *)"";
6998 7209
6999 expr = str = get_vartv_string(&argvars[0]); 7210 expr = str = get_tv_string(&argvars[0]);
7000 pat = get_vartv_string_buf(&argvars[1], patbuf); 7211 pat = get_tv_string_buf(&argvars[1], patbuf);
7001 7212
7002 if (type == 2) 7213 if (type == 2)
7003 { 7214 {
7004 retvar->v_type = VAR_STRING; 7215 rettv->v_type = VAR_STRING;
7005 retvar->vval.v_string = NULL; 7216 rettv->vval.v_string = NULL;
7006 } 7217 }
7007 else 7218 else
7008 retvar->vval.v_number = -1; 7219 rettv->vval.v_number = -1;
7009 7220
7010 if (argvars[2].v_type != VAR_UNKNOWN) 7221 if (argvars[2].v_type != VAR_UNKNOWN)
7011 { 7222 {
7012 start = get_vartv_number(&argvars[2]); 7223 start = get_tv_number(&argvars[2]);
7013 if (start < 0) 7224 if (start < 0)
7014 start = 0; 7225 start = 0;
7015 if (start > (long)STRLEN(str)) 7226 if (start > (long)STRLEN(str))
7016 goto theend; 7227 goto theend;
7017 str += start; 7228 str += start;
7018 7229
7019 if (argvars[3].v_type != VAR_UNKNOWN) 7230 if (argvars[3].v_type != VAR_UNKNOWN)
7020 nth = get_vartv_number(&argvars[3]); 7231 nth = get_tv_number(&argvars[3]);
7021 } 7232 }
7022 7233
7023 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); 7234 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
7024 if (regmatch.regprog != NULL) 7235 if (regmatch.regprog != NULL)
7025 { 7236 {
7039 } 7250 }
7040 7251
7041 if (match) 7252 if (match)
7042 { 7253 {
7043 if (type == 2) 7254 if (type == 2)
7044 retvar->vval.v_string = vim_strnsave(regmatch.startp[0], 7255 rettv->vval.v_string = vim_strnsave(regmatch.startp[0],
7045 (int)(regmatch.endp[0] - regmatch.startp[0])); 7256 (int)(regmatch.endp[0] - regmatch.startp[0]));
7046 else 7257 else
7047 { 7258 {
7048 if (type != 0) 7259 if (type != 0)
7049 retvar->vval.v_number = 7260 rettv->vval.v_number =
7050 (varnumber_T)(regmatch.startp[0] - str); 7261 (varnumber_T)(regmatch.startp[0] - str);
7051 else 7262 else
7052 retvar->vval.v_number = 7263 rettv->vval.v_number =
7053 (varnumber_T)(regmatch.endp[0] - str); 7264 (varnumber_T)(regmatch.endp[0] - str);
7054 retvar->vval.v_number += str - expr; 7265 rettv->vval.v_number += str - expr;
7055 } 7266 }
7056 } 7267 }
7057 vim_free(regmatch.regprog); 7268 vim_free(regmatch.regprog);
7058 } 7269 }
7059 7270
7064 /* 7275 /*
7065 * "mode()" function 7276 * "mode()" function
7066 */ 7277 */
7067 /*ARGSUSED*/ 7278 /*ARGSUSED*/
7068 static void 7279 static void
7069 f_mode(argvars, retvar) 7280 f_mode(argvars, rettv)
7070 typeval *argvars; 7281 typeval *argvars;
7071 typeval *retvar; 7282 typeval *rettv;
7072 { 7283 {
7073 char_u buf[2]; 7284 char_u buf[2];
7074 7285
7075 #ifdef FEAT_VISUAL 7286 #ifdef FEAT_VISUAL
7076 if (VIsual_active) 7287 if (VIsual_active)
7095 buf[0] = 'c'; 7306 buf[0] = 'c';
7096 else 7307 else
7097 buf[0] = 'n'; 7308 buf[0] = 'n';
7098 7309
7099 buf[1] = NUL; 7310 buf[1] = NUL;
7100 retvar->vval.v_string = vim_strsave(buf); 7311 rettv->vval.v_string = vim_strsave(buf);
7101 retvar->v_type = VAR_STRING; 7312 rettv->v_type = VAR_STRING;
7102 } 7313 }
7103 7314
7104 /* 7315 /*
7105 * "nr2char()" function 7316 * "nr2char()" function
7106 */ 7317 */
7107 static void 7318 static void
7108 f_nr2char(argvars, retvar) 7319 f_nr2char(argvars, rettv)
7109 typeval *argvars; 7320 typeval *argvars;
7110 typeval *retvar; 7321 typeval *rettv;
7111 { 7322 {
7112 char_u buf[NUMBUFLEN]; 7323 char_u buf[NUMBUFLEN];
7113 7324
7114 #ifdef FEAT_MBYTE 7325 #ifdef FEAT_MBYTE
7115 if (has_mbyte) 7326 if (has_mbyte)
7116 buf[(*mb_char2bytes)((int)get_vartv_number(&argvars[0]), buf)] = NUL; 7327 buf[(*mb_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
7117 else 7328 else
7118 #endif 7329 #endif
7119 { 7330 {
7120 buf[0] = (char_u)get_vartv_number(&argvars[0]); 7331 buf[0] = (char_u)get_tv_number(&argvars[0]);
7121 buf[1] = NUL; 7332 buf[1] = NUL;
7122 } 7333 }
7123 retvar->v_type = VAR_STRING; 7334 rettv->v_type = VAR_STRING;
7124 retvar->vval.v_string = vim_strsave(buf); 7335 rettv->vval.v_string = vim_strsave(buf);
7125 } 7336 }
7126 7337
7127 /* 7338 /*
7128 * "remove({list}, {idx})" function 7339 * "remove({list}, {idx})" function
7129 */ 7340 */
7130 static void 7341 static void
7131 f_remove(argvars, retvar) 7342 f_remove(argvars, rettv)
7132 typeval *argvars; 7343 typeval *argvars;
7133 typeval *retvar; 7344 typeval *rettv;
7134 { 7345 {
7135 listvar *l; 7346 listvar *l;
7136 listitem *item; 7347 listitem *item;
7137 long idx; 7348 long idx;
7138 7349
7139 if (argvars[0].v_type != VAR_LIST) 7350 if (argvars[0].v_type != VAR_LIST)
7140 EMSG(_("E999: First argument of remove() must be a list")); 7351 EMSG(_("E999: First argument of remove() must be a list"));
7141 else if ((l = argvars[0].vval.v_list) != NULL) 7352 else if ((l = argvars[0].vval.v_list) != NULL)
7142 { 7353 {
7143 idx = get_vartv_number(&argvars[1]); 7354 idx = get_tv_number(&argvars[1]);
7144 item = list_getrem(l, idx); 7355 item = list_getrem(l, idx);
7145 if (item == NULL) 7356 if (item == NULL)
7146 EMSGN(_(e_listidx), idx); 7357 EMSGN(_(e_listidx), idx);
7147 else 7358 else
7148 { 7359 {
7149 *retvar = item->li_tv; 7360 *rettv = item->li_tv;
7150 vim_free(item); 7361 vim_free(item);
7151 } 7362 }
7152 } 7363 }
7153 } 7364 }
7154 7365
7155 /* 7366 /*
7156 * "rename({from}, {to})" function 7367 * "rename({from}, {to})" function
7157 */ 7368 */
7158 static void 7369 static void
7159 f_rename(argvars, retvar) 7370 f_rename(argvars, rettv)
7160 typeval *argvars; 7371 typeval *argvars;
7161 typeval *retvar; 7372 typeval *rettv;
7162 { 7373 {
7163 char_u buf[NUMBUFLEN]; 7374 char_u buf[NUMBUFLEN];
7164 7375
7165 if (check_restricted() || check_secure()) 7376 if (check_restricted() || check_secure())
7166 retvar->vval.v_number = -1; 7377 rettv->vval.v_number = -1;
7167 else 7378 else
7168 retvar->vval.v_number = vim_rename(get_vartv_string(&argvars[0]), 7379 rettv->vval.v_number = vim_rename(get_tv_string(&argvars[0]),
7169 get_vartv_string_buf(&argvars[1], buf)); 7380 get_tv_string_buf(&argvars[1], buf));
7170 } 7381 }
7171 7382
7172 /* 7383 /*
7173 * "resolve()" function 7384 * "resolve()" function
7174 */ 7385 */
7175 static void 7386 static void
7176 f_resolve(argvars, retvar) 7387 f_resolve(argvars, rettv)
7177 typeval *argvars; 7388 typeval *argvars;
7178 typeval *retvar; 7389 typeval *rettv;
7179 { 7390 {
7180 char_u *p; 7391 char_u *p;
7181 7392
7182 p = get_vartv_string(&argvars[0]); 7393 p = get_tv_string(&argvars[0]);
7183 #ifdef FEAT_SHORTCUT 7394 #ifdef FEAT_SHORTCUT
7184 { 7395 {
7185 char_u *v = NULL; 7396 char_u *v = NULL;
7186 7397
7187 v = mch_resolve_shortcut(p); 7398 v = mch_resolve_shortcut(p);
7188 if (v != NULL) 7399 if (v != NULL)
7189 retvar->vval.v_string = v; 7400 rettv->vval.v_string = v;
7190 else 7401 else
7191 retvar->vval.v_string = vim_strsave(p); 7402 rettv->vval.v_string = vim_strsave(p);
7192 } 7403 }
7193 #else 7404 #else
7194 # ifdef HAVE_READLINK 7405 # ifdef HAVE_READLINK
7195 { 7406 {
7196 char_u buf[MAXPATHL + 1]; 7407 char_u buf[MAXPATHL + 1];
7233 if (limit-- == 0) 7444 if (limit-- == 0)
7234 { 7445 {
7235 vim_free(p); 7446 vim_free(p);
7236 vim_free(remain); 7447 vim_free(remain);
7237 EMSG(_("E655: Too many symbolic links (cycle?)")); 7448 EMSG(_("E655: Too many symbolic links (cycle?)"));
7238 retvar->vval.v_string = NULL; 7449 rettv->vval.v_string = NULL;
7239 goto fail; 7450 goto fail;
7240 } 7451 }
7241 7452
7242 /* Ensure that the result will have a trailing path separator 7453 /* Ensure that the result will have a trailing path separator
7243 * if the argument has one. */ 7454 * if the argument has one. */
7353 q = p + STRLEN(p); 7564 q = p + STRLEN(p);
7354 if (after_pathsep(p, q)) 7565 if (after_pathsep(p, q))
7355 *gettail_sep(p) = NUL; 7566 *gettail_sep(p) = NUL;
7356 } 7567 }
7357 7568
7358 retvar->vval.v_string = p; 7569 rettv->vval.v_string = p;
7359 } 7570 }
7360 # else 7571 # else
7361 retvar->vval.v_string = vim_strsave(p); 7572 rettv->vval.v_string = vim_strsave(p);
7362 # endif 7573 # endif
7363 #endif 7574 #endif
7364 7575
7365 simplify_filename(retvar->vval.v_string); 7576 simplify_filename(rettv->vval.v_string);
7366 7577
7367 #ifdef HAVE_READLINK 7578 #ifdef HAVE_READLINK
7368 fail: 7579 fail:
7369 #endif 7580 #endif
7370 retvar->v_type = VAR_STRING; 7581 rettv->v_type = VAR_STRING;
7371 } 7582 }
7372 7583
7373 /* 7584 /*
7374 * "simplify()" function 7585 * "simplify()" function
7375 */ 7586 */
7376 static void 7587 static void
7377 f_simplify(argvars, retvar) 7588 f_simplify(argvars, rettv)
7378 typeval *argvars; 7589 typeval *argvars;
7379 typeval *retvar; 7590 typeval *rettv;
7380 { 7591 {
7381 char_u *p; 7592 char_u *p;
7382 7593
7383 p = get_vartv_string(&argvars[0]); 7594 p = get_tv_string(&argvars[0]);
7384 retvar->vval.v_string = vim_strsave(p); 7595 rettv->vval.v_string = vim_strsave(p);
7385 simplify_filename(retvar->vval.v_string); /* simplify in place */ 7596 simplify_filename(rettv->vval.v_string); /* simplify in place */
7386 retvar->v_type = VAR_STRING; 7597 rettv->v_type = VAR_STRING;
7387 } 7598 }
7388 7599
7389 #define SP_NOMOVE 1 /* don't move cursor */ 7600 #define SP_NOMOVE 1 /* don't move cursor */
7390 #define SP_REPEAT 2 /* repeat to find outer pair */ 7601 #define SP_REPEAT 2 /* repeat to find outer pair */
7391 #define SP_RETCOUNT 4 /* return matchcount */ 7602 #define SP_RETCOUNT 4 /* return matchcount */
7392 7603
7393 /* 7604 /*
7394 * "search()" function 7605 * "search()" function
7395 */ 7606 */
7396 static void 7607 static void
7397 f_search(argvars, retvar) 7608 f_search(argvars, rettv)
7398 typeval *argvars; 7609 typeval *argvars;
7399 typeval *retvar; 7610 typeval *rettv;
7400 { 7611 {
7401 char_u *pat; 7612 char_u *pat;
7402 pos_T pos; 7613 pos_T pos;
7403 pos_T save_cursor; 7614 pos_T save_cursor;
7404 int save_p_ws = p_ws; 7615 int save_p_ws = p_ws;
7405 int dir; 7616 int dir;
7406 int flags = 0; 7617 int flags = 0;
7407 7618
7408 retvar->vval.v_number = 0; /* default: FAIL */ 7619 rettv->vval.v_number = 0; /* default: FAIL */
7409 7620
7410 pat = get_vartv_string(&argvars[0]); 7621 pat = get_tv_string(&argvars[0]);
7411 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */ 7622 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */
7412 if (dir == 0) 7623 if (dir == 0)
7413 goto theend; 7624 goto theend;
7414 if ((flags & ~SP_NOMOVE) != 0) 7625 if ((flags & ~SP_NOMOVE) != 0)
7415 { 7626 {
7416 EMSG2(_(e_invarg2), get_vartv_string(&argvars[1])); 7627 EMSG2(_(e_invarg2), get_tv_string(&argvars[1]));
7417 goto theend; 7628 goto theend;
7418 } 7629 }
7419 7630
7420 pos = save_cursor = curwin->w_cursor; 7631 pos = save_cursor = curwin->w_cursor;
7421 if (searchit(curwin, curbuf, &pos, dir, pat, 1L, 7632 if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
7422 SEARCH_KEEP, RE_SEARCH) != FAIL) 7633 SEARCH_KEEP, RE_SEARCH) != FAIL)
7423 { 7634 {
7424 retvar->vval.v_number = pos.lnum; 7635 rettv->vval.v_number = pos.lnum;
7425 curwin->w_cursor = pos; 7636 curwin->w_cursor = pos;
7426 /* "/$" will put the cursor after the end of the line, may need to 7637 /* "/$" will put the cursor after the end of the line, may need to
7427 * correct that here */ 7638 * correct that here */
7428 check_cursor(); 7639 check_cursor();
7429 } 7640 }
7437 7648
7438 /* 7649 /*
7439 * "searchpair()" function 7650 * "searchpair()" function
7440 */ 7651 */
7441 static void 7652 static void
7442 f_searchpair(argvars, retvar) 7653 f_searchpair(argvars, rettv)
7443 typeval *argvars; 7654 typeval *argvars;
7444 typeval *retvar; 7655 typeval *rettv;
7445 { 7656 {
7446 char_u *spat, *mpat, *epat; 7657 char_u *spat, *mpat, *epat;
7447 char_u *skip; 7658 char_u *skip;
7448 char_u *pat, *pat2, *pat3; 7659 char_u *pat, *pat2, *pat3;
7449 pos_T pos; 7660 pos_T pos;
7460 int n; 7671 int n;
7461 int r; 7672 int r;
7462 int nest = 1; 7673 int nest = 1;
7463 int err; 7674 int err;
7464 7675
7465 retvar->vval.v_number = 0; /* default: FAIL */ 7676 rettv->vval.v_number = 0; /* default: FAIL */
7466 7677
7467 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ 7678 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
7468 save_cpo = p_cpo; 7679 save_cpo = p_cpo;
7469 p_cpo = (char_u *)""; 7680 p_cpo = (char_u *)"";
7470 7681
7471 /* Get the three pattern arguments: start, middle, end. */ 7682 /* Get the three pattern arguments: start, middle, end. */
7472 spat = get_vartv_string(&argvars[0]); 7683 spat = get_tv_string(&argvars[0]);
7473 mpat = get_vartv_string_buf(&argvars[1], nbuf1); 7684 mpat = get_tv_string_buf(&argvars[1], nbuf1);
7474 epat = get_vartv_string_buf(&argvars[2], nbuf2); 7685 epat = get_tv_string_buf(&argvars[2], nbuf2);
7475 7686
7476 /* Make two search patterns: start/end (pat2, for in nested pairs) and 7687 /* Make two search patterns: start/end (pat2, for in nested pairs) and
7477 * start/middle/end (pat3, for the top pair). */ 7688 * start/middle/end (pat3, for the top pair). */
7478 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15)); 7689 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15));
7479 pat3 = alloc((unsigned)(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23)); 7690 pat3 = alloc((unsigned)(STRLEN(spat) + STRLEN(mpat) + STRLEN(epat) + 23));
7494 /* Optional fifth argument: skip expresion */ 7705 /* Optional fifth argument: skip expresion */
7495 if (argvars[3].v_type == VAR_UNKNOWN 7706 if (argvars[3].v_type == VAR_UNKNOWN
7496 || argvars[4].v_type == VAR_UNKNOWN) 7707 || argvars[4].v_type == VAR_UNKNOWN)
7497 skip = (char_u *)""; 7708 skip = (char_u *)"";
7498 else 7709 else
7499 skip = get_vartv_string_buf(&argvars[4], nbuf3); 7710 skip = get_tv_string_buf(&argvars[4], nbuf3);
7500 7711
7501 save_cursor = curwin->w_cursor; 7712 save_cursor = curwin->w_cursor;
7502 pos = curwin->w_cursor; 7713 pos = curwin->w_cursor;
7503 firstpos.lnum = 0; 7714 firstpos.lnum = 0;
7504 pat = pat3; 7715 pat = pat3;
7522 curwin->w_cursor = save_pos; 7733 curwin->w_cursor = save_pos;
7523 if (err) 7734 if (err)
7524 { 7735 {
7525 /* Evaluating {skip} caused an error, break here. */ 7736 /* Evaluating {skip} caused an error, break here. */
7526 curwin->w_cursor = save_cursor; 7737 curwin->w_cursor = save_cursor;
7527 retvar->vval.v_number = -1; 7738 rettv->vval.v_number = -1;
7528 break; 7739 break;
7529 } 7740 }
7530 if (r) 7741 if (r)
7531 continue; 7742 continue;
7532 } 7743 }
7548 7759
7549 if (nest == 0) 7760 if (nest == 0)
7550 { 7761 {
7551 /* Found the match: return matchcount or line number. */ 7762 /* Found the match: return matchcount or line number. */
7552 if (flags & SP_RETCOUNT) 7763 if (flags & SP_RETCOUNT)
7553 ++retvar->vval.v_number; 7764 ++rettv->vval.v_number;
7554 else 7765 else
7555 retvar->vval.v_number = pos.lnum; 7766 rettv->vval.v_number = pos.lnum;
7556 curwin->w_cursor = pos; 7767 curwin->w_cursor = pos;
7557 if (!(flags & SP_REPEAT)) 7768 if (!(flags & SP_REPEAT))
7558 break; 7769 break;
7559 nest = 1; /* search for next unmatched */ 7770 nest = 1; /* search for next unmatched */
7560 } 7771 }
7561 } 7772 }
7562 7773
7563 /* If 'n' flag is used or search failed: restore cursor position. */ 7774 /* If 'n' flag is used or search failed: restore cursor position. */
7564 if ((flags & SP_NOMOVE) || retvar->vval.v_number == 0) 7775 if ((flags & SP_NOMOVE) || rettv->vval.v_number == 0)
7565 curwin->w_cursor = save_cursor; 7776 curwin->w_cursor = save_cursor;
7566 7777
7567 theend: 7778 theend:
7568 vim_free(pat2); 7779 vim_free(pat2);
7569 vim_free(pat3); 7780 vim_free(pat3);
7586 char_u nbuf[NUMBUFLEN]; 7797 char_u nbuf[NUMBUFLEN];
7587 int mask; 7798 int mask;
7588 7799
7589 if (varp->v_type != VAR_UNKNOWN) 7800 if (varp->v_type != VAR_UNKNOWN)
7590 { 7801 {
7591 flags = get_vartv_string_buf(varp, nbuf); 7802 flags = get_tv_string_buf(varp, nbuf);
7592 while (*flags != NUL) 7803 while (*flags != NUL)
7593 { 7804 {
7594 switch (*flags) 7805 switch (*flags)
7595 { 7806 {
7596 case 'b': dir = BACKWARD; break; 7807 case 'b': dir = BACKWARD; break;
7623 /* 7834 /*
7624 * "setbufvar()" function 7835 * "setbufvar()" function
7625 */ 7836 */
7626 /*ARGSUSED*/ 7837 /*ARGSUSED*/
7627 static void 7838 static void
7628 f_setbufvar(argvars, retvar) 7839 f_setbufvar(argvars, rettv)
7629 typeval *argvars; 7840 typeval *argvars;
7630 typeval *retvar; 7841 typeval *rettv;
7631 { 7842 {
7632 buf_T *buf; 7843 buf_T *buf;
7633 #ifdef FEAT_AUTOCMD 7844 #ifdef FEAT_AUTOCMD
7634 aco_save_T aco; 7845 aco_save_T aco;
7635 #else 7846 #else
7640 char_u nbuf[NUMBUFLEN]; 7851 char_u nbuf[NUMBUFLEN];
7641 7852
7642 if (check_restricted() || check_secure()) 7853 if (check_restricted() || check_secure())
7643 return; 7854 return;
7644 ++emsg_off; 7855 ++emsg_off;
7645 buf = get_buf_vartv(&argvars[0]); 7856 buf = get_buf_tv(&argvars[0]);
7646 varname = get_vartv_string(&argvars[1]); 7857 varname = get_tv_string(&argvars[1]);
7647 varp = &argvars[2]; 7858 varp = &argvars[2];
7648 7859
7649 if (buf != NULL && varname != NULL && varp != NULL) 7860 if (buf != NULL && varname != NULL && varp != NULL)
7650 { 7861 {
7651 /* set curbuf to be our buf, temporarily */ 7862 /* set curbuf to be our buf, temporarily */
7657 #endif 7868 #endif
7658 7869
7659 if (*varname == '&') 7870 if (*varname == '&')
7660 { 7871 {
7661 ++varname; 7872 ++varname;
7662 set_option_value(varname, get_vartv_number(varp), 7873 set_option_value(varname, get_tv_number(varp),
7663 get_vartv_string_buf(varp, nbuf), OPT_LOCAL); 7874 get_tv_string_buf(varp, nbuf), OPT_LOCAL);
7664 } 7875 }
7665 else 7876 else
7666 { 7877 {
7667 bufvarname = alloc((unsigned)STRLEN(varname) + 3); 7878 bufvarname = alloc((unsigned)STRLEN(varname) + 3);
7668 if (bufvarname != NULL) 7879 if (bufvarname != NULL)
7686 7897
7687 /* 7898 /*
7688 * "setcmdpos()" function 7899 * "setcmdpos()" function
7689 */ 7900 */
7690 static void 7901 static void
7691 f_setcmdpos(argvars, retvar) 7902 f_setcmdpos(argvars, rettv)
7692 typeval *argvars; 7903 typeval *argvars;
7693 typeval *retvar; 7904 typeval *rettv;
7694 { 7905 {
7695 retvar->vval.v_number = set_cmdline_pos( 7906 rettv->vval.v_number = set_cmdline_pos(
7696 (int)get_vartv_number(&argvars[0]) - 1); 7907 (int)get_tv_number(&argvars[0]) - 1);
7697 } 7908 }
7698 7909
7699 /* 7910 /*
7700 * "setline()" function 7911 * "setline()" function
7701 */ 7912 */
7702 static void 7913 static void
7703 f_setline(argvars, retvar) 7914 f_setline(argvars, rettv)
7704 typeval *argvars; 7915 typeval *argvars;
7705 typeval *retvar; 7916 typeval *rettv;
7706 { 7917 {
7707 linenr_T lnum; 7918 linenr_T lnum;
7708 char_u *line; 7919 char_u *line;
7709 7920
7710 lnum = get_vartv_lnum(argvars); 7921 lnum = get_tv_lnum(argvars);
7711 line = get_vartv_string(&argvars[1]); 7922 line = get_tv_string(&argvars[1]);
7712 retvar->vval.v_number = 1; /* FAIL is default */ 7923 rettv->vval.v_number = 1; /* FAIL is default */
7713 7924
7714 if (lnum >= 1 7925 if (lnum >= 1
7715 && lnum <= curbuf->b_ml.ml_line_count 7926 && lnum <= curbuf->b_ml.ml_line_count
7716 && u_savesub(lnum) == OK 7927 && u_savesub(lnum) == OK
7717 && ml_replace(lnum, line, TRUE) == OK) 7928 && ml_replace(lnum, line, TRUE) == OK)
7718 { 7929 {
7719 changed_bytes(lnum, 0); 7930 changed_bytes(lnum, 0);
7720 check_cursor_col(); 7931 check_cursor_col();
7721 retvar->vval.v_number = 0; 7932 rettv->vval.v_number = 0;
7722 } 7933 }
7723 } 7934 }
7724 7935
7725 /* 7936 /*
7726 * "setreg()" function 7937 * "setreg()" function
7727 */ 7938 */
7728 static void 7939 static void
7729 f_setreg(argvars, retvar) 7940 f_setreg(argvars, rettv)
7730 typeval *argvars; 7941 typeval *argvars;
7731 typeval *retvar; 7942 typeval *rettv;
7732 { 7943 {
7733 int regname; 7944 int regname;
7734 char_u *strregname; 7945 char_u *strregname;
7735 char_u *stropt; 7946 char_u *stropt;
7736 int append; 7947 int append;
7739 7950
7740 block_len = -1; 7951 block_len = -1;
7741 yank_type = MAUTO; 7952 yank_type = MAUTO;
7742 append = FALSE; 7953 append = FALSE;
7743 7954
7744 strregname = get_vartv_string(argvars); 7955 strregname = get_tv_string(argvars);
7745 retvar->vval.v_number = 1; /* FAIL is default */ 7956 rettv->vval.v_number = 1; /* FAIL is default */
7746 7957
7747 regname = (strregname == NULL ? '"' : *strregname); 7958 regname = (strregname == NULL ? '"' : *strregname);
7748 if (regname == 0 || regname == '@') 7959 if (regname == 0 || regname == '@')
7749 regname = '"'; 7960 regname = '"';
7750 else if (regname == '=') 7961 else if (regname == '=')
7751 return; 7962 return;
7752 7963
7753 if (argvars[2].v_type != VAR_UNKNOWN) 7964 if (argvars[2].v_type != VAR_UNKNOWN)
7754 { 7965 {
7755 for (stropt = get_vartv_string(&argvars[2]); *stropt != NUL; ++stropt) 7966 for (stropt = get_tv_string(&argvars[2]); *stropt != NUL; ++stropt)
7756 switch (*stropt) 7967 switch (*stropt)
7757 { 7968 {
7758 case 'a': case 'A': /* append */ 7969 case 'a': case 'A': /* append */
7759 append = TRUE; 7970 append = TRUE;
7760 break; 7971 break;
7776 break; 7987 break;
7777 #endif 7988 #endif
7778 } 7989 }
7779 } 7990 }
7780 7991
7781 write_reg_contents_ex(regname, get_vartv_string(&argvars[1]), -1, 7992 write_reg_contents_ex(regname, get_tv_string(&argvars[1]), -1,
7782 append, yank_type, block_len); 7993 append, yank_type, block_len);
7783 retvar->vval.v_number = 0; 7994 rettv->vval.v_number = 0;
7784 } 7995 }
7785 7996
7786 7997
7787 /* 7998 /*
7788 * "setwinvar(expr)" function 7999 * "setwinvar(expr)" function
7789 */ 8000 */
7790 /*ARGSUSED*/ 8001 /*ARGSUSED*/
7791 static void 8002 static void
7792 f_setwinvar(argvars, retvar) 8003 f_setwinvar(argvars, rettv)
7793 typeval *argvars; 8004 typeval *argvars;
7794 typeval *retvar; 8005 typeval *rettv;
7795 { 8006 {
7796 win_T *win; 8007 win_T *win;
7797 #ifdef FEAT_WINDOWS 8008 #ifdef FEAT_WINDOWS
7798 win_T *save_curwin; 8009 win_T *save_curwin;
7799 #endif 8010 #endif
7803 8014
7804 if (check_restricted() || check_secure()) 8015 if (check_restricted() || check_secure())
7805 return; 8016 return;
7806 ++emsg_off; 8017 ++emsg_off;
7807 win = find_win_by_nr(&argvars[0]); 8018 win = find_win_by_nr(&argvars[0]);
7808 varname = get_vartv_string(&argvars[1]); 8019 varname = get_tv_string(&argvars[1]);
7809 varp = &argvars[2]; 8020 varp = &argvars[2];
7810 8021
7811 if (win != NULL && varname != NULL && varp != NULL) 8022 if (win != NULL && varname != NULL && varp != NULL)
7812 { 8023 {
7813 #ifdef FEAT_WINDOWS 8024 #ifdef FEAT_WINDOWS
7818 #endif 8029 #endif
7819 8030
7820 if (*varname == '&') 8031 if (*varname == '&')
7821 { 8032 {
7822 ++varname; 8033 ++varname;
7823 set_option_value(varname, get_vartv_number(varp), 8034 set_option_value(varname, get_tv_number(varp),
7824 get_vartv_string_buf(varp, nbuf), OPT_LOCAL); 8035 get_tv_string_buf(varp, nbuf), OPT_LOCAL);
7825 } 8036 }
7826 else 8037 else
7827 { 8038 {
7828 winvarname = alloc((unsigned)STRLEN(varname) + 3); 8039 winvarname = alloc((unsigned)STRLEN(varname) + 3);
7829 if (winvarname != NULL) 8040 if (winvarname != NULL)
7850 8061
7851 /* 8062 /*
7852 * "nextnonblank()" function 8063 * "nextnonblank()" function
7853 */ 8064 */
7854 static void 8065 static void
7855 f_nextnonblank(argvars, retvar) 8066 f_nextnonblank(argvars, rettv)
7856 typeval *argvars; 8067 typeval *argvars;
7857 typeval *retvar; 8068 typeval *rettv;
7858 { 8069 {
7859 linenr_T lnum; 8070 linenr_T lnum;
7860 8071
7861 for (lnum = get_vartv_lnum(argvars); ; ++lnum) 8072 for (lnum = get_tv_lnum(argvars); ; ++lnum)
7862 { 8073 {
7863 if (lnum > curbuf->b_ml.ml_line_count) 8074 if (lnum > curbuf->b_ml.ml_line_count)
7864 { 8075 {
7865 lnum = 0; 8076 lnum = 0;
7866 break; 8077 break;
7867 } 8078 }
7868 if (*skipwhite(ml_get(lnum)) != NUL) 8079 if (*skipwhite(ml_get(lnum)) != NUL)
7869 break; 8080 break;
7870 } 8081 }
7871 retvar->vval.v_number = lnum; 8082 rettv->vval.v_number = lnum;
7872 } 8083 }
7873 8084
7874 /* 8085 /*
7875 * "prevnonblank()" function 8086 * "prevnonblank()" function
7876 */ 8087 */
7877 static void 8088 static void
7878 f_prevnonblank(argvars, retvar) 8089 f_prevnonblank(argvars, rettv)
7879 typeval *argvars; 8090 typeval *argvars;
7880 typeval *retvar; 8091 typeval *rettv;
7881 { 8092 {
7882 linenr_T lnum; 8093 linenr_T lnum;
7883 8094
7884 lnum = get_vartv_lnum(argvars); 8095 lnum = get_tv_lnum(argvars);
7885 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count) 8096 if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
7886 lnum = 0; 8097 lnum = 0;
7887 else 8098 else
7888 while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL) 8099 while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL)
7889 --lnum; 8100 --lnum;
7890 retvar->vval.v_number = lnum; 8101 rettv->vval.v_number = lnum;
7891 } 8102 }
7892 8103
7893 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11) 8104 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
7894 static void make_connection __ARGS((void)); 8105 static void make_connection __ARGS((void));
7895 static int check_connection __ARGS((void)); 8106 static int check_connection __ARGS((void));
7922 } 8133 }
7923 #endif 8134 #endif
7924 8135
7925 /*ARGSUSED*/ 8136 /*ARGSUSED*/
7926 static void 8137 static void
7927 f_serverlist(argvars, retvar) 8138 f_serverlist(argvars, rettv)
7928 typeval *argvars; 8139 typeval *argvars;
7929 typeval *retvar; 8140 typeval *rettv;
7930 { 8141 {
7931 char_u *r = NULL; 8142 char_u *r = NULL;
7932 8143
7933 #ifdef FEAT_CLIENTSERVER 8144 #ifdef FEAT_CLIENTSERVER
7934 # ifdef WIN32 8145 # ifdef WIN32
7937 make_connection(); 8148 make_connection();
7938 if (X_DISPLAY != NULL) 8149 if (X_DISPLAY != NULL)
7939 r = serverGetVimNames(X_DISPLAY); 8150 r = serverGetVimNames(X_DISPLAY);
7940 # endif 8151 # endif
7941 #endif 8152 #endif
7942 retvar->v_type = VAR_STRING; 8153 rettv->v_type = VAR_STRING;
7943 retvar->vval.v_string = r; 8154 rettv->vval.v_string = r;
7944 } 8155 }
7945 8156
7946 /*ARGSUSED*/ 8157 /*ARGSUSED*/
7947 static void 8158 static void
7948 f_remote_peek(argvars, retvar) 8159 f_remote_peek(argvars, rettv)
7949 typeval *argvars; 8160 typeval *argvars;
7950 typeval *retvar; 8161 typeval *rettv;
7951 { 8162 {
7952 #ifdef FEAT_CLIENTSERVER 8163 #ifdef FEAT_CLIENTSERVER
7953 var v; 8164 var v;
7954 char_u *s = NULL; 8165 char_u *s = NULL;
7955 # ifdef WIN32 8166 # ifdef WIN32
7956 int n = 0; 8167 int n = 0;
7957 # endif 8168 # endif
7958 8169
7959 if (check_restricted() || check_secure()) 8170 if (check_restricted() || check_secure())
7960 { 8171 {
7961 retvar->vval.v_number = -1; 8172 rettv->vval.v_number = -1;
7962 return; 8173 return;
7963 } 8174 }
7964 # ifdef WIN32 8175 # ifdef WIN32
7965 sscanf(get_vartv_string(&argvars[0]), "%x", &n); 8176 sscanf(get_tv_string(&argvars[0]), "%x", &n);
7966 if (n == 0) 8177 if (n == 0)
7967 retvar->vval.v_number = -1; 8178 rettv->vval.v_number = -1;
7968 else 8179 else
7969 { 8180 {
7970 s = serverGetReply((HWND)n, FALSE, FALSE, FALSE); 8181 s = serverGetReply((HWND)n, FALSE, FALSE, FALSE);
7971 retvar->vval.v_number = (s != NULL); 8182 rettv->vval.v_number = (s != NULL);
7972 } 8183 }
7973 # else 8184 # else
7974 retvar->vval.v_number = 0; 8185 rettv->vval.v_number = 0;
7975 if (check_connection() == FAIL) 8186 if (check_connection() == FAIL)
7976 return; 8187 return;
7977 8188
7978 retvar->vval.v_number = serverPeekReply(X_DISPLAY, 8189 rettv->vval.v_number = serverPeekReply(X_DISPLAY,
7979 serverStrToWin(get_vartv_string(&argvars[0])), &s); 8190 serverStrToWin(get_tv_string(&argvars[0])), &s);
7980 # endif 8191 # endif
7981 8192
7982 if (argvars[1].v_type != VAR_UNKNOWN && retvar->vval.v_number > 0) 8193 if (argvars[1].v_type != VAR_UNKNOWN && rettv->vval.v_number > 0)
7983 { 8194 {
7984 v.tv.v_type = VAR_STRING; 8195 v.tv.v_type = VAR_STRING;
7985 v.tv.vval.v_string = vim_strsave(s); 8196 v.tv.vval.v_string = vim_strsave(s);
7986 set_var(get_vartv_string(&argvars[1]), &v.tv, FALSE); 8197 set_var(get_tv_string(&argvars[1]), &v.tv, FALSE);
7987 vim_free(v.tv.vval.v_string); 8198 vim_free(v.tv.vval.v_string);
7988 } 8199 }
7989 #else 8200 #else
7990 retvar->vval.v_number = -1; 8201 rettv->vval.v_number = -1;
7991 #endif 8202 #endif
7992 } 8203 }
7993 8204
7994 /*ARGSUSED*/ 8205 /*ARGSUSED*/
7995 static void 8206 static void
7996 f_remote_read(argvars, retvar) 8207 f_remote_read(argvars, rettv)
7997 typeval *argvars; 8208 typeval *argvars;
7998 typeval *retvar; 8209 typeval *rettv;
7999 { 8210 {
8000 char_u *r = NULL; 8211 char_u *r = NULL;
8001 8212
8002 #ifdef FEAT_CLIENTSERVER 8213 #ifdef FEAT_CLIENTSERVER
8003 if (!check_restricted() && !check_secure()) 8214 if (!check_restricted() && !check_secure())
8004 { 8215 {
8005 # ifdef WIN32 8216 # ifdef WIN32
8006 /* The server's HWND is encoded in the 'id' parameter */ 8217 /* The server's HWND is encoded in the 'id' parameter */
8007 int n = 0; 8218 int n = 0;
8008 8219
8009 sscanf(get_vartv_string(&argvars[0]), "%x", &n); 8220 sscanf(get_tv_string(&argvars[0]), "%x", &n);
8010 if (n != 0) 8221 if (n != 0)
8011 r = serverGetReply((HWND)n, FALSE, TRUE, TRUE); 8222 r = serverGetReply((HWND)n, FALSE, TRUE, TRUE);
8012 if (r == NULL) 8223 if (r == NULL)
8013 # else 8224 # else
8014 if (check_connection() == FAIL || serverReadReply(X_DISPLAY, 8225 if (check_connection() == FAIL || serverReadReply(X_DISPLAY,
8015 serverStrToWin(get_vartv_string(&argvars[0])), &r, FALSE) < 0) 8226 serverStrToWin(get_tv_string(&argvars[0])), &r, FALSE) < 0)
8016 # endif 8227 # endif
8017 EMSG(_("E277: Unable to read a server reply")); 8228 EMSG(_("E277: Unable to read a server reply"));
8018 } 8229 }
8019 #endif 8230 #endif
8020 retvar->v_type = VAR_STRING; 8231 rettv->v_type = VAR_STRING;
8021 retvar->vval.v_string = r; 8232 rettv->vval.v_string = r;
8022 } 8233 }
8023 8234
8024 /*ARGSUSED*/ 8235 /*ARGSUSED*/
8025 static void 8236 static void
8026 f_server2client(argvars, retvar) 8237 f_server2client(argvars, rettv)
8027 typeval *argvars; 8238 typeval *argvars;
8028 typeval *retvar; 8239 typeval *rettv;
8029 { 8240 {
8030 #ifdef FEAT_CLIENTSERVER 8241 #ifdef FEAT_CLIENTSERVER
8031 char_u buf[NUMBUFLEN]; 8242 char_u buf[NUMBUFLEN];
8032 char_u *server = get_vartv_string(&argvars[0]); 8243 char_u *server = get_tv_string(&argvars[0]);
8033 char_u *reply = get_vartv_string_buf(&argvars[1], buf); 8244 char_u *reply = get_tv_string_buf(&argvars[1], buf);
8034 8245
8035 retvar->vval.v_number = -1; 8246 rettv->vval.v_number = -1;
8036 if (check_restricted() || check_secure()) 8247 if (check_restricted() || check_secure())
8037 return; 8248 return;
8038 # ifdef FEAT_X11 8249 # ifdef FEAT_X11
8039 if (check_connection() == FAIL) 8250 if (check_connection() == FAIL)
8040 return; 8251 return;
8043 if (serverSendReply(server, reply) < 0) 8254 if (serverSendReply(server, reply) < 0)
8044 { 8255 {
8045 EMSG(_("E258: Unable to send to client")); 8256 EMSG(_("E258: Unable to send to client"));
8046 return; 8257 return;
8047 } 8258 }
8048 retvar->vval.v_number = 0; 8259 rettv->vval.v_number = 0;
8049 #else 8260 #else
8050 retvar->vval.v_number = -1; 8261 rettv->vval.v_number = -1;
8051 #endif 8262 #endif
8052 } 8263 }
8053 8264
8054 #ifdef FEAT_CLIENTSERVER 8265 #ifdef FEAT_CLIENTSERVER
8055 static void remote_common __ARGS((typeval *argvars, typeval *retvar, int expr)); 8266 static void remote_common __ARGS((typeval *argvars, typeval *rettv, int expr));
8056 8267
8057 static void 8268 static void
8058 remote_common(argvars, retvar, expr) 8269 remote_common(argvars, rettv, expr)
8059 typeval *argvars; 8270 typeval *argvars;
8060 typeval *retvar; 8271 typeval *rettv;
8061 int expr; 8272 int expr;
8062 { 8273 {
8063 char_u *server_name; 8274 char_u *server_name;
8064 char_u *keys; 8275 char_u *keys;
8065 char_u *r = NULL; 8276 char_u *r = NULL;
8076 # ifdef FEAT_X11 8287 # ifdef FEAT_X11
8077 if (check_connection() == FAIL) 8288 if (check_connection() == FAIL)
8078 return; 8289 return;
8079 # endif 8290 # endif
8080 8291
8081 server_name = get_vartv_string(&argvars[0]); 8292 server_name = get_tv_string(&argvars[0]);
8082 keys = get_vartv_string_buf(&argvars[1], buf); 8293 keys = get_tv_string_buf(&argvars[1], buf);
8083 # ifdef WIN32 8294 # ifdef WIN32
8084 if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0) 8295 if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0)
8085 # else 8296 # else
8086 if (serverSendToVim(X_DISPLAY, server_name, keys, &r, &w, expr, 0, TRUE) 8297 if (serverSendToVim(X_DISPLAY, server_name, keys, &r, &w, expr, 0, TRUE)
8087 < 0) 8298 < 0)
8092 else 8303 else
8093 EMSG2(_("E241: Unable to send to %s"), server_name); 8304 EMSG2(_("E241: Unable to send to %s"), server_name);
8094 return; 8305 return;
8095 } 8306 }
8096 8307
8097 retvar->vval.v_string = r; 8308 rettv->vval.v_string = r;
8098 8309
8099 if (argvars[2].v_type != VAR_UNKNOWN) 8310 if (argvars[2].v_type != VAR_UNKNOWN)
8100 { 8311 {
8101 var v; 8312 var v;
8102 char_u str[30]; 8313 char_u str[30];
8103 8314
8104 sprintf((char *)str, "0x%x", (unsigned int)w); 8315 sprintf((char *)str, "0x%x", (unsigned int)w);
8105 v.tv.v_type = VAR_STRING; 8316 v.tv.v_type = VAR_STRING;
8106 v.tv.vval.v_string = vim_strsave(str); 8317 v.tv.vval.v_string = vim_strsave(str);
8107 set_var(get_vartv_string(&argvars[2]), &v.tv, FALSE); 8318 set_var(get_tv_string(&argvars[2]), &v.tv, FALSE);
8108 vim_free(v.tv.vval.v_string); 8319 vim_free(v.tv.vval.v_string);
8109 } 8320 }
8110 } 8321 }
8111 #endif 8322 #endif
8112 8323
8113 /* 8324 /*
8114 * "remote_expr()" function 8325 * "remote_expr()" function
8115 */ 8326 */
8116 /*ARGSUSED*/ 8327 /*ARGSUSED*/
8117 static void 8328 static void
8118 f_remote_expr(argvars, retvar) 8329 f_remote_expr(argvars, rettv)
8119 typeval *argvars; 8330 typeval *argvars;
8120 typeval *retvar; 8331 typeval *rettv;
8121 { 8332 {
8122 retvar->v_type = VAR_STRING; 8333 rettv->v_type = VAR_STRING;
8123 retvar->vval.v_string = NULL; 8334 rettv->vval.v_string = NULL;
8124 #ifdef FEAT_CLIENTSERVER 8335 #ifdef FEAT_CLIENTSERVER
8125 remote_common(argvars, retvar, TRUE); 8336 remote_common(argvars, rettv, TRUE);
8126 #endif 8337 #endif
8127 } 8338 }
8128 8339
8129 /* 8340 /*
8130 * "remote_send()" function 8341 * "remote_send()" function
8131 */ 8342 */
8132 /*ARGSUSED*/ 8343 /*ARGSUSED*/
8133 static void 8344 static void
8134 f_remote_send(argvars, retvar) 8345 f_remote_send(argvars, rettv)
8135 typeval *argvars; 8346 typeval *argvars;
8136 typeval *retvar; 8347 typeval *rettv;
8137 { 8348 {
8138 retvar->v_type = VAR_STRING; 8349 rettv->v_type = VAR_STRING;
8139 retvar->vval.v_string = NULL; 8350 rettv->vval.v_string = NULL;
8140 #ifdef FEAT_CLIENTSERVER 8351 #ifdef FEAT_CLIENTSERVER
8141 remote_common(argvars, retvar, FALSE); 8352 remote_common(argvars, rettv, FALSE);
8142 #endif 8353 #endif
8143 } 8354 }
8144 8355
8145 /* 8356 /*
8146 * "remote_foreground()" function 8357 * "remote_foreground()" function
8147 */ 8358 */
8148 /*ARGSUSED*/ 8359 /*ARGSUSED*/
8149 static void 8360 static void
8150 f_remote_foreground(argvars, retvar) 8361 f_remote_foreground(argvars, rettv)
8151 typeval *argvars; 8362 typeval *argvars;
8152 typeval *retvar; 8363 typeval *rettv;
8153 { 8364 {
8154 retvar->vval.v_number = 0; 8365 rettv->vval.v_number = 0;
8155 #ifdef FEAT_CLIENTSERVER 8366 #ifdef FEAT_CLIENTSERVER
8156 # ifdef WIN32 8367 # ifdef WIN32
8157 /* On Win32 it's done in this application. */ 8368 /* On Win32 it's done in this application. */
8158 serverForeground(get_vartv_string(&argvars[0])); 8369 serverForeground(get_tv_string(&argvars[0]));
8159 # else 8370 # else
8160 /* Send a foreground() expression to the server. */ 8371 /* Send a foreground() expression to the server. */
8161 argvars[1].v_type = VAR_STRING; 8372 argvars[1].v_type = VAR_STRING;
8162 argvars[1].vval.v_string = vim_strsave((char_u *)"foreground()"); 8373 argvars[1].vval.v_string = vim_strsave((char_u *)"foreground()");
8163 argvars[2].v_type = VAR_UNKNOWN; 8374 argvars[2].v_type = VAR_UNKNOWN;
8164 remote_common(argvars, retvar, TRUE); 8375 remote_common(argvars, rettv, TRUE);
8165 vim_free(argvars[1].vval.v_string); 8376 vim_free(argvars[1].vval.v_string);
8166 # endif 8377 # endif
8167 #endif 8378 #endif
8168 } 8379 }
8169 8380
8170 /* 8381 /*
8171 * "repeat()" function 8382 * "repeat()" function
8172 */ 8383 */
8173 /*ARGSUSED*/ 8384 /*ARGSUSED*/
8174 static void 8385 static void
8175 f_repeat(argvars, retvar) 8386 f_repeat(argvars, rettv)
8176 typeval *argvars; 8387 typeval *argvars;
8177 typeval *retvar; 8388 typeval *rettv;
8178 { 8389 {
8179 char_u *p; 8390 char_u *p;
8180 int n; 8391 int n;
8181 int slen; 8392 int slen;
8182 int len; 8393 int len;
8183 char_u *r; 8394 char_u *r;
8184 int i; 8395 int i;
8185 8396
8186 p = get_vartv_string(&argvars[0]); 8397 p = get_tv_string(&argvars[0]);
8187 n = get_vartv_number(&argvars[1]); 8398 n = get_tv_number(&argvars[1]);
8188 8399
8189 retvar->v_type = VAR_STRING; 8400 rettv->v_type = VAR_STRING;
8190 retvar->vval.v_string = NULL; 8401 rettv->vval.v_string = NULL;
8191 8402
8192 slen = (int)STRLEN(p); 8403 slen = (int)STRLEN(p);
8193 len = slen * n; 8404 len = slen * n;
8194 8405
8195 if (len <= 0) 8406 if (len <= 0)
8201 for (i = 0; i < n; i++) 8412 for (i = 0; i < n; i++)
8202 mch_memmove(r + i * slen, p, (size_t)slen); 8413 mch_memmove(r + i * slen, p, (size_t)slen);
8203 r[len] = NUL; 8414 r[len] = NUL;
8204 } 8415 }
8205 8416
8206 retvar->vval.v_string = r; 8417 rettv->vval.v_string = r;
8207 } 8418 }
8208 8419
8209 #ifdef HAVE_STRFTIME 8420 #ifdef HAVE_STRFTIME
8210 /* 8421 /*
8211 * "strftime({format}[, {time}])" function 8422 * "strftime({format}[, {time}])" function
8212 */ 8423 */
8213 static void 8424 static void
8214 f_strftime(argvars, retvar) 8425 f_strftime(argvars, rettv)
8215 typeval *argvars; 8426 typeval *argvars;
8216 typeval *retvar; 8427 typeval *rettv;
8217 { 8428 {
8218 char_u result_buf[256]; 8429 char_u result_buf[256];
8219 struct tm *curtime; 8430 struct tm *curtime;
8220 time_t seconds; 8431 time_t seconds;
8221 char_u *p; 8432 char_u *p;
8222 8433
8223 retvar->v_type = VAR_STRING; 8434 rettv->v_type = VAR_STRING;
8224 8435
8225 p = get_vartv_string(&argvars[0]); 8436 p = get_tv_string(&argvars[0]);
8226 if (argvars[1].v_type == VAR_UNKNOWN) 8437 if (argvars[1].v_type == VAR_UNKNOWN)
8227 seconds = time(NULL); 8438 seconds = time(NULL);
8228 else 8439 else
8229 seconds = (time_t)get_vartv_number(&argvars[1]); 8440 seconds = (time_t)get_tv_number(&argvars[1]);
8230 curtime = localtime(&seconds); 8441 curtime = localtime(&seconds);
8231 /* MSVC returns NULL for an invalid value of seconds. */ 8442 /* MSVC returns NULL for an invalid value of seconds. */
8232 if (curtime == NULL) 8443 if (curtime == NULL)
8233 retvar->vval.v_string = vim_strsave((char_u *)_("(Invalid)")); 8444 rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
8234 else 8445 else
8235 { 8446 {
8236 # ifdef FEAT_MBYTE 8447 # ifdef FEAT_MBYTE
8237 vimconv_T conv; 8448 vimconv_T conv;
8238 char_u *enc; 8449 char_u *enc;
8252 # ifdef FEAT_MBYTE 8463 # ifdef FEAT_MBYTE
8253 if (conv.vc_type != CONV_NONE) 8464 if (conv.vc_type != CONV_NONE)
8254 vim_free(p); 8465 vim_free(p);
8255 convert_setup(&conv, enc, p_enc); 8466 convert_setup(&conv, enc, p_enc);
8256 if (conv.vc_type != CONV_NONE) 8467 if (conv.vc_type != CONV_NONE)
8257 retvar->vval.v_string = string_convert(&conv, result_buf, NULL); 8468 rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
8258 else 8469 else
8259 # endif 8470 # endif
8260 retvar->vval.v_string = vim_strsave(result_buf); 8471 rettv->vval.v_string = vim_strsave(result_buf);
8261 8472
8262 # ifdef FEAT_MBYTE 8473 # ifdef FEAT_MBYTE
8263 /* Release conversion descriptors */ 8474 /* Release conversion descriptors */
8264 convert_setup(&conv, NULL, NULL); 8475 convert_setup(&conv, NULL, NULL);
8265 vim_free(enc); 8476 vim_free(enc);
8270 8481
8271 /* 8482 /*
8272 * "stridx()" function 8483 * "stridx()" function
8273 */ 8484 */
8274 static void 8485 static void
8275 f_stridx(argvars, retvar) 8486 f_stridx(argvars, rettv)
8276 typeval *argvars; 8487 typeval *argvars;
8277 typeval *retvar; 8488 typeval *rettv;
8278 { 8489 {
8279 char_u buf[NUMBUFLEN]; 8490 char_u buf[NUMBUFLEN];
8280 char_u *needle; 8491 char_u *needle;
8281 char_u *haystack; 8492 char_u *haystack;
8282 char_u *pos; 8493 char_u *pos;
8283 8494
8284 needle = get_vartv_string(&argvars[1]); 8495 needle = get_tv_string(&argvars[1]);
8285 haystack = get_vartv_string_buf(&argvars[0], buf); 8496 haystack = get_tv_string_buf(&argvars[0], buf);
8286 pos = (char_u *)strstr((char *)haystack, (char *)needle); 8497 pos = (char_u *)strstr((char *)haystack, (char *)needle);
8287 8498
8288 if (pos == NULL) 8499 if (pos == NULL)
8289 retvar->vval.v_number = -1; 8500 rettv->vval.v_number = -1;
8290 else 8501 else
8291 retvar->vval.v_number = (varnumber_T) (pos - haystack); 8502 rettv->vval.v_number = (varnumber_T) (pos - haystack);
8292 } 8503 }
8293 8504
8294 /* 8505 /*
8295 * "strridx()" function 8506 * "strridx()" function
8296 */ 8507 */
8297 static void 8508 static void
8298 f_strridx(argvars, retvar) 8509 f_strridx(argvars, rettv)
8299 typeval *argvars; 8510 typeval *argvars;
8300 typeval *retvar; 8511 typeval *rettv;
8301 { 8512 {
8302 char_u buf[NUMBUFLEN]; 8513 char_u buf[NUMBUFLEN];
8303 char_u *needle; 8514 char_u *needle;
8304 char_u *haystack; 8515 char_u *haystack;
8305 char_u *rest; 8516 char_u *rest;
8306 char_u *lastmatch = NULL; 8517 char_u *lastmatch = NULL;
8307 8518
8308 needle = get_vartv_string(&argvars[1]); 8519 needle = get_tv_string(&argvars[1]);
8309 haystack = get_vartv_string_buf(&argvars[0], buf); 8520 haystack = get_tv_string_buf(&argvars[0], buf);
8310 if (*needle == NUL) 8521 if (*needle == NUL)
8311 /* Empty string matches past the end. */ 8522 /* Empty string matches past the end. */
8312 lastmatch = haystack + STRLEN(haystack); 8523 lastmatch = haystack + STRLEN(haystack);
8313 else 8524 else
8314 for (rest = haystack; *rest != '\0'; ++rest) 8525 for (rest = haystack; *rest != '\0'; ++rest)
8318 break; 8529 break;
8319 lastmatch = rest; 8530 lastmatch = rest;
8320 } 8531 }
8321 8532
8322 if (lastmatch == NULL) 8533 if (lastmatch == NULL)
8323 retvar->vval.v_number = -1; 8534 rettv->vval.v_number = -1;
8324 else 8535 else
8325 retvar->vval.v_number = (varnumber_T)(lastmatch - haystack); 8536 rettv->vval.v_number = (varnumber_T)(lastmatch - haystack);
8326 } 8537 }
8327 8538
8328 /* 8539 /*
8329 * "string()" function 8540 * "string()" function
8330 */ 8541 */
8331 static void 8542 static void
8332 f_string(argvars, retvar) 8543 f_string(argvars, rettv)
8333 typeval *argvars; 8544 typeval *argvars;
8334 typeval *retvar; 8545 typeval *rettv;
8335 { 8546 {
8336 char_u *tofree; 8547 char_u *tofree;
8337 8548
8338 retvar->v_type = VAR_STRING; 8549 rettv->v_type = VAR_STRING;
8339 retvar->vval.v_string = tv2string(&argvars[0], &tofree); 8550 rettv->vval.v_string = tv2string(&argvars[0], &tofree);
8340 if (tofree == NULL) 8551 if (tofree == NULL)
8341 retvar->vval.v_string = vim_strsave(retvar->vval.v_string); 8552 rettv->vval.v_string = vim_strsave(rettv->vval.v_string);
8342 } 8553 }
8343 8554
8344 /* 8555 /*
8345 * "strlen()" function 8556 * "strlen()" function
8346 */ 8557 */
8347 static void 8558 static void
8348 f_strlen(argvars, retvar) 8559 f_strlen(argvars, rettv)
8349 typeval *argvars; 8560 typeval *argvars;
8350 typeval *retvar; 8561 typeval *rettv;
8351 { 8562 {
8352 retvar->vval.v_number = (varnumber_T)(STRLEN( 8563 rettv->vval.v_number = (varnumber_T)(STRLEN(
8353 get_vartv_string(&argvars[0]))); 8564 get_tv_string(&argvars[0])));
8354 } 8565 }
8355 8566
8356 /* 8567 /*
8357 * "strpart()" function 8568 * "strpart()" function
8358 */ 8569 */
8359 static void 8570 static void
8360 f_strpart(argvars, retvar) 8571 f_strpart(argvars, rettv)
8361 typeval *argvars; 8572 typeval *argvars;
8362 typeval *retvar; 8573 typeval *rettv;
8363 { 8574 {
8364 char_u *p; 8575 char_u *p;
8365 int n; 8576 int n;
8366 int len; 8577 int len;
8367 int slen; 8578 int slen;
8368 8579
8369 p = get_vartv_string(&argvars[0]); 8580 p = get_tv_string(&argvars[0]);
8370 slen = (int)STRLEN(p); 8581 slen = (int)STRLEN(p);
8371 8582
8372 n = get_vartv_number(&argvars[1]); 8583 n = get_tv_number(&argvars[1]);
8373 if (argvars[2].v_type != VAR_UNKNOWN) 8584 if (argvars[2].v_type != VAR_UNKNOWN)
8374 len = get_vartv_number(&argvars[2]); 8585 len = get_tv_number(&argvars[2]);
8375 else 8586 else
8376 len = slen - n; /* default len: all bytes that are available. */ 8587 len = slen - n; /* default len: all bytes that are available. */
8377 8588
8378 /* 8589 /*
8379 * Only return the overlap between the specified part and the actual 8590 * Only return the overlap between the specified part and the actual
8389 if (len < 0) 8600 if (len < 0)
8390 len = 0; 8601 len = 0;
8391 else if (n + len > slen) 8602 else if (n + len > slen)
8392 len = slen - n; 8603 len = slen - n;
8393 8604
8394 retvar->v_type = VAR_STRING; 8605 rettv->v_type = VAR_STRING;
8395 retvar->vval.v_string = vim_strnsave(p + n, len); 8606 rettv->vval.v_string = vim_strnsave(p + n, len);
8396 } 8607 }
8397 8608
8398 /* 8609 /*
8399 * "strtrans()" function 8610 * "strtrans()" function
8400 */ 8611 */
8401 static void 8612 static void
8402 f_strtrans(argvars, retvar) 8613 f_strtrans(argvars, rettv)
8403 typeval *argvars; 8614 typeval *argvars;
8404 typeval *retvar; 8615 typeval *rettv;
8405 { 8616 {
8406 retvar->v_type = VAR_STRING; 8617 rettv->v_type = VAR_STRING;
8407 retvar->vval.v_string = transstr(get_vartv_string(&argvars[0])); 8618 rettv->vval.v_string = transstr(get_tv_string(&argvars[0]));
8408 } 8619 }
8409 8620
8410 /* 8621 /*
8411 * "synID(line, col, trans)" function 8622 * "synID(line, col, trans)" function
8412 */ 8623 */
8413 /*ARGSUSED*/ 8624 /*ARGSUSED*/
8414 static void 8625 static void
8415 f_synID(argvars, retvar) 8626 f_synID(argvars, rettv)
8416 typeval *argvars; 8627 typeval *argvars;
8417 typeval *retvar; 8628 typeval *rettv;
8418 { 8629 {
8419 int id = 0; 8630 int id = 0;
8420 #ifdef FEAT_SYN_HL 8631 #ifdef FEAT_SYN_HL
8421 long line; 8632 long line;
8422 long col; 8633 long col;
8423 int trans; 8634 int trans;
8424 8635
8425 line = get_vartv_lnum(argvars); 8636 line = get_tv_lnum(argvars);
8426 col = get_vartv_number(&argvars[1]) - 1; 8637 col = get_tv_number(&argvars[1]) - 1;
8427 trans = get_vartv_number(&argvars[2]); 8638 trans = get_tv_number(&argvars[2]);
8428 8639
8429 if (line >= 1 && line <= curbuf->b_ml.ml_line_count 8640 if (line >= 1 && line <= curbuf->b_ml.ml_line_count
8430 && col >= 0 && col < (long)STRLEN(ml_get(line))) 8641 && col >= 0 && col < (long)STRLEN(ml_get(line)))
8431 id = syn_get_id(line, col, trans); 8642 id = syn_get_id(line, col, trans);
8432 #endif 8643 #endif
8433 8644
8434 retvar->vval.v_number = id; 8645 rettv->vval.v_number = id;
8435 } 8646 }
8436 8647
8437 /* 8648 /*
8438 * "synIDattr(id, what [, mode])" function 8649 * "synIDattr(id, what [, mode])" function
8439 */ 8650 */
8440 /*ARGSUSED*/ 8651 /*ARGSUSED*/
8441 static void 8652 static void
8442 f_synIDattr(argvars, retvar) 8653 f_synIDattr(argvars, rettv)
8443 typeval *argvars; 8654 typeval *argvars;
8444 typeval *retvar; 8655 typeval *rettv;
8445 { 8656 {
8446 char_u *p = NULL; 8657 char_u *p = NULL;
8447 #ifdef FEAT_SYN_HL 8658 #ifdef FEAT_SYN_HL
8448 int id; 8659 int id;
8449 char_u *what; 8660 char_u *what;
8450 char_u *mode; 8661 char_u *mode;
8451 char_u modebuf[NUMBUFLEN]; 8662 char_u modebuf[NUMBUFLEN];
8452 int modec; 8663 int modec;
8453 8664
8454 id = get_vartv_number(&argvars[0]); 8665 id = get_tv_number(&argvars[0]);
8455 what = get_vartv_string(&argvars[1]); 8666 what = get_tv_string(&argvars[1]);
8456 if (argvars[2].v_type != VAR_UNKNOWN) 8667 if (argvars[2].v_type != VAR_UNKNOWN)
8457 { 8668 {
8458 mode = get_vartv_string_buf(&argvars[2], modebuf); 8669 mode = get_tv_string_buf(&argvars[2], modebuf);
8459 modec = TOLOWER_ASC(mode[0]); 8670 modec = TOLOWER_ASC(mode[0]);
8460 if (modec != 't' && modec != 'c' 8671 if (modec != 't' && modec != 'c'
8461 #ifdef FEAT_GUI 8672 #ifdef FEAT_GUI
8462 && modec != 'g' 8673 && modec != 'g'
8463 #endif 8674 #endif
8516 } 8727 }
8517 8728
8518 if (p != NULL) 8729 if (p != NULL)
8519 p = vim_strsave(p); 8730 p = vim_strsave(p);
8520 #endif 8731 #endif
8521 retvar->v_type = VAR_STRING; 8732 rettv->v_type = VAR_STRING;
8522 retvar->vval.v_string = p; 8733 rettv->vval.v_string = p;
8523 } 8734 }
8524 8735
8525 /* 8736 /*
8526 * "synIDtrans(id)" function 8737 * "synIDtrans(id)" function
8527 */ 8738 */
8528 /*ARGSUSED*/ 8739 /*ARGSUSED*/
8529 static void 8740 static void
8530 f_synIDtrans(argvars, retvar) 8741 f_synIDtrans(argvars, rettv)
8531 typeval *argvars; 8742 typeval *argvars;
8532 typeval *retvar; 8743 typeval *rettv;
8533 { 8744 {
8534 int id; 8745 int id;
8535 8746
8536 #ifdef FEAT_SYN_HL 8747 #ifdef FEAT_SYN_HL
8537 id = get_vartv_number(&argvars[0]); 8748 id = get_tv_number(&argvars[0]);
8538 8749
8539 if (id > 0) 8750 if (id > 0)
8540 id = syn_get_final_id(id); 8751 id = syn_get_final_id(id);
8541 else 8752 else
8542 #endif 8753 #endif
8543 id = 0; 8754 id = 0;
8544 8755
8545 retvar->vval.v_number = id; 8756 rettv->vval.v_number = id;
8546 } 8757 }
8547 8758
8548 /* 8759 /*
8549 * "system()" function 8760 * "system()" function
8550 */ 8761 */
8551 static void 8762 static void
8552 f_system(argvars, retvar) 8763 f_system(argvars, rettv)
8553 typeval *argvars; 8764 typeval *argvars;
8554 typeval *retvar; 8765 typeval *rettv;
8555 { 8766 {
8556 char_u *res = NULL; 8767 char_u *res = NULL;
8557 char_u *p; 8768 char_u *p;
8558 char_u *infile = NULL; 8769 char_u *infile = NULL;
8559 char_u buf[NUMBUFLEN]; 8770 char_u buf[NUMBUFLEN];
8576 if (fd == NULL) 8787 if (fd == NULL)
8577 { 8788 {
8578 EMSG2(_(e_notopen), infile); 8789 EMSG2(_(e_notopen), infile);
8579 goto done; 8790 goto done;
8580 } 8791 }
8581 p = get_vartv_string_buf(&argvars[1], buf); 8792 p = get_tv_string_buf(&argvars[1], buf);
8582 if (fwrite(p, STRLEN(p), 1, fd) != 1) 8793 if (fwrite(p, STRLEN(p), 1, fd) != 1)
8583 err = TRUE; 8794 err = TRUE;
8584 if (fclose(fd) != 0) 8795 if (fclose(fd) != 0)
8585 err = TRUE; 8796 err = TRUE;
8586 if (err) 8797 if (err)
8588 EMSG(_("E677: Error writing temp file")); 8799 EMSG(_("E677: Error writing temp file"));
8589 goto done; 8800 goto done;
8590 } 8801 }
8591 } 8802 }
8592 8803
8593 res = get_cmd_output(get_vartv_string(&argvars[0]), infile, SHELL_SILENT); 8804 res = get_cmd_output(get_tv_string(&argvars[0]), infile, SHELL_SILENT);
8594 8805
8595 #ifdef USE_CR 8806 #ifdef USE_CR
8596 /* translate <CR> into <NL> */ 8807 /* translate <CR> into <NL> */
8597 if (res != NULL) 8808 if (res != NULL)
8598 { 8809 {
8627 if (infile != NULL) 8838 if (infile != NULL)
8628 { 8839 {
8629 mch_remove(infile); 8840 mch_remove(infile);
8630 vim_free(infile); 8841 vim_free(infile);
8631 } 8842 }
8632 retvar->v_type = VAR_STRING; 8843 rettv->v_type = VAR_STRING;
8633 retvar->vval.v_string = res; 8844 rettv->vval.v_string = res;
8634 } 8845 }
8635 8846
8636 /* 8847 /*
8637 * "submatch()" function 8848 * "submatch()" function
8638 */ 8849 */
8639 static void 8850 static void
8640 f_submatch(argvars, retvar) 8851 f_submatch(argvars, rettv)
8641 typeval *argvars; 8852 typeval *argvars;
8642 typeval *retvar; 8853 typeval *rettv;
8643 { 8854 {
8644 retvar->v_type = VAR_STRING; 8855 rettv->v_type = VAR_STRING;
8645 retvar->vval.v_string = reg_submatch((int)get_vartv_number(&argvars[0])); 8856 rettv->vval.v_string = reg_submatch((int)get_tv_number(&argvars[0]));
8646 } 8857 }
8647 8858
8648 /* 8859 /*
8649 * "substitute()" function 8860 * "substitute()" function
8650 */ 8861 */
8651 static void 8862 static void
8652 f_substitute(argvars, retvar) 8863 f_substitute(argvars, rettv)
8653 typeval *argvars; 8864 typeval *argvars;
8654 typeval *retvar; 8865 typeval *rettv;
8655 { 8866 {
8656 char_u patbuf[NUMBUFLEN]; 8867 char_u patbuf[NUMBUFLEN];
8657 char_u subbuf[NUMBUFLEN]; 8868 char_u subbuf[NUMBUFLEN];
8658 char_u flagsbuf[NUMBUFLEN]; 8869 char_u flagsbuf[NUMBUFLEN];
8659 8870
8660 retvar->v_type = VAR_STRING; 8871 rettv->v_type = VAR_STRING;
8661 retvar->vval.v_string = do_string_sub( 8872 rettv->vval.v_string = do_string_sub(
8662 get_vartv_string(&argvars[0]), 8873 get_tv_string(&argvars[0]),
8663 get_vartv_string_buf(&argvars[1], patbuf), 8874 get_tv_string_buf(&argvars[1], patbuf),
8664 get_vartv_string_buf(&argvars[2], subbuf), 8875 get_tv_string_buf(&argvars[2], subbuf),
8665 get_vartv_string_buf(&argvars[3], flagsbuf)); 8876 get_tv_string_buf(&argvars[3], flagsbuf));
8666 } 8877 }
8667 8878
8668 /* 8879 /*
8669 * "tempname()" function 8880 * "tempname()" function
8670 */ 8881 */
8671 /*ARGSUSED*/ 8882 /*ARGSUSED*/
8672 static void 8883 static void
8673 f_tempname(argvars, retvar) 8884 f_tempname(argvars, rettv)
8674 typeval *argvars; 8885 typeval *argvars;
8675 typeval *retvar; 8886 typeval *rettv;
8676 { 8887 {
8677 static int x = 'A'; 8888 static int x = 'A';
8678 8889
8679 retvar->v_type = VAR_STRING; 8890 rettv->v_type = VAR_STRING;
8680 retvar->vval.v_string = vim_tempname(x); 8891 rettv->vval.v_string = vim_tempname(x);
8681 8892
8682 /* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different 8893 /* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different
8683 * names. Skip 'I' and 'O', they are used for shell redirection. */ 8894 * names. Skip 'I' and 'O', they are used for shell redirection. */
8684 do 8895 do
8685 { 8896 {
8703 8914
8704 /* 8915 /*
8705 * "tolower(string)" function 8916 * "tolower(string)" function
8706 */ 8917 */
8707 static void 8918 static void
8708 f_tolower(argvars, retvar) 8919 f_tolower(argvars, rettv)
8709 typeval *argvars; 8920 typeval *argvars;
8710 typeval *retvar; 8921 typeval *rettv;
8711 { 8922 {
8712 char_u *p; 8923 char_u *p;
8713 8924
8714 p = vim_strsave(get_vartv_string(&argvars[0])); 8925 p = vim_strsave(get_tv_string(&argvars[0]));
8715 retvar->v_type = VAR_STRING; 8926 rettv->v_type = VAR_STRING;
8716 retvar->vval.v_string = p; 8927 rettv->vval.v_string = p;
8717 8928
8718 if (p != NULL) 8929 if (p != NULL)
8719 while (*p != NUL) 8930 while (*p != NUL)
8720 { 8931 {
8721 #ifdef FEAT_MBYTE 8932 #ifdef FEAT_MBYTE
8746 8957
8747 /* 8958 /*
8748 * "toupper(string)" function 8959 * "toupper(string)" function
8749 */ 8960 */
8750 static void 8961 static void
8751 f_toupper(argvars, retvar) 8962 f_toupper(argvars, rettv)
8752 typeval *argvars; 8963 typeval *argvars;
8753 typeval *retvar; 8964 typeval *rettv;
8754 { 8965 {
8755 char_u *p; 8966 char_u *p;
8756 8967
8757 p = vim_strsave(get_vartv_string(&argvars[0])); 8968 p = vim_strsave(get_tv_string(&argvars[0]));
8758 retvar->v_type = VAR_STRING; 8969 rettv->v_type = VAR_STRING;
8759 retvar->vval.v_string = p; 8970 rettv->vval.v_string = p;
8760 8971
8761 if (p != NULL) 8972 if (p != NULL)
8762 while (*p != NUL) 8973 while (*p != NUL)
8763 { 8974 {
8764 #ifdef FEAT_MBYTE 8975 #ifdef FEAT_MBYTE
8789 9000
8790 /* 9001 /*
8791 * "tr(string, fromstr, tostr)" function 9002 * "tr(string, fromstr, tostr)" function
8792 */ 9003 */
8793 static void 9004 static void
8794 f_tr(argvars, retvar) 9005 f_tr(argvars, rettv)
8795 typeval *argvars; 9006 typeval *argvars;
8796 typeval *retvar; 9007 typeval *rettv;
8797 { 9008 {
8798 char_u *instr; 9009 char_u *instr;
8799 char_u *fromstr; 9010 char_u *fromstr;
8800 char_u *tostr; 9011 char_u *tostr;
8801 char_u *p; 9012 char_u *p;
8810 #endif 9021 #endif
8811 char_u buf[NUMBUFLEN]; 9022 char_u buf[NUMBUFLEN];
8812 char_u buf2[NUMBUFLEN]; 9023 char_u buf2[NUMBUFLEN];
8813 garray_T ga; 9024 garray_T ga;
8814 9025
8815 instr = get_vartv_string(&argvars[0]); 9026 instr = get_tv_string(&argvars[0]);
8816 fromstr = get_vartv_string_buf(&argvars[1], buf); 9027 fromstr = get_tv_string_buf(&argvars[1], buf);
8817 tostr = get_vartv_string_buf(&argvars[2], buf2); 9028 tostr = get_tv_string_buf(&argvars[2], buf2);
8818 9029
8819 /* Default return value: empty string. */ 9030 /* Default return value: empty string. */
8820 retvar->v_type = VAR_STRING; 9031 rettv->v_type = VAR_STRING;
8821 retvar->vval.v_string = NULL; 9032 rettv->vval.v_string = NULL;
8822 ga_init2(&ga, (int)sizeof(char), 80); 9033 ga_init2(&ga, (int)sizeof(char), 80);
8823 9034
8824 #ifdef FEAT_MBYTE 9035 #ifdef FEAT_MBYTE
8825 if (!has_mbyte) 9036 if (!has_mbyte)
8826 #endif 9037 #endif
8899 ga_append(&ga, *instr); 9110 ga_append(&ga, *instr);
8900 ++instr; 9111 ++instr;
8901 } 9112 }
8902 } 9113 }
8903 9114
8904 retvar->vval.v_string = ga.ga_data; 9115 rettv->vval.v_string = ga.ga_data;
8905 } 9116 }
8906 9117
8907 /* 9118 /*
8908 * "type(expr)" function 9119 * "type(expr)" function
8909 */ 9120 */
8910 static void 9121 static void
8911 f_type(argvars, retvar) 9122 f_type(argvars, rettv)
8912 typeval *argvars; 9123 typeval *argvars;
8913 typeval *retvar; 9124 typeval *rettv;
8914 { 9125 {
8915 if (argvars[0].v_type == VAR_NUMBER) 9126 if (argvars[0].v_type == VAR_NUMBER)
8916 retvar->vval.v_number = 0; 9127 rettv->vval.v_number = 0;
8917 else 9128 else
8918 retvar->vval.v_number = 1; 9129 rettv->vval.v_number = 1;
8919 } 9130 }
8920 9131
8921 /* 9132 /*
8922 * "virtcol(string)" function 9133 * "virtcol(string)" function
8923 */ 9134 */
8924 static void 9135 static void
8925 f_virtcol(argvars, retvar) 9136 f_virtcol(argvars, rettv)
8926 typeval *argvars; 9137 typeval *argvars;
8927 typeval *retvar; 9138 typeval *rettv;
8928 { 9139 {
8929 colnr_T vcol = 0; 9140 colnr_T vcol = 0;
8930 pos_T *fp; 9141 pos_T *fp;
8931 9142
8932 fp = var2fpos(&argvars[0], FALSE); 9143 fp = var2fpos(&argvars[0], FALSE);
8934 { 9145 {
8935 getvvcol(curwin, fp, NULL, NULL, &vcol); 9146 getvvcol(curwin, fp, NULL, NULL, &vcol);
8936 ++vcol; 9147 ++vcol;
8937 } 9148 }
8938 9149
8939 retvar->vval.v_number = vcol; 9150 rettv->vval.v_number = vcol;
8940 } 9151 }
8941 9152
8942 /* 9153 /*
8943 * "visualmode()" function 9154 * "visualmode()" function
8944 */ 9155 */
8945 /*ARGSUSED*/ 9156 /*ARGSUSED*/
8946 static void 9157 static void
8947 f_visualmode(argvars, retvar) 9158 f_visualmode(argvars, rettv)
8948 typeval *argvars; 9159 typeval *argvars;
8949 typeval *retvar; 9160 typeval *rettv;
8950 { 9161 {
8951 #ifdef FEAT_VISUAL 9162 #ifdef FEAT_VISUAL
8952 char_u str[2]; 9163 char_u str[2];
8953 9164
8954 retvar->v_type = VAR_STRING; 9165 rettv->v_type = VAR_STRING;
8955 str[0] = curbuf->b_visual_mode_eval; 9166 str[0] = curbuf->b_visual_mode_eval;
8956 str[1] = NUL; 9167 str[1] = NUL;
8957 retvar->vval.v_string = vim_strsave(str); 9168 rettv->vval.v_string = vim_strsave(str);
8958 9169
8959 /* A non-zero number or non-empty string argument: reset mode. */ 9170 /* A non-zero number or non-empty string argument: reset mode. */
8960 if ((argvars[0].v_type == VAR_NUMBER 9171 if ((argvars[0].v_type == VAR_NUMBER
8961 && argvars[0].vval.v_number != 0) 9172 && argvars[0].vval.v_number != 0)
8962 || (argvars[0].v_type == VAR_STRING 9173 || (argvars[0].v_type == VAR_STRING
8963 && *get_vartv_string(&argvars[0]) != NUL)) 9174 && *get_tv_string(&argvars[0]) != NUL))
8964 curbuf->b_visual_mode_eval = NUL; 9175 curbuf->b_visual_mode_eval = NUL;
8965 #else 9176 #else
8966 retvar->vval.v_number = 0; /* return anything, it won't work anyway */ 9177 rettv->vval.v_number = 0; /* return anything, it won't work anyway */
8967 #endif 9178 #endif
8968 } 9179 }
8969 9180
8970 /* 9181 /*
8971 * "winbufnr(nr)" function 9182 * "winbufnr(nr)" function
8972 */ 9183 */
8973 static void 9184 static void
8974 f_winbufnr(argvars, retvar) 9185 f_winbufnr(argvars, rettv)
8975 typeval *argvars; 9186 typeval *argvars;
8976 typeval *retvar; 9187 typeval *rettv;
8977 { 9188 {
8978 win_T *wp; 9189 win_T *wp;
8979 9190
8980 wp = find_win_by_nr(&argvars[0]); 9191 wp = find_win_by_nr(&argvars[0]);
8981 if (wp == NULL) 9192 if (wp == NULL)
8982 retvar->vval.v_number = -1; 9193 rettv->vval.v_number = -1;
8983 else 9194 else
8984 retvar->vval.v_number = wp->w_buffer->b_fnum; 9195 rettv->vval.v_number = wp->w_buffer->b_fnum;
8985 } 9196 }
8986 9197
8987 /* 9198 /*
8988 * "wincol()" function 9199 * "wincol()" function
8989 */ 9200 */
8990 /*ARGSUSED*/ 9201 /*ARGSUSED*/
8991 static void 9202 static void
8992 f_wincol(argvars, retvar) 9203 f_wincol(argvars, rettv)
8993 typeval *argvars; 9204 typeval *argvars;
8994 typeval *retvar; 9205 typeval *rettv;
8995 { 9206 {
8996 validate_cursor(); 9207 validate_cursor();
8997 retvar->vval.v_number = curwin->w_wcol + 1; 9208 rettv->vval.v_number = curwin->w_wcol + 1;
8998 } 9209 }
8999 9210
9000 /* 9211 /*
9001 * "winheight(nr)" function 9212 * "winheight(nr)" function
9002 */ 9213 */
9003 static void 9214 static void
9004 f_winheight(argvars, retvar) 9215 f_winheight(argvars, rettv)
9005 typeval *argvars; 9216 typeval *argvars;
9006 typeval *retvar; 9217 typeval *rettv;
9007 { 9218 {
9008 win_T *wp; 9219 win_T *wp;
9009 9220
9010 wp = find_win_by_nr(&argvars[0]); 9221 wp = find_win_by_nr(&argvars[0]);
9011 if (wp == NULL) 9222 if (wp == NULL)
9012 retvar->vval.v_number = -1; 9223 rettv->vval.v_number = -1;
9013 else 9224 else
9014 retvar->vval.v_number = wp->w_height; 9225 rettv->vval.v_number = wp->w_height;
9015 } 9226 }
9016 9227
9017 /* 9228 /*
9018 * "winline()" function 9229 * "winline()" function
9019 */ 9230 */
9020 /*ARGSUSED*/ 9231 /*ARGSUSED*/
9021 static void 9232 static void
9022 f_winline(argvars, retvar) 9233 f_winline(argvars, rettv)
9023 typeval *argvars; 9234 typeval *argvars;
9024 typeval *retvar; 9235 typeval *rettv;
9025 { 9236 {
9026 validate_cursor(); 9237 validate_cursor();
9027 retvar->vval.v_number = curwin->w_wrow + 1; 9238 rettv->vval.v_number = curwin->w_wrow + 1;
9028 } 9239 }
9029 9240
9030 /* 9241 /*
9031 * "winnr()" function 9242 * "winnr()" function
9032 */ 9243 */
9033 /* ARGSUSED */ 9244 /* ARGSUSED */
9034 static void 9245 static void
9035 f_winnr(argvars, retvar) 9246 f_winnr(argvars, rettv)
9036 typeval *argvars; 9247 typeval *argvars;
9037 typeval *retvar; 9248 typeval *rettv;
9038 { 9249 {
9039 int nr = 1; 9250 int nr = 1;
9040 #ifdef FEAT_WINDOWS 9251 #ifdef FEAT_WINDOWS
9041 win_T *wp; 9252 win_T *wp;
9042 win_T *twin = curwin; 9253 win_T *twin = curwin;
9043 char_u *arg; 9254 char_u *arg;
9044 9255
9045 if (argvars[0].v_type != VAR_UNKNOWN) 9256 if (argvars[0].v_type != VAR_UNKNOWN)
9046 { 9257 {
9047 arg = get_vartv_string(&argvars[0]); 9258 arg = get_tv_string(&argvars[0]);
9048 if (STRCMP(arg, "$") == 0) 9259 if (STRCMP(arg, "$") == 0)
9049 twin = lastwin; 9260 twin = lastwin;
9050 else if (STRCMP(arg, "#") == 0) 9261 else if (STRCMP(arg, "#") == 0)
9051 { 9262 {
9052 twin = prevwin; 9263 twin = prevwin;
9062 9273
9063 if (nr > 0) 9274 if (nr > 0)
9064 for (wp = firstwin; wp != twin; wp = wp->w_next) 9275 for (wp = firstwin; wp != twin; wp = wp->w_next)
9065 ++nr; 9276 ++nr;
9066 #endif 9277 #endif
9067 retvar->vval.v_number = nr; 9278 rettv->vval.v_number = nr;
9068 } 9279 }
9069 9280
9070 /* 9281 /*
9071 * "winrestcmd()" function 9282 * "winrestcmd()" function
9072 */ 9283 */
9073 /* ARGSUSED */ 9284 /* ARGSUSED */
9074 static void 9285 static void
9075 f_winrestcmd(argvars, retvar) 9286 f_winrestcmd(argvars, rettv)
9076 typeval *argvars; 9287 typeval *argvars;
9077 typeval *retvar; 9288 typeval *rettv;
9078 { 9289 {
9079 #ifdef FEAT_WINDOWS 9290 #ifdef FEAT_WINDOWS
9080 win_T *wp; 9291 win_T *wp;
9081 int winnr = 1; 9292 int winnr = 1;
9082 garray_T ga; 9293 garray_T ga;
9093 # endif 9304 # endif
9094 ++winnr; 9305 ++winnr;
9095 } 9306 }
9096 ga_append(&ga, NUL); 9307 ga_append(&ga, NUL);
9097 9308
9098 retvar->vval.v_string = ga.ga_data; 9309 rettv->vval.v_string = ga.ga_data;
9099 #else 9310 #else
9100 retvar->vval.v_string = NULL; 9311 rettv->vval.v_string = NULL;
9101 #endif 9312 #endif
9102 retvar->v_type = VAR_STRING; 9313 rettv->v_type = VAR_STRING;
9103 } 9314 }
9104 9315
9105 /* 9316 /*
9106 * "winwidth(nr)" function 9317 * "winwidth(nr)" function
9107 */ 9318 */
9108 static void 9319 static void
9109 f_winwidth(argvars, retvar) 9320 f_winwidth(argvars, rettv)
9110 typeval *argvars; 9321 typeval *argvars;
9111 typeval *retvar; 9322 typeval *rettv;
9112 { 9323 {
9113 win_T *wp; 9324 win_T *wp;
9114 9325
9115 wp = find_win_by_nr(&argvars[0]); 9326 wp = find_win_by_nr(&argvars[0]);
9116 if (wp == NULL) 9327 if (wp == NULL)
9117 retvar->vval.v_number = -1; 9328 rettv->vval.v_number = -1;
9118 else 9329 else
9119 #ifdef FEAT_VERTSPLIT 9330 #ifdef FEAT_VERTSPLIT
9120 retvar->vval.v_number = wp->w_width; 9331 rettv->vval.v_number = wp->w_width;
9121 #else 9332 #else
9122 retvar->vval.v_number = Columns; 9333 rettv->vval.v_number = Columns;
9123 #endif 9334 #endif
9124 } 9335 }
9125 9336
9126 static win_T * 9337 static win_T *
9127 find_win_by_nr(vp) 9338 find_win_by_nr(vp)
9130 #ifdef FEAT_WINDOWS 9341 #ifdef FEAT_WINDOWS
9131 win_T *wp; 9342 win_T *wp;
9132 #endif 9343 #endif
9133 int nr; 9344 int nr;
9134 9345
9135 nr = get_vartv_number(vp); 9346 nr = get_tv_number(vp);
9136 9347
9137 #ifdef FEAT_WINDOWS 9348 #ifdef FEAT_WINDOWS
9138 if (nr == 0) 9349 if (nr == 0)
9139 return curwin; 9350 return curwin;
9140 9351
9159 { 9370 {
9160 char_u *name; 9371 char_u *name;
9161 static pos_T pos; 9372 static pos_T pos;
9162 pos_T *pp; 9373 pos_T *pp;
9163 9374
9164 name = get_vartv_string(varp); 9375 name = get_tv_string(varp);
9165 if (name[0] == '.') /* cursor */ 9376 if (name[0] == '.') /* cursor */
9166 return &curwin->w_cursor; 9377 return &curwin->w_cursor;
9167 if (name[0] == '\'') /* mark */ 9378 if (name[0] == '\'') /* mark */
9168 { 9379 {
9169 pp = getmark(name[1], FALSE); 9380 pp = getmark(name[1], FALSE);
9246 char_u **arg; 9457 char_u **arg;
9247 char_u **alias; 9458 char_u **alias;
9248 int evaluate; 9459 int evaluate;
9249 { 9460 {
9250 int len; 9461 int len;
9251 #ifdef FEAT_MAGIC_BRACES
9252 char_u *p; 9462 char_u *p;
9253 char_u *expr_start; 9463 char_u *expr_start;
9254 char_u *expr_end; 9464 char_u *expr_end;
9255 #endif
9256 9465
9257 *alias = NULL; /* default to no alias */ 9466 *alias = NULL; /* default to no alias */
9258 9467
9259 if ((*arg)[0] == K_SPECIAL && (*arg)[1] == KS_EXTRA 9468 if ((*arg)[0] == K_SPECIAL && (*arg)[1] == KS_EXTRA
9260 && (*arg)[2] == (int)KE_SNR) 9469 && (*arg)[2] == (int)KE_SNR)
9268 { 9477 {
9269 /* literal "<SID>", "s:" or "<SNR>" */ 9478 /* literal "<SID>", "s:" or "<SNR>" */
9270 *arg += len; 9479 *arg += len;
9271 } 9480 }
9272 9481
9273 #ifdef FEAT_MAGIC_BRACES
9274 /* 9482 /*
9275 * Find the end of the name; 9483 * Find the end of the name; check for {} construction.
9276 */ 9484 */
9277 p = find_name_end(*arg, &expr_start, &expr_end); 9485 p = find_name_end(*arg, &expr_start, &expr_end, FALSE);
9278 /* check for {} construction */
9279 if (expr_start != NULL) 9486 if (expr_start != NULL)
9280 { 9487 {
9281 char_u *temp_string; 9488 char_u *temp_string;
9282 9489
9283 if (!evaluate) 9490 if (!evaluate)
9296 return 0; 9503 return 0;
9297 *alias = temp_string; 9504 *alias = temp_string;
9298 *arg = skipwhite(p); 9505 *arg = skipwhite(p);
9299 return (int)STRLEN(temp_string); 9506 return (int)STRLEN(temp_string);
9300 } 9507 }
9301 #endif
9302 9508
9303 len += get_id_len(arg); 9509 len += get_id_len(arg);
9304 if (len == 0) 9510 if (len == 0)
9305 EMSG2(_(e_invexpr2), *arg); 9511 EMSG2(_(e_invexpr2), *arg);
9306 9512
9307 return len; 9513 return len;
9308 } 9514 }
9309 9515
9516 /*
9517 * Find the end of a variable or function name, taking care of magic braces.
9518 * If "expr_start" is not NULL then "expr_start" and "expr_end" are set to the
9519 * start and end of the first magic braces item.
9520 * Return a pointer to just after the name. Equal to "arg" if there is no
9521 * valid name.
9522 */
9310 static char_u * 9523 static char_u *
9311 find_name_end(arg, expr_start, expr_end) 9524 find_name_end(arg, expr_start, expr_end, incl_br)
9312 char_u *arg; 9525 char_u *arg;
9313 char_u **expr_start; 9526 char_u **expr_start;
9314 char_u **expr_end; 9527 char_u **expr_end;
9315 { 9528 int incl_br; /* Include [] indexes */
9316 int nesting = 0; 9529 {
9530 int mb_nest = 0;
9531 int br_nest = 0;
9317 char_u *p; 9532 char_u *p;
9318 9533
9319 *expr_start = NULL; 9534 if (expr_start != NULL)
9320 *expr_end = NULL; 9535 {
9321 9536 *expr_start = NULL;
9322 for (p = arg; (*p != NUL && (eval_isnamec(*p) || nesting != 0)); ++p) 9537 *expr_end = NULL;
9323 { 9538 }
9324 #ifdef FEAT_MAGIC_BRACES 9539
9325 if (*p == '{') 9540 for (p = arg; *p != NUL
9326 { 9541 && (eval_isnamec(*p)
9327 nesting++; 9542 || (*p == '[' && incl_br)
9328 if (*expr_start == NULL) 9543 || mb_nest != 0
9329 *expr_start = p; 9544 || br_nest != 0); ++p)
9330 } 9545 {
9331 else if (*p == '}') 9546 if (mb_nest == 0)
9332 { 9547 {
9333 nesting--; 9548 if (*p == '[')
9334 if (nesting == 0 && *expr_end == NULL) 9549 ++br_nest;
9335 *expr_end = p; 9550 else if (*p == ']')
9336 } 9551 --br_nest;
9337 #endif 9552 }
9553 if (br_nest == 0)
9554 {
9555 if (*p == '{')
9556 {
9557 mb_nest++;
9558 if (expr_start != NULL && *expr_start == NULL)
9559 *expr_start = p;
9560 }
9561 else if (*p == '}')
9562 {
9563 mb_nest--;
9564 if (expr_start != NULL && mb_nest == 0 && *expr_end == NULL)
9565 *expr_end = p;
9566 }
9567 }
9338 } 9568 }
9339 9569
9340 return p; 9570 return p;
9341 } 9571 }
9342 9572
9345 */ 9575 */
9346 static int 9576 static int
9347 eval_isnamec(c) 9577 eval_isnamec(c)
9348 int c; 9578 int c;
9349 { 9579 {
9350 return (ASCII_ISALNUM(c) || c == '_' || c == ':' 9580 return (ASCII_ISALNUM(c) || c == '_' || c == ':' || c == '{' || c == '}');
9351 #ifdef FEAT_MAGIC_BRACES
9352 || c == '{' || c == '}'
9353 #endif
9354 );
9355 } 9581 }
9356 9582
9357 /* 9583 /*
9358 * Find a v: variable. 9584 * Find a v: variable.
9359 * Return it's index, or -1 if not found. 9585 * Return it's index, or -1 if not found.
9554 /* 9780 /*
9555 * Get the value of internal variable "name". 9781 * Get the value of internal variable "name".
9556 * Return OK or FAIL. 9782 * Return OK or FAIL.
9557 */ 9783 */
9558 static int 9784 static int
9559 get_var_vartv(name, len, retvar) 9785 get_var_tv(name, len, rettv)
9560 char_u *name; 9786 char_u *name;
9561 int len; /* length of "name" */ 9787 int len; /* length of "name" */
9562 typeval *retvar; /* NULL when only checking existence */ 9788 typeval *rettv; /* NULL when only checking existence */
9563 { 9789 {
9564 int ret = OK; 9790 int ret = OK;
9565 typeval tv; 9791 typeval tv;
9566 VAR v; 9792 VAR v;
9567 int cc; 9793 int cc;
9604 tv = v->tv; 9830 tv = v->tv;
9605 } 9831 }
9606 9832
9607 if (tv.v_type == VAR_UNKNOWN) 9833 if (tv.v_type == VAR_UNKNOWN)
9608 { 9834 {
9609 if (retvar != NULL) 9835 if (rettv != NULL)
9610 EMSG2(_("E121: Undefined variable: %s"), name); 9836 EMSG2(_(e_undefvar), name);
9611 ret = FAIL; 9837 ret = FAIL;
9612 } 9838 }
9613 else if (retvar != NULL) 9839 else if (rettv != NULL)
9614 copy_vartv(&tv, retvar); 9840 copy_tv(&tv, rettv);
9615 9841
9616 name[len] = cc; 9842 name[len] = cc;
9617 9843
9618 return ret; 9844 return ret;
9619 }
9620
9621 /*
9622 * Allocate memory for a variable, and make it emtpy (0 or NULL value).
9623 */
9624 static VAR
9625 alloc_var()
9626 {
9627 return (VAR)alloc_clear((unsigned)sizeof(var));
9628 } 9845 }
9629 9846
9630 /* 9847 /*
9631 * Allocate memory for a variable type-value, and make it emtpy (0 or NULL 9848 * Allocate memory for a variable type-value, and make it emtpy (0 or NULL
9632 * value). 9849 * value).
9633 */ 9850 */
9634 static typeval * 9851 static typeval *
9635 alloc_vartv() 9852 alloc_tv()
9636 { 9853 {
9637 return (typeval *)alloc_clear((unsigned)sizeof(typeval)); 9854 return (typeval *)alloc_clear((unsigned)sizeof(typeval));
9638 } 9855 }
9639 9856
9640 /* 9857 /*
9641 * Allocate memory for a variable type-value, and assign a string to it. 9858 * Allocate memory for a variable type-value, and assign a string to it.
9642 * The string "s" must have been allocated, it is consumed. 9859 * The string "s" must have been allocated, it is consumed.
9643 * Return NULL for out of memory, the variable otherwise. 9860 * Return NULL for out of memory, the variable otherwise.
9644 */ 9861 */
9645 static typeval * 9862 static typeval *
9646 alloc_string_vartv(s) 9863 alloc_string_tv(s)
9647 char_u *s; 9864 char_u *s;
9648 { 9865 {
9649 typeval *retvar; 9866 typeval *rettv;
9650 9867
9651 retvar = alloc_vartv(); 9868 rettv = alloc_tv();
9652 if (retvar != NULL) 9869 if (rettv != NULL)
9653 { 9870 {
9654 retvar->v_type = VAR_STRING; 9871 rettv->v_type = VAR_STRING;
9655 retvar->vval.v_string = s; 9872 rettv->vval.v_string = s;
9656 } 9873 }
9657 else 9874 else
9658 vim_free(s); 9875 vim_free(s);
9659 return retvar; 9876 return rettv;
9660 } 9877 }
9661 9878
9662 /* 9879 /*
9663 * Free the memory for a variable type-value. 9880 * Free the memory for a variable type-value.
9664 */ 9881 */
9665 static void 9882 static void
9666 free_vartv(varp) 9883 free_tv(varp)
9667 typeval *varp; 9884 typeval *varp;
9668 { 9885 {
9669 if (varp != NULL) 9886 if (varp != NULL)
9670 { 9887 {
9671 switch (varp->v_type) 9888 switch (varp->v_type)
9686 9903
9687 /* 9904 /*
9688 * Free the memory for a variable value and set the value to NULL or 0. 9905 * Free the memory for a variable value and set the value to NULL or 0.
9689 */ 9906 */
9690 static void 9907 static void
9691 clear_vartv(varp) 9908 clear_tv(varp)
9692 typeval *varp; 9909 typeval *varp;
9693 { 9910 {
9694 if (varp != NULL) 9911 if (varp != NULL)
9695 { 9912 {
9696 switch (varp->v_type) 9913 switch (varp->v_type)
9701 varp->vval.v_string = NULL; 9918 varp->vval.v_string = NULL;
9702 break; 9919 break;
9703 case VAR_LIST: 9920 case VAR_LIST:
9704 list_unref(varp->vval.v_list); 9921 list_unref(varp->vval.v_list);
9705 break; 9922 break;
9706 default: 9923 case VAR_NUMBER:
9707 varp->vval.v_number = 0; 9924 varp->vval.v_number = 0;
9708 break; 9925 break;
9709 } 9926 case VAR_UNKNOWN:
9710 } 9927 break;
9928 default:
9929 EMSG2(_(e_intern2), "clear_tv()");
9930 }
9931 }
9932 }
9933
9934 /*
9935 * Set the value of a variable to NULL without freeing items.
9936 */
9937 static void
9938 init_tv(varp)
9939 typeval *varp;
9940 {
9941 if (varp != NULL)
9942 vim_memset(varp, 0, sizeof(typeval));
9711 } 9943 }
9712 9944
9713 /* 9945 /*
9714 * Get the number value of a variable. 9946 * Get the number value of a variable.
9715 * If it is a String variable, uses vim_str2nr(). 9947 * If it is a String variable, uses vim_str2nr().
9716 */ 9948 */
9717 static long 9949 static long
9718 get_vartv_number(varp) 9950 get_tv_number(varp)
9719 typeval *varp; 9951 typeval *varp;
9720 { 9952 {
9721 long n = 0L; 9953 long n = 0L;
9722 9954
9723 switch (varp->v_type) 9955 switch (varp->v_type)
9741 9973
9742 /* 9974 /*
9743 * Get the lnum from the first argument. Also accepts ".", "$", etc. 9975 * Get the lnum from the first argument. Also accepts ".", "$", etc.
9744 */ 9976 */
9745 static linenr_T 9977 static linenr_T
9746 get_vartv_lnum(argvars) 9978 get_tv_lnum(argvars)
9747 typeval *argvars; 9979 typeval *argvars;
9748 { 9980 {
9749 typeval retvar; 9981 typeval rettv;
9750 linenr_T lnum; 9982 linenr_T lnum;
9751 9983
9752 lnum = get_vartv_number(&argvars[0]); 9984 lnum = get_tv_number(&argvars[0]);
9753 if (lnum == 0) /* no valid number, try using line() */ 9985 if (lnum == 0) /* no valid number, try using line() */
9754 { 9986 {
9755 retvar.v_type = VAR_NUMBER; 9987 rettv.v_type = VAR_NUMBER;
9756 f_line(argvars, &retvar); 9988 f_line(argvars, &rettv);
9757 lnum = retvar.vval.v_number; 9989 lnum = rettv.vval.v_number;
9758 clear_vartv(&retvar); 9990 clear_tv(&rettv);
9759 } 9991 }
9760 return lnum; 9992 return lnum;
9761 } 9993 }
9762 9994
9763 /* 9995 /*
9767 * get_var_string_buf() uses a given buffer. 9999 * get_var_string_buf() uses a given buffer.
9768 * If the String variable has never been set, return an empty string. 10000 * If the String variable has never been set, return an empty string.
9769 * Never returns NULL; 10001 * Never returns NULL;
9770 */ 10002 */
9771 static char_u * 10003 static char_u *
9772 get_vartv_string(varp) 10004 get_tv_string(varp)
9773 typeval *varp; 10005 typeval *varp;
9774 { 10006 {
9775 static char_u mybuf[NUMBUFLEN]; 10007 static char_u mybuf[NUMBUFLEN];
9776 10008
9777 return get_vartv_string_buf(varp, mybuf); 10009 return get_tv_string_buf(varp, mybuf);
9778 } 10010 }
9779 10011
9780 static char_u * 10012 static char_u *
9781 get_vartv_string_buf(varp, buf) 10013 get_tv_string_buf(varp, buf)
9782 typeval *varp; 10014 typeval *varp;
9783 char_u *buf; 10015 char_u *buf;
9784 { 10016 {
9785 switch (varp->v_type) 10017 switch (varp->v_type)
9786 { 10018 {
9796 case VAR_STRING: 10028 case VAR_STRING:
9797 if (varp->vval.v_string != NULL) 10029 if (varp->vval.v_string != NULL)
9798 return varp->vval.v_string; 10030 return varp->vval.v_string;
9799 break; 10031 break;
9800 default: 10032 default:
9801 EMSG(_("E999: Internal error: get_vartv_string_buf()")); 10033 EMSG2(_(e_intern2), "get_tv_string_buf()");
9802 break; 10034 break;
9803 } 10035 }
9804 return (char_u *)""; 10036 return (char_u *)"";
9805 } 10037 }
9806 10038
9969 clear_var(v) 10201 clear_var(v)
9970 VAR v; 10202 VAR v;
9971 { 10203 {
9972 vim_free(v->v_name); 10204 vim_free(v->v_name);
9973 v->v_name = NULL; 10205 v->v_name = NULL;
9974 clear_vartv(&v->tv); 10206 clear_tv(&v->tv);
9975 } 10207 }
9976 10208
9977 /* 10209 /*
9978 * List the value of one internal variable. 10210 * List the value of one internal variable.
9979 */ 10211 */
10044 if (type == VAR_FUNC) 10276 if (type == VAR_FUNC)
10045 msg_puts((char_u *)"()"); 10277 msg_puts((char_u *)"()");
10046 } 10278 }
10047 10279
10048 /* 10280 /*
10049 * Set variable "name" to value in "varp". 10281 * Set variable "name" to value in "tv".
10050 * If the variable already exists, the value is updated. 10282 * If the variable already exists, the value is updated.
10051 * Otherwise the variable is created. 10283 * Otherwise the variable is created.
10052 */ 10284 */
10053 static void 10285 static void
10054 set_var(name, varp, copy) 10286 set_var(name, tv, copy)
10055 char_u *name; 10287 char_u *name;
10056 typeval *varp; 10288 typeval *tv;
10057 int copy; /* make copy of value in "varp" */ 10289 int copy; /* make copy of value in "tv" */
10058 { 10290 {
10059 int i; 10291 int i;
10060 VAR v; 10292 VAR v;
10061 char_u *varname; 10293 char_u *varname;
10062 garray_T *gap; 10294 garray_T *gap;
10074 else 10306 else
10075 { 10307 {
10076 if (vimvars[i].type == VAR_STRING) 10308 if (vimvars[i].type == VAR_STRING)
10077 { 10309 {
10078 vim_free(vimvars[i].val); 10310 vim_free(vimvars[i].val);
10079 if (copy || varp->v_type != VAR_STRING) 10311 if (copy || tv->v_type != VAR_STRING)
10080 vimvars[i].val = vim_strsave(get_vartv_string(varp)); 10312 vimvars[i].val = vim_strsave(get_tv_string(tv));
10081 else 10313 else
10082 { 10314 {
10083 /* Take over the string to avoid an extra alloc/free. */ 10315 /* Take over the string to avoid an extra alloc/free. */
10084 vimvars[i].val = varp->vval.v_string; 10316 vimvars[i].val = tv->vval.v_string;
10085 varp->vval.v_string = NULL; 10317 tv->vval.v_string = NULL;
10086 } 10318 }
10087 } 10319 }
10088 else 10320 else
10089 vimvars[i].val = (char_u *)get_vartv_number(varp); 10321 vimvars[i].val = (char_u *)get_tv_number(tv);
10090 } 10322 }
10091 return; 10323 return;
10092 } 10324 }
10093 10325
10094 if (varp->v_type == VAR_FUNC) 10326 if (tv->v_type == VAR_FUNC)
10095 { 10327 {
10096 if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':') 10328 if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':')
10097 && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':') 10329 && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
10098 ? name[2] : name[0])) 10330 ? name[2] : name[0]))
10099 { 10331 {
10108 } 10340 }
10109 10341
10110 v = find_var(name, TRUE); 10342 v = find_var(name, TRUE);
10111 if (v != NULL) /* existing variable, only need to free string */ 10343 if (v != NULL) /* existing variable, only need to free string */
10112 { 10344 {
10113 if (v->tv.v_type != varp->v_type 10345 if (v->tv.v_type != tv->v_type
10114 && !((v->tv.v_type == VAR_STRING 10346 && !((v->tv.v_type == VAR_STRING
10115 || v->tv.v_type == VAR_NUMBER) 10347 || v->tv.v_type == VAR_NUMBER)
10116 && (varp->v_type == VAR_STRING 10348 && (tv->v_type == VAR_STRING
10117 || varp->v_type == VAR_NUMBER))) 10349 || tv->v_type == VAR_NUMBER)))
10118 { 10350 {
10119 EMSG2(_("E999: Variable type mismatch for: %s"), name); 10351 EMSG2(_("E999: Variable type mismatch for: %s"), name);
10120 return; 10352 return;
10121 } 10353 }
10122 if (v->tv.v_type == VAR_STRING || v->tv.v_type == VAR_FUNC) 10354 clear_tv(&v->tv);
10123 vim_free(v->tv.vval.v_string);
10124 } 10355 }
10125 else /* add a new variable */ 10356 else /* add a new variable */
10126 { 10357 {
10127 gap = find_var_ga(name, &varname); 10358 gap = find_var_ga(name, &varname);
10128 if (gap == NULL) /* illegal name */ 10359 if (gap == NULL) /* illegal name */
10145 if ((v->v_name = vim_strsave(varname)) == NULL) 10376 if ((v->v_name = vim_strsave(varname)) == NULL)
10146 return; 10377 return;
10147 if (i == gap->ga_len) 10378 if (i == gap->ga_len)
10148 ++gap->ga_len; 10379 ++gap->ga_len;
10149 } 10380 }
10150 if (copy || (varp->v_type != VAR_STRING && varp->v_type != VAR_FUNC)) 10381 if (copy || tv->v_type == VAR_NUMBER)
10151 copy_vartv(varp, &v->tv); 10382 copy_tv(tv, &v->tv);
10152 else 10383 else
10153 { 10384 {
10154 v->tv.v_type = varp->v_type; 10385 v->tv = *tv;
10155 v->tv.vval.v_string = varp->vval.v_string; 10386 init_tv(tv);
10156 varp->vval.v_string = NULL;
10157 } 10387 }
10158 } 10388 }
10159 10389
10160 /* 10390 /*
10161 * Copy the values from typeval "from" to typeval "to". 10391 * Copy the values from typeval "from" to typeval "to".
10162 * When needed allocates string or increases reference count. 10392 * When needed allocates string or increases reference count.
10163 * Does not make a copy of a list! 10393 * Does not make a copy of a list!
10164 */ 10394 */
10165 static void 10395 static void
10166 copy_vartv(from, to) 10396 copy_tv(from, to)
10167 typeval *from; 10397 typeval *from;
10168 typeval *to; 10398 typeval *to;
10169 { 10399 {
10170 to->v_type = from->v_type; 10400 to->v_type = from->v_type;
10171 switch (from->v_type) 10401 switch (from->v_type)
10188 to->vval.v_list = from->vval.v_list; 10418 to->vval.v_list = from->vval.v_list;
10189 ++to->vval.v_list->lv_refcount; 10419 ++to->vval.v_list->lv_refcount;
10190 } 10420 }
10191 break; 10421 break;
10192 default: 10422 default:
10193 EMSG(_("E999: Internal error: copy_vartv()")); 10423 EMSG2(_(e_intern2), "copy_tv()");
10194 break; 10424 break;
10195 } 10425 }
10196 } 10426 }
10197 10427
10198 /* 10428 /*
10203 void 10433 void
10204 ex_echo(eap) 10434 ex_echo(eap)
10205 exarg_T *eap; 10435 exarg_T *eap;
10206 { 10436 {
10207 char_u *arg = eap->arg; 10437 char_u *arg = eap->arg;
10208 typeval retvar; 10438 typeval rettv;
10209 char_u *tofree; 10439 char_u *tofree;
10210 char_u *p; 10440 char_u *p;
10211 int needclr = TRUE; 10441 int needclr = TRUE;
10212 int atstart = TRUE; 10442 int atstart = TRUE;
10213 10443
10214 if (eap->skip) 10444 if (eap->skip)
10215 ++emsg_skip; 10445 ++emsg_skip;
10216 while (*arg != NUL && *arg != '|' && *arg != '\n' && !got_int) 10446 while (*arg != NUL && *arg != '|' && *arg != '\n' && !got_int)
10217 { 10447 {
10218 p = arg; 10448 p = arg;
10219 if (eval1(&arg, &retvar, !eap->skip) == FAIL) 10449 if (eval1(&arg, &rettv, !eap->skip) == FAIL)
10220 { 10450 {
10221 /* 10451 /*
10222 * Report the invalid expression unless the expression evaluation 10452 * Report the invalid expression unless the expression evaluation
10223 * has been cancelled due to an aborting error, an interrupt, or an 10453 * has been cancelled due to an aborting error, an interrupt, or an
10224 * exception. 10454 * exception.
10237 if (eap->cmdidx == CMD_echo) 10467 if (eap->cmdidx == CMD_echo)
10238 msg_start(); 10468 msg_start();
10239 } 10469 }
10240 else if (eap->cmdidx == CMD_echo) 10470 else if (eap->cmdidx == CMD_echo)
10241 msg_puts_attr((char_u *)" ", echo_attr); 10471 msg_puts_attr((char_u *)" ", echo_attr);
10242 for (p = tv2string(&retvar, &tofree); *p != NUL && !got_int; ++p) 10472 for (p = tv2string(&rettv, &tofree); *p != NUL && !got_int; ++p)
10243 if (*p == '\n' || *p == '\r' || *p == TAB) 10473 if (*p == '\n' || *p == '\r' || *p == TAB)
10244 { 10474 {
10245 if (*p != TAB && needclr) 10475 if (*p != TAB && needclr)
10246 { 10476 {
10247 /* remove any text still there from the command */ 10477 /* remove any text still there from the command */
10264 #endif 10494 #endif
10265 (void)msg_outtrans_len_attr(p, 1, echo_attr); 10495 (void)msg_outtrans_len_attr(p, 1, echo_attr);
10266 } 10496 }
10267 vim_free(tofree); 10497 vim_free(tofree);
10268 } 10498 }
10269 clear_vartv(&retvar); 10499 clear_tv(&rettv);
10270 arg = skipwhite(arg); 10500 arg = skipwhite(arg);
10271 } 10501 }
10272 eap->nextcmd = check_nextcmd(arg); 10502 eap->nextcmd = check_nextcmd(arg);
10273 10503
10274 if (eap->skip) 10504 if (eap->skip)
10309 void 10539 void
10310 ex_execute(eap) 10540 ex_execute(eap)
10311 exarg_T *eap; 10541 exarg_T *eap;
10312 { 10542 {
10313 char_u *arg = eap->arg; 10543 char_u *arg = eap->arg;
10314 typeval retvar; 10544 typeval rettv;
10315 int ret = OK; 10545 int ret = OK;
10316 char_u *p; 10546 char_u *p;
10317 garray_T ga; 10547 garray_T ga;
10318 int len; 10548 int len;
10319 int save_did_emsg; 10549 int save_did_emsg;
10323 if (eap->skip) 10553 if (eap->skip)
10324 ++emsg_skip; 10554 ++emsg_skip;
10325 while (*arg != NUL && *arg != '|' && *arg != '\n') 10555 while (*arg != NUL && *arg != '|' && *arg != '\n')
10326 { 10556 {
10327 p = arg; 10557 p = arg;
10328 if (eval1(&arg, &retvar, !eap->skip) == FAIL) 10558 if (eval1(&arg, &rettv, !eap->skip) == FAIL)
10329 { 10559 {
10330 /* 10560 /*
10331 * Report the invalid expression unless the expression evaluation 10561 * Report the invalid expression unless the expression evaluation
10332 * has been cancelled due to an aborting error, an interrupt, or an 10562 * has been cancelled due to an aborting error, an interrupt, or an
10333 * exception. 10563 * exception.
10338 break; 10568 break;
10339 } 10569 }
10340 10570
10341 if (!eap->skip) 10571 if (!eap->skip)
10342 { 10572 {
10343 p = get_vartv_string(&retvar); 10573 p = get_tv_string(&rettv);
10344 len = (int)STRLEN(p); 10574 len = (int)STRLEN(p);
10345 if (ga_grow(&ga, len + 2) == FAIL) 10575 if (ga_grow(&ga, len + 2) == FAIL)
10346 { 10576 {
10347 clear_vartv(&retvar); 10577 clear_tv(&rettv);
10348 ret = FAIL; 10578 ret = FAIL;
10349 break; 10579 break;
10350 } 10580 }
10351 if (ga.ga_len) 10581 if (ga.ga_len)
10352 ((char_u *)(ga.ga_data))[ga.ga_len++] = ' '; 10582 ((char_u *)(ga.ga_data))[ga.ga_len++] = ' ';
10353 STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p); 10583 STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p);
10354 ga.ga_len += len; 10584 ga.ga_len += len;
10355 } 10585 }
10356 10586
10357 clear_vartv(&retvar); 10587 clear_tv(&rettv);
10358 arg = skipwhite(arg); 10588 arg = skipwhite(arg);
10359 } 10589 }
10360 10590
10361 if (ret != FAIL && ga.ga_data != NULL) 10591 if (ret != FAIL && ga.ga_data != NULL)
10362 { 10592 {
10430 exarg_T *eap; 10660 exarg_T *eap;
10431 { 10661 {
10432 char_u *theline; 10662 char_u *theline;
10433 int j; 10663 int j;
10434 int c; 10664 int c;
10435 #ifdef FEAT_MAGIC_BRACES
10436 int saved_did_emsg; 10665 int saved_did_emsg;
10437 #endif
10438 char_u *name = NULL; 10666 char_u *name = NULL;
10439 char_u *p; 10667 char_u *p;
10440 char_u *arg; 10668 char_u *arg;
10441 garray_T newargs; 10669 garray_T newargs;
10442 garray_T newlines; 10670 garray_T newlines;
10474 if (!aborting()) 10702 if (!aborting())
10475 return; 10703 return;
10476 else 10704 else
10477 eap->skip = TRUE; 10705 eap->skip = TRUE;
10478 } 10706 }
10479 #ifdef FEAT_MAGIC_BRACES
10480 /* An error in a function call during evaluation of an expression in magic 10707 /* An error in a function call during evaluation of an expression in magic
10481 * braces should not cause the function not to be defined. */ 10708 * braces should not cause the function not to be defined. */
10482 saved_did_emsg = did_emsg; 10709 saved_did_emsg = did_emsg;
10483 did_emsg = FALSE; 10710 did_emsg = FALSE;
10484 #endif
10485 10711
10486 /* 10712 /*
10487 * ":function func" with only function name: list function. 10713 * ":function func" with only function name: list function.
10488 */ 10714 */
10489 if (vim_strchr(p, '(') == NULL) 10715 if (vim_strchr(p, '(') == NULL)
10782 fp->lines = newlines; 11008 fp->lines = newlines;
10783 fp->varargs = varargs; 11009 fp->varargs = varargs;
10784 fp->flags = flags; 11010 fp->flags = flags;
10785 fp->calls = 0; 11011 fp->calls = 0;
10786 fp->script_ID = current_SID; 11012 fp->script_ID = current_SID;
10787 #ifdef FEAT_MAGIC_BRACES
10788 did_emsg |= saved_did_emsg; 11013 did_emsg |= saved_did_emsg;
10789 #endif
10790 vim_free(skip_until); 11014 vim_free(skip_until);
10791 return; 11015 return;
10792 11016
10793 erret: 11017 erret:
10794 vim_free(skip_until); 11018 vim_free(skip_until);
10795 ga_clear_strings(&newargs); 11019 ga_clear_strings(&newargs);
10796 ga_clear_strings(&newlines); 11020 ga_clear_strings(&newlines);
10797 erret_name: 11021 erret_name:
10798 vim_free(name); 11022 vim_free(name);
10799 #ifdef FEAT_MAGIC_BRACES
10800 did_emsg |= saved_did_emsg; 11023 did_emsg |= saved_did_emsg;
10801 #endif
10802 } 11024 }
10803 11025
10804 /* 11026 /*
10805 * Get a function name, translating "<SID>" and "<SNR>". 11027 * Get a function name, translating "<SID>" and "<SNR>".
10806 * Returns the function name in allocated memory, or NULL for failure. 11028 * Returns the function name in allocated memory, or NULL for failure.
10824 /* A name starting with "<SID>" or "<SNR>" is local to a script. */ 11046 /* A name starting with "<SID>" or "<SNR>" is local to a script. */
10825 start = *pp; 11047 start = *pp;
10826 lead = eval_fname_script(start); 11048 lead = eval_fname_script(start);
10827 if (lead > 0) 11049 if (lead > 0)
10828 start += lead; 11050 start += lead;
10829 end = find_name_end(start, &expr_start, &expr_end); 11051 end = find_name_end(start, &expr_start, &expr_end, FALSE);
10830 if (end == start) 11052 if (end == start)
10831 { 11053 {
10832 if (!skip) 11054 if (!skip)
10833 EMSG(_("E129: Function name required")); 11055 EMSG(_("E129: Function name required"));
10834 return NULL; 11056 return NULL;
10835 } 11057 }
10836 #ifdef FEAT_MAGIC_BRACES
10837 if (expr_start != NULL && !skip) 11058 if (expr_start != NULL && !skip)
10838 { 11059 {
10839 /* expand magic curlies */ 11060 /* expand magic curlies */
10840 temp_string = make_expanded_name(start, expr_start, expr_end, end); 11061 temp_string = make_expanded_name(start, expr_start, expr_end, end);
10841 if (temp_string == NULL) 11062 if (temp_string == NULL)
10853 } 11074 }
10854 start = temp_string; 11075 start = temp_string;
10855 len = (int)STRLEN(temp_string); 11076 len = (int)STRLEN(temp_string);
10856 } 11077 }
10857 else 11078 else
10858 #endif
10859 len = (int)(end - start); 11079 len = (int)(end - start);
10860 11080
10861 /* 11081 /*
10862 * Copy the function name to allocated memory. 11082 * Copy the function name to allocated memory.
10863 * Accept <SID>name() inside a script, translate into <SNR>123_name(). 11083 * Accept <SID>name() inside a script, translate into <SNR>123_name().
11127 11347
11128 /* 11348 /*
11129 * Call a user function. 11349 * Call a user function.
11130 */ 11350 */
11131 static void 11351 static void
11132 call_user_func(fp, argcount, argvars, retvar, firstline, lastline) 11352 call_user_func(fp, argcount, argvars, rettv, firstline, lastline)
11133 ufunc_T *fp; /* pointer to function */ 11353 ufunc_T *fp; /* pointer to function */
11134 int argcount; /* nr of args */ 11354 int argcount; /* nr of args */
11135 typeval *argvars; /* arguments */ 11355 typeval *argvars; /* arguments */
11136 typeval *retvar; /* return value */ 11356 typeval *rettv; /* return value */
11137 linenr_T firstline; /* first line of range */ 11357 linenr_T firstline; /* first line of range */
11138 linenr_T lastline; /* last line of range */ 11358 linenr_T lastline; /* last line of range */
11139 { 11359 {
11140 char_u *save_sourcing_name; 11360 char_u *save_sourcing_name;
11141 linenr_T save_sourcing_lnum; 11361 linenr_T save_sourcing_lnum;
11147 11367
11148 /* If depth of calling is getting too high, don't execute the function */ 11368 /* If depth of calling is getting too high, don't execute the function */
11149 if (depth >= p_mfd) 11369 if (depth >= p_mfd)
11150 { 11370 {
11151 EMSG(_("E132: Function call depth is higher than 'maxfuncdepth'")); 11371 EMSG(_("E132: Function call depth is higher than 'maxfuncdepth'"));
11152 retvar->v_type = VAR_NUMBER; 11372 rettv->v_type = VAR_NUMBER;
11153 retvar->vval.v_number = -1; 11373 rettv->vval.v_number = -1;
11154 return; 11374 return;
11155 } 11375 }
11156 ++depth; 11376 ++depth;
11157 11377
11158 line_breakcheck(); /* check for CTRL-C hit */ 11378 line_breakcheck(); /* check for CTRL-C hit */
11160 /* set local variables */ 11380 /* set local variables */
11161 vars_init(&fc.l_vars); 11381 vars_init(&fc.l_vars);
11162 fc.func = fp; 11382 fc.func = fp;
11163 fc.argcount = argcount; 11383 fc.argcount = argcount;
11164 fc.argvars = argvars; 11384 fc.argvars = argvars;
11165 fc.retvar = retvar; 11385 fc.rettv = rettv;
11166 retvar->vval.v_number = 0; 11386 rettv->vval.v_number = 0;
11167 fc.linenr = 0; 11387 fc.linenr = 0;
11168 fc.returned = FALSE; 11388 fc.returned = FALSE;
11169 fc.level = ex_nesting_level; 11389 fc.level = ex_nesting_level;
11170 fc.a0_var.tv.v_type = VAR_NUMBER; 11390 fc.a0_var.tv.v_type = VAR_NUMBER;
11171 fc.a0_var.tv.vval.v_number = argcount - fp->args.ga_len; 11391 fc.a0_var.tv.vval.v_number = argcount - fp->args.ga_len;
11214 msg_puts((char_u *)", "); 11434 msg_puts((char_u *)", ");
11215 if (argvars[i].v_type == VAR_NUMBER) 11435 if (argvars[i].v_type == VAR_NUMBER)
11216 msg_outnum((long)argvars[i].vval.v_number); 11436 msg_outnum((long)argvars[i].vval.v_number);
11217 else 11437 else
11218 { 11438 {
11219 trunc_string(get_vartv_string(&argvars[i]), 11439 trunc_string(get_tv_string(&argvars[i]),
11220 buf, MSG_BUF_LEN); 11440 buf, MSG_BUF_LEN);
11221 msg_puts((char_u *)"\""); 11441 msg_puts((char_u *)"\"");
11222 msg_puts(buf); 11442 msg_puts(buf);
11223 msg_puts((char_u *)"\""); 11443 msg_puts((char_u *)"\"");
11224 } 11444 }
11240 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT); 11460 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
11241 11461
11242 --RedrawingDisabled; 11462 --RedrawingDisabled;
11243 11463
11244 /* when the function was aborted because of an error, return -1 */ 11464 /* when the function was aborted because of an error, return -1 */
11245 if ((did_emsg && (fp->flags & FC_ABORT)) || retvar->v_type == VAR_UNKNOWN) 11465 if ((did_emsg && (fp->flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN)
11246 { 11466 {
11247 clear_vartv(retvar); 11467 clear_tv(rettv);
11248 retvar->v_type = VAR_NUMBER; 11468 rettv->v_type = VAR_NUMBER;
11249 retvar->vval.v_number = -1; 11469 rettv->vval.v_number = -1;
11250 } 11470 }
11251 11471
11252 /* when being verbose, mention the return value */ 11472 /* when being verbose, mention the return value */
11253 if (p_verbose >= 12) 11473 if (p_verbose >= 12)
11254 { 11474 {
11262 if (STRLEN(sourcing_name) > IOSIZE / 2 - 50) 11482 if (STRLEN(sourcing_name) > IOSIZE / 2 - 50)
11263 sn = sourcing_name + STRLEN(sourcing_name) - (IOSIZE / 2 - 50); 11483 sn = sourcing_name + STRLEN(sourcing_name) - (IOSIZE / 2 - 50);
11264 11484
11265 if (aborting()) 11485 if (aborting())
11266 smsg((char_u *)_("%s aborted"), sn); 11486 smsg((char_u *)_("%s aborted"), sn);
11267 else if (fc.retvar->v_type == VAR_NUMBER) 11487 else if (fc.rettv->v_type == VAR_NUMBER)
11268 smsg((char_u *)_("%s returning #%ld"), sn, 11488 smsg((char_u *)_("%s returning #%ld"), sn,
11269 (long)fc.retvar->vval.v_number); 11489 (long)fc.rettv->vval.v_number);
11270 else if (fc.retvar->v_type == VAR_STRING) 11490 else if (fc.rettv->v_type == VAR_STRING)
11271 { 11491 {
11272 val = get_vartv_string(fc.retvar); 11492 val = get_tv_string(fc.rettv);
11273 if (STRLEN(val) > IOSIZE / 2 - 50) 11493 if (STRLEN(val) > IOSIZE / 2 - 50)
11274 val = val + STRLEN(val) - (IOSIZE / 2 - 50); 11494 val = val + STRLEN(val) - (IOSIZE / 2 - 50);
11275 smsg((char_u *)_("%s returning \"%s\""), sn, val); 11495 smsg((char_u *)_("%s returning \"%s\""), sn, val);
11276 } 11496 }
11277 msg_puts((char_u *)"\n"); /* don't overwrite this either */ 11497 msg_puts((char_u *)"\n"); /* don't overwrite this either */
11307 void 11527 void
11308 ex_return(eap) 11528 ex_return(eap)
11309 exarg_T *eap; 11529 exarg_T *eap;
11310 { 11530 {
11311 char_u *arg = eap->arg; 11531 char_u *arg = eap->arg;
11312 var retvar; 11532 typeval rettv;
11313 int returning = FALSE; 11533 int returning = FALSE;
11314 11534
11315 if (current_funccal == NULL) 11535 if (current_funccal == NULL)
11316 { 11536 {
11317 EMSG(_("E133: :return not inside a function")); 11537 EMSG(_("E133: :return not inside a function"));
11321 if (eap->skip) 11541 if (eap->skip)
11322 ++emsg_skip; 11542 ++emsg_skip;
11323 11543
11324 eap->nextcmd = NULL; 11544 eap->nextcmd = NULL;
11325 if ((*arg != NUL && *arg != '|' && *arg != '\n') 11545 if ((*arg != NUL && *arg != '|' && *arg != '\n')
11326 && eval0(arg, &retvar, &eap->nextcmd, !eap->skip) != FAIL) 11546 && eval0(arg, &rettv, &eap->nextcmd, !eap->skip) != FAIL)
11327 { 11547 {
11328 if (!eap->skip) 11548 if (!eap->skip)
11329 returning = do_return(eap, FALSE, TRUE, &retvar); 11549 returning = do_return(eap, FALSE, TRUE, &rettv);
11330 else 11550 else
11331 clear_vartv(&retvar.tv); 11551 clear_tv(&rettv);
11332 } 11552 }
11333 /* It's safer to return also on error. */ 11553 /* It's safer to return also on error. */
11334 else if (!eap->skip) 11554 else if (!eap->skip)
11335 { 11555 {
11336 /* 11556 /*
11355 11575
11356 /* 11576 /*
11357 * Return from a function. Possibly makes the return pending. Also called 11577 * Return from a function. Possibly makes the return pending. Also called
11358 * for a pending return at the ":endtry" or after returning from an extra 11578 * for a pending return at the ":endtry" or after returning from an extra
11359 * do_cmdline(). "reanimate" is used in the latter case. "is_cmd" is set 11579 * do_cmdline(). "reanimate" is used in the latter case. "is_cmd" is set
11360 * when called due to a ":return" command. "value" may point to a variable 11580 * when called due to a ":return" command. "rettv" may point to a typeval
11361 * with the return value. Returns TRUE when the return can be carried out, 11581 * with the return rettv. Returns TRUE when the return can be carried out,
11362 * FALSE when the return gets pending. 11582 * FALSE when the return gets pending.
11363 */ 11583 */
11364 int 11584 int
11365 do_return(eap, reanimate, is_cmd, value) 11585 do_return(eap, reanimate, is_cmd, rettv)
11366 exarg_T *eap; 11586 exarg_T *eap;
11367 int reanimate; 11587 int reanimate;
11368 int is_cmd; 11588 int is_cmd;
11369 void *value; 11589 void *rettv;
11370 { 11590 {
11371 int idx; 11591 int idx;
11372 struct condstack *cstack = eap->cstack; 11592 struct condstack *cstack = eap->cstack;
11373 11593
11374 if (reanimate) 11594 if (reanimate)
11385 if (idx >= 0) 11605 if (idx >= 0)
11386 { 11606 {
11387 cstack->cs_pending[idx] = CSTP_RETURN; 11607 cstack->cs_pending[idx] = CSTP_RETURN;
11388 11608
11389 if (!is_cmd && !reanimate) 11609 if (!is_cmd && !reanimate)
11390 /* A pending return again gets pending. "value" points to an 11610 /* A pending return again gets pending. "rettv" points to an
11391 * allocated variable with the value of the original ":return"'s 11611 * allocated variable with the rettv of the original ":return"'s
11392 * argument if present or is NULL else. */ 11612 * argument if present or is NULL else. */
11393 cstack->cs_retvar[idx] = value; 11613 cstack->cs_rettv[idx] = rettv;
11394 else 11614 else
11395 { 11615 {
11396 /* When undoing a return in order to make it pending, get the stored 11616 /* When undoing a return in order to make it pending, get the stored
11397 * return value. */ 11617 * return rettv. */
11398 if (reanimate) 11618 if (reanimate)
11399 value = current_funccal->retvar; 11619 rettv = current_funccal->rettv;
11400 11620
11401 if (value != NULL) 11621 if (rettv != NULL)
11402 { 11622 {
11403 /* Store the value of the pending return. */ 11623 /* Store the value of the pending return. */
11404 if ((cstack->cs_retvar[idx] = alloc_var()) != NULL) 11624 if ((cstack->cs_rettv[idx] = alloc_tv()) != NULL)
11405 *(typeval *)cstack->cs_retvar[idx] = *(typeval *)value; 11625 *(typeval *)cstack->cs_rettv[idx] = *(typeval *)rettv;
11406 else 11626 else
11407 EMSG(_(e_outofmem)); 11627 EMSG(_(e_outofmem));
11408 } 11628 }
11409 else 11629 else
11410 cstack->cs_retvar[idx] = NULL; 11630 cstack->cs_rettv[idx] = NULL;
11411 11631
11412 if (reanimate) 11632 if (reanimate)
11413 { 11633 {
11414 /* The pending return value could be overwritten by a ":return" 11634 /* The pending return value could be overwritten by a ":return"
11415 * without argument in a finally clause; reset the default 11635 * without argument in a finally clause; reset the default
11416 * return value. */ 11636 * return value. */
11417 current_funccal->retvar->v_type = VAR_NUMBER; 11637 current_funccal->rettv->v_type = VAR_NUMBER;
11418 current_funccal->retvar->vval.v_number = 0; 11638 current_funccal->rettv->vval.v_number = 0;
11419 } 11639 }
11420 } 11640 }
11421 report_make_pending(CSTP_RETURN, value); 11641 report_make_pending(CSTP_RETURN, rettv);
11422 } 11642 }
11423 else 11643 else
11424 { 11644 {
11425 current_funccal->returned = TRUE; 11645 current_funccal->returned = TRUE;
11426 11646
11427 /* If the return is carried out now, store the return value. For 11647 /* If the return is carried out now, store the return value. For
11428 * a return immediately after reanimation, the value is already 11648 * a return immediately after reanimation, the value is already
11429 * there. */ 11649 * there. */
11430 if (!reanimate && value != NULL) 11650 if (!reanimate && rettv != NULL)
11431 { 11651 {
11432 clear_vartv(current_funccal->retvar); 11652 clear_tv(current_funccal->rettv);
11433 *current_funccal->retvar = *(typeval *)value; 11653 *current_funccal->rettv = *(typeval *)rettv;
11434 if (!is_cmd) 11654 if (!is_cmd)
11435 vim_free(value); 11655 vim_free(rettv);
11436 } 11656 }
11437 } 11657 }
11438 11658
11439 return idx < 0; 11659 return idx < 0;
11440 } 11660 }
11441 11661
11442 /* 11662 /*
11443 * Free the variable with a pending return value. 11663 * Free the variable with a pending return value.
11444 */ 11664 */
11445 void 11665 void
11446 discard_pending_return(retvar) 11666 discard_pending_return(rettv)
11447 void *retvar; 11667 void *rettv;
11448 { 11668 {
11449 /* The variable was copied from one with an undefined v_name. So we can't 11669 free_tv((typeval *)rettv);
11450 * use free_vartv() to clear and free it. */ 11670 }
11451 clear_vartv(&((VAR)retvar)->tv); 11671
11452 vim_free(retvar); 11672 /*
11453 } 11673 * Generate a return command for producing the value of "rettv". The result
11454
11455 /*
11456 * Generate a return command for producing the value of "retvar". The result
11457 * is an allocated string. Used by report_pending() for verbose messages. 11674 * is an allocated string. Used by report_pending() for verbose messages.
11458 */ 11675 */
11459 char_u * 11676 char_u *
11460 get_return_cmd(retvar) 11677 get_return_cmd(rettv)
11461 void *retvar; 11678 void *rettv;
11462 { 11679 {
11463 char_u *s = IObuff; 11680 char_u *s;
11464 11681 char_u *tofree = NULL;
11465 if (retvar == NULL || ((VAR)retvar)->tv.v_type == VAR_UNKNOWN) 11682
11466 s = (char_u *)":return"; 11683 if (rettv == NULL)
11467 else if (((VAR)retvar)->tv.v_type == VAR_STRING) 11684 s = (char_u *)"";
11468 sprintf((char *)IObuff, ":return \"%s\"",
11469 ((VAR)retvar)->tv.vval.v_string);
11470 else 11685 else
11471 sprintf((char *)IObuff, ":return %ld", 11686 s = tv2string((typeval *)rettv, &tofree);
11472 (long)(((VAR)retvar)->tv.vval.v_number)); 11687
11473 return vim_strsave(s); 11688 STRCPY(IObuff, ":return ");
11689 STRNCPY(IObuff + 8, s, IOSIZE - 8);
11690 if (STRLEN(s) + 8 >= IOSIZE)
11691 STRCPY(IObuff + IOSIZE - 4, "...");
11692 vim_free(tofree);
11693 return vim_strsave(IObuff);
11474 } 11694 }
11475 11695
11476 /* 11696 /*
11477 * Get next function line. 11697 * Get next function line.
11478 * Called by do_cmdline() to get the next line. 11698 * Called by do_cmdline() to get the next line.
11584 vir_T *virp; 11804 vir_T *virp;
11585 int writing; 11805 int writing;
11586 { 11806 {
11587 char_u *tab; 11807 char_u *tab;
11588 int is_string = FALSE; 11808 int is_string = FALSE;
11589 typeval *vartvp = NULL; 11809 typeval *tvp = NULL;
11590 char_u *val; 11810 char_u *val;
11591 11811
11592 if (!writing && (find_viminfo_parameter('!') != NULL)) 11812 if (!writing && (find_viminfo_parameter('!') != NULL))
11593 { 11813 {
11594 tab = vim_strchr(virp->vir_line + 1, '\t'); 11814 tab = vim_strchr(virp->vir_line + 1, '\t');
11599 is_string = TRUE; 11819 is_string = TRUE;
11600 11820
11601 tab = vim_strchr(tab, '\t'); 11821 tab = vim_strchr(tab, '\t');
11602 if (tab != NULL) 11822 if (tab != NULL)
11603 { 11823 {
11604 /* create a nameless variable to hold the value */ 11824 /* create a typeval to hold the value */
11605 if (is_string) 11825 if (is_string)
11606 { 11826 {
11607 val = viminfo_readstring(virp, 11827 val = viminfo_readstring(virp,
11608 (int)(tab - virp->vir_line + 1), TRUE); 11828 (int)(tab - virp->vir_line + 1), TRUE);
11609 if (val != NULL) 11829 if (val != NULL)
11610 vartvp = alloc_string_vartv(val); 11830 tvp = alloc_string_tv(val);
11611 } 11831 }
11612 else 11832 else
11613 { 11833 {
11614 vartvp = alloc_vartv(); 11834 tvp = alloc_tv();
11615 if (vartvp != NULL) 11835 if (tvp != NULL)
11616 { 11836 {
11617 vartvp->v_type = VAR_NUMBER; 11837 tvp->v_type = VAR_NUMBER;
11618 vartvp->vval.v_number = atol((char *)tab + 1); 11838 tvp->vval.v_number = atol((char *)tab + 1);
11619 } 11839 }
11620 } 11840 }
11621 /* assign the value to the variable */ 11841 /* assign the value to the variable */
11622 if (vartvp != NULL) 11842 if (tvp != NULL)
11623 { 11843 {
11624 set_var(virp->vir_line + 1, vartvp, FALSE); 11844 set_var(virp->vir_line + 1, tvp, FALSE);
11625 free_vartv(vartvp); 11845 free_tv(tvp);
11626 } 11846 }
11627 } 11847 }
11628 } 11848 }
11629 } 11849 }
11630 11850
11639 FILE *fp; 11859 FILE *fp;
11640 { 11860 {
11641 garray_T *gap = &variables; /* global variable */ 11861 garray_T *gap = &variables; /* global variable */
11642 VAR this_var; 11862 VAR this_var;
11643 int i; 11863 int i;
11864 char *s;
11865 char_u *tofree;
11644 11866
11645 if (find_viminfo_parameter('!') == NULL) 11867 if (find_viminfo_parameter('!') == NULL)
11646 return; 11868 return;
11647 11869
11648 fprintf(fp, _("\n# global variables:\n")); 11870 fprintf(fp, _("\n# global variables:\n"));
11650 { 11872 {
11651 this_var = &VAR_GAP_ENTRY(i, gap); 11873 this_var = &VAR_GAP_ENTRY(i, gap);
11652 if (this_var->v_name != NULL 11874 if (this_var->v_name != NULL
11653 && var_flavour(this_var->v_name) == VAR_FLAVOUR_VIMINFO) 11875 && var_flavour(this_var->v_name) == VAR_FLAVOUR_VIMINFO)
11654 { 11876 {
11655 fprintf(fp, "!%s\t%s\t", this_var->v_name, 11877 switch (this_var->tv.v_type)
11656 (this_var->tv.v_type == VAR_STRING) ? "STR" : "NUM"); 11878 {
11657 viminfo_writestring(fp, get_var_string(this_var)); 11879 case VAR_STRING: s = "STR"; break;
11880 case VAR_NUMBER: s = "NUM"; break;
11881 case VAR_LIST: s = "LST"; break;
11882 case VAR_FUNC: s = "FUN"; break;
11883 default:
11884 EMSGN(_("E999: Internal error: write_viminfo_varlist(): %ld"), (long)this_var->tv.v_type);
11885 s = "ERR";
11886 }
11887 fprintf(fp, "!%s\t%s\t", this_var->v_name, s);
11888 viminfo_writestring(fp, tv2string(&this_var->tv, &tofree));
11889 vim_free(tofree);
11658 } 11890 }
11659 } 11891 }
11660 } 11892 }
11661 #endif 11893 #endif
11662 11894