1#ifndef DEFINE_FUNC_ATTRIBUTES
2# define DEFINE_FUNC_ATTRIBUTES
3#endif
4#include "nvim/func_attr.h"
5#undef DEFINE_FUNC_ATTRIBUTES
6static inline kh_functions_t *kh_init_functions(void);
7static inline void kh_dealloc_functions(kh_functions_t *h);
8static inline void kh_destroy_functions(kh_functions_t *h);
9static inline void kh_clear_functions(kh_functions_t *h);
10static inline khint_t kh_get_functions(const kh_functions_t *h, kh_cstr_t key);
11static inline void kh_resize_functions(kh_functions_t *h, khint_t new_n_buckets);
12static inline khint_t kh_put_functions(kh_functions_t *h, kh_cstr_t key, int *ret);
13static inline void kh_del_functions(kh_functions_t *h, khint_t x);
14static int eval1_emsg(char_u **arg, typval_T *rettv, _Bool evaluate) FUNC_ATTR_NONNULL_ARG(1, 2);
15static int eval_expr_typval(const typval_T *expr, typval_T *argv, int argc, typval_T *rettv) FUNC_ATTR_NONNULL_ARG(1, 2, 4);
16static _Bool eval_expr_to_bool(const typval_T *expr, _Bool *error) FUNC_ATTR_NONNULL_ARG(1, 2);
17static void prepare_vimvar(int idx, typval_T *save_tv);
18static void restore_vimvar(int idx, typval_T *save_tv);
19static void find_win_for_curbuf(void);
20static void ex_let_const(exarg_T *eap, const _Bool is_const);
21static int ex_let_vars(char_u *arg_start, typval_T *tv, int copy, int semicolon, int var_count, int is_const, char_u *nextchars );
22static const char_u *skip_var_list(const char_u *arg, int *var_count, int *semicolon);
23static const char_u *skip_var_one(const char_u *arg);
24static void list_hashtable_vars(hashtab_T *ht, const char *prefix, int empty, int *first);
25static void list_glob_vars(int *first);
26static void list_buf_vars(int *first);
27static void list_win_vars(int *first);
28static void list_tab_vars(int *first);
29static void list_vim_vars(int *first);
30static void list_script_vars(int *first);
31static void list_func_vars(int *first);
32static const char *list_arg_vars(exarg_T *eap, const char *arg, int *first);
33static char_u *ex_let_one(char_u *arg, typval_T *const tv, const _Bool copy, const _Bool is_const, const char_u *const endchars, const char_u *const op) FUNC_ATTR_NONNULL_ARG(1, 2) FUNC_ATTR_WARN_UNUSED_RESULT;
34static char_u *get_lval(char_u *const name, typval_T *const rettv, lval_T *const lp, const _Bool unlet, const _Bool skip, const int flags, const int fne_flags) FUNC_ATTR_NONNULL_ARG(1, 3);
35static void clear_lval(lval_T *lp);
36static void set_var_lval(lval_T *lp, char_u *endp, typval_T *rettv, int copy, const _Bool is_const, const char_u *op);
37static void ex_unletlock(exarg_T *eap, char_u *argstart, int deep);
38static int do_unlet_var(lval_T *const lp, char_u *const name_end, int forceit);
39static int do_lock_var(lval_T *lp, char_u *const name_end, const int deep, const _Bool lock);
40static char_u *cat_prefix_varname(int prefix, char_u *name);
41static int pattern_match(char_u *pat, char_u *text, int ic);
42static int eval1(char_u **arg, typval_T *rettv, int evaluate);
43static int eval2(char_u **arg, typval_T *rettv, int evaluate);
44static int eval3(char_u **arg, typval_T *rettv, int evaluate);
45static int eval4(char_u **arg, typval_T *rettv, int evaluate);
46static int eval5(char_u **arg, typval_T *rettv, int evaluate);
47static int eval6(char_u **arg, typval_T *rettv, int evaluate, int want_string) FUNC_ATTR_NO_SANITIZE_UNDEFINED;
48static int eval7(char_u **arg, typval_T *rettv, int evaluate, int want_string );
49static int eval_index(char_u **arg, typval_T *rettv, int evaluate, int verbose );
50static int get_option_tv(const char **const arg, typval_T *const rettv, const _Bool evaluate) FUNC_ATTR_NONNULL_ARG(1);
51static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate);
52static int get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate);
53static void partial_free(partial_T *pt);
54static int get_list_tv(char_u **arg, typval_T *rettv, int evaluate);
55static int free_unref_items(int copyID);
56static inline _Bool set_ref_in_fmark(fmark_T fm, int copyID) FUNC_ATTR_WARN_UNUSED_RESULT;
57static inline _Bool set_ref_list(list_T *list, int copyID) FUNC_ATTR_WARN_UNUSED_RESULT;
58static inline _Bool set_ref_dict(dict_T *dict, int copyID) FUNC_ATTR_WARN_UNUSED_RESULT;
59static _Bool set_ref_in_funccal(funccall_T *fc, int copyID);
60static int dict_get_tv(char_u **arg, typval_T *rettv, int evaluate);
61static int get_function_args(char_u **argp, char_u endchar, garray_T *newargs, int *varargs, _Bool skip);
62static void register_closure(ufunc_T *fp);
63static int get_lambda_tv(char_u **arg, typval_T *rettv, _Bool evaluate);
64static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate);
65static const VimLFuncDef *find_internal_func(const char *const name) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE FUNC_ATTR_NONNULL_ALL;
66static char_u *deref_func_name(const char *name, int *lenp, partial_T **const partialp, _Bool no_autoload) FUNC_ATTR_NONNULL_ARG(1, 2);
67static int get_func_tv(char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, partial_T *partial, dict_T *selfdict );
68static char_u *fname_trans_sid(const char_u *const name, char_u *const fname_buf, char_u **const tofree, int *const error) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT;
69static void emsg_funcname(char *ermsg, char_u *name);
70static int non_zero_arg(typval_T *argvars);
71static void float_op_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr);
72static void api_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr);
73static void f_abs(typval_T *argvars, typval_T *rettv, FunPtr fptr);
74static void f_add(typval_T *argvars, typval_T *rettv, FunPtr fptr);
75static void f_and(typval_T *argvars, typval_T *rettv, FunPtr fptr);
76static void f_api_info(typval_T *argvars, typval_T *rettv, FunPtr fptr);
77static void f_append(typval_T *argvars, typval_T *rettv, FunPtr fptr);
78static void f_appendbufline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
79static void f_argc(typval_T *argvars, typval_T *rettv, FunPtr fptr);
80static void f_argidx(typval_T *argvars, typval_T *rettv, FunPtr fptr);
81static void f_arglistid(typval_T *argvars, typval_T *rettv, FunPtr fptr);
82static void get_arglist_as_rettv(aentry_T *arglist, int argcount, typval_T *rettv);
83static void f_argv(typval_T *argvars, typval_T *rettv, FunPtr fptr);
84static void prepare_assert_error(garray_T *gap);
85static void ga_concat_esc(garray_T *gap, char_u *str);
86static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv, assert_type_T atype);
87static void assert_error(garray_T *gap);
88static void assert_equal_common(typval_T *argvars, assert_type_T atype);
89static void f_assert_beeps(typval_T *argvars, typval_T *rettv, FunPtr fptr);
90static void f_assert_equal(typval_T *argvars, typval_T *rettv, FunPtr fptr);
91static void f_assert_notequal(typval_T *argvars, typval_T *rettv, FunPtr fptr);
92static void f_assert_report(typval_T *argvars, typval_T *rettv, FunPtr fptr);
93static void f_assert_exception(typval_T *argvars, typval_T *rettv, FunPtr fptr);
94static void f_assert_fails(typval_T *argvars, typval_T *rettv, FunPtr fptr);
95static void assert_bool(typval_T *argvars, _Bool is_true);
96static void f_assert_false(typval_T *argvars, typval_T *rettv, FunPtr fptr);
97static void assert_match_common(typval_T *argvars, assert_type_T atype);
98static void f_assert_inrange(typval_T *argvars, typval_T *rettv, FunPtr fptr);
99static void f_assert_match(typval_T *argvars, typval_T *rettv, FunPtr fptr);
100static void f_assert_notmatch(typval_T *argvars, typval_T *rettv, FunPtr fptr);
101static void f_assert_true(typval_T *argvars, typval_T *rettv, FunPtr fptr);
102static void f_atan2(typval_T *argvars, typval_T *rettv, FunPtr fptr);
103static void f_browse(typval_T *argvars, typval_T *rettv, FunPtr fptr);
104static void f_browsedir(typval_T *argvars, typval_T *rettv, FunPtr fptr);
105static buf_T *find_buffer(typval_T *avar);
106static void f_bufadd(typval_T *argvars, typval_T *rettv, FunPtr fptr);
107static void f_bufexists(typval_T *argvars, typval_T *rettv, FunPtr fptr);
108static void f_buflisted(typval_T *argvars, typval_T *rettv, FunPtr fptr);
109static void f_bufload(typval_T *argvars, typval_T *unused, FunPtr fptr);
110static void f_bufloaded(typval_T *argvars, typval_T *rettv, FunPtr fptr);
111static buf_T *tv_get_buf(typval_T *tv, int curtab_only);
112static buf_T *get_buf_arg(typval_T *arg);
113static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr);
114static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
115static void buf_win_common(typval_T *argvars, typval_T *rettv, _Bool get_nr);
116static void f_bufwinid(typval_T *argvars, typval_T *rettv, FunPtr fptr);
117static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
118static void f_byte2line(typval_T *argvars, typval_T *rettv, FunPtr fptr);
119static void byteidx(typval_T *argvars, typval_T *rettv, int comp);
120static void f_byteidx(typval_T *argvars, typval_T *rettv, FunPtr fptr);
121static void f_byteidxcomp(typval_T *argvars, typval_T *rettv, FunPtr fptr);
122static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr);
123static void f_changenr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
124static void f_chanclose(typval_T *argvars, typval_T *rettv, FunPtr fptr);
125static void f_chansend(typval_T *argvars, typval_T *rettv, FunPtr fptr);
126static void f_char2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
127static void f_cindent(typval_T *argvars, typval_T *rettv, FunPtr fptr);
128static void f_clearmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr);
129static void f_col(typval_T *argvars, typval_T *rettv, FunPtr fptr);
130static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr);
131static void f_complete_add(typval_T *argvars, typval_T *rettv, FunPtr fptr);
132static void f_complete_check(typval_T *argvars, typval_T *rettv, FunPtr fptr);
133static void f_complete_info(typval_T *argvars, typval_T *rettv, FunPtr fptr);
134static void f_confirm(typval_T *argvars, typval_T *rettv, FunPtr fptr);
135static void f_copy(typval_T *argvars, typval_T *rettv, FunPtr fptr);
136static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr);
137static void f_cscope_connection(typval_T *argvars, typval_T *rettv, FunPtr fptr);
138static void f_ctxget(typval_T *argvars, typval_T *rettv, FunPtr fptr);
139static void f_ctxpop(typval_T *argvars, typval_T *rettv, FunPtr fptr);
140static void f_ctxpush(typval_T *argvars, typval_T *rettv, FunPtr fptr);
141static void f_ctxset(typval_T *argvars, typval_T *rettv, FunPtr fptr);
142static void f_ctxsize(typval_T *argvars, typval_T *rettv, FunPtr fptr);
143static void f_cursor(typval_T *argvars, typval_T *rettv, FunPtr fptr);
144static void f_deepcopy(typval_T *argvars, typval_T *rettv, FunPtr fptr);
145static void f_delete(typval_T *argvars, typval_T *rettv, FunPtr fptr);
146static void f_dictwatcheradd(typval_T *argvars, typval_T *rettv, FunPtr fptr);
147static void f_dictwatcherdel(typval_T *argvars, typval_T *rettv, FunPtr fptr);
148static void f_deletebufline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
149static void f_did_filetype(typval_T *argvars, typval_T *rettv, FunPtr fptr);
150static void f_diff_filler(typval_T *argvars, typval_T *rettv, FunPtr fptr);
151static void f_diff_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr);
152static void f_empty(typval_T *argvars, typval_T *rettv, FunPtr fptr);
153static void f_environ(typval_T *argvars, typval_T *rettv, FunPtr fptr);
154static void f_escape(typval_T *argvars, typval_T *rettv, FunPtr fptr);
155static void f_getenv(typval_T *argvars, typval_T *rettv, FunPtr fptr);
156static void f_eval(typval_T *argvars, typval_T *rettv, FunPtr fptr);
157static void f_eventhandler(typval_T *argvars, typval_T *rettv, FunPtr fptr);
158static void f_executable(typval_T *argvars, typval_T *rettv, FunPtr fptr);
159static char_u *get_list_line(int c, void *cookie, int indent);
160static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr);
161static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr);
162static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr);
163static void f_expand(typval_T *argvars, typval_T *rettv, FunPtr fptr);
164static void f_menu_get(typval_T *argvars, typval_T *rettv, FunPtr fptr);
165static void f_extend(typval_T *argvars, typval_T *rettv, FunPtr fptr);
166static void f_feedkeys(typval_T *argvars, typval_T *rettv, FunPtr fptr);
167static void f_filereadable(typval_T *argvars, typval_T *rettv, FunPtr fptr);
168static void f_filewritable(typval_T *argvars, typval_T *rettv, FunPtr fptr);
169static void findfilendir(typval_T *argvars, typval_T *rettv, int find_what);
170static void filter_map(typval_T *argvars, typval_T *rettv, int map);
171static int filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp) FUNC_ATTR_NONNULL_ARG(1, 2);
172static void f_filter(typval_T *argvars, typval_T *rettv, FunPtr fptr);
173static void f_finddir(typval_T *argvars, typval_T *rettv, FunPtr fptr);
174static void f_findfile(typval_T *argvars, typval_T *rettv, FunPtr fptr);
175static void f_float2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
176static void f_fmod(typval_T *argvars, typval_T *rettv, FunPtr fptr);
177static void f_fnameescape(typval_T *argvars, typval_T *rettv, FunPtr fptr);
178static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr);
179static void foldclosed_both(typval_T *argvars, typval_T *rettv, int end);
180static void f_foldclosed(typval_T *argvars, typval_T *rettv, FunPtr fptr);
181static void f_foldclosedend(typval_T *argvars, typval_T *rettv, FunPtr fptr);
182static void f_foldlevel(typval_T *argvars, typval_T *rettv, FunPtr fptr);
183static void f_foldtext(typval_T *argvars, typval_T *rettv, FunPtr fptr);
184static void f_foldtextresult(typval_T *argvars, typval_T *rettv, FunPtr fptr);
185static void f_foreground(typval_T *argvars, typval_T *rettv, FunPtr fptr);
186static void common_function(typval_T *argvars, typval_T *rettv, _Bool is_funcref, FunPtr fptr);
187static void f_funcref(typval_T *argvars, typval_T *rettv, FunPtr fptr);
188static void f_function(typval_T *argvars, typval_T *rettv, FunPtr fptr);
189static void f_garbagecollect(typval_T *argvars, typval_T *rettv, FunPtr fptr);
190static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr);
191static dict_T *get_buffer_info(buf_T *buf);
192static void f_getbufinfo(typval_T *argvars, typval_T *rettv, FunPtr fptr);
193static void get_buffer_lines(buf_T *buf, linenr_T start, linenr_T end, int retlist, typval_T *rettv);
194static linenr_T tv_get_lnum_buf(const typval_T *const tv, const buf_T *const buf) FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_WARN_UNUSED_RESULT;
195static void f_getbufline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
196static void f_getbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
197static void f_getchangelist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
198static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
199static void f_getcharmod(typval_T *argvars, typval_T *rettv, FunPtr fptr);
200static void f_getcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr);
201static void f_getcmdline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
202static void f_getcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
203static void f_getcmdtype(typval_T *argvars, typval_T *rettv, FunPtr fptr);
204static void f_getcmdwintype(typval_T *argvars, typval_T *rettv, FunPtr fptr);
205static void f_getcompletion(typval_T *argvars, typval_T *rettv, FunPtr fptr);
206static void f_getcwd(typval_T *argvars, typval_T *rettv, FunPtr fptr);
207static void f_getfontname(typval_T *argvars, typval_T *rettv, FunPtr fptr);
208static void f_getfperm(typval_T *argvars, typval_T *rettv, FunPtr fptr);
209static void f_getfsize(typval_T *argvars, typval_T *rettv, FunPtr fptr);
210static void f_getftime(typval_T *argvars, typval_T *rettv, FunPtr fptr);
211static void f_getftype(typval_T *argvars, typval_T *rettv, FunPtr fptr);
212static void f_getjumplist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
213static void f_getline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
214static void get_qf_loc_list(int is_qf, win_T *wp, typval_T *what_arg, typval_T *rettv);
215static void f_getloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
216static void f_getmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr);
217static void f_getpid(typval_T *argvars, typval_T *rettv, FunPtr fptr);
218static void getpos_both(typval_T *argvars, typval_T *rettv, _Bool getcurpos);
219static void f_getcurpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
220static void f_getpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
221static void f_getqflist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
222static void f_getreg(typval_T *argvars, typval_T *rettv, FunPtr fptr);
223static void f_getregtype(typval_T *argvars, typval_T *rettv, FunPtr fptr);
224static dict_T *get_tabpage_info(tabpage_T *tp, int tp_idx);
225static void f_gettabinfo(typval_T *argvars, typval_T *rettv, FunPtr fptr);
226static void f_gettabvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
227static void f_gettabwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
228static void f_gettagstack(typval_T *argvars, typval_T *rettv, FunPtr fptr);
229static dict_T *get_win_info(win_T *wp, int16_t tpnr, int16_t winnr);
230static void f_getwininfo(typval_T *argvars, typval_T *rettv, FunPtr fptr);
231static void dummy_timer_due_cb(TimeWatcher *tw, void *data);
232static void dummy_timer_close_cb(TimeWatcher *tw, void *data);
233static void f_wait(typval_T *argvars, typval_T *rettv, FunPtr fptr);
234static void f_win_screenpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
235static void f_getwinpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
236static void f_getwinposx(typval_T *argvars, typval_T *rettv, FunPtr fptr);
237static void f_getwinposy(typval_T *argvars, typval_T *rettv, FunPtr fptr);
238static win_T *find_win_by_nr(typval_T *vp, tabpage_T *tp );
239static win_T *find_tabwin(typval_T *wvp, typval_T *tvp);
240static void f_getwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
241static void getwinvar(typval_T *argvars, typval_T *rettv, int off );
242static void f_glob(typval_T *argvars, typval_T *rettv, FunPtr fptr);
243static void f_globpath(typval_T *argvars, typval_T *rettv, FunPtr fptr);
244static void f_glob2regpat(typval_T *argvars, typval_T *rettv, FunPtr fptr);
245static void f_has(typval_T *argvars, typval_T *rettv, FunPtr fptr);
246static void f_has_key(typval_T *argvars, typval_T *rettv, FunPtr fptr);
247static void f_haslocaldir(typval_T *argvars, typval_T *rettv, FunPtr fptr);
248static void f_hasmapto(typval_T *argvars, typval_T *rettv, FunPtr fptr);
249static void f_histadd(typval_T *argvars, typval_T *rettv, FunPtr fptr);
250static void f_histdel(typval_T *argvars, typval_T *rettv, FunPtr fptr);
251static void f_histget(typval_T *argvars, typval_T *rettv, FunPtr fptr);
252static void f_histnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
253static void f_hlID(typval_T *argvars, typval_T *rettv, FunPtr fptr);
254static void f_hlexists(typval_T *argvars, typval_T *rettv, FunPtr fptr);
255static void f_hostname(typval_T *argvars, typval_T *rettv, FunPtr fptr);
256static void f_iconv(typval_T *argvars, typval_T *rettv, FunPtr fptr);
257static void f_indent(typval_T *argvars, typval_T *rettv, FunPtr fptr);
258static void f_index(typval_T *argvars, typval_T *rettv, FunPtr fptr);
259static void f_input(typval_T *argvars, typval_T *rettv, FunPtr fptr);
260static void f_inputdialog(typval_T *argvars, typval_T *rettv, FunPtr fptr);
261static void f_inputlist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
262static void f_inputrestore(typval_T *argvars, typval_T *rettv, FunPtr fptr);
263static void f_inputsave(typval_T *argvars, typval_T *rettv, FunPtr fptr);
264static void f_inputsecret(typval_T *argvars, typval_T *rettv, FunPtr fptr);
265static void f_insert(typval_T *argvars, typval_T *rettv, FunPtr fptr);
266static void f_invert(typval_T *argvars, typval_T *rettv, FunPtr fptr);
267static void f_isdirectory(typval_T *argvars, typval_T *rettv, FunPtr fptr);
268static void f_islocked(typval_T *argvars, typval_T *rettv, FunPtr fptr);
269static void f_isinf(typval_T *argvars, typval_T *rettv, FunPtr fptr);
270static void f_isnan(typval_T *argvars, typval_T *rettv, FunPtr fptr);
271static void dict_list(typval_T *const tv, typval_T *const rettv, const DictListType what);
272static void f_id(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL;
273static void f_items(typval_T *argvars, typval_T *rettv, FunPtr fptr);
274static void f_jobpid(typval_T *argvars, typval_T *rettv, FunPtr fptr);
275static void f_jobresize(typval_T *argvars, typval_T *rettv, FunPtr fptr);
276static char **tv_to_argv(typval_T *cmd_tv, const char **cmd, _Bool *executable);
277static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr);
278static void f_jobstop(typval_T *argvars, typval_T *rettv, FunPtr fptr);
279static void f_jobwait(typval_T *argvars, typval_T *rettv, FunPtr fptr);
280static void f_join(typval_T *argvars, typval_T *rettv, FunPtr fptr);
281static void f_json_decode(typval_T *argvars, typval_T *rettv, FunPtr fptr);
282static void f_json_encode(typval_T *argvars, typval_T *rettv, FunPtr fptr);
283static void f_keys(typval_T *argvars, typval_T *rettv, FunPtr fptr);
284static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
285static void f_len(typval_T *argvars, typval_T *rettv, FunPtr fptr);
286static void libcall_common(typval_T *argvars, typval_T *rettv, int out_type);
287static void f_libcall(typval_T *argvars, typval_T *rettv, FunPtr fptr);
288static void f_libcallnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
289static void f_line(typval_T *argvars, typval_T *rettv, FunPtr fptr);
290static void f_line2byte(typval_T *argvars, typval_T *rettv, FunPtr fptr);
291static void f_lispindent(typval_T *argvars, typval_T *rettv, FunPtr fptr);
292static void f_localtime(typval_T *argvars, typval_T *rettv, FunPtr fptr);
293static void get_maparg(typval_T *argvars, typval_T *rettv, int exact);
294static void f_luaeval(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL;
295static void f_map(typval_T *argvars, typval_T *rettv, FunPtr fptr);
296static void f_maparg(typval_T *argvars, typval_T *rettv, FunPtr fptr);
297static void f_mapcheck(typval_T *argvars, typval_T *rettv, FunPtr fptr);
298static void find_some_match(typval_T *const argvars, typval_T *const rettv, const SomeMatchType type);
299static void f_match(typval_T *argvars, typval_T *rettv, FunPtr fptr);
300static int matchadd_dict_arg(typval_T *tv, const char **conceal_char, win_T **win);
301static void f_matchadd(typval_T *argvars, typval_T *rettv, FunPtr fptr);
302static void f_matchaddpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
303static void f_matcharg(typval_T *argvars, typval_T *rettv, FunPtr fptr);
304static void f_matchdelete(typval_T *argvars, typval_T *rettv, FunPtr fptr);
305static void f_matchend(typval_T *argvars, typval_T *rettv, FunPtr fptr);
306static void f_matchlist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
307static void f_matchstr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
308static void f_matchstrpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
309static void max_min(const typval_T *const tv, typval_T *const rettv, const _Bool domax) FUNC_ATTR_NONNULL_ALL;
310static void f_max(typval_T *argvars, typval_T *rettv, FunPtr fptr);
311static void f_min(typval_T *argvars, typval_T *rettv, FunPtr fptr);
312static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr);
313static void f_mode(typval_T *argvars, typval_T *rettv, FunPtr fptr);
314static void f_msgpackdump(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL;
315static void f_msgpackparse(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL;
316static void f_nextnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr);
317static void f_nr2char(typval_T *argvars, typval_T *rettv, FunPtr fptr);
318static void f_or(typval_T *argvars, typval_T *rettv, FunPtr fptr);
319static void f_pathshorten(typval_T *argvars, typval_T *rettv, FunPtr fptr);
320static void f_pow(typval_T *argvars, typval_T *rettv, FunPtr fptr);
321static void f_prevnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr);
322static void f_printf(typval_T *argvars, typval_T *rettv, FunPtr fptr);
323static void f_pumvisible(typval_T *argvars, typval_T *rettv, FunPtr fptr);
324static void f_pyeval(typval_T *argvars, typval_T *rettv, FunPtr fptr);
325static void f_py3eval(typval_T *argvars, typval_T *rettv, FunPtr fptr);
326static void f_pyxeval(typval_T *argvars, typval_T *rettv, FunPtr fptr);
327static void f_range(typval_T *argvars, typval_T *rettv, FunPtr fptr);
328static void f_readfile(typval_T *argvars, typval_T *rettv, FunPtr fptr);
329static void return_register(int regname, typval_T *rettv);
330static void f_reg_executing(typval_T *argvars, typval_T *rettv, FunPtr fptr);
331static void f_reg_recording(typval_T *argvars, typval_T *rettv, FunPtr fptr);
332static int list2proftime(typval_T *arg, proftime_T *tm) FUNC_ATTR_NONNULL_ALL;
333static void f_reltime(typval_T *argvars, typval_T *rettv, FunPtr fptr);
334static void f_reltimestr(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL;
335static void f_remove(typval_T *argvars, typval_T *rettv, FunPtr fptr);
336static void f_rename(typval_T *argvars, typval_T *rettv, FunPtr fptr);
337static void f_repeat(typval_T *argvars, typval_T *rettv, FunPtr fptr);
338static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr);
339static void f_reverse(typval_T *argvars, typval_T *rettv, FunPtr fptr);
340static int get_search_arg(typval_T *varp, int *flagsp);
341static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp);
342static void f_rpcnotify(typval_T *argvars, typval_T *rettv, FunPtr fptr);
343static void f_rpcrequest(typval_T *argvars, typval_T *rettv, FunPtr fptr);
344static void f_rpcstart(typval_T *argvars, typval_T *rettv, FunPtr fptr);
345static void f_rpcstop(typval_T *argvars, typval_T *rettv, FunPtr fptr);
346static void screenchar_adjust_grid(ScreenGrid **grid, int *row, int *col);
347static void f_screenattr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
348static void f_screenchar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
349static void f_screencol(typval_T *argvars, typval_T *rettv, FunPtr fptr);
350static void f_screenpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
351static void f_screenrow(typval_T *argvars, typval_T *rettv, FunPtr fptr);
352static void f_search(typval_T *argvars, typval_T *rettv, FunPtr fptr);
353static void f_searchdecl(typval_T *argvars, typval_T *rettv, FunPtr fptr);
354static int searchpair_cmn(typval_T *argvars, pos_T *match_pos);
355static void f_searchpair(typval_T *argvars, typval_T *rettv, FunPtr fptr);
356static void f_searchpairpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
357static void f_searchpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
358static void f_serverlist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
359static void f_serverstart(typval_T *argvars, typval_T *rettv, FunPtr fptr);
360static void f_serverstop(typval_T *argvars, typval_T *rettv, FunPtr fptr);
361static void set_buffer_lines(buf_T *buf, linenr_T lnum_arg, _Bool append, const typval_T *lines, typval_T *rettv) FUNC_ATTR_NONNULL_ARG(4, 5);
362static void f_setbufline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
363static void f_setbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
364static void f_setcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr);
365static void f_setcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
366static void f_setenv(typval_T *argvars, typval_T *rettv, FunPtr fptr);
367static void f_setfperm(typval_T *argvars, typval_T *rettv, FunPtr fptr);
368static void f_setline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
369static void set_qf_ll_list(win_T *wp, typval_T *args, typval_T *rettv) FUNC_ATTR_NONNULL_ARG(2, 3);
370static void f_setloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
371static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr);
372static void f_setpos(typval_T *argvars, typval_T *rettv, FunPtr fptr);
373static void f_setqflist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
374static void f_setreg(typval_T *argvars, typval_T *rettv, FunPtr fptr);
375static void f_settabvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
376static void f_settabwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
377static void f_settagstack(typval_T *argvars, typval_T *rettv, FunPtr fptr);
378static void f_setwinvar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
379static void setwinvar(typval_T *argvars, typval_T *rettv, int off);
380static void f_sha256(typval_T *argvars, typval_T *rettv, FunPtr fptr);
381static void f_shellescape(typval_T *argvars, typval_T *rettv, FunPtr fptr);
382static void f_shiftwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr);
383static void f_sign_define(typval_T *argvars, typval_T *rettv, FunPtr fptr);
384static void f_sign_getdefined(typval_T *argvars, typval_T *rettv, FunPtr fptr);
385static void f_sign_getplaced(typval_T *argvars, typval_T *rettv, FunPtr fptr);
386static void f_sign_jump(typval_T *argvars, typval_T *rettv, FunPtr fptr);
387static void f_sign_place(typval_T *argvars, typval_T *rettv, FunPtr fptr);
388static void f_sign_undefine(typval_T *argvars, typval_T *rettv, FunPtr fptr);
389static void f_sign_unplace(typval_T *argvars, typval_T *rettv, FunPtr fptr);
390static void f_simplify(typval_T *argvars, typval_T *rettv, FunPtr fptr);
391static void f_sockconnect(typval_T *argvars, typval_T *rettv, FunPtr fptr);
392static int item_compare(const void *s1, const void *s2, _Bool keep_zero);
393static int item_compare_keeping_zero(const void *s1, const void *s2);
394static int item_compare_not_keeping_zero(const void *s1, const void *s2);
395static int item_compare2(const void *s1, const void *s2, _Bool keep_zero);
396static int item_compare2_keeping_zero(const void *s1, const void *s2);
397static int item_compare2_not_keeping_zero(const void *s1, const void *s2);
398static void do_sort_uniq(typval_T *argvars, typval_T *rettv, _Bool sort);
399static void f_sort(typval_T *argvars, typval_T *rettv, FunPtr fptr);
400static void f_stdioopen(typval_T *argvars, typval_T *rettv, FunPtr fptr);
401static void f_uniq(typval_T *argvars, typval_T *rettv, FunPtr fptr);
402static void f_reltimefloat(typval_T *argvars, typval_T *rettv, FunPtr fptr) FUNC_ATTR_NONNULL_ALL;
403static void f_soundfold(typval_T *argvars, typval_T *rettv, FunPtr fptr);
404static void f_spellbadword(typval_T *argvars, typval_T *rettv, FunPtr fptr);
405static void f_spellsuggest(typval_T *argvars, typval_T *rettv, FunPtr fptr);
406static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr);
407static void get_xdg_var_list(const XDGVarType xdg, typval_T *rettv) FUNC_ATTR_NONNULL_ALL;
408static void f_stdpath(typval_T *argvars, typval_T *rettv, FunPtr fptr);
409static void f_str2float(typval_T *argvars, typval_T *rettv, FunPtr fptr);
410static void f_str2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
411static void f_strftime(typval_T *argvars, typval_T *rettv, FunPtr fptr);
412static void f_strgetchar(typval_T *argvars, typval_T *rettv, FunPtr fptr);
413static void f_stridx(typval_T *argvars, typval_T *rettv, FunPtr fptr);
414static void f_string(typval_T *argvars, typval_T *rettv, FunPtr fptr);
415static void f_strlen(typval_T *argvars, typval_T *rettv, FunPtr fptr);
416static void f_strchars(typval_T *argvars, typval_T *rettv, FunPtr fptr);
417static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv, FunPtr fptr);
418static void f_strwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr);
419static void f_strcharpart(typval_T *argvars, typval_T *rettv, FunPtr fptr);
420static void f_strpart(typval_T *argvars, typval_T *rettv, FunPtr fptr);
421static void f_strridx(typval_T *argvars, typval_T *rettv, FunPtr fptr);
422static void f_strtrans(typval_T *argvars, typval_T *rettv, FunPtr fptr);
423static void f_submatch(typval_T *argvars, typval_T *rettv, FunPtr fptr);
424static void f_substitute(typval_T *argvars, typval_T *rettv, FunPtr fptr);
425static void f_swapinfo(typval_T *argvars, typval_T *rettv, FunPtr fptr);
426static void f_swapname(typval_T *argvars, typval_T *rettv, FunPtr fptr);
427static void f_synID(typval_T *argvars, typval_T *rettv, FunPtr fptr);
428static void f_synIDattr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
429static void f_synIDtrans(typval_T *argvars, typval_T *rettv, FunPtr fptr);
430static void f_synconcealed(typval_T *argvars, typval_T *rettv, FunPtr fptr);
431static void f_synstack(typval_T *argvars, typval_T *rettv, FunPtr fptr);
432static list_T *string_to_list(const char *str, size_t len, const _Bool keepempty);
433static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv, _Bool retlist);
434static void f_system(typval_T *argvars, typval_T *rettv, FunPtr fptr);
435static void f_systemlist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
436static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
437static void f_tabpagenr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
438static int get_winnr(tabpage_T *tp, typval_T *argvar);
439static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
440static void f_tagfiles(typval_T *argvars, typval_T *rettv, FunPtr fptr);
441static void f_taglist(typval_T *argvars, typval_T *rettv, FunPtr fptr);
442static void f_tempname(typval_T *argvars, typval_T *rettv, FunPtr fptr);
443static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr);
444static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv, FunPtr fptr);
445static void f_test_write_list_log(typval_T *const argvars, typval_T *const rettv, FunPtr fptr);
446static _Bool set_ref_in_callback(Callback *callback, int copyID, ht_stack_T **ht_stack, list_stack_T **list_stack);
447static _Bool set_ref_in_callback_reader(CallbackReader *reader, int copyID, ht_stack_T **ht_stack, list_stack_T **list_stack);
448static void add_timer_info(typval_T *rettv, timer_T *timer);
449static void add_timer_info_all(typval_T *rettv);
450static void f_timer_info(typval_T *argvars, typval_T *rettv, FunPtr fptr);
451static void f_timer_pause(typval_T *argvars, typval_T *unused, FunPtr fptr);
452static void f_timer_start(typval_T *argvars, typval_T *rettv, FunPtr fptr);
453static void f_timer_stop(typval_T *argvars, typval_T *rettv, FunPtr fptr);
454static void f_timer_stopall(typval_T *argvars, typval_T *unused, FunPtr fptr);
455static void timer_due_cb(TimeWatcher *tw, void *data);
456static void timer_stop(timer_T *timer);
457static void timer_close_cb(TimeWatcher *tw, void *data);
458static void timer_decref(timer_T *timer);
459static void timer_stop_all(void);
460static void f_tolower(typval_T *argvars, typval_T *rettv, FunPtr fptr);
461static void f_toupper(typval_T *argvars, typval_T *rettv, FunPtr fptr);
462static void f_tr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
463static void f_trim(typval_T *argvars, typval_T *rettv, FunPtr fptr);
464static void f_type(typval_T *argvars, typval_T *rettv, FunPtr fptr);
465static void f_undofile(typval_T *argvars, typval_T *rettv, FunPtr fptr);
466static void f_undotree(typval_T *argvars, typval_T *rettv, FunPtr fptr);
467static void f_values(typval_T *argvars, typval_T *rettv, FunPtr fptr);
468static void f_virtcol(typval_T *argvars, typval_T *rettv, FunPtr fptr);
469static void f_visualmode(typval_T *argvars, typval_T *rettv, FunPtr fptr);
470static void f_wildmenumode(typval_T *argvars, typval_T *rettv, FunPtr fptr);
471static void f_win_findbuf(typval_T *argvars, typval_T *rettv, FunPtr fptr);
472static void f_win_getid(typval_T *argvars, typval_T *rettv, FunPtr fptr);
473static void f_win_gotoid(typval_T *argvars, typval_T *rettv, FunPtr fptr);
474static void f_win_id2tabwin(typval_T *argvars, typval_T *rettv, FunPtr fptr);
475static void f_win_id2win(typval_T *argvars, typval_T *rettv, FunPtr fptr);
476static void f_winbufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
477static void f_wincol(typval_T *argvars, typval_T *rettv, FunPtr fptr);
478static void f_winheight(typval_T *argvars, typval_T *rettv, FunPtr fptr);
479static void f_winlayout(typval_T *argvars, typval_T *rettv, FunPtr fptr);
480static void f_winline(typval_T *argvars, typval_T *rettv, FunPtr fptr);
481static void f_winnr(typval_T *argvars, typval_T *rettv, FunPtr fptr);
482static void f_winrestcmd(typval_T *argvars, typval_T *rettv, FunPtr fptr);
483static void f_winrestview(typval_T *argvars, typval_T *rettv, FunPtr fptr);
484static void f_winsaveview(typval_T *argvars, typval_T *rettv, FunPtr fptr);
485static _Bool write_list(FileDescriptor *const fp, const list_T *const list, const _Bool binary) FUNC_ATTR_NONNULL_ARG(1);
486static char *save_tv_as_string(typval_T *tv, ptrdiff_t *const len, _Bool endnl) FUNC_ATTR_MALLOC FUNC_ATTR_NONNULL_ALL;
487static void f_winwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr);
488static void f_wordcount(typval_T *argvars, typval_T *rettv, FunPtr fptr);
489static void f_writefile(typval_T *argvars, typval_T *rettv, FunPtr fptr);
490static void f_xor(typval_T *argvars, typval_T *rettv, FunPtr fptr);
491static int get_env_len(const char_u **arg);
492static int get_id_len(const char **const arg);
493static int get_name_len(const char **const arg, char **alias, int evaluate, int verbose);
494static const char_u *find_name_end(const char_u *arg, const char_u **expr_start, const char_u **expr_end, int flags);
495static char_u *make_expanded_name(const char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end);
496static int eval_isnamec(int c);
497static int eval_isnamec1(int c);
498static int get_var_tv(const char *name, int len, typval_T *rettv, dictitem_T **dip, int verbose, int no_autoload );
499static void check_vars(const char *name, size_t len);
500static int handle_subscript(const char **const arg, typval_T *rettv, int evaluate, int verbose );
501static dictitem_T *find_var(const char *const name, const size_t name_len, hashtab_T **htp, int no_autoload);
502static dictitem_T *find_var_in_ht(hashtab_T *const ht, int htname, const char *const varname, const size_t varname_len, int no_autoload) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL;
503static funccall_T *get_funccal(void);
504static hashtab_T *get_funccal_args_ht(void);
505static hashtab_T *get_funccal_local_ht(void);
506static hashtab_T *find_var_ht_dict(const char *name, const size_t name_len, const char **varname, dict_T **d);
507static hashtab_T *find_var_ht(const char *name, const size_t name_len, const char **varname);
508static void vars_clear_ext(hashtab_T *ht, int free_val);
509static void delete_var(hashtab_T *ht, hashitem_T *hi);
510static void list_one_var(dictitem_T *v, const char *prefix, int *first);
511static void list_one_var_a(const char *prefix, const char *name, const ptrdiff_t name_len, const int type, const char *string, int *first);
512static void set_var(const char *name, const size_t name_len, typval_T *const tv, const _Bool copy) FUNC_ATTR_NONNULL_ALL;
513static void set_var_const(const char *name, const size_t name_len, typval_T *const tv, const _Bool copy, const _Bool is_const) FUNC_ATTR_NONNULL_ALL;
514static _Bool var_check_fixed(const int flags, const char *name, size_t name_len) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL;
515static const char *find_option_end(const char **const arg, int *const opt_flags);
516static char_u *trans_function_name(char_u **pp, int skip, int flags, funcdict_T *fdp, partial_T **partial );
517static int eval_fname_script(const char *const p);
518static inline _Bool eval_fname_sid(const char *const name) FUNC_ATTR_PURE FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL;
519static void list_func_head(ufunc_T *fp, int indent, _Bool force);
520static ufunc_T *find_func(const char_u *name);
521static _Bool function_exists(const char *const name, _Bool no_deref);
522static _Bool builtin_function(const char *name, int len);
523static void func_do_profile(ufunc_T *fp);
524static void prof_sort_list(FILE *fd, ufunc_T **sorttab, int st_len, char *title, int prefer_self );
525static void prof_func_line(FILE *fd, int count, proftime_T *total, proftime_T *self, int prefer_self );
526static int prof_total_cmp(const void *s1, const void *s2);
527static int prof_self_cmp(const void *s1, const void *s2);
528static _Bool script_autoload(const char *const name, const size_t name_len, const _Bool reload);
529static char *autoload_name(const char *const name, const size_t name_len) FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT;
530static void cat_func_name(char_u *buf, ufunc_T *fp);
531static _Bool func_name_refcount(char_u *name);
532static _Bool func_remove(ufunc_T *fp);
533static void func_clear_items(ufunc_T *fp);
534static void func_clear(ufunc_T *fp, _Bool force);
535static void func_free(ufunc_T *fp);
536static void func_clear_free(ufunc_T *fp, _Bool force);
537static inline _Bool fc_referenced(const funccall_T *const fc) FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL;
538static void funccal_unref(funccall_T *fc, ufunc_T *fp, _Bool force);
539static int can_free_funccal(funccall_T *fc, int copyID);
540static void free_funccal(funccall_T *fc, int free_val );
541static void cleanup_function_call(funccall_T *fc);
542static void add_nr_var(dict_T *dp, dictitem_T *v, char *name, varnumber_T nr);
543static var_flavour_T var_flavour(char_u *varname);
544static inline _Bool common_job_callbacks(dict_T *vopts, CallbackReader *on_stdout, CallbackReader *on_stderr, Callback *on_exit);
545static Channel *find_job(uint64_t id, _Bool show_error);
546static void script_host_eval(char *name, typval_T *argvars, typval_T *rettv);
547#include "nvim/func_attr.h"
548