annotate src/evalvars.c @ 27970:212c5894b8b1 v8.2.4510

patch 8.2.4510: Vim9: shortening commands leads to confusing script Commit: https://github.com/vim/vim/commit/204852ae2adfdde10c656ca7f14e5b4207a69172 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 5 12:56:44 2022 +0000 patch 8.2.4510: Vim9: shortening commands leads to confusing script Problem: Vim9: shortening commands leads to confusing script. Solution: In Vim9 script require at least ":cont" for ":continue", "const" instead of "cons", "break" instead of "brea", "catch" instead of "cat", "else" instead of "el" "elseif" instead of "elsei" "endfor" instead of "endfo" "endif" instead of "en" "endtry" instead of "endt", "finally" instead of "fina", "throw" instead of "th", "while" instead of "wh".
author Bram Moolenaar <Bram@vim.org>
date Sat, 05 Mar 2022 14:00:03 +0100
parents 40c6e5f849dc
children 1012048eed26
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * evalvars.c: functions for dealing with variables
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 #if defined(FEAT_EVAL) || defined(PROTO)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
18 static dictitem_T globvars_var; // variable used for g:
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
19 static dict_T globvardict; // Dictionary with g: variables
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
20 #define globvarht globvardict.dv_hashtab
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
21
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
22 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
23 * Old Vim variables such as "v:version" are also available without the "v:".
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
24 * Also in functions. We need a special hashtable for them.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
25 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
26 static hashtab_T compat_hashtab;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
27
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
28 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
29 * Array to hold the value of v: variables.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
30 * The value is in a dictitem, so that it can also be used in the v: scope.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
31 * The reason to use this table anyway is for very quick access to the
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
32 * variables with the VV_ defines.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
33 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
34
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
35 // values for vv_flags:
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
36 #define VV_COMPAT 1 // compatible, also used without "v:"
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
37 #define VV_RO 2 // read-only
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
38 #define VV_RO_SBX 4 // read-only in the sandbox
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
39
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
40 #define VV_NAME(s, t) s, {{t, 0, {0}}, 0, {0}}
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
41
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
42 typedef struct vimvar vimvar_T;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
43
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
44 static struct vimvar
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
45 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
46 char *vv_name; // name of variable, without v:
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
47 dictitem16_T vv_di; // value and name for key (max 16 chars!)
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
48 type_T *vv_type; // type or NULL
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
49 char vv_flags; // VV_COMPAT, VV_RO, VV_RO_SBX
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
50 } vimvars[VV_LEN] =
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
51 {
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
52 // The order here must match the VV_ defines in vim.h!
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
53 // Initializing a union does not work, leave tv.vval empty to get zero's.
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
54 {VV_NAME("count", VAR_NUMBER), NULL, VV_COMPAT+VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
55 {VV_NAME("count1", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
56 {VV_NAME("prevcount", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
57 {VV_NAME("errmsg", VAR_STRING), NULL, VV_COMPAT},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
58 {VV_NAME("warningmsg", VAR_STRING), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
59 {VV_NAME("statusmsg", VAR_STRING), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
60 {VV_NAME("shell_error", VAR_NUMBER), NULL, VV_COMPAT+VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
61 {VV_NAME("this_session", VAR_STRING), NULL, VV_COMPAT},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
62 {VV_NAME("version", VAR_NUMBER), NULL, VV_COMPAT+VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
63 {VV_NAME("lnum", VAR_NUMBER), NULL, VV_RO_SBX},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
64 {VV_NAME("termresponse", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
65 {VV_NAME("fname", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
66 {VV_NAME("lang", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
67 {VV_NAME("lc_time", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
68 {VV_NAME("ctype", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
69 {VV_NAME("charconvert_from", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
70 {VV_NAME("charconvert_to", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
71 {VV_NAME("fname_in", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
72 {VV_NAME("fname_out", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
73 {VV_NAME("fname_new", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
74 {VV_NAME("fname_diff", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
75 {VV_NAME("cmdarg", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
76 {VV_NAME("foldstart", VAR_NUMBER), NULL, VV_RO_SBX},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
77 {VV_NAME("foldend", VAR_NUMBER), NULL, VV_RO_SBX},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
78 {VV_NAME("folddashes", VAR_STRING), NULL, VV_RO_SBX},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
79 {VV_NAME("foldlevel", VAR_NUMBER), NULL, VV_RO_SBX},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
80 {VV_NAME("progname", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
81 {VV_NAME("servername", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
82 {VV_NAME("dying", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
83 {VV_NAME("exception", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
84 {VV_NAME("throwpoint", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
85 {VV_NAME("register", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
86 {VV_NAME("cmdbang", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
87 {VV_NAME("insertmode", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
88 {VV_NAME("val", VAR_UNKNOWN), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
89 {VV_NAME("key", VAR_UNKNOWN), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
90 {VV_NAME("profiling", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
91 {VV_NAME("fcs_reason", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
92 {VV_NAME("fcs_choice", VAR_STRING), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
93 {VV_NAME("beval_bufnr", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
94 {VV_NAME("beval_winnr", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
95 {VV_NAME("beval_winid", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
96 {VV_NAME("beval_lnum", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
97 {VV_NAME("beval_col", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
98 {VV_NAME("beval_text", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
99 {VV_NAME("scrollstart", VAR_STRING), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
100 {VV_NAME("swapname", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
101 {VV_NAME("swapchoice", VAR_STRING), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
102 {VV_NAME("swapcommand", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
103 {VV_NAME("char", VAR_STRING), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
104 {VV_NAME("mouse_win", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
105 {VV_NAME("mouse_winid", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
106 {VV_NAME("mouse_lnum", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
107 {VV_NAME("mouse_col", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
108 {VV_NAME("operator", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
109 {VV_NAME("searchforward", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
110 {VV_NAME("hlsearch", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
111 {VV_NAME("oldfiles", VAR_LIST), &t_list_string, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
112 {VV_NAME("windowid", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
113 {VV_NAME("progpath", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
114 {VV_NAME("completed_item", VAR_DICT), &t_dict_string, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
115 {VV_NAME("option_new", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
116 {VV_NAME("option_old", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
117 {VV_NAME("option_oldlocal", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
118 {VV_NAME("option_oldglobal", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
119 {VV_NAME("option_command", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
120 {VV_NAME("option_type", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
121 {VV_NAME("errors", VAR_LIST), &t_list_string, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
122 {VV_NAME("false", VAR_BOOL), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
123 {VV_NAME("true", VAR_BOOL), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
124 {VV_NAME("none", VAR_SPECIAL), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
125 {VV_NAME("null", VAR_SPECIAL), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
126 {VV_NAME("numbermax", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
127 {VV_NAME("numbermin", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
128 {VV_NAME("numbersize", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
129 {VV_NAME("vim_did_enter", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
130 {VV_NAME("testing", VAR_NUMBER), NULL, 0},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
131 {VV_NAME("t_number", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
132 {VV_NAME("t_string", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
133 {VV_NAME("t_func", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
134 {VV_NAME("t_list", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
135 {VV_NAME("t_dict", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
136 {VV_NAME("t_float", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
137 {VV_NAME("t_bool", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
138 {VV_NAME("t_none", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
139 {VV_NAME("t_job", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
140 {VV_NAME("t_channel", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
141 {VV_NAME("t_blob", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
142 {VV_NAME("termrfgresp", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
143 {VV_NAME("termrbgresp", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
144 {VV_NAME("termu7resp", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
145 {VV_NAME("termstyleresp", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
146 {VV_NAME("termblinkresp", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
147 {VV_NAME("event", VAR_DICT), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
148 {VV_NAME("versionlong", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
149 {VV_NAME("echospace", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
150 {VV_NAME("argv", VAR_LIST), &t_list_string, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
151 {VV_NAME("collate", VAR_STRING), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
152 {VV_NAME("exiting", VAR_SPECIAL), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
153 {VV_NAME("colornames", VAR_DICT), &t_dict_string, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
154 {VV_NAME("sizeofint", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
155 {VV_NAME("sizeoflong", VAR_NUMBER), NULL, VV_RO},
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
156 {VV_NAME("sizeofpointer", VAR_NUMBER), NULL, VV_RO},
26881
fb67cd7d30a7 patch 8.2.3969: value of MAXCOL not available in Vim script
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
157 {VV_NAME("maxcol", VAR_NUMBER), NULL, VV_RO},
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
158 };
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
159
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
160 // shorthand
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
161 #define vv_tv_type vv_di.di_tv.v_type
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
162 #define vv_nr vv_di.di_tv.vval.v_number
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
163 #define vv_float vv_di.di_tv.vval.v_float
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
164 #define vv_str vv_di.di_tv.vval.v_string
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
165 #define vv_list vv_di.di_tv.vval.v_list
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
166 #define vv_dict vv_di.di_tv.vval.v_dict
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
167 #define vv_blob vv_di.di_tv.vval.v_blob
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
168 #define vv_tv vv_di.di_tv
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
169
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
170 static dictitem_T vimvars_var; // variable used for v:
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
171 static dict_T vimvardict; // Dictionary with v: variables
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
172 #define vimvarht vimvardict.dv_hashtab
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
173
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
174 // for VIM_VERSION_ defines
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
175 #include "version.h"
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
176
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 static void list_glob_vars(int *first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178 static void list_buf_vars(int *first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179 static void list_win_vars(int *first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 static void list_tab_vars(int *first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 static char_u *list_arg_vars(exarg_T *eap, char_u *arg, int *first);
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
182 static char_u *ex_let_one(char_u *arg, typval_T *tv, int copy, int flags, char_u *endchars, char_u *op, int var_idx);
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
183 static int do_unlet_var(lval_T *lp, char_u *name_end, exarg_T *eap, int deep, void *cookie);
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
184 static int do_lock_var(lval_T *lp, char_u *name_end, exarg_T *eap, int deep, void *cookie);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 static void list_one_var(dictitem_T *v, char *prefix, int *first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 static void list_one_var_a(char *prefix, char_u *name, int type, char_u *string, int *first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
189 * Initialize global and vim special variables
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
190 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
191 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
192 evalvars_init(void)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
193 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
194 int i;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
195 struct vimvar *p;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
196
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
197 init_var_dict(&globvardict, &globvars_var, VAR_DEF_SCOPE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
198 init_var_dict(&vimvardict, &vimvars_var, VAR_SCOPE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
199 vimvardict.dv_lock = VAR_FIXED;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
200 hash_init(&compat_hashtab);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
201
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
202 for (i = 0; i < VV_LEN; ++i)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
203 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
204 p = &vimvars[i];
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
205 if (STRLEN(p->vv_name) > DICTITEM16_KEY_LEN)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
206 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
207 iemsg("INTERNAL: name too long, increase size of dictitem16_T");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
208 getout(1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
209 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
210 STRCPY(p->vv_di.di_key, p->vv_name);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
211 if (p->vv_flags & VV_RO)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
212 p->vv_di.di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
213 else if (p->vv_flags & VV_RO_SBX)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
214 p->vv_di.di_flags = DI_FLAGS_RO_SBX | DI_FLAGS_FIX;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
215 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
216 p->vv_di.di_flags = DI_FLAGS_FIX;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
217
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
218 // add to v: scope dict, unless the value is not always available
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
219 if (p->vv_tv_type != VAR_UNKNOWN)
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
220 hash_add(&vimvarht, p->vv_di.di_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
221 if (p->vv_flags & VV_COMPAT)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
222 // add to compat scope dict
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
223 hash_add(&compat_hashtab, p->vv_di.di_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
224 }
22480
5e95de50ddd2 patch 8.2.1788: Vim9: still allows :let for declarations
Bram Moolenaar <Bram@vim.org>
parents: 22415
diff changeset
225 set_vim_var_nr(VV_VERSION, VIM_VERSION_100);
5e95de50ddd2 patch 8.2.1788: Vim9: still allows :let for declarations
Bram Moolenaar <Bram@vim.org>
parents: 22415
diff changeset
226 set_vim_var_nr(VV_VERSIONLONG, VIM_VERSION_100 * 10000 + highest_patch());
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
227
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
228 set_vim_var_nr(VV_SEARCHFORWARD, 1L);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
229 set_vim_var_nr(VV_HLSEARCH, 1L);
23048
ad674a98058a patch 8.2.2070: can't get the exit value in VimLeave(Pre) autocommands
Bram Moolenaar <Bram@vim.org>
parents: 22942
diff changeset
230 set_vim_var_nr(VV_EXITING, VVAL_NULL);
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
231 set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc_lock(VAR_FIXED));
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
232 set_vim_var_list(VV_ERRORS, list_alloc());
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
233 set_vim_var_dict(VV_EVENT, dict_alloc_lock(VAR_FIXED));
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
234
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
235 set_vim_var_nr(VV_FALSE, VVAL_FALSE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
236 set_vim_var_nr(VV_TRUE, VVAL_TRUE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
237 set_vim_var_nr(VV_NONE, VVAL_NONE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
238 set_vim_var_nr(VV_NULL, VVAL_NULL);
23693
cd06cc37f53f patch 8.2.2388: no easy way to get the maximum or mininum number value
Bram Moolenaar <Bram@vim.org>
parents: 23679
diff changeset
239 set_vim_var_nr(VV_NUMBERMAX, VARNUM_MAX);
cd06cc37f53f patch 8.2.2388: no easy way to get the maximum or mininum number value
Bram Moolenaar <Bram@vim.org>
parents: 23679
diff changeset
240 set_vim_var_nr(VV_NUMBERMIN, VARNUM_MIN);
19477
2bb0e80fcd32 patch 8.2.0296: mixing up "long long" and __int64 may cause problems
Bram Moolenaar <Bram@vim.org>
parents: 19285
diff changeset
241 set_vim_var_nr(VV_NUMBERSIZE, sizeof(varnumber_T) * 8);
26079
a60952e58e5d patch 8.2.3573: cannot decide whether to skip test that fails with 64 bit
Bram Moolenaar <Bram@vim.org>
parents: 26057
diff changeset
242 set_vim_var_nr(VV_SIZEOFINT, sizeof(int));
a60952e58e5d patch 8.2.3573: cannot decide whether to skip test that fails with 64 bit
Bram Moolenaar <Bram@vim.org>
parents: 26057
diff changeset
243 set_vim_var_nr(VV_SIZEOFLONG, sizeof(long));
a60952e58e5d patch 8.2.3573: cannot decide whether to skip test that fails with 64 bit
Bram Moolenaar <Bram@vim.org>
parents: 26057
diff changeset
244 set_vim_var_nr(VV_SIZEOFPOINTER, sizeof(char *));
26881
fb67cd7d30a7 patch 8.2.3969: value of MAXCOL not available in Vim script
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
245 set_vim_var_nr(VV_MAXCOL, MAXCOL);
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
246
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
247 set_vim_var_nr(VV_TYPE_NUMBER, VAR_TYPE_NUMBER);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
248 set_vim_var_nr(VV_TYPE_STRING, VAR_TYPE_STRING);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
249 set_vim_var_nr(VV_TYPE_FUNC, VAR_TYPE_FUNC);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
250 set_vim_var_nr(VV_TYPE_LIST, VAR_TYPE_LIST);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
251 set_vim_var_nr(VV_TYPE_DICT, VAR_TYPE_DICT);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
252 set_vim_var_nr(VV_TYPE_FLOAT, VAR_TYPE_FLOAT);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
253 set_vim_var_nr(VV_TYPE_BOOL, VAR_TYPE_BOOL);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
254 set_vim_var_nr(VV_TYPE_NONE, VAR_TYPE_NONE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
255 set_vim_var_nr(VV_TYPE_JOB, VAR_TYPE_JOB);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
256 set_vim_var_nr(VV_TYPE_CHANNEL, VAR_TYPE_CHANNEL);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
257 set_vim_var_nr(VV_TYPE_BLOB, VAR_TYPE_BLOB);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
258
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
259 set_vim_var_nr(VV_ECHOSPACE, sc_col - 1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
260
26057
92c424550367 patch 8.2.3562: cannot add color names
Bram Moolenaar <Bram@vim.org>
parents: 25955
diff changeset
261 set_vim_var_dict(VV_COLORNAMES, dict_alloc());
92c424550367 patch 8.2.3562: cannot add color names
Bram Moolenaar <Bram@vim.org>
parents: 25955
diff changeset
262
20721
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
263 // Default for v:register is not 0 but '"'. This is adjusted once the
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
264 // clipboard has been setup by calling reset_reg_var().
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
265 set_reg_var(0);
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
266 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
267
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
268 #if defined(EXITFREE) || defined(PROTO)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
269 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
270 * Free all vim variables information on exit
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
271 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
272 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
273 evalvars_clear(void)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
274 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
275 int i;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
276 struct vimvar *p;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
277
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
278 for (i = 0; i < VV_LEN; ++i)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
279 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
280 p = &vimvars[i];
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
281 if (p->vv_di.di_tv.v_type == VAR_STRING)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
282 VIM_CLEAR(p->vv_str);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
283 else if (p->vv_di.di_tv.v_type == VAR_LIST)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
284 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
285 list_unref(p->vv_list);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
286 p->vv_list = NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
287 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
288 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
289 hash_clear(&vimvarht);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
290 hash_init(&vimvarht); // garbage_collect() will access it
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
291 hash_clear(&compat_hashtab);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
292
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
293 // global variables
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
294 vars_clear(&globvarht);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
295
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
296 // Script-local variables. Clear all the variables here.
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
297 // The scriptvar_T is cleared later in free_scriptnames(), because a
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
298 // variable in one script might hold a reference to the whole scope of
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
299 // another script.
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
300 for (i = 1; i <= script_items.ga_len; ++i)
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
301 vars_clear(&SCRIPT_VARS(i));
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
302 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
303 #endif
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
304
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
305 int
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
306 garbage_collect_globvars(int copyID)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
307 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
308 return set_ref_in_ht(&globvarht, copyID, NULL);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
309 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
310
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
311 int
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
312 garbage_collect_vimvars(int copyID)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
313 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
314 return set_ref_in_ht(&vimvarht, copyID, NULL);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
315 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
316
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
317 int
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
318 garbage_collect_scriptvars(int copyID)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
319 {
22602
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
320 int i;
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
321 int idx;
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
322 int abort = FALSE;
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
323 scriptitem_T *si;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
324
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
325 for (i = 1; i <= script_items.ga_len; ++i)
22602
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
326 {
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
327 abort = abort || set_ref_in_ht(&SCRIPT_VARS(i), copyID, NULL);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
328
22602
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
329 si = SCRIPT_ITEM(i);
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
330 for (idx = 0; idx < si->sn_var_vals.ga_len; ++idx)
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
331 {
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
332 svar_T *sv = ((svar_T *)si->sn_var_vals.ga_data) + idx;
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
333
24075
c5e396fb0ebe patch 8.2.2579: Vim9: crash in garbagecollect after for loop
Bram Moolenaar <Bram@vim.org>
parents: 24051
diff changeset
334 if (sv->sv_name != NULL)
c5e396fb0ebe patch 8.2.2579: Vim9: crash in garbagecollect after for loop
Bram Moolenaar <Bram@vim.org>
parents: 24051
diff changeset
335 abort = abort || set_ref_in_item(sv->sv_tv, copyID, NULL, NULL);
22602
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
336 }
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
337 }
2c77ec32deeb patch 8.2.1849: Vim9: garbage collection frees block-local variables
Bram Moolenaar <Bram@vim.org>
parents: 22594
diff changeset
338
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
339 return abort;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
340 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
341
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
342 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
343 * Set an internal variable to a string value. Creates the variable if it does
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
344 * not already exist.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
345 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
346 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
347 set_internal_string_var(char_u *name, char_u *value)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
348 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
349 char_u *val;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
350 typval_T *tvp;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
351
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
352 val = vim_strsave(value);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
353 if (val != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
354 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
355 tvp = alloc_string_tv(val);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
356 if (tvp != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
357 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
358 set_var(name, tvp, FALSE);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
359 free_tv(tvp);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
360 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
361 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
362 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
363
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
364 int
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
365 eval_charconvert(
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
366 char_u *enc_from,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
367 char_u *enc_to,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
368 char_u *fname_from,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
369 char_u *fname_to)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
370 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
371 int err = FALSE;
27330
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
372 sctx_T saved_sctx = current_sctx;
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
373 sctx_T *ctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
374
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
375 set_vim_var_string(VV_CC_FROM, enc_from, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
376 set_vim_var_string(VV_CC_TO, enc_to, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
377 set_vim_var_string(VV_FNAME_IN, fname_from, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
378 set_vim_var_string(VV_FNAME_OUT, fname_to, -1);
27330
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
379 ctx = get_option_sctx("charconvert");
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
380 if (ctx != NULL)
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
381 current_sctx = *ctx;
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
382
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
383 if (eval_to_bool(p_ccv, &err, NULL, FALSE))
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
384 err = TRUE;
27330
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
385
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
386 set_vim_var_string(VV_CC_FROM, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
387 set_vim_var_string(VV_CC_TO, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
388 set_vim_var_string(VV_FNAME_IN, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
389 set_vim_var_string(VV_FNAME_OUT, NULL, -1);
27330
aeadf4315bef patch 8.2.4193: cannot use an import in 'charconvert'
Bram Moolenaar <Bram@vim.org>
parents: 27328
diff changeset
390 current_sctx = saved_sctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
391
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
392 if (err)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
393 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
394 return OK;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
395 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
396
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
397 # if defined(FEAT_POSTSCRIPT) || defined(PROTO)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
398 int
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
399 eval_printexpr(char_u *fname, char_u *args)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
400 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
401 int err = FALSE;
27328
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
402 sctx_T saved_sctx = current_sctx;
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
403 sctx_T *ctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
404
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
405 set_vim_var_string(VV_FNAME_IN, fname, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
406 set_vim_var_string(VV_CMDARG, args, -1);
27328
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
407 ctx = get_option_sctx("printexpr");
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
408 if (ctx != NULL)
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
409 current_sctx = *ctx;
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
410
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
411 if (eval_to_bool(p_pexpr, &err, NULL, FALSE))
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
412 err = TRUE;
27328
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
413
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
414 set_vim_var_string(VV_FNAME_IN, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
415 set_vim_var_string(VV_CMDARG, NULL, -1);
27328
7382135dac01 patch 8.2.4192: cannot use an import in 'printexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27315
diff changeset
416 current_sctx = saved_sctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
417
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
418 if (err)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
419 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
420 mch_remove(fname);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
421 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
422 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
423 return OK;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
424 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
425 # endif
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
426
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
427 # if defined(FEAT_DIFF) || defined(PROTO)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
428 void
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
429 eval_diff(
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
430 char_u *origfile,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
431 char_u *newfile,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
432 char_u *outfile)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
433 {
27305
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
434 sctx_T saved_sctx = current_sctx;
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
435 sctx_T *ctx;
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
436 typval_T *tv;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
437
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
438 set_vim_var_string(VV_FNAME_IN, origfile, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
439 set_vim_var_string(VV_FNAME_NEW, newfile, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
440 set_vim_var_string(VV_FNAME_OUT, outfile, -1);
27305
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
441
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
442 ctx = get_option_sctx("diffexpr");
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
443 if (ctx != NULL)
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
444 current_sctx = *ctx;
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
445
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
446 // errors are ignored
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
447 tv = eval_expr(p_dex, NULL);
27307
bb36a04d7e34 patch 8.2.4182: memory leak when evaluating 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27305
diff changeset
448 free_tv(tv);
27305
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
449
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
450 set_vim_var_string(VV_FNAME_IN, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
451 set_vim_var_string(VV_FNAME_NEW, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
452 set_vim_var_string(VV_FNAME_OUT, NULL, -1);
27305
30d8437ad7cc patch 8.2.4181: Vim9: cannot use an import in 'diffexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27285
diff changeset
453 current_sctx = saved_sctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
454 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
455
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
456 void
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
457 eval_patch(
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
458 char_u *origfile,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
459 char_u *difffile,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
460 char_u *outfile)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
461 {
27315
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
462 sctx_T saved_sctx = current_sctx;
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
463 sctx_T *ctx;
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
464 typval_T *tv;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
465
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
466 set_vim_var_string(VV_FNAME_IN, origfile, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
467 set_vim_var_string(VV_FNAME_DIFF, difffile, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
468 set_vim_var_string(VV_FNAME_OUT, outfile, -1);
27315
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
469
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
470 ctx = get_option_sctx("patchexpr");
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
471 if (ctx != NULL)
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
472 current_sctx = *ctx;
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
473
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
474 // errors are ignored
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
475 tv = eval_expr(p_pex, NULL);
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
476 free_tv(tv);
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
477
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
478 set_vim_var_string(VV_FNAME_IN, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
479 set_vim_var_string(VV_FNAME_DIFF, NULL, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
480 set_vim_var_string(VV_FNAME_OUT, NULL, -1);
27315
a195a900a329 patch 8.2.4186: cannot use an import in 'patchexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27307
diff changeset
481 current_sctx = saved_sctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
482 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
483 # endif
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
484
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
485 #if defined(FEAT_SPELL) || defined(PROTO)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
486 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
487 * Evaluate an expression to a list with suggestions.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
488 * For the "expr:" part of 'spellsuggest'.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
489 * Returns NULL when there is an error.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
490 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
491 list_T *
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
492 eval_spell_expr(char_u *badword, char_u *expr)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
493 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
494 typval_T save_val;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
495 typval_T rettv;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
496 list_T *list = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
497 char_u *p = skipwhite(expr);
27338
c62006deb5c1 patch 8.2.4197: cannot use an import in the "expr" part of 'spellsuggest'
Bram Moolenaar <Bram@vim.org>
parents: 27330
diff changeset
498 sctx_T saved_sctx = current_sctx;
c62006deb5c1 patch 8.2.4197: cannot use an import in the "expr" part of 'spellsuggest'
Bram Moolenaar <Bram@vim.org>
parents: 27330
diff changeset
499 sctx_T *ctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
500
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
501 // Set "v:val" to the bad word.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
502 prepare_vimvar(VV_VAL, &save_val);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
503 set_vim_var_string(VV_VAL, badword, -1);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
504 if (p_verbose == 0)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
505 ++emsg_off;
27338
c62006deb5c1 patch 8.2.4197: cannot use an import in the "expr" part of 'spellsuggest'
Bram Moolenaar <Bram@vim.org>
parents: 27330
diff changeset
506 ctx = get_option_sctx("spellsuggest");
c62006deb5c1 patch 8.2.4197: cannot use an import in the "expr" part of 'spellsuggest'
Bram Moolenaar <Bram@vim.org>
parents: 27330
diff changeset
507 if (ctx != NULL)
c62006deb5c1 patch 8.2.4197: cannot use an import in the "expr" part of 'spellsuggest'
Bram Moolenaar <Bram@vim.org>
parents: 27330
diff changeset
508 current_sctx = *ctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
509
20992
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20953
diff changeset
510 if (eval1(&p, &rettv, &EVALARG_EVALUATE) == OK)
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
511 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
512 if (rettv.v_type != VAR_LIST)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
513 clear_tv(&rettv);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
514 else
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
515 list = rettv.vval.v_list;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
516 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
517
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
518 if (p_verbose == 0)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
519 --emsg_off;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
520 clear_tv(get_vim_var_tv(VV_VAL));
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
521 restore_vimvar(VV_VAL, &save_val);
27338
c62006deb5c1 patch 8.2.4197: cannot use an import in the "expr" part of 'spellsuggest'
Bram Moolenaar <Bram@vim.org>
parents: 27330
diff changeset
522 current_sctx = saved_sctx;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
523
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
524 return list;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
525 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
526
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
527 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
528 * "list" is supposed to contain two items: a word and a number. Return the
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
529 * word in "pp" and the number as the return value.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
530 * Return -1 if anything isn't right.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
531 * Used to get the good word and score from the eval_spell_expr() result.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
532 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
533 int
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
534 get_spellword(list_T *list, char_u **pp)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
535 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
536 listitem_T *li;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
537
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
538 li = list->lv_first;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
539 if (li == NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
540 return -1;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
541 *pp = tv_get_string(&li->li_tv);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
542
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
543 li = li->li_next;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
544 if (li == NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
545 return -1;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
546 return (int)tv_get_number(&li->li_tv);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
547 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
548 #endif
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
549
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
550 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
551 * Prepare v: variable "idx" to be used.
17944
745c02392844 patch 8.1.1968: crash when using nested map()
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
552 * Save the current typeval in "save_tv" and clear it.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
553 * When not used yet add the variable to the v: hashtable.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
554 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
555 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
556 prepare_vimvar(int idx, typval_T *save_tv)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
557 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
558 *save_tv = vimvars[idx].vv_tv;
17944
745c02392844 patch 8.1.1968: crash when using nested map()
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
559 vimvars[idx].vv_str = NULL; // don't free it now
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
560 if (vimvars[idx].vv_tv_type == VAR_UNKNOWN)
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
561 hash_add(&vimvarht, vimvars[idx].vv_di.di_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
562 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
563
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
564 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
565 * Restore v: variable "idx" to typeval "save_tv".
17944
745c02392844 patch 8.1.1968: crash when using nested map()
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
566 * Note that the v: variable must have been cleared already.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
567 * When no longer defined, remove the variable from the v: hashtable.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
568 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
569 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
570 restore_vimvar(int idx, typval_T *save_tv)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
571 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
572 hashitem_T *hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
573
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
574 vimvars[idx].vv_tv = *save_tv;
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
575 if (vimvars[idx].vv_tv_type == VAR_UNKNOWN)
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
576 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
577 hi = hash_find(&vimvarht, vimvars[idx].vv_di.di_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
578 if (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
579 internal_error("restore_vimvar()");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
580 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
581 hash_remove(&vimvarht, hi);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
582 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
583 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
584
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
585 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
586 * List Vim variables.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
587 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
588 static void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
589 list_vim_vars(int *first)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
590 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
591 list_hashtable_vars(&vimvarht, "v:", FALSE, first);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
592 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
593
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
594 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
595 * List script-local variables, if there is a script.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
596 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
597 static void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
598 list_script_vars(int *first)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
599 {
21979
a98211c3e14e patch 8.2.1539: using invalid script ID causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 21955
diff changeset
600 if (SCRIPT_ID_VALID(current_sctx.sc_sid))
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
601 list_hashtable_vars(&SCRIPT_VARS(current_sctx.sc_sid),
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
602 "s:", FALSE, first);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
603 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
604
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
605 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 * Get a list of lines from a HERE document. The here document is a list of
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 * lines surrounded by a marker.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 * cmd << {marker}
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609 * {line1}
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 * {line2}
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 * ....
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 * {marker}
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 * The {marker} is a string. If the optional 'trim' word is supplied before the
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 * marker, then the leading indentation before the lines (matching the
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 * indentation in the 'cmd' line) is stripped.
20045
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
617 *
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
618 * When getting lines for an embedded script (e.g. python, lua, perl, ruby,
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
619 * tcl, mzscheme), script_get is set to TRUE. In this case, if the marker is
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
620 * missing, then '.' is accepted as a marker.
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
621 *
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 * Returns a List with {lines} or NULL.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 */
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
624 list_T *
20045
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
625 heredoc_get(exarg_T *eap, char_u *cmd, int script_get)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 char_u *theline;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 char_u *marker;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 list_T *l;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 char_u *p;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 int marker_indent_len = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 int text_indent_len = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 char_u *text_indent = NULL;
20045
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
634 char_u dot[] = ".";
22413
66d1131a7eff patch 8.2.1755: Vim9: crash when using invalid heredoc marker
Bram Moolenaar <Bram@vim.org>
parents: 22409
diff changeset
635 int comment_char = in_vim9script() ? '#' : '"';
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 if (eap->getline == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
639 emsg(_(e_cannot_use_heredoc_here));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 // Check for the optional 'trim' word before the marker
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 cmd = skipwhite(cmd);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 if (STRNCMP(cmd, "trim", 4) == 0 && (cmd[4] == NUL || VIM_ISWHITE(cmd[4])))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 cmd = skipwhite(cmd + 4);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 // Trim the indentation from all the lines in the here document.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 // The amount of indentation trimmed is the same as the indentation of
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 // the first line after the :let command line. To find the end marker
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 // the indent of the :let command line is trimmed.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 p = *eap->cmdlinep;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 while (VIM_ISWHITE(*p))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656 p++;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 marker_indent_len++;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 text_indent_len = -1;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 // The marker is the next word.
22413
66d1131a7eff patch 8.2.1755: Vim9: crash when using invalid heredoc marker
Bram Moolenaar <Bram@vim.org>
parents: 22409
diff changeset
663 if (*cmd != NUL && *cmd != comment_char)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 marker = skipwhite(cmd);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666 p = skiptowhite(marker);
22413
66d1131a7eff patch 8.2.1755: Vim9: crash when using invalid heredoc marker
Bram Moolenaar <Bram@vim.org>
parents: 22409
diff changeset
667 if (*skipwhite(p) != NUL && *skipwhite(p) != comment_char)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 {
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26881
diff changeset
669 semsg(_(e_trailing_characters_str), p);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 *p = NUL;
20233
5f9c2c7d3d73 patch 8.2.0672: heredoc in scripts does not accept lower case marker
Bram Moolenaar <Bram@vim.org>
parents: 20148
diff changeset
673 if (!script_get && vim_islower(*marker))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 {
26861
df2de1e63de0 patch 8.2.3959: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26857
diff changeset
675 emsg(_(e_marker_cannot_start_with_lower_case_letter));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 {
20045
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
681 // When getting lines for an embedded script, if the marker is missing,
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
682 // accept '.' as the marker.
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
683 if (script_get)
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
684 marker = dot;
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
685 else
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
686 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26723
diff changeset
687 emsg(_(e_missing_marker));
20045
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
688 return NULL;
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
689 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 l = list_alloc();
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 if (l == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 for (;;)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 int mi = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 int ti = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701 theline = eap->getline(NUL, eap->cookie, 0, FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 if (theline == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
704 semsg(_(e_missing_end_marker_str), marker);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 // with "trim": skip the indent matching the :let line to find the
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709 // marker
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 if (marker_indent_len > 0
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 && STRNCMP(theline, *eap->cmdlinep, marker_indent_len) == 0)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 mi = marker_indent_len;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 if (STRCMP(marker, theline + mi) == 0)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 vim_free(theline);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 if (text_indent_len == -1 && *theline != NUL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 // set the text indent from the first line.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 p = theline;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 text_indent_len = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 while (VIM_ISWHITE(*p))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 p++;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 text_indent_len++;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 text_indent = vim_strnsave(theline, text_indent_len);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 // with "trim": skip the indent matching the first line
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 if (text_indent != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 for (ti = 0; ti < text_indent_len; ++ti)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 if (theline[ti] != text_indent[ti])
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 if (list_append_string(l, theline + ti, -1) == FAIL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 vim_free(theline);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 vim_free(text_indent);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743 return l;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 /*
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
747 * Vim9 variable declaration:
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
748 * ":var name"
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
749 * ":var name: type"
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
750 * ":var name = expr"
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
751 * ":var name: type = expr"
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
752 * etc.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
753 */
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
754 void
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
755 ex_var(exarg_T *eap)
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
756 {
27966
80f398bfc19f patch 8.2.4508: Vim9: cannot assign to a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27950
diff changeset
757 char_u *p = eap->cmd;
27968
40c6e5f849dc patch 8.2.4509: Vim9: can declare a variable with ":va"
Bram Moolenaar <Bram@vim.org>
parents: 27966
diff changeset
758 int has_var;
27966
80f398bfc19f patch 8.2.4508: Vim9: cannot assign to a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27950
diff changeset
759
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
760 if (!in_vim9script())
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
761 {
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
762 semsg(_(e_str_cannot_be_used_in_legacy_vim_script), ":var");
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
763 return;
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
764 }
27968
40c6e5f849dc patch 8.2.4509: Vim9: can declare a variable with ":va"
Bram Moolenaar <Bram@vim.org>
parents: 27966
diff changeset
765 has_var = checkforcmd_noparen(&p, "var", 3);
40c6e5f849dc patch 8.2.4509: Vim9: can declare a variable with ":va"
Bram Moolenaar <Bram@vim.org>
parents: 27966
diff changeset
766 if (current_sctx.sc_sid == 0 && has_var)
27950
aacc98a38cf3 patch 8.2.4500: Vim9: can declare a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27934
diff changeset
767 {
aacc98a38cf3 patch 8.2.4500: Vim9: can declare a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27934
diff changeset
768 emsg(_(e_cannot_declare_variable_on_command_line));
aacc98a38cf3 patch 8.2.4500: Vim9: can declare a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27934
diff changeset
769 return;
aacc98a38cf3 patch 8.2.4500: Vim9: can declare a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27934
diff changeset
770 }
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
771 ex_let(eap);
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
772 }
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
773
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
774 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 * ":let" list all variable values
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776 * ":let var1 var2" list variable values
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
777 * ":let var = expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 * ":let var += expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779 * ":let var -= expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 * ":let var *= expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 * ":let var /= expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 * ":let var %= expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 * ":let var .= expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 * ":let var ..= expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 * ":let [var1, var2] = expr" unpack list.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
786 * ":let var =<< ..." heredoc
19524
4a6a412e4565 patch 8.2.0319: file missing in distribution, comments outdated
Bram Moolenaar <Bram@vim.org>
parents: 19477
diff changeset
787 * ":let var: string" Vim9 declaration
20536
8fa783f2c69c patch 8.2.0822: Vim9: code left over from discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20530
diff changeset
788 *
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
789 * ":final var = expr" assignment command.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
790 * ":final [var1, var2] = expr" unpack list.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
791 *
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 * ":const" list all variable values
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 * ":const var1 var2" list variable values
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794 * ":const var = expr" assignment command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 * ":const [var1, var2] = expr" unpack list.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 void
20536
8fa783f2c69c patch 8.2.0822: Vim9: code left over from discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20530
diff changeset
798 ex_let(exarg_T *eap)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 char_u *arg = eap->arg;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 char_u *expr = NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 typval_T rettv;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 int i;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 int var_count = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 int semicolon = 0;
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
806 char_u op[4];
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 char_u *argend;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 int first = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 int concat;
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
810 int has_assign;
23297
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
811 int flags = 0;
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
812 int vim9script = in_vim9script();
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
813
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
814 if (eap->cmdidx == CMD_final && !vim9script)
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
815 {
23297
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
816 // In legacy Vim script ":final" is short for ":finally".
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
817 ex_finally(eap);
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
818 return;
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
819 }
22667
87987c783087 patch 8.2.1882: Vim9: v:disallow_let is no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 22602
diff changeset
820 if (eap->cmdidx == CMD_let && vim9script)
22415
1cefe1c013ac patch 8.2.1756: Vim9: :let will soon be disallowed
Bram Moolenaar <Bram@vim.org>
parents: 22413
diff changeset
821 {
1cefe1c013ac patch 8.2.1756: Vim9: :let will soon be disallowed
Bram Moolenaar <Bram@vim.org>
parents: 22413
diff changeset
822 emsg(_(e_cannot_use_let_in_vim9_script));
1cefe1c013ac patch 8.2.1756: Vim9: :let will soon be disallowed
Bram Moolenaar <Bram@vim.org>
parents: 22413
diff changeset
823 return;
1cefe1c013ac patch 8.2.1756: Vim9: :let will soon be disallowed
Bram Moolenaar <Bram@vim.org>
parents: 22413
diff changeset
824 }
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
825
23297
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
826 if (eap->cmdidx == CMD_const)
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
827 flags |= ASSIGN_CONST;
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
828 else if (eap->cmdidx == CMD_final)
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
829 flags |= ASSIGN_FINAL;
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
830
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
831 // Vim9 assignment without ":let", ":const" or ":final"
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
832 if (eap->arg == eap->cmd)
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
833 flags |= ASSIGN_NO_DECL;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
834
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
835 argend = skip_var_list(arg, TRUE, &var_count, &semicolon, FALSE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 if (argend == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 return;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 if (argend > arg && argend[-1] == '.') // for var.='str'
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 --argend;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 expr = skipwhite(argend);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 concat = expr[0] == '.'
25622
15b54e0a576b patch 8.2.3347: check for legacy script is incomplete
Bram Moolenaar <Bram@vim.org>
parents: 25613
diff changeset
842 && ((expr[1] == '=' && in_old_script(2))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 || (expr[1] == '.' && expr[2] == '='));
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
844 has_assign = *expr == '=' || (vim_strchr((char_u *)"+-*/%", *expr) != NULL
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
845 && expr[1] == '=');
20528
489cb75c76b6 patch 8.2.0818: Vim9: using a discovery phase doesn't work well
Bram Moolenaar <Bram@vim.org>
parents: 20397
diff changeset
846 if (!has_assign && !concat)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 // ":let" without "=": list variables
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 if (*arg == '[')
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
850 emsg(_(e_invalid_argument));
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
851 else if (expr[0] == '.' && expr[1] == '=')
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
852 emsg(_(e_dot_equal_not_supported_with_script_version_two));
20111
f40231487a49 patch 8.2.0611: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 20103
diff changeset
853 else if (!ends_excmd2(eap->cmd, arg))
20840
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
854 {
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
855 if (vim9script)
20840
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
856 {
24238
e5cd25f7ffcd patch 8.2.2660: Vim9: no error for declaration with trailing text
Bram Moolenaar <Bram@vim.org>
parents: 24124
diff changeset
857 if (!ends_excmd2(eap->cmd, skipwhite(argend)))
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26881
diff changeset
858 semsg(_(e_trailing_characters_str), argend);
24238
e5cd25f7ffcd patch 8.2.2660: Vim9: no error for declaration with trailing text
Bram Moolenaar <Bram@vim.org>
parents: 24124
diff changeset
859 else
e5cd25f7ffcd patch 8.2.2660: Vim9: no error for declaration with trailing text
Bram Moolenaar <Bram@vim.org>
parents: 24124
diff changeset
860 // Vim9 declaration ":var name: type"
e5cd25f7ffcd patch 8.2.2660: Vim9: no error for declaration with trailing text
Bram Moolenaar <Bram@vim.org>
parents: 24124
diff changeset
861 arg = vim9_declare_scriptvar(eap, arg);
20840
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
862 }
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
863 else
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
864 {
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
865 // ":let var1 var2" - list values
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
866 arg = list_arg_vars(eap, arg, &first);
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
867 }
0600ab7b9f09 patch 8.2.0972: Vim9 script variable declarations need a type
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
868 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 else if (!eap->skip)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 // ":let"
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
872 list_glob_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
873 list_buf_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
874 list_win_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 list_tab_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 list_script_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 list_func_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 list_vim_vars(&first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 }
25521
2063b858cad9 patch 8.2.3297: cannot use all commands inside a {} block
Bram Moolenaar <Bram@vim.org>
parents: 25405
diff changeset
880 set_nextcmd(eap, arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 else if (expr[0] == '=' && expr[1] == '<' && expr[2] == '<')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884 list_T *l;
25405
747ebbce2421 patch 8.2.3239: Vim9: no error using heredoc for a number variable
Bram Moolenaar <Bram@vim.org>
parents: 25358
diff changeset
885 long cur_lnum = SOURCING_LNUM;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 // HERE document
20045
04ef2ccf2519 patch 8.2.0578: heredoc for interfaces does not support "trim"
Bram Moolenaar <Bram@vim.org>
parents: 19962
diff changeset
888 l = heredoc_get(eap, expr + 3, FALSE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 if (l != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 rettv_list_set(&rettv, l);
18348
9ea364ccf216 patch 8.1.2168: heredoc assignment not skipped in if block
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
892 if (!eap->skip)
9ea364ccf216 patch 8.1.2168: heredoc assignment not skipped in if block
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
893 {
25405
747ebbce2421 patch 8.2.3239: Vim9: no error using heredoc for a number variable
Bram Moolenaar <Bram@vim.org>
parents: 25358
diff changeset
894 // errors are for the assignment, not the end marker
747ebbce2421 patch 8.2.3239: Vim9: no error using heredoc for a number variable
Bram Moolenaar <Bram@vim.org>
parents: 25358
diff changeset
895 SOURCING_LNUM = cur_lnum;
18348
9ea364ccf216 patch 8.1.2168: heredoc assignment not skipped in if block
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
896 op[0] = '=';
9ea364ccf216 patch 8.1.2168: heredoc assignment not skipped in if block
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
897 op[1] = NUL;
9ea364ccf216 patch 8.1.2168: heredoc assignment not skipped in if block
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
898 (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count,
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
899 flags, op);
18348
9ea364ccf216 patch 8.1.2168: heredoc assignment not skipped in if block
Bram Moolenaar <Bram@vim.org>
parents: 17986
diff changeset
900 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 clear_tv(&rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 {
20992
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20953
diff changeset
906 evalarg_T evalarg;
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
907 int len = 1;
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
908
22202
7899b4e2880c patch 8.2.1650: Vim9: result of && and || expression is not bool in script
Bram Moolenaar <Bram@vim.org>
parents: 22027
diff changeset
909 CLEAR_FIELD(rettv);
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
910 i = FAIL;
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
911 if (has_assign || concat)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 {
23707
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
913 int cur_lnum;
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
914
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
915 op[0] = '=';
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
916 op[1] = NUL;
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
917 if (*expr != '=')
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 {
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
919 if (vim9script && (flags & ASSIGN_NO_DECL) == 0)
21905
2474c6b0c5de patch 8.2.1502: Vim9: can use += with a :let command at script level
Bram Moolenaar <Bram@vim.org>
parents: 21879
diff changeset
920 {
2474c6b0c5de patch 8.2.1502: Vim9: can use += with a :let command at script level
Bram Moolenaar <Bram@vim.org>
parents: 21879
diff changeset
921 // +=, /=, etc. require an existing variable
2474c6b0c5de patch 8.2.1502: Vim9: can use += with a :let command at script level
Bram Moolenaar <Bram@vim.org>
parents: 21879
diff changeset
922 semsg(_(e_cannot_use_operator_on_new_variable), eap->arg);
2474c6b0c5de patch 8.2.1502: Vim9: can use += with a :let command at script level
Bram Moolenaar <Bram@vim.org>
parents: 21879
diff changeset
923 i = FAIL;
2474c6b0c5de patch 8.2.1502: Vim9: can use += with a :let command at script level
Bram Moolenaar <Bram@vim.org>
parents: 21879
diff changeset
924 }
2474c6b0c5de patch 8.2.1502: Vim9: can use += with a :let command at script level
Bram Moolenaar <Bram@vim.org>
parents: 21879
diff changeset
925 else if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL)
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
926 {
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
927 op[0] = *expr; // +=, -=, *=, /=, %= or .=
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
928 ++len;
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
929 if (expr[0] == '.' && expr[1] == '.') // ..=
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
930 {
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
931 ++expr;
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
932 ++len;
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
933 }
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
934 }
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
935 expr += 2;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 }
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
937 else
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
938 ++expr;
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
939
26330
55e658312376 patch 8.2.3696: Vim9: error for invalid assignment when skipping
Bram Moolenaar <Bram@vim.org>
parents: 26317
diff changeset
940 if (vim9script && !eap->skip && (!VIM_ISWHITE(*argend)
21548
4e679db1c404 patch 8.2.1324: Vim9: line break after "=" does not work
Bram Moolenaar <Bram@vim.org>
parents: 21500
diff changeset
941 || !IS_WHITE_OR_NUL(*expr)))
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
942 {
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
943 vim_strncpy(op, expr - len, len);
23446
b1dbbc81a011 patch 8.2.2266: Vim9: it can be hard to see where white space is missing
Bram Moolenaar <Bram@vim.org>
parents: 23438
diff changeset
944 semsg(_(e_white_space_required_before_and_after_str_at_str),
b1dbbc81a011 patch 8.2.2266: Vim9: it can be hard to see where white space is missing
Bram Moolenaar <Bram@vim.org>
parents: 23438
diff changeset
945 op, argend);
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
946 i = FAIL;
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
947 }
20397
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
948
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
949 if (eap->skip)
c225be44692a patch 8.2.0753: Vim9: expressions are evaluated in the discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20392
diff changeset
950 ++emsg_skip;
25358
f03271631eb5 patch 8.2.3216: Vim9: crash when using variable in a loop at script level
Bram Moolenaar <Bram@vim.org>
parents: 25348
diff changeset
951 fill_evalarg_from_eap(&evalarg, eap, eap->skip);
21548
4e679db1c404 patch 8.2.1324: Vim9: line break after "=" does not work
Bram Moolenaar <Bram@vim.org>
parents: 21500
diff changeset
952 expr = skipwhite_and_linebreak(expr, &evalarg);
23707
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
953 cur_lnum = SOURCING_LNUM;
20996
3af71cbcfdbe patch 8.2.1049: Vim9: leaking memory when using continuation line
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
954 i = eval0(expr, &rettv, eap, &evalarg);
20992
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20953
diff changeset
955 if (eap->skip)
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20953
diff changeset
956 --emsg_skip;
21050
7a9daf73a724 patch 8.2.1076: Vim9: no line break allowed in :if expression
Bram Moolenaar <Bram@vim.org>
parents: 21040
diff changeset
957 clear_evalarg(&evalarg, eap);
23707
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
958
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
959 // Restore the line number so that any type error is given for the
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
960 // declaration, not the expression.
6e8a4a30d94d patch 8.2.2395: Vim9: error for wrong type may report wrong line number
Bram Moolenaar <Bram@vim.org>
parents: 23693
diff changeset
961 SOURCING_LNUM = cur_lnum;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 if (eap->skip)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 if (i != FAIL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 clear_tv(&rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 }
20528
489cb75c76b6 patch 8.2.0818: Vim9: using a discovery phase doesn't work well
Bram Moolenaar <Bram@vim.org>
parents: 20397
diff changeset
968 else if (i != FAIL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count,
21447
369cde0d5771 patch 8.2.1274: Vim9: no error for missing white space at script level
Bram Moolenaar <Bram@vim.org>
parents: 21409
diff changeset
971 flags, op);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 clear_tv(&rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977 /*
24051
da8347e453b4 patch 8.2.2567: Vim9: no error if variable is defined for existing function
Bram Moolenaar <Bram@vim.org>
parents: 24049
diff changeset
978 * Assign the typeval "tv" to the variable or variables at "arg_start".
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 * Handles both "var" with any type and "[var, var; var]" with a list type.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 * When "op" is not NULL it points to a string with characters that
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 * must appear after the variable(s). Use "+", "-" or "." for add, subtract
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 * or concatenate.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 * Returns OK or FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 ex_let_vars(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 char_u *arg_start,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 typval_T *tv,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 int copy, // copy values from "tv", don't move
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 int semicolon, // from skip_var_list()
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991 int var_count, // from skip_var_list()
23450
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
992 int flags, // ASSIGN_FINAL, ASSIGN_CONST, etc.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 char_u *op)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 char_u *arg = arg_start;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 list_T *l;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 int i;
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
998 int var_idx = 0;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 listitem_T *item;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 typval_T ltv;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 if (*arg != '[')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 // ":let var = expr" or ":for var in list"
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
1005 if (ex_let_one(arg, tv, copy, flags, op, op, var_idx) == NULL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007 return OK;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 // ":let [v1, v2] = list" or ":for [v1, v2] in listlist"
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 if (tv->v_type != VAR_LIST || (l = tv->vval.v_list) == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
1013 emsg(_(e_list_required));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 i = list_len(l);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 if (semicolon == 0 && var_count < i)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 {
26952
b34ddbca305c patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26915
diff changeset
1020 emsg(_(e_less_targets_than_list_items));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 if (var_count - semicolon > i)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 {
26952
b34ddbca305c patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26915
diff changeset
1025 emsg(_(e_more_targets_than_list_items));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028
20392
4c317d8c1051 patch 8.2.0751: Vim9: performance can be improved
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1029 CHECK_LIST_MATERIALIZE(l);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 item = l->lv_first;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 while (*arg != ']')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 arg = skipwhite(arg + 1);
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
1034 ++var_idx;
24426
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
1035 arg = ex_let_one(arg, &item->li_tv, TRUE,
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
1036 flags | ASSIGN_UNPACK, (char_u *)",;]", op, var_idx);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 item = item->li_next;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038 if (arg == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 arg = skipwhite(arg);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 if (*arg == ';')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 // Put the rest of the list (may be empty) in the var after ';'.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 // Create a new list for this.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 l = list_alloc();
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 if (l == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 while (item != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 list_append_tv(l, &item->li_tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 item = item->li_next;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 ltv.v_type = VAR_LIST;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 ltv.v_lock = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057 ltv.vval.v_list = l;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 l->lv_refcount = 1;
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
1059 ++var_idx;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060
24426
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
1061 arg = ex_let_one(skipwhite(arg + 1), &ltv, FALSE,
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
1062 flags | ASSIGN_UNPACK, (char_u *)"]", op, var_idx);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 clear_tv(&ltv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 if (arg == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068 else if (*arg != ',' && *arg != ']')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 internal_error("ex_let_vars()");
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1074
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1075 return OK;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 * Skip over assignable variable "var" or list of variables "[var, var]".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 * Used for ":let varvar = expr" and ":for varvar in expr".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081 * For "[var, var]" increment "*var_count" for each variable.
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1082 * for "[var, var; var]" set "semicolon" to 1.
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1083 * If "silent" is TRUE do not give an "invalid argument" error message.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 * Return NULL for an error.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086 char_u *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 skip_var_list(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 char_u *arg,
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1089 int include_type,
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 int *var_count,
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1091 int *semicolon,
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1092 int silent)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 char_u *p, *s;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 if (*arg == '[')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 // "[var, var]": find the matching ']'.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 p = arg;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 for (;;)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1101 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 p = skipwhite(p + 1); // skip whites after '[', ';' or ','
23658
c8f26523d7d7 patch 8.2.2371: Vim9: crash when using types in :for with unpack
Bram Moolenaar <Bram@vim.org>
parents: 23598
diff changeset
1103 s = skip_var_one(p, include_type);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 if (s == p)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 {
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1106 if (!silent)
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
1107 semsg(_(e_invalid_argument_str), p);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1110 ++*var_count;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1111
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112 p = skipwhite(s);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1113 if (*p == ']')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1115 else if (*p == ';')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1116 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1117 if (*semicolon == 1)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 {
27738
d754ac2f5ac5 patch 8.2.4395: some code lines not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 27698
diff changeset
1119 if (!silent)
d754ac2f5ac5 patch 8.2.4395: some code lines not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 27698
diff changeset
1120 emsg(_(e_double_semicolon_in_list_of_variables));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 *semicolon = 1;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1124 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125 else if (*p != ',')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 {
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1127 if (!silent)
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
1128 semsg(_(e_invalid_argument_str), p);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 return p + 1;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 else
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1135 return skip_var_one(arg, include_type);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 * Skip one (assignable) variable name, including @r, $VAR, &option, d.key,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 * l[idx].
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1141 * In Vim9 script also skip over ": type" if "include_type" is TRUE.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 */
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1143 char_u *
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1144 skip_var_one(char_u *arg, int include_type)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 {
23660
f8f460738aaa patch 8.2.2372: confusing error message for wrong :let command
Bram Moolenaar <Bram@vim.org>
parents: 23658
diff changeset
1146 char_u *end;
f8f460738aaa patch 8.2.2372: confusing error message for wrong :let command
Bram Moolenaar <Bram@vim.org>
parents: 23658
diff changeset
1147 int vim9 = in_vim9script();
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1148
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 if (*arg == '@' && arg[1] != NUL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150 return arg + 2;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1151 end = find_name_end(*arg == '$' || *arg == '&' ? arg + 1 : arg,
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
23658
c8f26523d7d7 patch 8.2.2371: Vim9: crash when using types in :for with unpack
Bram Moolenaar <Bram@vim.org>
parents: 23598
diff changeset
1153
c8f26523d7d7 patch 8.2.2371: Vim9: crash when using types in :for with unpack
Bram Moolenaar <Bram@vim.org>
parents: 23598
diff changeset
1154 // "a: type" is declaring variable "a" with a type, not "a:".
c8f26523d7d7 patch 8.2.2371: Vim9: crash when using types in :for with unpack
Bram Moolenaar <Bram@vim.org>
parents: 23598
diff changeset
1155 // Same for "s: type".
23660
f8f460738aaa patch 8.2.2372: confusing error message for wrong :let command
Bram Moolenaar <Bram@vim.org>
parents: 23658
diff changeset
1156 if (vim9 && end == arg + 2 && end[-1] == ':')
23658
c8f26523d7d7 patch 8.2.2371: Vim9: crash when using types in :for with unpack
Bram Moolenaar <Bram@vim.org>
parents: 23598
diff changeset
1157 --end;
c8f26523d7d7 patch 8.2.2371: Vim9: crash when using types in :for with unpack
Bram Moolenaar <Bram@vim.org>
parents: 23598
diff changeset
1158
23660
f8f460738aaa patch 8.2.2372: confusing error message for wrong :let command
Bram Moolenaar <Bram@vim.org>
parents: 23658
diff changeset
1159 if (include_type && vim9)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1160 {
20859
876e16c48bd1 patch 8.2.0981: Vim9: cannot compile "[var, var] = list"
Bram Moolenaar <Bram@vim.org>
parents: 20842
diff changeset
1161 if (*end == ':')
21500
574517d682cf patch 8.2.1300: Vim9: optional argument type not parsed properly
Bram Moolenaar <Bram@vim.org>
parents: 21461
diff changeset
1162 end = skip_type(skipwhite(end + 1), FALSE);
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1163 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1164 return end;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168 * List variables for hashtab "ht" with prefix "prefix".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 * If "empty" is TRUE also list NULL strings as empty strings.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1170 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1171 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 list_hashtable_vars(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 hashtab_T *ht,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 char *prefix,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 int empty,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178 hashitem_T *hi;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 dictitem_T *di;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 int todo;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 char_u buf[IOSIZE];
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 todo = (int)ht->ht_used;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 for (hi = ht->ht_array; todo > 0 && !got_int; ++hi)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 if (!HASHITEM_EMPTY(hi))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 --todo;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 di = HI2DI(hi);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 // apply :filter /pat/ to variable name
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 vim_strncpy((char_u *)buf, (char_u *)prefix, IOSIZE - 1);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 vim_strcat((char_u *)buf, di->di_key, IOSIZE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 if (message_filtered(buf))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 continue;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 if (empty || di->di_tv.v_type != VAR_STRING
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 || di->di_tv.vval.v_string != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 list_one_var(di, prefix, first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 * List global variables.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 list_glob_vars(int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 list_hashtable_vars(&globvarht, "", TRUE, first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 * List buffer variables.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 list_buf_vars(int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 list_hashtable_vars(&curbuf->b_vars->dv_hashtab, "b:", TRUE, first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 * List window variables.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226 list_win_vars(int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 list_hashtable_vars(&curwin->w_vars->dv_hashtab, "w:", TRUE, first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 * List tab page variables.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 list_tab_vars(int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237 list_hashtable_vars(&curtab->tp_vars->dv_hashtab, "t:", TRUE, first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241 * List variables in "arg".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 static char_u *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 list_arg_vars(exarg_T *eap, char_u *arg, int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 int error = FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 int len;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248 char_u *name;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 char_u *name_start;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 char_u *arg_subsc;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 char_u *tofree;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252 typval_T tv;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253
20111
f40231487a49 patch 8.2.0611: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 20103
diff changeset
1254 while (!ends_excmd2(eap->cmd, arg) && !got_int)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 if (error || eap->skip)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 arg = find_name_end(arg, NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 if (!VIM_ISWHITE(*arg) && !ends_excmd(*arg))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261 emsg_severe = TRUE;
25613
994cad298596 patch 8.2.3343: Vim9: autoload test fails
Bram Moolenaar <Bram@vim.org>
parents: 25611
diff changeset
1262 if (!did_emsg)
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26881
diff changeset
1263 semsg(_(e_trailing_characters_str), arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1267 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 // get_name_len() takes care of expanding curly braces
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 name_start = name = arg;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271 len = get_name_len(&arg, &tofree, TRUE, TRUE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 if (len <= 0)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274 // This is mainly to keep test 49 working: when expanding
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1275 // curly braces fails overrule the exception error message.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 if (len < 0 && !aborting())
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1278 emsg_severe = TRUE;
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
1279 semsg(_(e_invalid_argument_str), arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 error = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 {
21630
3c6c52fbc8ea patch 8.2.1365: Vim9: no error for missing white space around operator
Bram Moolenaar <Bram@vim.org>
parents: 21610
diff changeset
1286 arg = skipwhite(arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 if (tofree != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 name = tofree;
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
1289 if (eval_variable(name, len, 0, &tv, NULL,
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
1290 EVAL_VAR_VERBOSE) == FAIL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 error = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294 // handle d.key, l[idx], f(expr)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295 arg_subsc = arg;
26990
4b8d836db103 patch 8.2.4024: confusing error message if imported name is used directly
Bram Moolenaar <Bram@vim.org>
parents: 26980
diff changeset
1296 if (handle_subscript(&arg, name_start, &tv,
4b8d836db103 patch 8.2.4024: confusing error message if imported name is used directly
Bram Moolenaar <Bram@vim.org>
parents: 26980
diff changeset
1297 &EVALARG_EVALUATE, TRUE) == FAIL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 error = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301 if (arg == arg_subsc && len == 2 && name[1] == ':')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 switch (*name)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 case 'g': list_glob_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 case 'b': list_buf_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 case 'w': list_win_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 case 't': list_tab_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 case 'v': list_vim_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 case 's': list_script_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1311 case 'l': list_func_vars(first); break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1312 default:
26952
b34ddbca305c patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26915
diff changeset
1313 semsg(_(e_cant_list_variables_for_str), name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1314 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1315 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1316 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1317 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1318 char_u numbuf[NUMBUFLEN];
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 char_u *tf;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1320 int c;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1321 char_u *s;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1322
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1323 s = echo_string(&tv, &tf, numbuf, 0);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324 c = *arg;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 *arg = NUL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 list_one_var_a("",
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1327 arg == arg_subsc ? name : name_start,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 tv.v_type,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 s == NULL ? (char_u *)"" : s,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330 first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331 *arg = c;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 vim_free(tf);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1334 clear_tv(&tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1336 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1337 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1339 vim_free(tofree);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1342 arg = skipwhite(arg);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1343 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1344
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1345 return arg;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1347
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1348 /*
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1349 * Set an environment variable, part of ex_let_one().
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1350 */
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1351 static char_u *
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1352 ex_let_env(
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1353 char_u *arg,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1354 typval_T *tv,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1355 int flags,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1356 char_u *endchars,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1357 char_u *op)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1358 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1359 char_u *arg_end = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1360 char_u *name;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1361 int len;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1362
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1363 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1364 && (flags & ASSIGN_FOR_LOOP) == 0)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1365 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
1366 emsg(_(e_cannot_lock_environment_variable));
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1367 return NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1368 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1369
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1370 // Find the end of the name.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1371 ++arg;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1372 name = arg;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1373 len = get_env_len(&arg);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1374 if (len == 0)
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
1375 semsg(_(e_invalid_argument_str), name - 1);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1376 else
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1377 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1378 if (op != NULL && vim_strchr((char_u *)"+-*/%", *op) != NULL)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
1379 semsg(_(e_wrong_variable_type_for_str_equal), op);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1380 else if (endchars != NULL
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1381 && vim_strchr(endchars, *skipwhite(arg)) == NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1382 emsg(_(e_unexpected_characters_in_let));
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1383 else if (!check_secure())
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1384 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1385 char_u *tofree = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1386 int c1 = name[len];
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1387 char_u *p;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1388
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1389 name[len] = NUL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1390 p = tv_get_string_chk(tv);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1391 if (p != NULL && op != NULL && *op == '.')
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1392 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1393 int mustfree = FALSE;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1394 char_u *s = vim_getenv(name, &mustfree);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1395
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1396 if (s != NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1397 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1398 p = tofree = concat_str(s, p);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1399 if (mustfree)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1400 vim_free(s);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1401 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1402 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1403 if (p != NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1404 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1405 vim_setenv_ext(name, p);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1406 arg_end = arg;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1407 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1408 name[len] = c1;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1409 vim_free(tofree);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1410 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1411 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1412 return arg_end;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1413 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1414
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1415 /*
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1416 * Set an option, part of ex_let_one().
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1417 */
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1418 static char_u *
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1419 ex_let_option(
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1420 char_u *arg,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1421 typval_T *tv,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1422 int flags,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1423 char_u *endchars,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1424 char_u *op)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1425 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1426 char_u *p;
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1427 int scope;
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1428 char_u *arg_end = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1429
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1430 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1431 && (flags & ASSIGN_FOR_LOOP) == 0)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1432 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
1433 emsg(_(e_cannot_lock_option));
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1434 return NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1435 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1436
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1437 // Find the end of the name.
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1438 p = find_option_end(&arg, &scope);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1439 if (p == NULL || (endchars != NULL
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1440 && vim_strchr(endchars, *skipwhite(p)) == NULL))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1441 emsg(_(e_unexpected_characters_in_let));
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1442 else
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1443 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1444 int c1;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1445 long n = 0;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1446 getoption_T opt_type;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1447 long numval;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1448 char_u *stringval = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1449 char_u *s = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1450 int failed = FALSE;
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1451 int opt_p_flags;
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1452 char_u *tofree = NULL;
26450
aea4d5e1e9d5 patch 8.2.3755: Coverity warns for using a buffer in another scope
Bram Moolenaar <Bram@vim.org>
parents: 26441
diff changeset
1453 char_u numbuf[NUMBUFLEN];
aea4d5e1e9d5 patch 8.2.3755: Coverity warns for using a buffer in another scope
Bram Moolenaar <Bram@vim.org>
parents: 26441
diff changeset
1454
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1455 c1 = *p;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1456 *p = NUL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1457
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1458 opt_type = get_option_value(arg, &numval, &stringval, &opt_p_flags,
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1459 scope);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1460 if ((opt_type == gov_bool
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1461 || opt_type == gov_number
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1462 || opt_type == gov_hidden_bool
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1463 || opt_type == gov_hidden_number)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1464 && (tv->v_type != VAR_STRING || !in_vim9script()))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1465 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1466 if (opt_type == gov_bool || opt_type == gov_hidden_bool)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1467 // bool, possibly hidden
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1468 n = (long)tv_get_bool(tv);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1469 else
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1470 // number, possibly hidden
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1471 n = (long)tv_get_number(tv);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1472 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1473
26528
4d8226001391 patch 8.2.3793: using "g:Func" as a funcref does not work in script context
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
1474 if ((opt_p_flags & P_FUNC) && (tv->v_type == VAR_PARTIAL
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1475 || tv->v_type == VAR_FUNC))
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1476 {
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1477 // If the option can be set to a function reference or a lambda
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1478 // and the passed value is a function reference, then convert it to
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1479 // the name (string) of the function reference.
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1480 s = tv2string(tv, &tofree, numbuf, 0);
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1481 }
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1482 // Avoid setting a string option to the text "v:false" or similar.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1483 // In Vim9 script also don't convert a number to string.
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1484 else if (tv->v_type != VAR_BOOL && tv->v_type != VAR_SPECIAL
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1485 && (!in_vim9script() || tv->v_type != VAR_NUMBER))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1486 s = tv_get_string_chk(tv);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1487
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1488 if (op != NULL && *op != '=')
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1489 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1490 if (((opt_type == gov_bool || opt_type == gov_number) && *op == '.')
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1491 || (opt_type == gov_string && *op != '.'))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1492 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
1493 semsg(_(e_wrong_variable_type_for_str_equal), op);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1494 failed = TRUE; // don't set the value
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1495
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1496 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1497 else
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1498 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1499 // number, in legacy script also bool
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1500 if (opt_type == gov_number
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1501 || (opt_type == gov_bool && !in_vim9script()))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1502 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1503 switch (*op)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1504 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1505 case '+': n = numval + n; break;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1506 case '-': n = numval - n; break;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1507 case '*': n = numval * n; break;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1508 case '/': n = (long)num_divide(numval, n,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1509 &failed); break;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1510 case '%': n = (long)num_modulus(numval, n,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1511 &failed); break;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1512 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1513 s = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1514 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1515 else if (opt_type == gov_string
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1516 && stringval != NULL && s != NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1517 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1518 // string
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1519 s = concat_str(stringval, s);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1520 vim_free(stringval);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1521 stringval = s;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1522 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1523 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1524 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1525
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1526 if (!failed)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1527 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1528 if (opt_type != gov_string || s != NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1529 {
27934
c8d6c2736796 patch 8.2.4492: no error if an option is given a value with ":let &opt = val"
Bram Moolenaar <Bram@vim.org>
parents: 27924
diff changeset
1530 char *err = set_option_value(arg, n, s, scope);
c8d6c2736796 patch 8.2.4492: no error if an option is given a value with ":let &opt = val"
Bram Moolenaar <Bram@vim.org>
parents: 27924
diff changeset
1531
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1532 arg_end = p;
27934
c8d6c2736796 patch 8.2.4492: no error if an option is given a value with ":let &opt = val"
Bram Moolenaar <Bram@vim.org>
parents: 27924
diff changeset
1533 if (err != NULL)
c8d6c2736796 patch 8.2.4492: no error if an option is given a value with ":let &opt = val"
Bram Moolenaar <Bram@vim.org>
parents: 27924
diff changeset
1534 emsg(_(err));
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1535 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1536 else
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
1537 emsg(_(e_string_required));
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1538 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1539 *p = c1;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1540 vim_free(stringval);
26441
65ab0b035dd8 patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents: 26330
diff changeset
1541 vim_free(tofree);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1542 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1543 return arg_end;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1544 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1545
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1546 /*
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1547 * Set a register, part of ex_let_one().
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1548 */
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1549 static char_u *
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1550 ex_let_register(
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1551 char_u *arg,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1552 typval_T *tv,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1553 int flags,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1554 char_u *endchars,
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1555 char_u *op)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1556 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1557 char_u *arg_end = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1558
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1559 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1560 && (flags & ASSIGN_FOR_LOOP) == 0)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1561 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
1562 emsg(_(e_cannot_lock_register));
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1563 return NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1564 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1565 ++arg;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1566 if (op != NULL && vim_strchr((char_u *)"+-*/%", *op) != NULL)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
1567 semsg(_(e_wrong_variable_type_for_str_equal), op);
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1568 else if (endchars != NULL
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1569 && vim_strchr(endchars, *skipwhite(arg + 1)) == NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1570 emsg(_(e_unexpected_characters_in_let));
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1571 else
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1572 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1573 char_u *ptofree = NULL;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1574 char_u *p;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1575
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1576 p = tv_get_string_chk(tv);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1577 if (p != NULL && op != NULL && *op == '.')
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1578 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1579 char_u *s = get_reg_contents(*arg == '@'
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1580 ? '"' : *arg, GREG_EXPR_SRC);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1581
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1582 if (s != NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1583 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1584 p = ptofree = concat_str(s, p);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1585 vim_free(s);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1586 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1587 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1588 if (p != NULL)
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1589 {
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1590 write_reg_contents(*arg == '@' ? '"' : *arg, p, -1, FALSE);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1591 arg_end = arg + 1;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1592 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1593 vim_free(ptofree);
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1594 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1595 return arg_end;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1596 }
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1597
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1598 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1599 * Set one item of ":let var = expr" or ":let [v1, v2] = list" to its value.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1600 * Returns a pointer to the char just after the var name.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1601 * Returns NULL if there is an error.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1602 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1603 static char_u *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 ex_let_one(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1605 char_u *arg, // points to variable name
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1606 typval_T *tv, // value to assign to variable
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1607 int copy, // copy value from "tv"
23450
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
1608 int flags, // ASSIGN_CONST, ASSIGN_FINAL, etc.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1609 char_u *endchars, // valid chars after variable name or NULL
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
1610 char_u *op, // "+", "-", "." or NULL
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
1611 int var_idx) // variable index for "let [a, b] = list"
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1612 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1613 char_u *arg_end = NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1614
23450
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
1615 if (in_vim9script() && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
23297
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
1616 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
21610
586241ee8096 patch 8.2.1355: Vim9: no error using :let for options and registers
Bram Moolenaar <Bram@vim.org>
parents: 21548
diff changeset
1617 && vim_strchr((char_u *)"$@&", *arg) != NULL)
586241ee8096 patch 8.2.1355: Vim9: no error using :let for options and registers
Bram Moolenaar <Bram@vim.org>
parents: 21548
diff changeset
1618 {
586241ee8096 patch 8.2.1355: Vim9: no error using :let for options and registers
Bram Moolenaar <Bram@vim.org>
parents: 21548
diff changeset
1619 vim9_declare_error(arg);
586241ee8096 patch 8.2.1355: Vim9: no error using :let for options and registers
Bram Moolenaar <Bram@vim.org>
parents: 21548
diff changeset
1620 return NULL;
586241ee8096 patch 8.2.1355: Vim9: no error using :let for options and registers
Bram Moolenaar <Bram@vim.org>
parents: 21548
diff changeset
1621 }
586241ee8096 patch 8.2.1355: Vim9: no error using :let for options and registers
Bram Moolenaar <Bram@vim.org>
parents: 21548
diff changeset
1622
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1623 if (*arg == '$')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1624 {
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1625 // ":let $VAR = expr": Set environment variable.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1626 return ex_let_env(arg, tv, flags, endchars, op);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1627 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1628 else if (*arg == '&')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 {
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1630 // ":let &option = expr": Set option value.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1631 // ":let &l:option = expr": Set local option value.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1632 // ":let &g:option = expr": Set global option value.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1633 // ":for &ts in range(8)": Set option value for for loop
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1634 return ex_let_option(arg, tv, flags, endchars, op);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1635 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1636 else if (*arg == '@')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1637 {
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1638 // ":let @r = expr": Set register contents.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1639 return ex_let_register(arg, tv, flags, endchars, op);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1640 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1641 else if (eval_isnamec1(*arg) || *arg == '{')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1642 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1643 lval_T lv;
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1644 char_u *p;
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1645
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1646 // ":let var = expr": Set internal variable.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1647 // ":let var: type = expr": Set internal variable with type.
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1648 // ":let {expr} = expr": Idem, name made with curly braces
23239
a789a688e37d patch 8.2.2165: Vim9: assignment to dict member does not work
Bram Moolenaar <Bram@vim.org>
parents: 23233
diff changeset
1649 p = get_lval(arg, tv, &lv, FALSE, FALSE,
23450
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
1650 (flags & (ASSIGN_NO_DECL | ASSIGN_DECL))
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
1651 ? GLV_NO_DECL : 0, FNE_CHECK_START);
20528
489cb75c76b6 patch 8.2.0818: Vim9: using a discovery phase doesn't work well
Bram Moolenaar <Bram@vim.org>
parents: 20397
diff changeset
1652 if (p != NULL && lv.ll_name != NULL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1654 if (endchars != NULL && vim_strchr(endchars,
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
1655 *skipwhite(lv.ll_name_end)) == NULL)
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1656 {
25064
8f2262c72178 patch 8.2.3069: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 24922
diff changeset
1657 emsg(_(e_unexpected_characters_in_let));
26317
f44ce6a85c34 patch 8.2.3689: ex_let_one() is too long
Bram Moolenaar <Bram@vim.org>
parents: 26302
diff changeset
1658 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1659 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1660 {
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
1661 set_var_lval(&lv, p, tv, copy, flags, op, var_idx);
24446
f388a033e568 patch 8.2.2763: Vim9: cannot use type in for loop unpack at script level
Bram Moolenaar <Bram@vim.org>
parents: 24440
diff changeset
1662 arg_end = lv.ll_name_end;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1663 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1664 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1665 clear_lval(&lv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1666 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1667 else
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
1668 semsg(_(e_invalid_argument_str), arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1669
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1670 return arg_end;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1672
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1673 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1674 * ":unlet[!] var1 ... " command.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1675 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1676 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1677 ex_unlet(exarg_T *eap)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1678 {
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1679 ex_unletlock(eap, eap->arg, 0, 0, do_unlet_var, NULL);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1681
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1682 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1683 * ":lockvar" and ":unlockvar" commands
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1684 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1685 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1686 ex_lockvar(exarg_T *eap)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1687 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 char_u *arg = eap->arg;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1689 int deep = 2;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1690
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1691 if (eap->forceit)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1692 deep = -1;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1693 else if (vim_isdigit(*arg))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1694 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1695 deep = getdigits(&arg);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696 arg = skipwhite(arg);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1697 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1698
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1699 ex_unletlock(eap, arg, deep, 0, do_lock_var, NULL);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1700 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1701
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1703 * ":unlet", ":lockvar" and ":unlockvar" are quite similar.
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1704 * Also used for Vim9 script. "callback" is invoked as:
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1705 * callback(&lv, name_end, eap, deep, cookie)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1706 */
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1707 void
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1708 ex_unletlock(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1709 exarg_T *eap,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1710 char_u *argstart,
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1711 int deep,
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1712 int glv_flags,
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1713 int (*callback)(lval_T *, char_u *, exarg_T *, int, void *),
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1714 void *cookie)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1715 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1716 char_u *arg = argstart;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1717 char_u *name_end;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 int error = FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1719 lval_T lv;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1720
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1721 do
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1722 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1723 if (*arg == '$')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 {
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1725 lv.ll_name = arg;
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1726 lv.ll_tv = NULL;
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1727 ++arg;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1728 if (get_env_len(&arg) == 0)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1729 {
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
1730 semsg(_(e_invalid_argument_str), arg - 1);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1731 return;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1732 }
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1733 if (!error && !eap->skip
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1734 && callback(&lv, arg, eap, deep, cookie) == FAIL)
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1735 error = TRUE;
20103
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1736 name_end = arg;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1737 }
20103
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1738 else
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1739 {
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1740 // Parse the name and find the end.
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1741 name_end = get_lval(arg, NULL, &lv, TRUE, eap->skip || error,
23448
8f31b990ab1e patch 8.2.2267: Vim9: cannot use unlet for a dict member
Bram Moolenaar <Bram@vim.org>
parents: 23446
diff changeset
1742 glv_flags | GLV_NO_DECL, FNE_CHECK_START);
20103
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1743 if (lv.ll_name == NULL)
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1744 error = TRUE; // error but continue parsing
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1745 if (name_end == NULL || (!VIM_ISWHITE(*name_end)
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1746 && !ends_excmd(*name_end)))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1747 {
20103
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1748 if (name_end != NULL)
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1749 {
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1750 emsg_severe = TRUE;
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26881
diff changeset
1751 semsg(_(e_trailing_characters_str), name_end);
20103
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1752 }
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1753 if (!(eap->skip || error))
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1754 clear_lval(&lv);
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1755 break;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1756 }
20103
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1757
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1758 if (!error && !eap->skip
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1759 && callback(&lv, name_end, eap, deep, cookie) == FAIL)
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1760 error = TRUE;
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1761
fda7bed83eb6 patch 8.2.0607: gcc warns for using uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 20093
diff changeset
1762 if (!eap->skip)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1763 clear_lval(&lv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1764 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1765
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1766 arg = skipwhite(name_end);
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1767 } while (!ends_excmd2(name_end, arg));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1768
25521
2063b858cad9 patch 8.2.3297: cannot use all commands inside a {} block
Bram Moolenaar <Bram@vim.org>
parents: 25405
diff changeset
1769 set_nextcmd(eap, arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1770 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1771
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1772 static int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 do_unlet_var(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1774 lval_T *lp,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1775 char_u *name_end,
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1776 exarg_T *eap,
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1777 int deep UNUSED,
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1778 void *cookie UNUSED)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1779 {
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1780 int forceit = eap->forceit;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1781 int ret = OK;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782 int cc;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1783
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1784 if (lp->ll_tv == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1786 cc = *name_end;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787 *name_end = NUL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1788
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1789 // Environment variable, normal name or expanded name.
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1790 if (*lp->ll_name == '$')
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1791 vim_unsetenv(lp->ll_name + 1);
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1792 else if (do_unlet(lp->ll_name, forceit) == FAIL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1793 ret = FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1794 *name_end = cc;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1795 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1796 else if ((lp->ll_list != NULL
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1797 && value_check_lock(lp->ll_list->lv_lock, lp->ll_name, FALSE))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1798 || (lp->ll_dict != NULL
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1799 && value_check_lock(lp->ll_dict->dv_lock, lp->ll_name, FALSE)))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1800 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1801 else if (lp->ll_range)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 {
23982
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1803 if (list_unlet_range(lp->ll_list, lp->ll_li, lp->ll_name, lp->ll_n1,
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1804 !lp->ll_empty2, lp->ll_n2) == FAIL)
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1805 return FAIL;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1806 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1809 if (lp->ll_list != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1810 // unlet a List item.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1811 listitem_remove(lp->ll_list, lp->ll_li);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1812 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1813 // unlet a Dictionary item.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 dictitem_remove(lp->ll_dict, lp->ll_di);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1815 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1817 return ret;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1818 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1819
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1820 /*
23982
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1821 * Unlet one item or a range of items from a list.
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1822 * Return OK or FAIL.
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1823 */
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1824 int
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1825 list_unlet_range(
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1826 list_T *l,
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1827 listitem_T *li_first,
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1828 char_u *name,
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1829 long n1_arg,
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1830 int has_n2,
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1831 long n2)
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1832 {
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1833 listitem_T *li = li_first;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1834 int n1 = n1_arg;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1835
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1836 while (li != NULL && (!has_n2 || n2 >= n1))
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1837 {
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1838 if (value_check_lock(li->li_tv.v_lock, name, FALSE))
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1839 return FAIL;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1840 li = li->li_next;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1841 ++n1;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1842 }
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1843
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1844 // Delete a range of List items.
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1845 li = li_first;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1846 n1 = n1_arg;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1847 while (li != NULL && (!has_n2 || n2 >= n1))
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1848 {
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1849 listitem_T *next = li->li_next;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1850
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1851 listitem_remove(l, li);
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1852 li = next;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1853 ++n1;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1854 }
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1855 return OK;
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1856 }
9fcd71d0db89 patch 8.2.2533: Vim9: cannot use a range with :unlet
Bram Moolenaar <Bram@vim.org>
parents: 23968
diff changeset
1857 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1858 * "unlet" a variable. Return OK if it existed, FAIL if not.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1859 * When "forceit" is TRUE don't complain if the variable doesn't exist.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1860 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1861 int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1862 do_unlet(char_u *name, int forceit)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1863 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1864 hashtab_T *ht;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1865 hashitem_T *hi;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1866 char_u *varname;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1867 dict_T *d;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1868 dictitem_T *di;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1869
23223
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1870 // can't :unlet a script variable in Vim9 script
21279
8d1d11afd8c8 patch 8.2.1190: Vim9: checking for Vim9 syntax is spread out
Bram Moolenaar <Bram@vim.org>
parents: 21267
diff changeset
1871 if (in_vim9script() && check_vim9_unlet(name) == FAIL)
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1872 return FAIL;
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1873
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1874 ht = find_var_ht(name, &varname);
23223
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1875
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1876 // can't :unlet a script variable in Vim9 script from a function
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1877 if (ht == get_script_local_ht()
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1878 && SCRIPT_ID_VALID(current_sctx.sc_sid)
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1879 && SCRIPT_ITEM(current_sctx.sc_sid)->sn_version
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1880 == SCRIPT_VERSION_VIM9
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1881 && check_vim9_unlet(name) == FAIL)
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1882 return FAIL;
98548b8fbc98 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function
Bram Moolenaar <Bram@vim.org>
parents: 23171
diff changeset
1883
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1884 if (ht != NULL && *varname != NUL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1885 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1886 d = get_current_funccal_dict(ht);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1887 if (d == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1888 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1889 if (ht == &globvarht)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1890 d = &globvardict;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
1891 else if (ht == &compat_hashtab)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1892 d = &vimvardict;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1893 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1894 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1895 di = find_var_in_ht(ht, *name, (char_u *)"", FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1896 d = di == NULL ? NULL : di->di_tv.vval.v_dict;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1897 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1898 if (d == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1899 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1900 internal_error("do_unlet()");
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1901 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1902 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1903 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1904 hi = hash_find(ht, varname);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1905 if (HASHITEM_EMPTY(hi))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1906 hi = find_hi_in_scoped_ht(name, &ht);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1907 if (hi != NULL && !HASHITEM_EMPTY(hi))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1908 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1909 di = HI2DI(hi);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1910 if (var_check_fixed(di->di_flags, name, FALSE)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1911 || var_check_ro(di->di_flags, name, FALSE)
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1912 || value_check_lock(d->dv_lock, name, FALSE))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1913 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1914
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1915 delete_var(ht, hi);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1916 return OK;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1917 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1918 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1919 if (forceit)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1920 return OK;
26602
fac6673086df patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26528
diff changeset
1921 semsg(_(e_no_such_variable_str), name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1922 return FAIL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1923 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1924
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1925 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1926 * Lock or unlock variable indicated by "lp".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1927 * "deep" is the levels to go (-1 for unlimited);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1928 * "lock" is TRUE for ":lockvar", FALSE for ":unlockvar".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1929 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1930 static int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1931 do_lock_var(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1932 lval_T *lp,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1933 char_u *name_end,
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1934 exarg_T *eap,
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1935 int deep,
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1936 void *cookie UNUSED)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1937 {
20091
a64c16ff98b8 patch 8.2.0601: Vim9: :unlet is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 20045
diff changeset
1938 int lock = eap->cmdidx == CMD_lockvar;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1939 int ret = OK;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1940 int cc;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1941 dictitem_T *di;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1942
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1943 if (lp->ll_tv == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1944 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1945 cc = *name_end;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1946 *name_end = NUL;
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1947 if (*lp->ll_name == '$')
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1948 {
26887
612339679616 patch 8.2.3972: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
1949 semsg(_(e_cannot_lock_or_unlock_variable_str), lp->ll_name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1950 ret = FAIL;
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1951 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1952 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1953 {
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1954 // Normal name or expanded name.
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1955 di = find_var(lp->ll_name, NULL, TRUE);
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1956 if (di == NULL)
26240
640b62dbf6cb patch 8.2.3651: Vim9: no error for :lock or :unlock with unknown variable
Bram Moolenaar <Bram@vim.org>
parents: 26238
diff changeset
1957 {
640b62dbf6cb patch 8.2.3651: Vim9: no error for :lock or :unlock with unknown variable
Bram Moolenaar <Bram@vim.org>
parents: 26238
diff changeset
1958 if (in_vim9script())
640b62dbf6cb patch 8.2.3651: Vim9: no error for :lock or :unlock with unknown variable
Bram Moolenaar <Bram@vim.org>
parents: 26238
diff changeset
1959 semsg(_(e_cannot_find_variable_to_unlock_str),
640b62dbf6cb patch 8.2.3651: Vim9: no error for :lock or :unlock with unknown variable
Bram Moolenaar <Bram@vim.org>
parents: 26238
diff changeset
1960 lp->ll_name);
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1961 ret = FAIL;
26240
640b62dbf6cb patch 8.2.3651: Vim9: no error for :lock or :unlock with unknown variable
Bram Moolenaar <Bram@vim.org>
parents: 26238
diff changeset
1962 }
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1963 else if ((di->di_flags & DI_FLAGS_FIX)
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1964 && di->di_tv.v_type != VAR_DICT
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1965 && di->di_tv.v_type != VAR_LIST)
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1966 {
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1967 // For historic reasons this error is not given for a list or
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1968 // dict. E.g., the b: dict could be locked/unlocked.
26887
612339679616 patch 8.2.3972: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
1969 semsg(_(e_cannot_lock_or_unlock_variable_str), lp->ll_name);
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1970 ret = FAIL;
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1971 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1972 else
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1973 {
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1974 if (lock)
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1975 di->di_flags |= DI_FLAGS_LOCK;
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1976 else
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1977 di->di_flags &= ~DI_FLAGS_LOCK;
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1978 if (deep != 0)
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1979 item_lock(&di->di_tv, deep, lock, FALSE);
20093
646c53fa5781 patch 8.2.0602: :unlet $VAR does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 20091
diff changeset
1980 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1981 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1982 *name_end = cc;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1983 }
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1984 else if (deep == 0)
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1985 {
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1986 // nothing to do
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1987 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1988 else if (lp->ll_range)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1989 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1990 listitem_T *li = lp->ll_li;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1991
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1992 // (un)lock a range of List items.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1993 while (li != NULL && (lp->ll_empty2 || lp->ll_n2 >= lp->ll_n1))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1994 {
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
1995 item_lock(&li->li_tv, deep, lock, FALSE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1996 li = li->li_next;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1997 ++lp->ll_n1;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1998 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1999 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2000 else if (lp->ll_list != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2001 // (un)lock a List item.
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2002 item_lock(&lp->ll_li->li_tv, deep, lock, FALSE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2003 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2004 // (un)lock a Dictionary item.
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2005 item_lock(&lp->ll_di->di_tv, deep, lock, FALSE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2006
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2007 return ret;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2008 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2009
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2010 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2011 * Lock or unlock an item. "deep" is nr of levels to go.
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2012 * When "check_refcount" is TRUE do not lock a list or dict with a reference
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2013 * count larger than 1.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2014 */
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22266
diff changeset
2015 void
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2016 item_lock(typval_T *tv, int deep, int lock, int check_refcount)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2017 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2018 static int recurse = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2019 list_T *l;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2020 listitem_T *li;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2021 dict_T *d;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2022 blob_T *b;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2023 hashitem_T *hi;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2024 int todo;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2025
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2026 if (recurse >= DICT_MAXNEST)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2027 {
26958
d92e0d85923f patch 8.2.4008: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26952
diff changeset
2028 emsg(_(e_variable_nested_too_deep_for_unlock));
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2029 return;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2030 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2031 if (deep == 0)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2032 return;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2033 ++recurse;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2034
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2035 // lock/unlock the item itself
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2036 if (lock)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2037 tv->v_lock |= VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2038 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2039 tv->v_lock &= ~VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2040
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2041 switch (tv->v_type)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2042 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2043 case VAR_UNKNOWN:
19922
1f42c49c3d29 patch 8.2.0517: Vim9: cannot separate "func" and "func(): void"
Bram Moolenaar <Bram@vim.org>
parents: 19916
diff changeset
2044 case VAR_ANY:
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2045 case VAR_VOID:
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2046 case VAR_NUMBER:
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2047 case VAR_BOOL:
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2048 case VAR_STRING:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2049 case VAR_FUNC:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2050 case VAR_PARTIAL:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2051 case VAR_FLOAT:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2052 case VAR_SPECIAL:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2053 case VAR_JOB:
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2054 case VAR_CHANNEL:
24606
a4fda40e0bb9 patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents: 24490
diff changeset
2055 case VAR_INSTR:
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2056 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2057
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2058 case VAR_BLOB:
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2059 if ((b = tv->vval.v_blob) != NULL
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2060 && !(check_refcount && b->bv_refcount > 1))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2061 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2062 if (lock)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2063 b->bv_lock |= VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2064 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2065 b->bv_lock &= ~VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2066 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2067 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2068 case VAR_LIST:
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2069 if ((l = tv->vval.v_list) != NULL
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2070 && !(check_refcount && l->lv_refcount > 1))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2071 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2072 if (lock)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2073 l->lv_lock |= VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2074 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2075 l->lv_lock &= ~VAR_LOCKED;
27394
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2076 if (deep < 0 || deep > 1)
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2077 {
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2078 if (l->lv_first == &range_list_item)
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2079 l->lv_lock |= VAR_ITEMS_LOCKED;
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2080 else
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2081 {
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2082 // recursive: lock/unlock the items the List contains
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2083 CHECK_LIST_MATERIALIZE(l);
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2084 FOR_ALL_LIST_ITEMS(l, li) item_lock(&li->li_tv,
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2085 deep - 1, lock, check_refcount);
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2086 }
69a48bcd1d80 patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def function
Bram Moolenaar <Bram@vim.org>
parents: 27362
diff changeset
2087 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2088 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2089 break;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2090 case VAR_DICT:
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2091 if ((d = tv->vval.v_dict) != NULL
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2092 && !(check_refcount && d->dv_refcount > 1))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2093 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2094 if (lock)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2095 d->dv_lock |= VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2096 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2097 d->dv_lock &= ~VAR_LOCKED;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2098 if (deep < 0 || deep > 1)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2099 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2100 // recursive: lock/unlock the items the List contains
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2101 todo = (int)d->dv_hashtab.ht_used;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2102 for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2103 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2104 if (!HASHITEM_EMPTY(hi))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2105 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2106 --todo;
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2107 item_lock(&HI2DI(hi)->di_tv, deep - 1, lock,
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
2108 check_refcount);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2109 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2110 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2111 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2112 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2113 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2114 --recurse;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2115 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2116
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2117 #if (defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)) || defined(PROTO)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2118 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2119 * Delete all "menutrans_" variables.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2120 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2121 void
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2122 del_menutrans_vars(void)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2123 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2124 hashitem_T *hi;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2125 int todo;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2126
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2127 hash_lock(&globvarht);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2128 todo = (int)globvarht.ht_used;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2129 for (hi = globvarht.ht_array; todo > 0 && !got_int; ++hi)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2130 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2131 if (!HASHITEM_EMPTY(hi))
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2132 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2133 --todo;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2134 if (STRNCMP(HI2DI(hi)->di_key, "menutrans_", 10) == 0)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2135 delete_var(&globvarht, hi);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2136 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2137 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2138 hash_unlock(&globvarht);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2139 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2140 #endif
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2141
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2142 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2143 * Local string buffer for the next two functions to store a variable name
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2144 * with its prefix. Allocated in cat_prefix_varname(), freed later in
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2145 * get_user_var_name().
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2146 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2147
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2148 static char_u *varnamebuf = NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2149 static int varnamebuflen = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2150
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2151 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2152 * Function to concatenate a prefix and a variable name.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2153 */
23598
a9433f834693 patch 8.2.2341: expresison command line completion incomplete after "g:"
Bram Moolenaar <Bram@vim.org>
parents: 23578
diff changeset
2154 char_u *
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2155 cat_prefix_varname(int prefix, char_u *name)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2156 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2157 int len;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2158
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2159 len = (int)STRLEN(name) + 3;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2160 if (len > varnamebuflen)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2161 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2162 vim_free(varnamebuf);
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
2163 len += 10; // some additional space
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2164 varnamebuf = alloc(len);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2165 if (varnamebuf == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2166 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2167 varnamebuflen = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2168 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2169 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2170 varnamebuflen = len;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2171 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2172 *varnamebuf = prefix;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2173 varnamebuf[1] = ':';
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2174 STRCPY(varnamebuf + 2, name);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2175 return varnamebuf;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2176 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2177
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2178 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2179 * Function given to ExpandGeneric() to obtain the list of user defined
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2180 * (global/buffer/window/built-in) variable names.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2181 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2182 char_u *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2183 get_user_var_name(expand_T *xp, int idx)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2184 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2185 static long_u gdone;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2186 static long_u bdone;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2187 static long_u wdone;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2188 static long_u tdone;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2189 static int vidx;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2190 static hashitem_T *hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2191 hashtab_T *ht;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2192
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2193 if (idx == 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2194 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2195 gdone = bdone = wdone = vidx = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2196 tdone = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2197 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2198
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2199 // Global variables
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2200 if (gdone < globvarht.ht_used)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2201 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2202 if (gdone++ == 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2203 hi = globvarht.ht_array;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2204 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2205 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2206 while (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2207 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2208 if (STRNCMP("g:", xp->xp_pattern, 2) == 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2209 return cat_prefix_varname('g', hi->hi_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2210 return hi->hi_key;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2211 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2212
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2213 // b: variables
27805
afbe86e8b24a patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents: 27738
diff changeset
2214 ht = &prevwin_curwin()->w_buffer->b_vars->dv_hashtab;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2215 if (bdone < ht->ht_used)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2216 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2217 if (bdone++ == 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2218 hi = ht->ht_array;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2219 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2220 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2221 while (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2222 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2223 return cat_prefix_varname('b', hi->hi_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2224 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2225
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2226 // w: variables
27805
afbe86e8b24a patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents: 27738
diff changeset
2227 ht = &prevwin_curwin()->w_vars->dv_hashtab;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2228 if (wdone < ht->ht_used)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2229 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2230 if (wdone++ == 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2231 hi = ht->ht_array;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2232 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2233 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2234 while (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2235 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2236 return cat_prefix_varname('w', hi->hi_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2237 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2238
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2239 // t: variables
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2240 ht = &curtab->tp_vars->dv_hashtab;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2241 if (tdone < ht->ht_used)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2242 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2243 if (tdone++ == 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2244 hi = ht->ht_array;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2245 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2246 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2247 while (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2248 ++hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2249 return cat_prefix_varname('t', hi->hi_key);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2250 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2251
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2252 // v: variables
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2253 if (vidx < VV_LEN)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2254 return cat_prefix_varname('v', (char_u *)vimvars[vidx++].vv_name);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2255
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2256 VIM_CLEAR(varnamebuf);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2257 varnamebuflen = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2258 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2259 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2260
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2261 char *
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2262 get_var_special_name(int nr)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2263 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2264 switch (nr)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2265 {
23438
4c6ebf531284 patch 8.2.2262: Vim9: converting bool to string prefixes v:
Bram Moolenaar <Bram@vim.org>
parents: 23422
diff changeset
2266 case VVAL_FALSE: return in_vim9script() ? "false" : "v:false";
4c6ebf531284 patch 8.2.2262: Vim9: converting bool to string prefixes v:
Bram Moolenaar <Bram@vim.org>
parents: 23422
diff changeset
2267 case VVAL_TRUE: return in_vim9script() ? "true" : "v:true";
23497
2247a2ce3630 patch 8.2.2291: Vim9: cannot use "null" for v:null
Bram Moolenaar <Bram@vim.org>
parents: 23485
diff changeset
2268 case VVAL_NULL: return in_vim9script() ? "null" : "v:null";
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2269 case VVAL_NONE: return "v:none";
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2270 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2271 internal_error("get_var_special_name()");
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2272 return "42";
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2273 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2274
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2275 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2276 * Returns the global variable dictionary
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2277 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2278 dict_T *
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2279 get_globvar_dict(void)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2280 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2281 return &globvardict;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2282 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2283
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2284 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2285 * Returns the global variable hash table
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2286 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2287 hashtab_T *
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2288 get_globvar_ht(void)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2289 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2290 return &globvarht;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2291 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2292
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2293 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2294 * Returns the v: variable dictionary
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2295 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2296 dict_T *
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2297 get_vimvar_dict(void)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2298 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2299 return &vimvardict;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2300 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
2301
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2302 /*
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2303 * Returns the index of a v:variable. Negative if not found.
19960
3c11b9f6fa03 patch 8.2.0536: Vim9: some compilation code not tested
Bram Moolenaar <Bram@vim.org>
parents: 19922
diff changeset
2304 * Returns DI_ flags in "di_flags".
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2305 */
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2306 int
19960
3c11b9f6fa03 patch 8.2.0536: Vim9: some compilation code not tested
Bram Moolenaar <Bram@vim.org>
parents: 19922
diff changeset
2307 find_vim_var(char_u *name, int *di_flags)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2308 {
19960
3c11b9f6fa03 patch 8.2.0536: Vim9: some compilation code not tested
Bram Moolenaar <Bram@vim.org>
parents: 19922
diff changeset
2309 dictitem_T *di = find_var_in_ht(&vimvarht, 0, name, TRUE);
3c11b9f6fa03 patch 8.2.0536: Vim9: some compilation code not tested
Bram Moolenaar <Bram@vim.org>
parents: 19922
diff changeset
2310 struct vimvar *vv;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2311
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2312 if (di == NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2313 return -1;
19960
3c11b9f6fa03 patch 8.2.0536: Vim9: some compilation code not tested
Bram Moolenaar <Bram@vim.org>
parents: 19922
diff changeset
2314 *di_flags = di->di_flags;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2315 vv = (struct vimvar *)((char *)di - offsetof(vimvar_T, vv_di));
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2316 return (int)(vv - vimvars);
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2317 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2318
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2319
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2320 /*
17887
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2321 * Set type of v: variable to "type".
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2322 */
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2323 void
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2324 set_vim_var_type(int idx, vartype_T type)
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2325 {
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2326 vimvars[idx].vv_tv_type = type;
17887
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2327 }
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2328
39ffd167a307 patch 8.1.1940: script tests fail
Bram Moolenaar <Bram@vim.org>
parents: 17885
diff changeset
2329 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2330 * Set number v: variable to "val".
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
2331 * Note that this does not set the type, use set_vim_var_type() for that.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2332 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2333 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2334 set_vim_var_nr(int idx, varnumber_T val)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2335 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2336 vimvars[idx].vv_nr = val;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2337 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2338
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2339 char *
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2340 get_vim_var_name(int idx)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2341 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2342 return vimvars[idx].vv_name;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2343 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2344
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2345 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2346 * Get typval_T v: variable value.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2347 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2348 typval_T *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2349 get_vim_var_tv(int idx)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2350 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2351 return &vimvars[idx].vv_tv;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2352 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2353
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2354 type_T *
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2355 get_vim_var_type(int idx, garray_T *type_list)
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2356 {
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2357 if (vimvars[idx].vv_type != NULL)
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2358 return vimvars[idx].vv_type;
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2359 return typval2type_vimvar(&vimvars[idx].vv_tv, type_list);
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2360 }
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2361
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2362 /*
19283
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2363 * Set v: variable to "tv". Only accepts the same type.
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2364 * Takes over the value of "tv".
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2365 */
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2366 int
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2367 set_vim_var_tv(int idx, typval_T *tv)
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2368 {
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2369 if (vimvars[idx].vv_tv_type != tv->v_type)
19283
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2370 {
21821
0deb6f96a5a3 patch 8.2.1460: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 21819
diff changeset
2371 emsg(_(e_type_mismatch_for_v_variable));
19283
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2372 clear_tv(tv);
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2373 return FAIL;
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2374 }
19962
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2375 // VV_RO is also checked when compiling, but let's check here as well.
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2376 if (vimvars[idx].vv_flags & VV_RO)
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2377 {
25320
1e6da8364a02 patch 8.2.3197: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 25302
diff changeset
2378 semsg(_(e_cannot_change_readonly_variable_str), vimvars[idx].vv_name);
19962
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2379 return FAIL;
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2380 }
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2381 if (sandbox && (vimvars[idx].vv_flags & VV_RO_SBX))
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2382 {
26624
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
2383 semsg(_(e_cannot_set_variable_in_sandbox_str), vimvars[idx].vv_name);
19962
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2384 return FAIL;
12fa79cac39b patch 8.2.0537: Vim9: no check for sandbox when setting v:var
Bram Moolenaar <Bram@vim.org>
parents: 19960
diff changeset
2385 }
19283
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2386 clear_tv(&vimvars[idx].vv_di.di_tv);
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2387 vimvars[idx].vv_di.di_tv = *tv;
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2388 return OK;
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2389 }
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2390
9dc843109c97 patch 8.2.0200: Vim9 script commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19229
diff changeset
2391 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2392 * Get number v: variable value.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2393 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2394 varnumber_T
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2395 get_vim_var_nr(int idx)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2396 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2397 return vimvars[idx].vv_nr;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2398 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2399
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2400 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2401 * Get string v: variable value. Uses a static buffer, can only be used once.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2402 * If the String variable has never been set, return an empty string.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2403 * Never returns NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2404 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2405 char_u *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2406 get_vim_var_str(int idx)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2407 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2408 return tv_get_string(&vimvars[idx].vv_tv);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2409 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2410
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2411 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2412 * Get List v: variable value. Caller must take care of reference count when
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2413 * needed.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2414 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2415 list_T *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2416 get_vim_var_list(int idx)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2417 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2418 return vimvars[idx].vv_list;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2419 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2420
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2421 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2422 * Get Dict v: variable value. Caller must take care of reference count when
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2423 * needed.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2424 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2425 dict_T *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2426 get_vim_var_dict(int idx)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2427 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2428 return vimvars[idx].vv_dict;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2429 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2430
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2431 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2432 * Set v:char to character "c".
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2433 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2434 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2435 set_vim_var_char(int c)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2436 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2437 char_u buf[MB_MAXBYTES + 1];
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2438
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2439 if (has_mbyte)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2440 buf[(*mb_char2bytes)(c, buf)] = NUL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2441 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2442 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2443 buf[0] = c;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2444 buf[1] = NUL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2445 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2446 set_vim_var_string(VV_CHAR, buf, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2447 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2448
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2449 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2450 * Set v:count to "count" and v:count1 to "count1".
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2451 * When "set_prevcount" is TRUE first set v:prevcount from v:count.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2452 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2453 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2454 set_vcount(
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2455 long count,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2456 long count1,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2457 int set_prevcount)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2458 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2459 if (set_prevcount)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2460 vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2461 vimvars[VV_COUNT].vv_nr = count;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2462 vimvars[VV_COUNT1].vv_nr = count1;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2463 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2464
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2465 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2466 * Save variables that might be changed as a side effect. Used when executing
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2467 * a timer callback.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2468 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2469 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2470 save_vimvars(vimvars_save_T *vvsave)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2471 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2472 vvsave->vv_prevcount = vimvars[VV_PREVCOUNT].vv_nr;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2473 vvsave->vv_count = vimvars[VV_COUNT].vv_nr;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2474 vvsave->vv_count1 = vimvars[VV_COUNT1].vv_nr;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2475 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2476
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2477 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2478 * Restore variables saved by save_vimvars().
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2479 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2480 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2481 restore_vimvars(vimvars_save_T *vvsave)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2482 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2483 vimvars[VV_PREVCOUNT].vv_nr = vvsave->vv_prevcount;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2484 vimvars[VV_COUNT].vv_nr = vvsave->vv_count;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2485 vimvars[VV_COUNT1].vv_nr = vvsave->vv_count1;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2486 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2487
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2488 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2489 * Set string v: variable to a copy of "val". If 'copy' is FALSE, then set the
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2490 * value.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2491 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2492 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2493 set_vim_var_string(
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2494 int idx,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2495 char_u *val,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2496 int len) // length of "val" to use or -1 (whole string)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2497 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2498 clear_tv(&vimvars[idx].vv_di.di_tv);
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2499 vimvars[idx].vv_tv_type = VAR_STRING;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2500 if (val == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2501 vimvars[idx].vv_str = NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2502 else if (len == -1)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2503 vimvars[idx].vv_str = vim_strsave(val);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2504 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2505 vimvars[idx].vv_str = vim_strnsave(val, len);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2506 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2507
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2508 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2509 * Set List v: variable to "val".
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2510 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2511 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2512 set_vim_var_list(int idx, list_T *val)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2513 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2514 clear_tv(&vimvars[idx].vv_di.di_tv);
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2515 vimvars[idx].vv_tv_type = VAR_LIST;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2516 vimvars[idx].vv_list = val;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2517 if (val != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2518 ++val->lv_refcount;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2519 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2520
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2521 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2522 * Set Dictionary v: variable to "val".
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2523 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2524 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2525 set_vim_var_dict(int idx, dict_T *val)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2526 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2527 clear_tv(&vimvars[idx].vv_di.di_tv);
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
2528 vimvars[idx].vv_tv_type = VAR_DICT;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2529 vimvars[idx].vv_dict = val;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2530 if (val != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2531 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2532 ++val->dv_refcount;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2533 dict_set_items_ro(val);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2534 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2535 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2536
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2537 /*
18477
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2538 * Set the v:argv list.
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2539 */
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2540 void
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2541 set_argv_var(char **argv, int argc)
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2542 {
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2543 list_T *l = list_alloc();
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2544 int i;
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2545
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2546 if (l == NULL)
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2547 getout(1);
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2548 l->lv_lock = VAR_FIXED;
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2549 for (i = 0; i < argc; ++i)
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2550 {
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2551 if (list_append_string(l, (char_u *)argv[i], -1) == FAIL)
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2552 getout(1);
19229
d776967d0f0d patch 8.2.0173: build fails with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 19201
diff changeset
2553 l->lv_u.mat.lv_last->li_tv.v_lock = VAR_FIXED;
18477
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2554 }
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2555 set_vim_var_list(VV_ARGV, l);
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2556 }
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2557
e93cab5d0f0f patch 8.1.2233: cannot get the Vim command line arguments
Bram Moolenaar <Bram@vim.org>
parents: 18348
diff changeset
2558 /*
20721
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2559 * Reset v:register, taking the 'clipboard' setting into account.
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2560 */
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2561 void
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2562 reset_reg_var(void)
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2563 {
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2564 int regname = 0;
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2565
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2566 // Adjust the register according to 'clipboard', so that when
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2567 // "unnamed" is present it becomes '*' or '+' instead of '"'.
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2568 #ifdef FEAT_CLIPBOARD
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2569 adjust_clip_reg(&regname);
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2570 #endif
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2571 set_reg_var(regname);
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2572 }
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2573
70d561931721 patch 8.2.0913: code for resetting v:register is duplicated
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
2574 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2575 * Set v:register if needed.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2576 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2577 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2578 set_reg_var(int c)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2579 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2580 char_u regname;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2581
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2582 if (c == 0 || c == ' ')
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2583 regname = '"';
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2584 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2585 regname = c;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2586 // Avoid free/alloc when the value is already right.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2587 if (vimvars[VV_REG].vv_str == NULL || vimvars[VV_REG].vv_str[0] != c)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2588 set_vim_var_string(VV_REG, &regname, 1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2589 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2590
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2591 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2592 * Get or set v:exception. If "oldval" == NULL, return the current value.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2593 * Otherwise, restore the value to "oldval" and return NULL.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2594 * Must always be called in pairs to save and restore v:exception! Does not
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2595 * take care of memory allocations.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2596 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2597 char_u *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2598 v_exception(char_u *oldval)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2599 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2600 if (oldval == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2601 return vimvars[VV_EXCEPTION].vv_str;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2602
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2603 vimvars[VV_EXCEPTION].vv_str = oldval;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2604 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2605 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2606
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2607 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2608 * Get or set v:throwpoint. If "oldval" == NULL, return the current value.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2609 * Otherwise, restore the value to "oldval" and return NULL.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2610 * Must always be called in pairs to save and restore v:throwpoint! Does not
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2611 * take care of memory allocations.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2612 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2613 char_u *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2614 v_throwpoint(char_u *oldval)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2615 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2616 if (oldval == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2617 return vimvars[VV_THROWPOINT].vv_str;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2618
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2619 vimvars[VV_THROWPOINT].vv_str = oldval;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2620 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2621 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2622
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2623 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2624 * Set v:cmdarg.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2625 * If "eap" != NULL, use "eap" to generate the value and return the old value.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2626 * If "oldarg" != NULL, restore the value to "oldarg" and return NULL.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2627 * Must always be called in pairs!
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2628 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2629 char_u *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2630 set_cmdarg(exarg_T *eap, char_u *oldarg)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2631 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2632 char_u *oldval;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2633 char_u *newval;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2634 unsigned len;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2635
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2636 oldval = vimvars[VV_CMDARG].vv_str;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2637 if (eap == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2638 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2639 vim_free(oldval);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2640 vimvars[VV_CMDARG].vv_str = oldarg;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2641 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2642 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2643
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2644 if (eap->force_bin == FORCE_BIN)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2645 len = 6;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2646 else if (eap->force_bin == FORCE_NOBIN)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2647 len = 8;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2648 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2649 len = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2650
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2651 if (eap->read_edit)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2652 len += 7;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2653
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2654 if (eap->force_ff != 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2655 len += 10; // " ++ff=unix"
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2656 if (eap->force_enc != 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2657 len += (unsigned)STRLEN(eap->cmd + eap->force_enc) + 7;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2658 if (eap->bad_char != 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2659 len += 7 + 4; // " ++bad=" + "keep" or "drop"
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2660
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2661 newval = alloc(len + 1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2662 if (newval == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2663 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2664
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2665 if (eap->force_bin == FORCE_BIN)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2666 sprintf((char *)newval, " ++bin");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2667 else if (eap->force_bin == FORCE_NOBIN)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2668 sprintf((char *)newval, " ++nobin");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2669 else
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2670 *newval = NUL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2671
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2672 if (eap->read_edit)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2673 STRCAT(newval, " ++edit");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2674
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2675 if (eap->force_ff != 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2676 sprintf((char *)newval + STRLEN(newval), " ++ff=%s",
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2677 eap->force_ff == 'u' ? "unix"
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2678 : eap->force_ff == 'd' ? "dos"
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2679 : "mac");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2680 if (eap->force_enc != 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2681 sprintf((char *)newval + STRLEN(newval), " ++enc=%s",
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2682 eap->cmd + eap->force_enc);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2683 if (eap->bad_char == BAD_KEEP)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2684 STRCPY(newval + STRLEN(newval), " ++bad=keep");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2685 else if (eap->bad_char == BAD_DROP)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2686 STRCPY(newval + STRLEN(newval), " ++bad=drop");
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2687 else if (eap->bad_char != 0)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2688 sprintf((char *)newval + STRLEN(newval), " ++bad=%c", eap->bad_char);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2689 vimvars[VV_CMDARG].vv_str = newval;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2690 return oldval;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2691 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2692
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2693 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2694 * Get the value of internal variable "name".
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2695 * If "flags" has EVAL_VAR_IMPORT may return a VAR_ANY with v_number set to the
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2696 * imported script ID.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2697 * Return OK or FAIL. If OK is returned "rettv" must be cleared.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2698 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2699 int
21120
4d844a65183d patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents: 21056
diff changeset
2700 eval_variable(
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2701 char_u *name,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2702 int len, // length of "name"
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2703 scid_T sid, // script ID for imported item or zero
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2704 typval_T *rettv, // NULL when only checking existence
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2705 dictitem_T **dip, // non-NULL when typval's dict item is needed
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2706 int flags) // EVAL_VAR_ flags
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2707 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2708 int ret = OK;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2709 typval_T *tv = NULL;
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2710 int found = FALSE;
25184
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2711 hashtab_T *ht = NULL;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2712 int cc;
25186
0a3b1c66d3f2 patch 8.2.3129: Vim9: imported uninitialized list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25184
diff changeset
2713 type_T *type = NULL;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2714
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2715 // truncate the name, so that we can use strcmp()
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2716 cc = name[len];
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2717 name[len] = NUL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2718
24922
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2719 // Check for local variable when debugging.
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2720 if ((tv = lookup_debug_var(name)) == NULL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2721 {
24922
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2722 // Check for user-defined variables.
25186
0a3b1c66d3f2 patch 8.2.3129: Vim9: imported uninitialized list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25184
diff changeset
2723 dictitem_T *v = find_var(name, &ht, flags & EVAL_VAR_NOAUTOLOAD);
0a3b1c66d3f2 patch 8.2.3129: Vim9: imported uninitialized list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25184
diff changeset
2724
24922
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2725 if (v != NULL)
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2726 {
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2727 tv = &v->di_tv;
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2728 if (dip != NULL)
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2729 *dip = v;
0d8baefcf4ed patch 8.2.2998: Vim9: disassemble test fails
Bram Moolenaar <Bram@vim.org>
parents: 24874
diff changeset
2730 }
25186
0a3b1c66d3f2 patch 8.2.3129: Vim9: imported uninitialized list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25184
diff changeset
2731 else
0a3b1c66d3f2 patch 8.2.3129: Vim9: imported uninitialized list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25184
diff changeset
2732 ht = NULL;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2733 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2734
21279
8d1d11afd8c8 patch 8.2.1190: Vim9: checking for Vim9 syntax is spread out
Bram Moolenaar <Bram@vim.org>
parents: 21267
diff changeset
2735 if (tv == NULL && (in_vim9script() || STRNCMP(name, "s:", 2) == 0))
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2736 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2737 imported_T *import = NULL;
20816
9faab49c880f patch 8.2.0960: cannot use :import in legacy Vim script
Bram Moolenaar <Bram@vim.org>
parents: 20731
diff changeset
2738 char_u *p = STRNCMP(name, "s:", 2) == 0 ? name + 2 : name;
9faab49c880f patch 8.2.0960: cannot use :import in legacy Vim script
Bram Moolenaar <Bram@vim.org>
parents: 20731
diff changeset
2739
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2740 if (sid == 0)
27698
3813036f19cb patch 8.2.4375: ctx_imports is not used
Bram Moolenaar <Bram@vim.org>
parents: 27690
diff changeset
2741 import = find_imported(p, 0, TRUE);
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2742
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2743 // imported variable from another script
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2744 if (import != NULL || sid != 0)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2745 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2746 if ((flags & EVAL_VAR_IMPORT) == 0)
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2747 {
27002
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2748 if (SCRIPT_ID_VALID(sid))
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2749 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2750 ht = &SCRIPT_VARS(sid);
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2751 if (ht != NULL)
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2752 {
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2753 dictitem_T *v = find_var_in_ht(ht, 0, name,
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2754 flags & EVAL_VAR_NOAUTOLOAD);
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2755
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2756 if (v != NULL)
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2757 {
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2758 tv = &v->di_tv;
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2759 if (dip != NULL)
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2760 *dip = v;
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2761 }
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2762 else
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2763 ht = NULL;
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2764 }
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2765 }
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2766 else
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2767 {
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2768 if (flags & EVAL_VAR_VERBOSE)
27277
b73e3617c1d6 patch 8.2.4167: Vim9: error message for old style import
Bram Moolenaar <Bram@vim.org>
parents: 27114
diff changeset
2769 semsg(_(e_expected_dot_after_name_str), name);
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2770 ret = FAIL;
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2771 }
22409
5736172d64a6 patch 8.2.1753: Vim9: crash when using import at script level
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
2772 }
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2773 else
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2774 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2775 if (rettv != NULL)
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2776 {
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2777 rettv->v_type = VAR_ANY;
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2778 rettv->vval.v_number = sid != 0 ? sid : import->imp_sid;
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2779 }
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2780 found = TRUE;
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2781 }
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2782 }
26504
7821550ba3a8 patch 8.2.3782: Vim9: no error if a function shadows a script variable
Bram Moolenaar <Bram@vim.org>
parents: 26482
diff changeset
2783 else if (in_vim9script() && (flags & EVAL_VAR_NO_FUNC) == 0)
21955
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2784 {
27464
a14c4d3e3260 patch 8.2.4260: Vim9: can still use a global function without g:
Bram Moolenaar <Bram@vim.org>
parents: 27394
diff changeset
2785 int has_g_prefix = STRNCMP(name, "g:", 2) == 0;
27114
98a01021e465 patch 8.2.4086: "cctx" argument of find_func_even_dead() is unused
Bram Moolenaar <Bram@vim.org>
parents: 27110
diff changeset
2786 ufunc_T *ufunc = find_func(name, FALSE);
21955
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2787
25630
c26eb08a0df2 patch 8.2.3351: Vim9: using a function by name may delete it
Bram Moolenaar <Bram@vim.org>
parents: 25622
diff changeset
2788 // In Vim9 script we can get a function reference by using the
27464
a14c4d3e3260 patch 8.2.4260: Vim9: can still use a global function without g:
Bram Moolenaar <Bram@vim.org>
parents: 27394
diff changeset
2789 // function name. For a global non-autoload function "g:" is
a14c4d3e3260 patch 8.2.4260: Vim9: can still use a global function without g:
Bram Moolenaar <Bram@vim.org>
parents: 27394
diff changeset
2790 // required.
a14c4d3e3260 patch 8.2.4260: Vim9: can still use a global function without g:
Bram Moolenaar <Bram@vim.org>
parents: 27394
diff changeset
2791 if (ufunc != NULL && (has_g_prefix
a14c4d3e3260 patch 8.2.4260: Vim9: can still use a global function without g:
Bram Moolenaar <Bram@vim.org>
parents: 27394
diff changeset
2792 || !func_requires_g_prefix(ufunc)))
21955
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2793 {
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2794 found = TRUE;
21955
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2795 if (rettv != NULL)
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2796 {
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2797 rettv->v_type = VAR_FUNC;
27464
a14c4d3e3260 patch 8.2.4260: Vim9: can still use a global function without g:
Bram Moolenaar <Bram@vim.org>
parents: 27394
diff changeset
2798 if (has_g_prefix)
26528
4d8226001391 patch 8.2.3793: using "g:Func" as a funcref does not work in script context
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
2799 // Keep the "g:", otherwise script-local may be
4d8226001391 patch 8.2.3793: using "g:Func" as a funcref does not work in script context
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
2800 // assumed.
4d8226001391 patch 8.2.3793: using "g:Func" as a funcref does not work in script context
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
2801 rettv->vval.v_string = vim_strsave(name);
4d8226001391 patch 8.2.3793: using "g:Func" as a funcref does not work in script context
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
2802 else
4d8226001391 patch 8.2.3793: using "g:Func" as a funcref does not work in script context
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
2803 rettv->vval.v_string = vim_strsave(ufunc->uf_name);
25630
c26eb08a0df2 patch 8.2.3351: Vim9: using a function by name may delete it
Bram Moolenaar <Bram@vim.org>
parents: 25622
diff changeset
2804 if (rettv->vval.v_string != NULL)
c26eb08a0df2 patch 8.2.3351: Vim9: using a function by name may delete it
Bram Moolenaar <Bram@vim.org>
parents: 25622
diff changeset
2805 func_ref(ufunc->uf_name);
21955
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2806 }
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2807 }
3991a6df522e patch 8.2.1527: Vim9: cannot use a function name at script level
Bram Moolenaar <Bram@vim.org>
parents: 21909
diff changeset
2808 }
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2809 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
2810
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2811 if (!found)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2812 {
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2813 if (tv == NULL)
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2814 {
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
2815 if (rettv != NULL && (flags & EVAL_VAR_VERBOSE))
21821
0deb6f96a5a3 patch 8.2.1460: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 21819
diff changeset
2816 semsg(_(e_undefined_variable_str), name);
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2817 ret = FAIL;
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2818 }
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2819 else if (rettv != NULL)
22802
3e0f909ca1f2 patch 8.2.1949: Vim9: using extend() on null dict is silently ignored
Bram Moolenaar <Bram@vim.org>
parents: 22705
diff changeset
2820 {
25232
346002a63bc6 patch 8.2.3152: Vim9: accessing "s:" results in an error
Bram Moolenaar <Bram@vim.org>
parents: 25186
diff changeset
2821 if (ht != NULL && ht == get_script_local_ht()
346002a63bc6 patch 8.2.3152: Vim9: accessing "s:" results in an error
Bram Moolenaar <Bram@vim.org>
parents: 25186
diff changeset
2822 && tv != &SCRIPT_SV(current_sctx.sc_sid)->sv_var.di_tv)
25184
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2823 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
2824 svar_T *sv = find_typval_in_script(tv, 0);
25186
0a3b1c66d3f2 patch 8.2.3129: Vim9: imported uninitialized list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25184
diff changeset
2825
25184
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2826 if (sv != NULL)
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2827 type = sv->sv_type;
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2828 }
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2829
22802
3e0f909ca1f2 patch 8.2.1949: Vim9: using extend() on null dict is silently ignored
Bram Moolenaar <Bram@vim.org>
parents: 22705
diff changeset
2830 // If a list or dict variable wasn't initialized, do it now.
27924
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2831 // Not for global variables, they are not declared.
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2832 if (ht != &globvarht)
22802
3e0f909ca1f2 patch 8.2.1949: Vim9: using extend() on null dict is silently ignored
Bram Moolenaar <Bram@vim.org>
parents: 22705
diff changeset
2833 {
27924
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2834 if (tv->v_type == VAR_DICT && tv->vval.v_dict == NULL)
25184
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2835 {
27924
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2836 tv->vval.v_dict = dict_alloc();
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2837 if (tv->vval.v_dict != NULL)
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2838 {
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2839 ++tv->vval.v_dict->dv_refcount;
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2840 tv->vval.v_dict->dv_type = alloc_type(type);
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2841 }
25184
e495f40e4b07 patch 8.2.3128: Vim9: uninitialzed list does not get type checked
Bram Moolenaar <Bram@vim.org>
parents: 25064
diff changeset
2842 }
27924
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2843 else if (tv->v_type == VAR_LIST && tv->vval.v_list == NULL)
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2844 {
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2845 tv->vval.v_list = list_alloc();
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2846 if (tv->vval.v_list != NULL)
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2847 {
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2848 ++tv->vval.v_list->lv_refcount;
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2849 tv->vval.v_list->lv_type = alloc_type(type);
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2850 }
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2851 }
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2852 else if (tv->v_type == VAR_BLOB && tv->vval.v_blob == NULL)
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2853 {
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2854 tv->vval.v_blob = blob_alloc();
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2855 if (tv->vval.v_blob != NULL)
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2856 ++tv->vval.v_blob->bv_refcount;
e6e3abc28c7a patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents: 27811
diff changeset
2857 }
24482
3d5a66e478f8 patch 8.2.2781: add() silently skips when adding to null list or blob
Bram Moolenaar <Bram@vim.org>
parents: 24446
diff changeset
2858 }
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 21150
diff changeset
2859 copy_tv(tv, rettv);
22802
3e0f909ca1f2 patch 8.2.1949: Vim9: using extend() on null dict is silently ignored
Bram Moolenaar <Bram@vim.org>
parents: 22705
diff changeset
2860 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2861 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2862
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2863 name[len] = cc;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2864
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2865 return ret;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2866 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2867
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2868 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2869 * Check if variable "name[len]" is a local variable or an argument.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2870 * If so, "*eval_lavars_used" is set to TRUE.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2871 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2872 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2873 check_vars(char_u *name, int len)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2874 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2875 int cc;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2876 char_u *varname;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2877 hashtab_T *ht;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2878
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2879 if (eval_lavars_used == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2880 return;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2881
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2882 // truncate the name, so that we can use strcmp()
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2883 cc = name[len];
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2884 name[len] = NUL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2886 ht = find_var_ht(name, &varname);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2887 if (ht == get_funccal_local_ht() || ht == get_funccal_args_ht())
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2888 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2889 if (find_var(name, NULL, TRUE) != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2890 *eval_lavars_used = TRUE;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2891 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2892
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2893 name[len] = cc;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2894 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2895
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2896 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2897 * Find variable "name" in the list of variables.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2898 * Return a pointer to it if found, NULL if not found.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2899 * Careful: "a:0" variables don't have a name.
23527
27ca5534a408 patch 8.2.2306: Vim9: when using function reference type is not checked
Bram Moolenaar <Bram@vim.org>
parents: 23509
diff changeset
2900 * When "htp" is not NULL set "htp" to the hashtab_T used.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2901 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2902 dictitem_T *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2903 find_var(char_u *name, hashtab_T **htp, int no_autoload)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2904 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2905 char_u *varname;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2906 hashtab_T *ht;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2907 dictitem_T *ret = NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2908
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2909 ht = find_var_ht(name, &varname);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2910 if (htp != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2911 *htp = ht;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2912 if (ht == NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2913 return NULL;
23527
27ca5534a408 patch 8.2.2306: Vim9: when using function reference type is not checked
Bram Moolenaar <Bram@vim.org>
parents: 23509
diff changeset
2914 ret = find_var_in_ht(ht, *name, varname, no_autoload);
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2915 if (ret != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2916 return ret;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2917
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
2918 // Search in parent scope for lambda
23527
27ca5534a408 patch 8.2.2306: Vim9: when using function reference type is not checked
Bram Moolenaar <Bram@vim.org>
parents: 23509
diff changeset
2919 ret = find_var_in_scoped_ht(name, no_autoload);
22942
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2920 if (ret != NULL)
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2921 return ret;
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2922
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2923 // in Vim9 script items without a scope can be script-local
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2924 if (in_vim9script() && name[0] != NUL && name[1] != ':')
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2925 {
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2926 ht = get_script_local_ht();
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2927 if (ht != NULL)
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2928 {
23527
27ca5534a408 patch 8.2.2306: Vim9: when using function reference type is not checked
Bram Moolenaar <Bram@vim.org>
parents: 23509
diff changeset
2929 ret = find_var_in_ht(ht, *name, varname, no_autoload);
22942
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2930 if (ret != NULL)
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2931 {
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2932 if (htp != NULL)
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2933 *htp = ht;
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2934 return ret;
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2935 }
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2936 }
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2937 }
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2938
27108
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2939 // When using "vim9script autoload" script-local items are prefixed but can
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2940 // be used with s:name.
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2941 if (SCRIPT_ID_VALID(current_sctx.sc_sid)
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2942 && name[0] == 's' && name[1] == ':')
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2943 {
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2944 scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2945
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2946 if (si->sn_autoload_prefix != NULL)
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2947 {
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2948 char_u *auto_name = concat_str(si->sn_autoload_prefix, name + 2);
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2949
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2950 if (auto_name != NULL)
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2951 {
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2952 ht = &globvarht;
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2953 ret = find_var_in_ht(ht, *name, auto_name, TRUE);
27110
62b88e6cd791 patch 8.2.4084: memory leak when looking for autoload prefixed variable
Bram Moolenaar <Bram@vim.org>
parents: 27108
diff changeset
2954 vim_free(auto_name);
27108
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2955 if (ret != NULL)
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2956 {
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2957 if (htp != NULL)
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2958 *htp = ht;
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2959 return ret;
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2960 }
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2961 }
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2962 }
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2963 }
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
2964
22942
4759d13193fb patch 8.2.2018: Vim9: script variable not found from lambda
Bram Moolenaar <Bram@vim.org>
parents: 22802
diff changeset
2965 return NULL;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2966 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2967
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
2968 /*
27002
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2969 * Like find_var() but if the name starts with <SNR>99_ then look in the
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2970 * referenced script (used for a funcref).
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2971 */
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2972 dictitem_T *
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2973 find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload)
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2974 {
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2975 if (STRNCMP(name, "<SNR>", 5) == 0 && isdigit(name[5]))
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2976 {
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2977 char_u *p = name + 5;
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2978 int sid = getdigits(&p);
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2979
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2980 if (SCRIPT_ID_VALID(sid) && *p == '_')
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2981 {
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2982 hashtab_T *ht = &SCRIPT_VARS(sid);
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2983
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2984 if (ht != NULL)
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2985 {
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2986 dictitem_T *di = find_var_in_ht(ht, 0, p + 1, no_autoload);
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2987
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2988 if (di != NULL)
27024
5d851ce07caf patch 8.2.4041: using unitialized pointer
Bram Moolenaar <Bram@vim.org>
parents: 27002
diff changeset
2989 {
5d851ce07caf patch 8.2.4041: using unitialized pointer
Bram Moolenaar <Bram@vim.org>
parents: 27002
diff changeset
2990 if (htp != NULL)
5d851ce07caf patch 8.2.4041: using unitialized pointer
Bram Moolenaar <Bram@vim.org>
parents: 27002
diff changeset
2991 *htp = ht;
27002
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2992 return di;
27024
5d851ce07caf patch 8.2.4041: using unitialized pointer
Bram Moolenaar <Bram@vim.org>
parents: 27002
diff changeset
2993 }
27002
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2994 }
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2995 }
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2996 }
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2997
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2998 return find_var(name, htp, no_autoload);
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
2999 }
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
3000
cf5b5e95f62b patch 8.2.4030: a script local funcref is not found from a mapping
Bram Moolenaar <Bram@vim.org>
parents: 26990
diff changeset
3001 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3002 * Find variable "varname" in hashtab "ht" with name "htname".
19902
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
3003 * When "varname" is empty returns curwin/curtab/etc vars dictionary.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3004 * Returns NULL if not found.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3005 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3006 dictitem_T *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3007 find_var_in_ht(
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3008 hashtab_T *ht,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3009 int htname,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3010 char_u *varname,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3011 int no_autoload)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3012 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3013 hashitem_T *hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3014
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3015 if (*varname == NUL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3016 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3017 // Must be something like "s:", otherwise "ht" would be NULL.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3018 switch (htname)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3019 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3020 case 's': return &SCRIPT_SV(current_sctx.sc_sid)->sv_var;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3021 case 'g': return &globvars_var;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3022 case 'v': return &vimvars_var;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3023 case 'b': return &curbuf->b_bufvar;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3024 case 'w': return &curwin->w_winvar;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3025 case 't': return &curtab->tp_winvar;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3026 case 'l': return get_funccal_local_var();
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3027 case 'a': return get_funccal_args_var();
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3028 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3029 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3030 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3031
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3032 hi = hash_find(ht, varname);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3033 if (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3034 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3035 // For global variables we may try auto-loading the script. If it
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3036 // worked find the variable again. Don't auto-load a script if it was
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3037 // loaded already, otherwise it would be loaded every time when
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3038 // checking if a function name is a Funcref variable.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3039 if (ht == &globvarht && !no_autoload)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3040 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3041 // Note: script_autoload() may make "hi" invalid. It must either
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3042 // be obtained again or not used.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3043 if (!script_autoload(varname, FALSE) || aborting())
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3044 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3045 hi = hash_find(ht, varname);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3046 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3047 if (HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3048 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3049 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3050 return HI2DI(hi);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3051 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3052
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3053 /*
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3054 * Get the script-local hashtab. NULL if not in a script context.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3055 */
22531
2df99e237965 patch 8.2.1814: missing change to remove "static"
Bram Moolenaar <Bram@vim.org>
parents: 22480
diff changeset
3056 hashtab_T *
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3057 get_script_local_ht(void)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3058 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3059 scid_T sid = current_sctx.sc_sid;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3060
21979
a98211c3e14e patch 8.2.1539: using invalid script ID causes a crash
Bram Moolenaar <Bram@vim.org>
parents: 21955
diff changeset
3061 if (SCRIPT_ID_VALID(sid))
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3062 return &SCRIPT_VARS(sid);
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3063 return NULL;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3064 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3065
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3066 /*
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3067 * Look for "name[len]" in script-local variables and functions.
24124
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3068 * When "cmd" is TRUE it must look like a command, a function must be followed
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3069 * by "(" or "->".
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3070 * Return OK when found, FAIL when not found.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3071 */
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3072 int
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3073 lookup_scriptitem(
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3074 char_u *name,
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3075 size_t len,
24124
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3076 int cmd,
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3077 cctx_T *dummy UNUSED)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3078 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3079 hashtab_T *ht = get_script_local_ht();
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3080 char_u buffer[30];
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3081 char_u *p;
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3082 int res;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3083 hashitem_T *hi;
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3084 int is_global = FALSE;
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3085 char_u *fname = name;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3086
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3087 if (ht == NULL)
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3088 return FAIL;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3089 if (len < sizeof(buffer) - 1)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3090 {
20326
74002d42dda0 patch 8.2.0718: gcc warning for returning pointer to local variable
Bram Moolenaar <Bram@vim.org>
parents: 20239
diff changeset
3091 // avoid an alloc/free for short names
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3092 vim_strncpy(buffer, name, len);
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3093 p = buffer;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3094 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3095 else
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3096 {
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20816
diff changeset
3097 p = vim_strnsave(name, len);
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3098 if (p == NULL)
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3099 return FAIL;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3100 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3101
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3102 hi = hash_find(ht, p);
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3103 res = HASHITEM_EMPTY(hi) ? FAIL : OK;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3104
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3105 // if not script-local, then perhaps imported
27698
3813036f19cb patch 8.2.4375: ctx_imports is not used
Bram Moolenaar <Bram@vim.org>
parents: 27690
diff changeset
3106 if (res == FAIL && find_imported(p, 0, FALSE) != NULL)
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3107 res = OK;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3108 if (p != buffer)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3109 vim_free(p);
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3110
24124
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3111 // Find a function, so that a following "->" works.
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3112 // When used as a command require "(" or "->" to follow, "Cmd" is a user
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3113 // command while "Cmd()" is a function call.
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3114 if (res != OK)
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3115 {
24124
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3116 p = skipwhite(name + len);
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3117
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3118 if (!cmd || name[len] == '(' || (p[0] == '-' && p[1] == '>'))
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3119 {
24124
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3120 // Do not check for an internal function, since it might also be a
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3121 // valid command, such as ":split" versus "split()".
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3122 // Skip "g:" before a function name.
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3123 if (name[0] == 'g' && name[1] == ':')
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3124 {
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3125 is_global = TRUE;
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3126 fname = name + 2;
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3127 }
27114
98a01021e465 patch 8.2.4086: "cctx" argument of find_func_even_dead() is unused
Bram Moolenaar <Bram@vim.org>
parents: 27110
diff changeset
3128 if (find_func(fname, is_global) != NULL)
24124
f4061617c438 patch 8.2.2603: Vim9: no effect if user command is also a function
Bram Moolenaar <Bram@vim.org>
parents: 24112
diff changeset
3129 res = OK;
24049
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3130 }
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3131 }
fc4c2beea99a patch 8.2.2566: Vim9: Function name is not recognized
Bram Moolenaar <Bram@vim.org>
parents: 23982
diff changeset
3132
23171
bb7531f77529 patch 8.2.2131: Vim9: crash when lambda uses same var as assignment
Bram Moolenaar <Bram@vim.org>
parents: 23048
diff changeset
3133 return res;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3134 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3135
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3136 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3137 * Find the hashtab used for a variable name.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3138 * Return NULL if the name is not valid.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3139 * Set "varname" to the start of name without ':'.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3140 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3141 hashtab_T *
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3142 find_var_ht(char_u *name, char_u **varname)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3143 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3144 hashitem_T *hi;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3145 hashtab_T *ht;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3146
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3147 if (name[0] == NUL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3148 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3149 if (name[1] != ':')
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3150 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3151 // The name must not start with a colon or #.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3152 if (name[0] == ':' || name[0] == AUTOLOAD_CHAR)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3153 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3154 *varname = name;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3155
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3156 // "version" is "v:version" in all scopes if scriptversion < 3.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3157 // Same for a few other variables marked with VV_COMPAT.
25622
15b54e0a576b patch 8.2.3347: check for legacy script is incomplete
Bram Moolenaar <Bram@vim.org>
parents: 25613
diff changeset
3158 if (in_old_script(3))
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3159 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3160 hi = hash_find(&compat_hashtab, name);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3161 if (!HASHITEM_EMPTY(hi))
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3162 return &compat_hashtab;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3163 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3164
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3165 ht = get_funccal_local_ht();
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3166 if (ht != NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3167 return ht; // local variable
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3168
24874
14b0b35d8488 patch 8.2.2975: Vim9: can only use an autoload function name as a string
Bram Moolenaar <Bram@vim.org>
parents: 24862
diff changeset
3169 // In Vim9 script items at the script level are script-local, except
14b0b35d8488 patch 8.2.2975: Vim9: can only use an autoload function name as a string
Bram Moolenaar <Bram@vim.org>
parents: 24862
diff changeset
3170 // for autoload names.
14b0b35d8488 patch 8.2.2975: Vim9: can only use an autoload function name as a string
Bram Moolenaar <Bram@vim.org>
parents: 24862
diff changeset
3171 if (in_vim9script() && vim_strchr(name, AUTOLOAD_CHAR) == NULL)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3172 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3173 ht = get_script_local_ht();
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3174 if (ht != NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3175 return ht;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3176 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3177
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3178 return &globvarht; // global variable
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3179 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3180 *varname = name + 2;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3181 if (*name == 'g') // global variable
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3182 return &globvarht;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3183 // There must be no ':' or '#' in the rest of the name, unless g: is used
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3184 if (vim_strchr(name + 2, ':') != NULL
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3185 || vim_strchr(name + 2, AUTOLOAD_CHAR) != NULL)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3186 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3187 if (*name == 'b') // buffer variable
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3188 return &curbuf->b_vars->dv_hashtab;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3189 if (*name == 'w') // window variable
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3190 return &curwin->w_vars->dv_hashtab;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3191 if (*name == 't') // tab page variable
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3192 return &curtab->tp_vars->dv_hashtab;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3193 if (*name == 'v') // v: variable
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3194 return &vimvarht;
19530
48e71f948360 patch 8.2.0322: Vim9: error checks not tested
Bram Moolenaar <Bram@vim.org>
parents: 19524
diff changeset
3195 if (get_current_funccal() != NULL
20943
1693ca876049 patch 8.2.1023: Vim9: redefining a function uses a new index every time
Bram Moolenaar <Bram@vim.org>
parents: 20919
diff changeset
3196 && get_current_funccal()->func->uf_def_status == UF_NOT_COMPILED)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3197 {
19530
48e71f948360 patch 8.2.0322: Vim9: error checks not tested
Bram Moolenaar <Bram@vim.org>
parents: 19524
diff changeset
3198 // a: and l: are only used in functions defined with ":function"
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3199 if (*name == 'a') // a: function argument
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3200 return get_funccal_args_ht();
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3201 if (*name == 'l') // l: local function variable
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3202 return get_funccal_local_ht();
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3203 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3204 if (*name == 's') // script variable
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3205 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3206 ht = get_script_local_ht();
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3207 if (ht != NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3208 return ht;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3209 }
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3210 return NULL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3211 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3212
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3213 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3214 * Get the string value of a (global/local) variable.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3215 * Note: see tv_get_string() for how long the pointer remains valid.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3216 * Returns NULL when it doesn't exist.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3217 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3218 char_u *
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3219 get_var_value(char_u *name)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3220 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3221 dictitem_T *v;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3222
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3223 v = find_var(name, NULL, FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3224 if (v == NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3225 return NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3226 return tv_get_string(&v->di_tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3227 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3228
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3229 /*
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3230 * Allocate a new hashtab for a sourced script. It will be used while
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3231 * sourcing this script and when executing functions defined in the script.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3232 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3233 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3234 new_script_vars(scid_T id)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3235 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3236 scriptvar_T *sv;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3237
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
3238 sv = ALLOC_CLEAR_ONE(scriptvar_T);
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
3239 if (sv == NULL)
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
3240 return;
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19102
diff changeset
3241 init_var_dict(&sv->sv_dict, &sv->sv_var, VAR_SCOPE);
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
3242 SCRIPT_ITEM(id)->sn_vars = sv;
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3243 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3244
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3245 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3246 * Initialize dictionary "dict" as a scope and set variable "dict_var" to
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3247 * point to it.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3248 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3249 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3250 init_var_dict(dict_T *dict, dictitem_T *dict_var, int scope)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3251 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3252 hash_init(&dict->dv_hashtab);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3253 dict->dv_lock = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3254 dict->dv_scope = scope;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3255 dict->dv_refcount = DO_NOT_FREE_CNT;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3256 dict->dv_copyID = 0;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3257 dict_var->di_tv.vval.v_dict = dict;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3258 dict_var->di_tv.v_type = VAR_DICT;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3259 dict_var->di_tv.v_lock = VAR_FIXED;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3260 dict_var->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3261 dict_var->di_key[0] = NUL;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3262 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3263
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3264 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3265 * Unreference a dictionary initialized by init_var_dict().
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3266 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3267 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3268 unref_var_dict(dict_T *dict)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3269 {
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
3270 // Now the dict needs to be freed if no one else is using it, go back to
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
3271 // normal reference counting.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3272 dict->dv_refcount -= DO_NOT_FREE_CNT - 1;
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3273 dict_unref(dict);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3274 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3275
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
3276 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3277 * Clean up a list of internal variables.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3278 * Frees all allocated variables and the value they contain.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3279 * Clears hashtab "ht", does not free it.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3280 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3281 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3282 vars_clear(hashtab_T *ht)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3283 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3284 vars_clear_ext(ht, TRUE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3285 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3286
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3287 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3288 * Like vars_clear(), but only free the value if "free_val" is TRUE.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3289 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3290 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3291 vars_clear_ext(hashtab_T *ht, int free_val)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3292 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3293 int todo;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3294 hashitem_T *hi;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3295 dictitem_T *v;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3296
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3297 hash_lock(ht);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3298 todo = (int)ht->ht_used;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3299 for (hi = ht->ht_array; todo > 0; ++hi)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3300 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3301 if (!HASHITEM_EMPTY(hi))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3302 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3303 --todo;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3304
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3305 // Free the variable. Don't remove it from the hashtab,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3306 // ht_array might change then. hash_clear() takes care of it
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3307 // later.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3308 v = HI2DI(hi);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3309 if (free_val)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3310 clear_tv(&v->di_tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3311 if (v->di_flags & DI_FLAGS_ALLOC)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3312 vim_free(v);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3313 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3314 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3315 hash_clear(ht);
22594
209c7aa56325 patch 8.2.1845: Vim9: function defined in a block can't use block variables
Bram Moolenaar <Bram@vim.org>
parents: 22551
diff changeset
3316 hash_init(ht);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3317 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3318
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3319 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3320 * Delete a variable from hashtab "ht" at item "hi".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3321 * Clear the variable value and free the dictitem.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3322 */
22551
86a115a80262 patch 8.2.1824: Vim9: variables at the script level escape their scope
Bram Moolenaar <Bram@vim.org>
parents: 22531
diff changeset
3323 void
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3324 delete_var(hashtab_T *ht, hashitem_T *hi)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3325 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3326 dictitem_T *di = HI2DI(hi);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3327
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3328 hash_remove(ht, hi);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3329 clear_tv(&di->di_tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3330 vim_free(di);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3331 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3332
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3333 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3334 * List the value of one internal variable.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3335 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3336 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3337 list_one_var(dictitem_T *v, char *prefix, int *first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3338 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3339 char_u *tofree;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3340 char_u *s;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3341 char_u numbuf[NUMBUFLEN];
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3342
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3343 s = echo_string(&v->di_tv, &tofree, numbuf, get_copyID());
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3344 list_one_var_a(prefix, v->di_key, v->di_tv.v_type,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3345 s == NULL ? (char_u *)"" : s, first);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3346 vim_free(tofree);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3347 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3348
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3349 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3350 list_one_var_a(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3351 char *prefix,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3352 char_u *name,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3353 int type,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3354 char_u *string,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3355 int *first) // when TRUE clear rest of screen and set to FALSE
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3356 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3357 // don't use msg() or msg_attr() to avoid overwriting "v:statusmsg"
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3358 msg_start();
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3359 msg_puts(prefix);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3360 if (name != NULL) // "a:" vars don't have a name stored
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3361 msg_puts((char *)name);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3362 msg_putchar(' ');
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3363 msg_advance(22);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3364 if (type == VAR_NUMBER)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3365 msg_putchar('#');
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3366 else if (type == VAR_FUNC || type == VAR_PARTIAL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3367 msg_putchar('*');
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3368 else if (type == VAR_LIST)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3369 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3370 msg_putchar('[');
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3371 if (*string == '[')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3372 ++string;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3373 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3374 else if (type == VAR_DICT)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3375 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3376 msg_putchar('{');
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3377 if (*string == '{')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3378 ++string;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3379 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3380 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3381 msg_putchar(' ');
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3382
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3383 msg_outtrans(string);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3384
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3385 if (type == VAR_FUNC || type == VAR_PARTIAL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3386 msg_puts("()");
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3387 if (*first)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3388 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3389 msg_clr_eos();
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3390 *first = FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3391 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3392 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3393
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3394 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3395 * Set variable "name" to value in "tv".
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3396 * If the variable already exists, the value is updated.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3397 * Otherwise the variable is created.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3398 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3399 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3400 set_var(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3401 char_u *name,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3402 typval_T *tv,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3403 int copy) // make copy of value in "tv"
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3404 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3405 set_var_const(name, 0, NULL, tv, copy, ASSIGN_DECL, 0);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3406 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3407
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3408 /*
27108
92e2e96ff559 patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable
Bram Moolenaar <Bram@vim.org>
parents: 27049
diff changeset
3409 * Set variable "name" to value in "tv_arg".
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3410 * When "sid" is non-zero "name" is in the script with this ID.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3411 * If the variable already exists and "is_const" is FALSE the value is updated.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3412 * Otherwise the variable is created.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3413 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3414 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3415 set_var_const(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3416 char_u *name,
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3417 scid_T sid,
26302
7351926fbe9e patch 8.2.3682: Vim9: assigning to a script variable drops the type
Bram Moolenaar <Bram@vim.org>
parents: 26240
diff changeset
3418 type_T *type_arg,
22202
7899b4e2880c patch 8.2.1650: Vim9: result of && and || expression is not bool in script
Bram Moolenaar <Bram@vim.org>
parents: 22027
diff changeset
3419 typval_T *tv_arg,
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3420 int copy, // make copy of value in "tv"
24440
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3421 int flags_arg, // ASSIGN_CONST, ASSIGN_FINAL, etc.
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
3422 int var_idx) // index for ":let [a, b] = list"
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3423 {
22202
7899b4e2880c patch 8.2.1650: Vim9: result of && and || expression is not bool in script
Bram Moolenaar <Bram@vim.org>
parents: 22027
diff changeset
3424 typval_T *tv = tv_arg;
26302
7351926fbe9e patch 8.2.3682: Vim9: assigning to a script variable drops the type
Bram Moolenaar <Bram@vim.org>
parents: 26240
diff changeset
3425 type_T *type = type_arg;
22202
7899b4e2880c patch 8.2.1650: Vim9: result of && and || expression is not bool in script
Bram Moolenaar <Bram@vim.org>
parents: 22027
diff changeset
3426 typval_T bool_tv;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3427 dictitem_T *di;
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3428 typval_T *dest_tv;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3429 char_u *varname;
27049
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3430 char_u *name_tofree = NULL;
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3431 hashtab_T *ht = NULL;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3432 int is_script_local;
22266
23f5750146d9 patch 8.2.1682: Vim9: const works in an unexpected way
Bram Moolenaar <Bram@vim.org>
parents: 22240
diff changeset
3433 int vim9script = in_vim9script();
24279
e3dbf2e58c6a patch 8.2.2680: Vim9: problem defining a script variable from legacy function
Bram Moolenaar <Bram@vim.org>
parents: 24264
diff changeset
3434 int var_in_vim9script;
27049
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3435 int var_in_autoload = FALSE;
24440
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3436 int flags = flags_arg;
26482
b115b552071f patch 8.2.3771: Vim9: accessing freed memory when checking type
Bram Moolenaar <Bram@vim.org>
parents: 26450
diff changeset
3437 int free_tv_arg = !copy; // free tv_arg if not used
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3438
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3439 if (sid != 0)
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3440 {
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3441 if (SCRIPT_ID_VALID(sid))
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3442 ht = &SCRIPT_VARS(sid);
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3443 varname = name;
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3444 }
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3445 else
27049
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3446 {
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
3447 scriptitem_T *si;
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
3448
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
3449 if (in_vim9script() && is_export
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
3450 && SCRIPT_ID_VALID(current_sctx.sc_sid)
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
3451 && (si = SCRIPT_ITEM(current_sctx.sc_sid))
27950
aacc98a38cf3 patch 8.2.4500: Vim9: can declare a global variable on the command line
Bram Moolenaar <Bram@vim.org>
parents: 27934
diff changeset
3452 ->sn_autoload_prefix != NULL)
27049
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3453 {
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3454 // In a vim9 autoload script an exported variable is put in the
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3455 // global namespace with the autoload prefix.
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3456 var_in_autoload = TRUE;
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
3457 varname = concat_str(si->sn_autoload_prefix, name);
27049
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3458 if (varname == NULL)
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3459 goto failed;
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3460 name_tofree = varname;
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3461 ht = &globvarht;
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3462 }
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3463 else
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3464 ht = find_var_ht(name, &varname);
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3465 }
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3466 if (ht == NULL || *varname == NUL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3467 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
3468 semsg(_(e_illegal_variable_name_str), name);
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3469 goto failed;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3470 }
27583
d4921b91542c patch 8.2.4318: various comment and indent mistakes, returning wrong zero
Bram Moolenaar <Bram@vim.org>
parents: 27517
diff changeset
3471 is_script_local = ht == get_script_local_ht() || sid != 0
d4921b91542c patch 8.2.4318: various comment and indent mistakes, returning wrong zero
Bram Moolenaar <Bram@vim.org>
parents: 27517
diff changeset
3472 || var_in_autoload;
20953
6b4b887a12f0 patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
3473
22266
23f5750146d9 patch 8.2.1682: Vim9: const works in an unexpected way
Bram Moolenaar <Bram@vim.org>
parents: 22240
diff changeset
3474 if (vim9script
20953
6b4b887a12f0 patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
3475 && !is_script_local
23450
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
3476 && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
23297
40f1d3f0c53e patch 8.2.2194: Vim9: cannot use :const or :final at the script level
Bram Moolenaar <Bram@vim.org>
parents: 23295
diff changeset
3477 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
20953
6b4b887a12f0 patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
3478 && name[1] == ':')
20945
0653b9b72091 patch 8.2.1024: Vim9: no error for using "let g:var = val"
Bram Moolenaar <Bram@vim.org>
parents: 20943
diff changeset
3479 {
20953
6b4b887a12f0 patch 8.2.1028: Vim9: no error for declaring buffer, window, etc. variable
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
3480 vim9_declare_error(name);
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3481 goto failed;
20945
0653b9b72091 patch 8.2.1024: Vim9: no error for using "let g:var = val"
Bram Moolenaar <Bram@vim.org>
parents: 20943
diff changeset
3482 }
24440
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3483 if ((flags & ASSIGN_FOR_LOOP) && name[1] == ':'
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3484 && vim_strchr((char_u *)"gwbt", name[0]) != NULL)
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3485 // Do not make g:var, w:var, b:var or t:var final.
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3486 flags &= ~ASSIGN_FINAL;
d2f9bdd938fa patch 8.2.2760: Vim9: no error for changing a for loop variable
Bram Moolenaar <Bram@vim.org>
parents: 24426
diff changeset
3487
24279
e3dbf2e58c6a patch 8.2.2680: Vim9: problem defining a script variable from legacy function
Bram Moolenaar <Bram@vim.org>
parents: 24264
diff changeset
3488 var_in_vim9script = is_script_local && current_script_is_vim9();
24408
96e0b898d5b4 patch 8.2.2744: Vim9: no way to explicitly ignore an argument
Bram Moolenaar <Bram@vim.org>
parents: 24281
diff changeset
3489 if (var_in_vim9script && name[0] == '_' && name[1] == NUL)
96e0b898d5b4 patch 8.2.2744: Vim9: no way to explicitly ignore an argument
Bram Moolenaar <Bram@vim.org>
parents: 24281
diff changeset
3490 {
24426
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
3491 // For "[a, _] = list" the underscore is ignored.
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
3492 if ((flags & ASSIGN_UNPACK) == 0)
78343859f42d patch 8.2.2753: Vim9: cannot ignore an item in assignment unpack
Bram Moolenaar <Bram@vim.org>
parents: 24408
diff changeset
3493 emsg(_(e_cannot_use_underscore_here));
24408
96e0b898d5b4 patch 8.2.2744: Vim9: no way to explicitly ignore an argument
Bram Moolenaar <Bram@vim.org>
parents: 24281
diff changeset
3494 goto failed;
96e0b898d5b4 patch 8.2.2744: Vim9: no way to explicitly ignore an argument
Bram Moolenaar <Bram@vim.org>
parents: 24281
diff changeset
3495 }
20945
0653b9b72091 patch 8.2.1024: Vim9: no error for using "let g:var = val"
Bram Moolenaar <Bram@vim.org>
parents: 20943
diff changeset
3496
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3497 di = find_var_in_ht(ht, 0, varname, TRUE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3498
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3499 if (di == NULL && var_in_vim9script)
22202
7899b4e2880c patch 8.2.1650: Vim9: result of && and || expression is not bool in script
Bram Moolenaar <Bram@vim.org>
parents: 22027
diff changeset
3500 {
27698
3813036f19cb patch 8.2.4375: ctx_imports is not used
Bram Moolenaar <Bram@vim.org>
parents: 27690
diff changeset
3501 imported_T *import = find_imported(varname, 0, FALSE);
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3502
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3503 if (import != NULL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3504 {
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3505 // imported name space cannot be used
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3506 if ((flags & ASSIGN_NO_DECL) == 0)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3507 {
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3508 semsg(_(e_redefining_imported_item_str), name);
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3509 goto failed;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3510 }
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3511 semsg(_(e_cannot_use_str_itself_it_is_imported), name);
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
3512 goto failed;
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3513 }
27690
fae9567b8024 patch 8.2.4371: Vim9: can create a script variable from a legacy function
Bram Moolenaar <Bram@vim.org>
parents: 27583
diff changeset
3514 if (!in_vim9script())
fae9567b8024 patch 8.2.4371: Vim9: can create a script variable from a legacy function
Bram Moolenaar <Bram@vim.org>
parents: 27583
diff changeset
3515 {
fae9567b8024 patch 8.2.4371: Vim9: can create a script variable from a legacy function
Bram Moolenaar <Bram@vim.org>
parents: 27583
diff changeset
3516 semsg(_(e_cannot_create_vim9_script_variable_in_function_str),
fae9567b8024 patch 8.2.4371: Vim9: can create a script variable from a legacy function
Bram Moolenaar <Bram@vim.org>
parents: 27583
diff changeset
3517 name);
fae9567b8024 patch 8.2.4371: Vim9: can create a script variable from a legacy function
Bram Moolenaar <Bram@vim.org>
parents: 27583
diff changeset
3518 goto failed;
fae9567b8024 patch 8.2.4371: Vim9: can create a script variable from a legacy function
Bram Moolenaar <Bram@vim.org>
parents: 27583
diff changeset
3519 }
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3520 }
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3521
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3522 // Search in parent scope which is possible to reference from lambda
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3523 if (di == NULL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3524 di = find_var_in_scoped_ht(name, TRUE);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3525
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3526 if ((tv->v_type == VAR_FUNC || tv->v_type == VAR_PARTIAL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3527 && var_wrong_func_name(name, di == NULL))
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3528 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3529
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3530 if (need_convert_to_bool(type, tv))
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3531 {
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3532 // Destination is a bool and the value is not, but it can be
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3533 // converted.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3534 CLEAR_FIELD(bool_tv);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3535 bool_tv.v_type = VAR_BOOL;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3536 bool_tv.vval.v_number = tv2bool(tv) ? VVAL_TRUE : VVAL_FALSE;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3537 tv = &bool_tv;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3538 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3539
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3540 if (di != NULL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3541 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3542 // Item already exists. Allowed to replace when reloading.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3543 if ((di->di_flags & DI_FLAGS_RELOAD) == 0)
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3544 {
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3545 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3546 && (flags & ASSIGN_FOR_LOOP) == 0)
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3547 {
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3548 emsg(_(e_cannot_modify_existing_variable));
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3549 goto failed;
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3550 }
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3551
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3552 if (is_script_local && vim9script
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3553 && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0)
24281
243985ba92b5 patch 8.2.2681: Vim9: test fails for redeclaring script variable
Bram Moolenaar <Bram@vim.org>
parents: 24279
diff changeset
3554 {
243985ba92b5 patch 8.2.2681: Vim9: test fails for redeclaring script variable
Bram Moolenaar <Bram@vim.org>
parents: 24279
diff changeset
3555 semsg(_(e_redefining_script_item_str), name);
243985ba92b5 patch 8.2.2681: Vim9: test fails for redeclaring script variable
Bram Moolenaar <Bram@vim.org>
parents: 24279
diff changeset
3556 goto failed;
243985ba92b5 patch 8.2.2681: Vim9: test fails for redeclaring script variable
Bram Moolenaar <Bram@vim.org>
parents: 24279
diff changeset
3557 }
243985ba92b5 patch 8.2.2681: Vim9: test fails for redeclaring script variable
Bram Moolenaar <Bram@vim.org>
parents: 24279
diff changeset
3558
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3559 if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
3560 {
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3561 where_T where = WHERE_INIT;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3562 svar_T *sv = find_typval_in_script(&di->di_tv, sid);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3563
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3564 if (sv != NULL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3565 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3566 // check the type and adjust to bool if needed
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3567 where.wt_index = var_idx;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3568 where.wt_variable = TRUE;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3569 if (check_script_var_type(sv, tv, name, where) == FAIL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3570 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3571 if (type == NULL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3572 type = sv->sv_type;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3573 }
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3574 }
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3575
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3576 if ((flags & ASSIGN_FOR_LOOP) == 0
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3577 && var_check_permission(di, name) == FAIL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3578 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3579 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3580 else
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3581 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3582 // can only redefine once
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3583 di->di_flags &= ~DI_FLAGS_RELOAD;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3584
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3585 // A Vim9 script-local variable is also present in sn_all_vars
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3586 // and sn_var_vals. It may set "type" from "tv".
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3587 if (var_in_vim9script || var_in_autoload)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3588 update_vim9_script_var(FALSE, di,
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3589 var_in_autoload ? name : di->di_key, flags,
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3590 tv, &type, (flags & ASSIGN_NO_MEMBER_TYPE) == 0);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3591 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3592
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3593 // existing variable, need to clear the value
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3594
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3595 // Handle setting internal di: variables separately where needed to
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3596 // prevent changing the type.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3597 if (ht == &vimvarht)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3598 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3599 if (di->di_tv.v_type == VAR_STRING)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3600 {
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3601 VIM_CLEAR(di->di_tv.vval.v_string);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3602 if (copy || tv->v_type != VAR_STRING)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3603 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3604 char_u *val = tv_get_string(tv);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3605
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3606 // Careful: when assigning to v:errmsg and
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3607 // tv_get_string() causes an error message the variable
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3608 // will already be set.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3609 if (di->di_tv.vval.v_string == NULL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3610 di->di_tv.vval.v_string = vim_strsave(val);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3611 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3612 else
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3613 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3614 // Take over the string to avoid an extra alloc/free.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3615 di->di_tv.vval.v_string = tv->vval.v_string;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3616 tv->vval.v_string = NULL;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3617 }
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3618 goto failed;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3619 }
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3620 else if (di->di_tv.v_type == VAR_NUMBER)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3621 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3622 di->di_tv.vval.v_number = tv_get_number(tv);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3623 if (STRCMP(varname, "searchforward") == 0)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3624 set_search_direction(di->di_tv.vval.v_number
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3625 ? '/' : '?');
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3626 #ifdef FEAT_SEARCH_EXTRA
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3627 else if (STRCMP(varname, "hlsearch") == 0)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3628 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3629 no_hlsearch = !di->di_tv.vval.v_number;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3630 redraw_all_later(SOME_VALID);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3631 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3632 #endif
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3633 goto failed;
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3634 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3635 else if (di->di_tv.v_type != tv->v_type)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3636 {
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3637 semsg(_(e_setting_str_to_value_with_wrong_type), name);
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3638 goto failed;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3639 }
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3640 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3641
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3642 clear_tv(&di->di_tv);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3643 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3644 else
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3645 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3646 // Item not found, check if a function already exists.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3647 if (is_script_local && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3648 && lookup_scriptitem(name, STRLEN(name), FALSE, NULL) == OK)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3649 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3650 semsg(_(e_redefining_script_item_str), name);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3651 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3652 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3653
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3654 // add a new variable
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3655 if (var_in_vim9script && (flags & ASSIGN_NO_DECL))
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3656 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3657 semsg(_(e_unknown_variable_str), name);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3658 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3659 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3660
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3661 // Can't add "v:" or "a:" variable.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3662 if (ht == &vimvarht || ht == get_funccal_args_ht())
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3663 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3664 semsg(_(e_illegal_variable_name_str), name);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3665 goto failed;
23450
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
3666 }
a8e7acf71fa4 patch 8.2.2268: Vim9: list unpack seen as declaration
Bram Moolenaar <Bram@vim.org>
parents: 23448
diff changeset
3667
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3668 // Make sure the variable name is valid. In Vim9 script an
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3669 // autoload variable must be prefixed with "g:" unless in an
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3670 // autoload script.
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3671 if (!valid_varname(varname, -1, !vim9script
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3672 || STRNCMP(name, "g:", 2) == 0 || var_in_autoload))
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3673 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3674
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3675 di = alloc(sizeof(dictitem_T) + STRLEN(varname));
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3676 if (di == NULL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3677 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3678 STRCPY(di->di_key, varname);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3679 if (hash_add(ht, DI2HIKEY(di)) == FAIL)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3680 {
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3681 vim_free(di);
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3682 goto failed;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3683 }
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3684 di->di_flags = DI_FLAGS_ALLOC;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3685 if (flags & (ASSIGN_CONST | ASSIGN_FINAL))
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3686 di->di_flags |= DI_FLAGS_LOCK;
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3687
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3688 // A Vim9 script-local variable is also added to sn_all_vars and
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3689 // sn_var_vals. It may set "type" from "tv".
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3690 if (var_in_vim9script || var_in_autoload)
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3691 update_vim9_script_var(TRUE, di,
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3692 var_in_autoload ? name : di->di_key, flags,
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3693 tv, &type, (flags & ASSIGN_NO_MEMBER_TYPE) == 0);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3694 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3695
27811
27956f5e263c patch 8.2.4431: unnecessary condition when assigning to a variable
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
3696 dest_tv = &di->di_tv;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3697 if (copy || tv->v_type == VAR_NUMBER || tv->v_type == VAR_FLOAT)
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3698 copy_tv(tv, dest_tv);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3699 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3700 {
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3701 *dest_tv = *tv;
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3702 dest_tv->v_lock = 0;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3703 init_tv(tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3704 }
26482
b115b552071f patch 8.2.3771: Vim9: accessing freed memory when checking type
Bram Moolenaar <Bram@vim.org>
parents: 26450
diff changeset
3705 free_tv_arg = FALSE;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3706
23458
d2b1269c2c68 patch 8.2.2272: Vim9: extend() can violate the type of a variable
Bram Moolenaar <Bram@vim.org>
parents: 23450
diff changeset
3707 if (vim9script && type != NULL)
27517
f00a7a2bee21 patch 8.2.4286: Vim9: strict type checking after copy() and deepcopy()
Bram Moolenaar <Bram@vim.org>
parents: 27464
diff changeset
3708 set_tv_type(dest_tv, type);
23458
d2b1269c2c68 patch 8.2.2272: Vim9: extend() can violate the type of a variable
Bram Moolenaar <Bram@vim.org>
parents: 23450
diff changeset
3709
23299
d5919c5fd3dc patch 8.2.2195: failing tests for :const
Bram Moolenaar <Bram@vim.org>
parents: 23297
diff changeset
3710 // ":const var = value" locks the value
d5919c5fd3dc patch 8.2.2195: failing tests for :const
Bram Moolenaar <Bram@vim.org>
parents: 23297
diff changeset
3711 // ":final var = value" locks "var"
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22298
diff changeset
3712 if (flags & ASSIGN_CONST)
21847
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
3713 // Like :lockvar! name: lock the value and what it contains, but only
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
3714 // if the reference count is up to one. That locks only literal
fb74a3387694 patch 8.2.1473: items in a list given to :const can still be modified
Bram Moolenaar <Bram@vim.org>
parents: 21843
diff changeset
3715 // values.
25284
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3716 item_lock(dest_tv, DICT_MAXNEST, TRUE, TRUE);
29191571eceb patch 8.2.3179: Vim9: cannot assign to an imported variable at script level
Bram Moolenaar <Bram@vim.org>
parents: 25232
diff changeset
3717
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3718 failed:
27049
140102677c12 patch 8.2.4053: Vim9: autoload mechanism doesn't fully work yet
Bram Moolenaar <Bram@vim.org>
parents: 27043
diff changeset
3719 vim_free(name_tofree);
26482
b115b552071f patch 8.2.3771: Vim9: accessing freed memory when checking type
Bram Moolenaar <Bram@vim.org>
parents: 26450
diff changeset
3720 if (free_tv_arg)
22240
88927d5f275d patch 8.2.1669: Vim9: memory leak when storing a value fails
Bram Moolenaar <Bram@vim.org>
parents: 22202
diff changeset
3721 clear_tv(tv_arg);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3722 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3723
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3724 /*
23295
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3725 * Check in this order for backwards compatibility:
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3726 * - Whether the variable is read-only
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3727 * - Whether the variable value is locked
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3728 * - Whether the variable is locked
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3729 */
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3730 int
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3731 var_check_permission(dictitem_T *di, char_u *name)
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3732 {
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3733 if (var_check_ro(di->di_flags, name, FALSE)
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3734 || value_check_lock(di->di_tv.v_lock, name, FALSE)
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3735 || var_check_lock(di->di_flags, name, FALSE))
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3736 return FAIL;
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3737 return OK;
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3738 }
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3739
d9ae7dd3a0f2 patch 8.2.2193: Vim9: can change constant in :def function
Bram Moolenaar <Bram@vim.org>
parents: 23239
diff changeset
3740 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3741 * Return TRUE if di_flags "flags" indicates variable "name" is read-only.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3742 * Also give an error message.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3743 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3744 int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3745 var_check_ro(int flags, char_u *name, int use_gettext)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3746 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3747 if (flags & DI_FLAGS_RO)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3748 {
26624
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3749 if (name == NULL)
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3750 emsg(_(e_cannot_change_readonly_variable));
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3751 else
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3752 semsg(_(e_cannot_change_readonly_variable_str),
25320
1e6da8364a02 patch 8.2.3197: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 25302
diff changeset
3753 use_gettext ? (char_u *)_(name) : name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3754 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3755 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3756 if ((flags & DI_FLAGS_RO_SBX) && sandbox)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3757 {
26624
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3758 if (name == NULL)
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3759 emsg(_(e_cannot_set_variable_in_sandbox));
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3760 else
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3761 semsg(_(e_cannot_set_variable_in_sandbox_str),
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3762 use_gettext ? (char_u *)_(name) : name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3763 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3764 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3765 return FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3766 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3767
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3768 /*
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3769 * Return TRUE if di_flags "flags" indicates variable "name" is locked.
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3770 * Also give an error message.
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3771 */
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3772 int
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3773 var_check_lock(int flags, char_u *name, int use_gettext)
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3774 {
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3775 if (flags & DI_FLAGS_LOCK)
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3776 {
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3777 semsg(_(e_variable_is_locked_str),
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3778 use_gettext ? (char_u *)_(name) : name);
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3779 return TRUE;
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3780 }
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3781 return FALSE;
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3782 }
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3783
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3784 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3785 * Return TRUE if di_flags "flags" indicates variable "name" is fixed.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3786 * Also give an error message.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3787 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3788 int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3789 var_check_fixed(int flags, char_u *name, int use_gettext)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3790 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3791 if (flags & DI_FLAGS_FIX)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3792 {
26624
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3793 if (name == NULL)
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3794 emsg(_(e_cannot_delete_variable));
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3795 else
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3796 semsg(_(e_cannot_delete_variable_str),
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3797 use_gettext ? (char_u *)_(name) : name);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3798 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3799 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3800 return FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3801 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3802
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3803 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3804 * Check if a funcref is assigned to a valid variable name.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3805 * Return TRUE and give an error if not.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3806 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3807 int
21691
f41c646cb8b9 patch 8.2.1395: Vim9: no error if declaring a funcref with lower case letter
Bram Moolenaar <Bram@vim.org>
parents: 21630
diff changeset
3808 var_wrong_func_name(
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3809 char_u *name, // points to start of variable name
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3810 int new_var) // TRUE when creating the variable
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3811 {
24264
db5eaad456cc patch 8.2.2673: Vim9: script-local funcref can have lower case name
Bram Moolenaar <Bram@vim.org>
parents: 24238
diff changeset
3812 // Allow for w: b: s: and t:. In Vim9 script s: is not allowed, because
db5eaad456cc patch 8.2.2673: Vim9: script-local funcref can have lower case name
Bram Moolenaar <Bram@vim.org>
parents: 24238
diff changeset
3813 // the name can be used without the s: prefix.
db5eaad456cc patch 8.2.2673: Vim9: script-local funcref can have lower case name
Bram Moolenaar <Bram@vim.org>
parents: 24238
diff changeset
3814 if (!((vim_strchr((char_u *)"wbt", name[0]) != NULL
db5eaad456cc patch 8.2.2673: Vim9: script-local funcref can have lower case name
Bram Moolenaar <Bram@vim.org>
parents: 24238
diff changeset
3815 || (!in_vim9script() && name[0] == 's')) && name[1] == ':')
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3816 && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3817 ? name[2] : name[0]))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3818 {
26952
b34ddbca305c patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26915
diff changeset
3819 semsg(_(e_funcref_variable_name_must_start_with_capital_str), name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3820 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3821 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3822 // Don't allow hiding a function. When "v" is not NULL we might be
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3823 // assigning another function to the same var, the type is checked
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3824 // below.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3825 if (new_var && function_exists(name, FALSE))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3826 {
26952
b34ddbca305c patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26915
diff changeset
3827 semsg(_(e_variable_name_conflicts_with_existing_function_str),
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3828 name);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3829 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3830 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3831 return FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3832 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3833
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3834 /*
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3835 * Return TRUE if "flags" indicates variable "name" has a locked (immutable)
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3836 * value. Also give an error message, using "name" or _("name") when
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3837 * "use_gettext" is TRUE.
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3838 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3839 int
22298
07e48ee8c3bb patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
3840 value_check_lock(int lock, char_u *name, int use_gettext)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3841 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3842 if (lock & VAR_LOCKED)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3843 {
26624
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3844 if (name == NULL)
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3845 emsg(_(e_value_is_locked));
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3846 else
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3847 semsg(_(e_value_is_locked_str),
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3848 use_gettext ? (char_u *)_(name) : name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3849 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3850 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3851 if (lock & VAR_FIXED)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3852 {
26624
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3853 if (name == NULL)
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3854 emsg(_(e_cannot_change_value));
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3855 else
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3856 semsg(_(e_cannot_change_value_of_str),
bdf11d8e3df3 patch 8.2.3841: Vim9: outdated TODO items, disabled tests that work
Bram Moolenaar <Bram@vim.org>
parents: 26602
diff changeset
3857 use_gettext ? (char_u *)_(name) : name);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3858 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3859 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3860 return FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3861 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3862
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3863 /*
23233
657216220293 patch 8.2.2162: Vim9: Cannot load or store autoload variables
Bram Moolenaar <Bram@vim.org>
parents: 23223
diff changeset
3864 * Check if a variable name is valid. When "autoload" is true "#" is allowed.
26238
14b4c778b61e patch 8.2.3650: Vim9: for loop variable can be a list member
Bram Moolenaar <Bram@vim.org>
parents: 26195
diff changeset
3865 * If "len" is -1 use all of "varname", otherwise up to "varname[len]".
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3866 * Return FALSE and give an error if not.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3867 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3868 int
26238
14b4c778b61e patch 8.2.3650: Vim9: for loop variable can be a list member
Bram Moolenaar <Bram@vim.org>
parents: 26195
diff changeset
3869 valid_varname(char_u *varname, int len, int autoload)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3870 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3871 char_u *p;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3872
26238
14b4c778b61e patch 8.2.3650: Vim9: for loop variable can be a list member
Bram Moolenaar <Bram@vim.org>
parents: 26195
diff changeset
3873 for (p = varname; len < 0 ? *p != NUL : p < varname + len; ++p)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3874 if (!eval_isnamec1(*p) && (p == varname || !VIM_ISDIGIT(*p))
23233
657216220293 patch 8.2.2162: Vim9: Cannot load or store autoload variables
Bram Moolenaar <Bram@vim.org>
parents: 23223
diff changeset
3875 && !(autoload && *p == AUTOLOAD_CHAR))
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3876 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
3877 semsg(_(e_illegal_variable_name_str), varname);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3878 return FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3879 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3880 return TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3881 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3882
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3883 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3884 * getwinvar() and gettabwinvar()
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3885 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3886 static void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3887 getwinvar(
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3888 typval_T *argvars,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3889 typval_T *rettv,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3890 int off) // 1 for gettabwinvar()
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3891 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3892 win_T *win;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3893 char_u *varname;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3894 dictitem_T *v;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3895 tabpage_T *tp = NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3896 int done = FALSE;
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
3897 switchwin_T switchwin;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3898 int need_switch_win;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3899
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3900 if (off == 1)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3901 tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3902 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3903 tp = curtab;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3904 win = find_win_by_nr(&argvars[off], tp);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3905 varname = tv_get_string_chk(&argvars[off + 1]);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3906 ++emsg_off;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3907
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3908 rettv->v_type = VAR_STRING;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3909 rettv->vval.v_string = NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3910
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3911 if (win != NULL && varname != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3912 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3913 // Set curwin to be our win, temporarily. Also set the tabpage,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3914 // otherwise the window is not valid. Only do this when needed,
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3915 // autocommands get blocked.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3916 need_switch_win = !(tp == curtab && win == curwin);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3917 if (!need_switch_win
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
3918 || switch_win(&switchwin, win, tp, TRUE) == OK)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3919 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3920 if (*varname == '&')
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3921 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3922 if (varname[1] == NUL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3923 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3924 // get all window-local options in a dict
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3925 dict_T *opts = get_winbuf_options(FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3926
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3927 if (opts != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3928 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3929 rettv_dict_set(rettv, opts);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3930 done = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3931 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3932 }
21120
4d844a65183d patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents: 21056
diff changeset
3933 else if (eval_option(&varname, rettv, 1) == OK)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3934 // window-local-option
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3935 done = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3936 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3937 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3938 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3939 // Look up the variable.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3940 // Let getwinvar({nr}, "") return the "w:" dictionary.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3941 v = find_var_in_ht(&win->w_vars->dv_hashtab, 'w',
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3942 varname, FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3943 if (v != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3944 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3945 copy_tv(&v->di_tv, rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3946 done = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3947 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3948 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3949 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3950
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3951 if (need_switch_win)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3952 // restore previous notion of curwin
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
3953 restore_win(&switchwin, TRUE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3954 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3955
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3956 if (!done && argvars[off + 2].v_type != VAR_UNKNOWN)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3957 // use the default return value
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3958 copy_tv(&argvars[off + 2], rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3959
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3960 --emsg_off;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3961 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3962
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3963 /*
21879
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3964 * Set option "varname" to the value of "varp" for the current buffer/window.
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3965 */
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3966 static void
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3967 set_option_from_tv(char_u *varname, typval_T *varp)
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3968 {
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3969 long numval = 0;
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3970 char_u *strval;
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3971 char_u nbuf[NUMBUFLEN];
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3972 int error = FALSE;
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3973
23483
ce7d6b461660 patch 8.2.2284: Vim9: cannot set an option to a boolean value
Bram Moolenaar <Bram@vim.org>
parents: 23458
diff changeset
3974 if (varp->v_type == VAR_BOOL)
23485
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3975 {
23483
ce7d6b461660 patch 8.2.2284: Vim9: cannot set an option to a boolean value
Bram Moolenaar <Bram@vim.org>
parents: 23458
diff changeset
3976 numval = (long)varp->vval.v_number;
23485
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3977 strval = (char_u *)"0"; // avoid using "false"
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3978 }
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3979 else
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3980 {
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3981 if (!in_vim9script() || varp->v_type != VAR_STRING)
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3982 numval = (long)tv_get_number_chk(varp, &error);
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3983 strval = tv_get_string_buf_chk(varp, nbuf);
198ad7ef2420 patch 8.2.2285: Vim9: cannot set an option to a false
Bram Moolenaar <Bram@vim.org>
parents: 23483
diff changeset
3984 }
21879
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3985 if (!error && strval != NULL)
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3986 set_option_value(varname, numval, strval, OPT_LOCAL);
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3987 }
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3988
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
3989 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3990 * "setwinvar()" and "settabwinvar()" functions
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3991 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3992 static void
19049
e47b04b01793 patch 8.2.0085: dead code in builtin functions
Bram Moolenaar <Bram@vim.org>
parents: 18477
diff changeset
3993 setwinvar(typval_T *argvars, int off)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3994 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3995 win_T *win;
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
3996 switchwin_T switchwin;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3997 int need_switch_win;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3998 char_u *varname, *winvarname;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3999 typval_T *varp;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4000 tabpage_T *tp = NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4001
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4002 if (check_secure())
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4003 return;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4004
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4005 if (off == 1)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4006 tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4007 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4008 tp = curtab;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4009 win = find_win_by_nr(&argvars[off], tp);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4010 varname = tv_get_string_chk(&argvars[off + 1]);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4011 varp = &argvars[off + 2];
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4012
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4013 if (win != NULL && varname != NULL && varp != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4014 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4015 need_switch_win = !(tp == curtab && win == curwin);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4016 if (!need_switch_win
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
4017 || switch_win(&switchwin, win, tp, TRUE) == OK)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4018 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4019 if (*varname == '&')
21879
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
4020 set_option_from_tv(varname + 1, varp);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4021 else
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4022 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4023 winvarname = alloc(STRLEN(varname) + 3);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4024 if (winvarname != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4025 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4026 STRCPY(winvarname, "w:");
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4027 STRCPY(winvarname + 2, varname);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4028 set_var(winvarname, varp, TRUE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4029 vim_free(winvarname);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4030 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4031 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4032 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4033 if (need_switch_win)
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
4034 restore_win(&switchwin, TRUE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4035 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4036 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4037
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4038 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4039 * reset v:option_new, v:option_old, v:option_oldlocal, v:option_oldglobal,
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4040 * v:option_type, and v:option_command.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4041 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4042 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4043 reset_v_option_vars(void)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4044 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4045 set_vim_var_string(VV_OPTION_NEW, NULL, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4046 set_vim_var_string(VV_OPTION_OLD, NULL, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4047 set_vim_var_string(VV_OPTION_OLDLOCAL, NULL, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4048 set_vim_var_string(VV_OPTION_OLDGLOBAL, NULL, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4049 set_vim_var_string(VV_OPTION_TYPE, NULL, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4050 set_vim_var_string(VV_OPTION_COMMAND, NULL, -1);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4051 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4052
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4053 /*
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4054 * Add an assert error to v:errors.
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4055 */
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4056 void
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4057 assert_error(garray_T *gap)
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4058 {
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4059 struct vimvar *vp = &vimvars[VV_ERRORS];
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4060
26723
c3cffd372c6f patch 8.2.3890: Vim9: type check for using v: variables is basic
Bram Moolenaar <Bram@vim.org>
parents: 26721
diff changeset
4061 if (vp->vv_tv_type != VAR_LIST || vimvars[VV_ERRORS].vv_list == NULL)
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4062 // Make sure v:errors is a list.
17885
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4063 set_vim_var_list(VV_ERRORS, list_alloc());
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4064 list_append_string(vimvars[VV_ERRORS].vv_list, gap->ga_data, gap->ga_len);
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4065 }
5e2d8840da11 patch 8.1.1939: code for handling v: variables in generic eval file
Bram Moolenaar <Bram@vim.org>
parents: 17873
diff changeset
4066
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4067 int
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4068 var_exists(char_u *var)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4069 {
21630
3c6c52fbc8ea patch 8.2.1365: Vim9: no error for missing white space around operator
Bram Moolenaar <Bram@vim.org>
parents: 21610
diff changeset
4070 char_u *arg = var;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4071 char_u *name;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4072 char_u *tofree;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4073 typval_T tv;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4074 int len = 0;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4075 int n = FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4076
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4077 // get_name_len() takes care of expanding curly braces
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4078 name = var;
21630
3c6c52fbc8ea patch 8.2.1365: Vim9: no error for missing white space around operator
Bram Moolenaar <Bram@vim.org>
parents: 21610
diff changeset
4079 len = get_name_len(&arg, &tofree, TRUE, FALSE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4080 if (len > 0)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4081 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4082 if (tofree != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4083 name = tofree;
26980
8796f1384750 patch 8.2.4019: Vim9: import mechanism is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 26978
diff changeset
4084 n = (eval_variable(name, len, 0, &tv, NULL,
24112
0346a59ed5bf patch 8.2.2597: Vim9: "import * as" does not work at script level
Bram Moolenaar <Bram@vim.org>
parents: 24075
diff changeset
4085 EVAL_VAR_NOAUTOLOAD + EVAL_VAR_IMPORT) == OK);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4086 if (n)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4087 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4088 // handle d.key, l[idx], f(expr)
21630
3c6c52fbc8ea patch 8.2.1365: Vim9: no error for missing white space around operator
Bram Moolenaar <Bram@vim.org>
parents: 21610
diff changeset
4089 arg = skipwhite(arg);
26990
4b8d836db103 patch 8.2.4024: confusing error message if imported name is used directly
Bram Moolenaar <Bram@vim.org>
parents: 26980
diff changeset
4090 n = (handle_subscript(&arg, name, &tv, &EVALARG_EVALUATE,
4b8d836db103 patch 8.2.4024: confusing error message if imported name is used directly
Bram Moolenaar <Bram@vim.org>
parents: 26980
diff changeset
4091 FALSE) == OK);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4092 if (n)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4093 clear_tv(&tv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4094 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4095 }
21630
3c6c52fbc8ea patch 8.2.1365: Vim9: no error for missing white space around operator
Bram Moolenaar <Bram@vim.org>
parents: 21610
diff changeset
4096 if (*arg != NUL)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4097 n = FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4098
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4099 vim_free(tofree);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4100 return n;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4101 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4102
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4103 static lval_T *redir_lval = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4104 #define EVALCMD_BUSY (redir_lval == (lval_T *)&redir_lval)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4105 static garray_T redir_ga; // only valid when redir_lval is not NULL
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4106 static char_u *redir_endp = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4107 static char_u *redir_varname = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4108
24490
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4109 int
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4110 alloc_redir_lval(void)
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4111 {
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4112 redir_lval = ALLOC_CLEAR_ONE(lval_T);
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4113 if (redir_lval == NULL)
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4114 return FAIL;
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4115 return OK;
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4116 }
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4117
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4118 void
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4119 clear_redir_lval(void)
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4120 {
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4121 VIM_CLEAR(redir_lval);
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4122 }
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4123
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4124 void
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4125 init_redir_ga(void)
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4126 {
27028
c9474ae175f4 patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents: 27024
diff changeset
4127 ga_init2(&redir_ga, sizeof(char), 500);
24490
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4128 }
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4129
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4130 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4131 * Start recording command output to a variable
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4132 * When "append" is TRUE append to an existing variable.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4133 * Returns OK if successfully completed the setup. FAIL otherwise.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4134 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4135 int
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4136 var_redir_start(char_u *name, int append)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4137 {
21265
6a4806e326dd patch 8.2.1183: assert_fails() checks the last error message
Bram Moolenaar <Bram@vim.org>
parents: 21206
diff changeset
4138 int called_emsg_before;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4139 typval_T tv;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4140
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4141 // Catch a bad name early.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4142 if (!eval_isnamec1(*name))
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4143 {
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
4144 emsg(_(e_invalid_argument));
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4145 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4146 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4147
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4148 // Make a copy of the name, it is used in redir_lval until redir ends.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4149 redir_varname = vim_strsave(name);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4150 if (redir_varname == NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4151 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4152
24490
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4153 if (alloc_redir_lval() == FAIL)
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4154 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4155 var_redir_stop();
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4156 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4157 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4158
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4159 // The output is stored in growarray "redir_ga" until redirection ends.
24490
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4160 init_redir_ga();
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4161
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4162 // Parse the variable name (can be a dict or list entry).
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4163 redir_endp = get_lval(redir_varname, NULL, redir_lval, FALSE, FALSE, 0,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4164 FNE_CHECK_START);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4165 if (redir_endp == NULL || redir_lval->ll_name == NULL || *redir_endp != NUL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4166 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4167 clear_lval(redir_lval);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4168 if (redir_endp != NULL && *redir_endp != NUL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4169 // Trailing characters are present after the variable name
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26881
diff changeset
4170 semsg(_(e_trailing_characters_str), redir_endp);
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4171 else
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26861
diff changeset
4172 semsg(_(e_invalid_argument_str), name);
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4173 redir_endp = NULL; // don't store a value, only cleanup
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4174 var_redir_stop();
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4175 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4176 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4177
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4178 // check if we can write to the variable: set it to or append an empty
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4179 // string
21265
6a4806e326dd patch 8.2.1183: assert_fails() checks the last error message
Bram Moolenaar <Bram@vim.org>
parents: 21206
diff changeset
4180 called_emsg_before = called_emsg;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4181 tv.v_type = VAR_STRING;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4182 tv.vval.v_string = (char_u *)"";
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4183 if (append)
22691
dda110a14be4 patch 8.2.1894: Vim9: command modifiers are not supported
Bram Moolenaar <Bram@vim.org>
parents: 22667
diff changeset
4184 set_var_lval(redir_lval, redir_endp, &tv, TRUE,
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
4185 ASSIGN_NO_DECL, (char_u *)".", 0);
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4186 else
22691
dda110a14be4 patch 8.2.1894: Vim9: command modifiers are not supported
Bram Moolenaar <Bram@vim.org>
parents: 22667
diff changeset
4187 set_var_lval(redir_lval, redir_endp, &tv, TRUE,
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
4188 ASSIGN_NO_DECL, (char_u *)"=", 0);
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4189 clear_lval(redir_lval);
21265
6a4806e326dd patch 8.2.1183: assert_fails() checks the last error message
Bram Moolenaar <Bram@vim.org>
parents: 21206
diff changeset
4190 if (called_emsg > called_emsg_before)
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4191 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4192 redir_endp = NULL; // don't store a value, only cleanup
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4193 var_redir_stop();
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4194 return FAIL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4195 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4196
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4197 return OK;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4198 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4199
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4200 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4201 * Append "value[value_len]" to the variable set by var_redir_start().
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4202 * The actual appending is postponed until redirection ends, because the value
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4203 * appended may in fact be the string we write to, changing it may cause freed
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4204 * memory to be used:
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4205 * :redir => foo
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4206 * :let foo
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4207 * :redir END
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4208 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4209 void
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4210 var_redir_str(char_u *value, int value_len)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4211 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4212 int len;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4213
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4214 if (redir_lval == NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4215 return;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4216
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4217 if (value_len == -1)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4218 len = (int)STRLEN(value); // Append the entire string
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4219 else
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4220 len = value_len; // Append only "value_len" characters
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4221
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4222 if (ga_grow(&redir_ga, len) == OK)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4223 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4224 mch_memmove((char *)redir_ga.ga_data + redir_ga.ga_len, value, len);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4225 redir_ga.ga_len += len;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4226 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4227 else
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4228 var_redir_stop();
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4229 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4230
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4231 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4232 * Stop redirecting command output to a variable.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4233 * Frees the allocated memory.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4234 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4235 void
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4236 var_redir_stop(void)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4237 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4238 typval_T tv;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4239
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4240 if (EVALCMD_BUSY)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4241 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4242 redir_lval = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4243 return;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4244 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4245
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4246 if (redir_lval != NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4247 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4248 // If there was no error: assign the text to the variable.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4249 if (redir_endp != NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4250 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4251 ga_append(&redir_ga, NUL); // Append the trailing NUL.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4252 tv.v_type = VAR_STRING;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4253 tv.vval.v_string = redir_ga.ga_data;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4254 // Call get_lval() again, if it's inside a Dict or List it may
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4255 // have changed.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4256 redir_endp = get_lval(redir_varname, NULL, redir_lval,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4257 FALSE, FALSE, 0, FNE_CHECK_START);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4258 if (redir_endp != NULL && redir_lval->ll_name != NULL)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19108
diff changeset
4259 set_var_lval(redir_lval, redir_endp, &tv, FALSE, 0,
23917
4b417b776b95 patch 8.2.2501: not always clear where an error is reported
Bram Moolenaar <Bram@vim.org>
parents: 23707
diff changeset
4260 (char_u *)".", 0);
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4261 clear_lval(redir_lval);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4262 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4263
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4264 // free the collected output
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4265 VIM_CLEAR(redir_ga.ga_data);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4266
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4267 VIM_CLEAR(redir_lval);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4268 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4269 VIM_CLEAR(redir_varname);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4270 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17893
diff changeset
4271
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4272 /*
24490
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4273 * Get the collected redirected text and clear redir_ga.
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4274 */
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4275 char_u *
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4276 get_clear_redir_ga(void)
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4277 {
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4278 char_u *res;
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4279
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4280 ga_append(&redir_ga, NUL); // Append the trailing NUL.
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4281 res = redir_ga.ga_data;
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4282 redir_ga.ga_data = NULL;
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4283 return res;
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4284 }
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4285
08050e45bd06 patch 8.2.2785: Vim9: cannot redirect to local variable
Bram Moolenaar <Bram@vim.org>
parents: 24482
diff changeset
4286 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4287 * "gettabvar()" function
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4288 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4289 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4290 f_gettabvar(typval_T *argvars, typval_T *rettv)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4291 {
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
4292 switchwin_T switchwin;
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
4293 tabpage_T *tp;
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4294 dictitem_T *v;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4295 char_u *varname;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4296 int done = FALSE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4297
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4298 rettv->v_type = VAR_STRING;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4299 rettv->vval.v_string = NULL;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4300
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4301 if (in_vim9script()
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4302 && (check_for_number_arg(argvars, 0) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4303 || check_for_string_arg(argvars, 1) == FAIL))
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4304 return;
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4305
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4306 varname = tv_get_string_chk(&argvars[1]);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4307 tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4308 if (tp != NULL && varname != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4309 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4310 // Set tp to be our tabpage, temporarily. Also set the window to the
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4311 // first window in the tabpage, otherwise the window is not valid.
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
4312 if (switch_win(&switchwin,
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4313 tp == curtab || tp->tp_firstwin == NULL ? firstwin
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4314 : tp->tp_firstwin, tp, TRUE) == OK)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4315 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4316 // look up the variable
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4317 // Let gettabvar({nr}, "") return the "t:" dictionary.
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4318 v = find_var_in_ht(&tp->tp_vars->dv_hashtab, 't', varname, FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4319 if (v != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4320 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4321 copy_tv(&v->di_tv, rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4322 done = TRUE;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4323 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4324 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4325
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4326 // restore previous notion of curwin
26978
aa613a3084b9 patch 8.2.4018: ml_get error when win_execute redraws with Visual selection
Bram Moolenaar <Bram@vim.org>
parents: 26966
diff changeset
4327 restore_win(&switchwin, TRUE);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4328 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4329
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4330 if (!done && argvars[2].v_type != VAR_UNKNOWN)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4331 copy_tv(&argvars[2], rettv);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4332 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4333
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4334 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4335 * "gettabwinvar()" function
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4336 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4337 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4338 f_gettabwinvar(typval_T *argvars, typval_T *rettv)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4339 {
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4340 if (in_vim9script()
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4341 && (check_for_number_arg(argvars, 0) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4342 || check_for_number_arg(argvars, 1) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4343 || check_for_string_arg(argvars, 2) == FAIL))
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4344 return;
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4345
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4346 getwinvar(argvars, rettv, 1);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4347 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4348
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4349 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4350 * "getwinvar()" function
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4351 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4352 void
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4353 f_getwinvar(typval_T *argvars, typval_T *rettv)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4354 {
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4355 if (in_vim9script()
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4356 && (check_for_number_arg(argvars, 0) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4357 || check_for_string_arg(argvars, 1) == FAIL))
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4358 return;
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4359
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4360 getwinvar(argvars, rettv, 0);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4361 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4362
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4363 /*
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4364 * "getbufvar()" function
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4365 */
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4366 void
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4367 f_getbufvar(typval_T *argvars, typval_T *rettv)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4368 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4369 buf_T *buf;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4370 char_u *varname;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4371 dictitem_T *v;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4372 int done = FALSE;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4373
25348
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4374 if (in_vim9script()
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4375 && (check_for_buffer_arg(argvars, 0) == FAIL
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4376 || check_for_string_arg(argvars, 1) == FAIL))
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4377 return;
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4378
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4379 varname = tv_get_string_chk(&argvars[1]);
22027
ee967cdcf749 patch 8.2.1563: Vim9: error when using '%" with setbufvar() r getbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21979
diff changeset
4380 buf = tv_get_buf_from_arg(&argvars[0]);
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4381
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4382 rettv->v_type = VAR_STRING;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4383 rettv->vval.v_string = NULL;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4384
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4385 if (buf != NULL && varname != NULL)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4386 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4387 if (*varname == '&')
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4388 {
19834
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4389 buf_T *save_curbuf = curbuf;
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4390
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4391 // set curbuf to be our buf, temporarily
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4392 curbuf = buf;
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4393
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4394 if (varname[1] == NUL)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4395 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4396 // get all buffer-local options in a dict
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4397 dict_T *opts = get_winbuf_options(TRUE);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4398
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4399 if (opts != NULL)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4400 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4401 rettv_dict_set(rettv, opts);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4402 done = TRUE;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4403 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4404 }
21120
4d844a65183d patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents: 21056
diff changeset
4405 else if (eval_option(&varname, rettv, TRUE) == OK)
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4406 // buffer-local-option
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4407 done = TRUE;
19834
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4408
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4409 // restore previous notion of curbuf
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4410 curbuf = save_curbuf;
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4411 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4412 else
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4413 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4414 // Look up the variable.
19902
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
4415 if (*varname == NUL)
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
4416 // Let getbufvar({nr}, "") return the "b:" dictionary.
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
4417 v = &buf->b_bufvar;
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
4418 else
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
4419 v = find_var_in_ht(&buf->b_vars->dv_hashtab, 'b',
481e8fa158b4 patch 8.2.0507: getbufvar() may get the wrong dictionary
Bram Moolenaar <Bram@vim.org>
parents: 19888
diff changeset
4420 varname, FALSE);
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4421 if (v != NULL)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4422 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4423 copy_tv(&v->di_tv, rettv);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4424 done = TRUE;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4425 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4426 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4427 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4428
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4429 if (!done && argvars[2].v_type != VAR_UNKNOWN)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4430 // use the default value
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4431 copy_tv(&argvars[2], rettv);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4432 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4433
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4434 /*
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4435 * "settabvar()" function
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4436 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4437 void
19049
e47b04b01793 patch 8.2.0085: dead code in builtin functions
Bram Moolenaar <Bram@vim.org>
parents: 18477
diff changeset
4438 f_settabvar(typval_T *argvars, typval_T *rettv UNUSED)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4439 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4440 tabpage_T *save_curtab;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4441 tabpage_T *tp;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4442 char_u *varname, *tabvarname;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4443 typval_T *varp;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4444
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4445 if (check_secure())
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4446 return;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4447
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4448 if (in_vim9script()
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4449 && (check_for_number_arg(argvars, 0) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4450 || check_for_string_arg(argvars, 1) == FAIL))
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4451 return;
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4452
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4453 tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4454 varname = tv_get_string_chk(&argvars[1]);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4455 varp = &argvars[2];
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4456
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4457 if (varname != NULL && varp != NULL && tp != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4458 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4459 save_curtab = curtab;
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4460 goto_tabpage_tp(tp, FALSE, FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4461
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4462 tabvarname = alloc(STRLEN(varname) + 3);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4463 if (tabvarname != NULL)
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4464 {
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4465 STRCPY(tabvarname, "t:");
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4466 STRCPY(tabvarname + 2, varname);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4467 set_var(tabvarname, varp, TRUE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4468 vim_free(tabvarname);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4469 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4470
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4471 // Restore current tabpage
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4472 if (valid_tabpage(save_curtab))
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4473 goto_tabpage_tp(save_curtab, FALSE, FALSE);
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4474 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4475 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4476
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4477 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4478 * "settabwinvar()" function
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4479 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4480 void
19049
e47b04b01793 patch 8.2.0085: dead code in builtin functions
Bram Moolenaar <Bram@vim.org>
parents: 18477
diff changeset
4481 f_settabwinvar(typval_T *argvars, typval_T *rettv UNUSED)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4482 {
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4483 if (in_vim9script()
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4484 && (check_for_number_arg(argvars, 0) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4485 || check_for_number_arg(argvars, 1) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4486 || check_for_string_arg(argvars, 2) == FAIL))
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4487 return;
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4488
19049
e47b04b01793 patch 8.2.0085: dead code in builtin functions
Bram Moolenaar <Bram@vim.org>
parents: 18477
diff changeset
4489 setwinvar(argvars, 1);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4490 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4491
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4492 /*
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4493 * "setwinvar()" function
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4494 */
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4495 void
19049
e47b04b01793 patch 8.2.0085: dead code in builtin functions
Bram Moolenaar <Bram@vim.org>
parents: 18477
diff changeset
4496 f_setwinvar(typval_T *argvars, typval_T *rettv UNUSED)
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4497 {
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4498 if (in_vim9script()
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4499 && (check_for_number_arg(argvars, 0) == FAIL
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4500 || check_for_string_arg(argvars, 1) == FAIL))
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4501 return;
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25298
diff changeset
4502
19049
e47b04b01793 patch 8.2.0085: dead code in builtin functions
Bram Moolenaar <Bram@vim.org>
parents: 18477
diff changeset
4503 setwinvar(argvars, 0);
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4504 }
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4505
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4506 /*
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4507 * "setbufvar()" function
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4508 */
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4509 void
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4510 f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4511 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4512 buf_T *buf;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4513 char_u *varname, *bufvarname;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4514 typval_T *varp;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4515
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4516 if (check_secure())
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4517 return;
25348
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4518
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4519 if (in_vim9script()
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4520 && (check_for_buffer_arg(argvars, 0) == FAIL
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4521 || check_for_string_arg(argvars, 1) == FAIL))
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4522 return;
75031a22be39 patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 25328
diff changeset
4523
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4524 varname = tv_get_string_chk(&argvars[1]);
22027
ee967cdcf749 patch 8.2.1563: Vim9: error when using '%" with setbufvar() r getbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21979
diff changeset
4525 buf = tv_get_buf_from_arg(&argvars[0]);
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4526 varp = &argvars[2];
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4527
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4528 if (buf != NULL && varname != NULL && varp != NULL)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4529 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4530 if (*varname == '&')
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4531 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4532 aco_save_T aco;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4533
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4534 // set curbuf to be our buf, temporarily
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4535 aucmd_prepbuf(&aco, buf);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4536
21879
172b1746489c patch 8.2.1489: Vim9: error when setting an option with setbufvar()
Bram Moolenaar <Bram@vim.org>
parents: 21847
diff changeset
4537 set_option_from_tv(varname + 1, varp);
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4538
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4539 // reset notion of buffer
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4540 aucmd_restbuf(&aco);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4541 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4542 else
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4543 {
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4544 bufvarname = alloc(STRLEN(varname) + 3);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4545 if (bufvarname != NULL)
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4546 {
19834
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4547 buf_T *save_curbuf = curbuf;
2ef25a007bb7 patch 8.2.0473: variables declared in an outer scope
Bram Moolenaar <Bram@vim.org>
parents: 19609
diff changeset
4548
17893
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4549 curbuf = buf;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4550 STRCPY(bufvarname, "b:");
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4551 STRCPY(bufvarname + 2, varname);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4552 set_var(bufvarname, varp, TRUE);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4553 vim_free(bufvarname);
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4554 curbuf = save_curbuf;
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4555 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4556 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4557 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4558 }
e4d3b6c466d4 patch 8.1.1943: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17887
diff changeset
4559
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4560 /*
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4561 * Get a callback from "arg". It can be a Funcref or a function name.
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4562 * When "arg" is zero return an empty string.
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4563 * "cb_name" is not allocated.
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4564 * "cb_name" is set to NULL for an invalid argument.
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4565 */
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4566 callback_T
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4567 get_callback(typval_T *arg)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4568 {
19609
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4569 callback_T res;
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4570 int r = OK;
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4571
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4572 res.cb_free_name = FALSE;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4573 if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4574 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4575 res.cb_partial = arg->vval.v_partial;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4576 ++res.cb_partial->pt_refcount;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4577 res.cb_name = partial_name(res.cb_partial);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4578 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4579 else
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4580 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4581 res.cb_partial = NULL;
19609
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4582 if (arg->v_type == VAR_STRING && arg->vval.v_string != NULL
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4583 && isdigit(*arg->vval.v_string))
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4584 r = FAIL;
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4585 else if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING)
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4586 {
26721
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4587 if (arg->v_type == VAR_STRING)
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4588 {
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4589 char_u *name;
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4590
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4591 name = get_scriptlocal_funcname(arg->vval.v_string);
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4592 if (name != NULL)
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4593 {
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4594 vim_free(arg->vval.v_string);
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4595 arg->vval.v_string = name;
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4596 }
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4597 }
9c9b8d95b05f patch 8.2.3889: duplicate code for translating script-local function name
Bram Moolenaar <Bram@vim.org>
parents: 26624
diff changeset
4598
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4599 res.cb_name = arg->vval.v_string;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4600 func_ref(res.cb_name);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4601 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4602 else if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4603 res.cb_name = (char_u *)"";
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4604 else
19609
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4605 r = FAIL;
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4606
fe827d6267c2 patch 8.2.0361: internal error when using "0" for a callback
Bram Moolenaar <Bram@vim.org>
parents: 19530
diff changeset
4607 if (r == FAIL)
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4608 {
26966
ac75c145f0a9 patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
4609 emsg(_(e_invalid_callback_argument));
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4610 res.cb_name = NULL;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4611 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4612 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4613 return res;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4614 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4615
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4616 /*
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4617 * Copy a callback into a typval_T.
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4618 */
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4619 void
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4620 put_callback(callback_T *cb, typval_T *tv)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4621 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4622 if (cb->cb_partial != NULL)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4623 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4624 tv->v_type = VAR_PARTIAL;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4625 tv->vval.v_partial = cb->cb_partial;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4626 ++tv->vval.v_partial->pt_refcount;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4627 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4628 else
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4629 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4630 tv->v_type = VAR_FUNC;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4631 tv->vval.v_string = vim_strsave(cb->cb_name);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4632 func_ref(cb->cb_name);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4633 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4634 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4635
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4636 /*
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4637 * Make a copy of "src" into "dest", allocating the function name if needed,
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4638 * without incrementing the refcount.
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4639 */
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4640 void
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4641 set_callback(callback_T *dest, callback_T *src)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4642 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4643 if (src->cb_partial == NULL)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4644 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4645 // just a function name, make a copy
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4646 dest->cb_name = vim_strsave(src->cb_name);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4647 dest->cb_free_name = TRUE;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4648 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4649 else
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4650 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4651 // cb_name is a pointer into cb_partial
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4652 dest->cb_name = src->cb_name;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4653 dest->cb_free_name = FALSE;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4654 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4655 dest->cb_partial = src->cb_partial;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4656 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4657
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4658 /*
21409
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4659 * Copy callback from "src" to "dest", incrementing the refcounts.
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4660 */
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4661 void
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4662 copy_callback(callback_T *dest, callback_T *src)
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4663 {
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4664 dest->cb_partial = src->cb_partial;
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4665 if (dest->cb_partial != NULL)
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4666 {
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4667 dest->cb_name = src->cb_name;
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4668 dest->cb_free_name = FALSE;
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4669 ++dest->cb_partial->pt_refcount;
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4670 }
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4671 else
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4672 {
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4673 dest->cb_name = vim_strsave(src->cb_name);
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4674 dest->cb_free_name = TRUE;
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4675 func_ref(src->cb_name);
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4676 }
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4677 }
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4678
2c40e60017a8 patch 8.2.1255: cannot use a lambda with quickfix functions
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
4679 /*
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4680 * When a callback refers to an autoload import, change the function name to
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4681 * the "path#name" form. Uses the current script context.
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4682 * Only works when the name is allocated.
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4683 */
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4684 void
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4685 expand_autload_callback(callback_T *cb)
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4686 {
27362
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4687 char_u *name;
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4688 char_u *p;
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4689 imported_T *import;
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4690
27362
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4691 if (!in_vim9script() || cb->cb_name == NULL
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4692 || (!cb->cb_free_name
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4693 && (cb->cb_partial == NULL || cb->cb_partial->pt_name == NULL)))
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4694 return;
27362
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4695 if (cb->cb_partial != NULL)
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4696 name = cb->cb_partial->pt_name;
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4697 else
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4698 name = cb->cb_name;
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4699 p = vim_strchr(name, '.');
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4700 if (p == NULL)
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4701 return;
27698
3813036f19cb patch 8.2.4375: ctx_imports is not used
Bram Moolenaar <Bram@vim.org>
parents: 27690
diff changeset
4702 import = find_imported(name, p - name, FALSE);
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4703 if (import != NULL && SCRIPT_ID_VALID(import->imp_sid))
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4704 {
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4705 scriptitem_T *si = SCRIPT_ITEM(import->imp_sid);
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4706
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4707 if (si->sn_autoload_prefix != NULL)
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4708 {
27362
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4709 char_u *newname = concat_str(si->sn_autoload_prefix, p + 1);
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4710
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4711 if (newname != NULL)
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4712 {
27362
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4713 if (cb->cb_partial != NULL)
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4714 {
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4715 if (cb->cb_name == cb->cb_partial->pt_name)
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4716 cb->cb_name = newname;
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4717 vim_free(cb->cb_partial->pt_name);
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4718 cb->cb_partial->pt_name = newname;
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4719 }
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4720 else
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4721 {
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4722 vim_free(cb->cb_name);
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4723 cb->cb_name = newname;
2ca6dd1f62af patch 8.2.4209: partial in 'opfunc' cannot use an imported function
Bram Moolenaar <Bram@vim.org>
parents: 27338
diff changeset
4724 }
27285
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4725 }
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4726 }
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4727 }
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4728 }
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4729
53edd190a607 patch 8.2.4171: cannot invoke option function using autoload import
Bram Moolenaar <Bram@vim.org>
parents: 27277
diff changeset
4730 /*
17986
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4731 * Unref/free "callback" returned by get_callback() or set_callback().
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4732 */
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4733 void
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4734 free_callback(callback_T *callback)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4735 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4736 if (callback->cb_partial != NULL)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4737 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4738 partial_unref(callback->cb_partial);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4739 callback->cb_partial = NULL;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4740 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4741 else if (callback->cb_name != NULL)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4742 func_unref(callback->cb_name);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4743 if (callback->cb_free_name)
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4744 {
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4745 vim_free(callback->cb_name);
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4746 callback->cb_free_name = FALSE;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4747 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4748 callback->cb_name = NULL;
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4749 }
5c8906f653f5 patch 8.1.1989: the evalfunc.c file is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17944
diff changeset
4750
17873
d50a5faa75bd patch 8.1.1933: the eval.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4751 #endif // FEAT_EVAL