Mercurial > vim
annotate src/typval.c @ 31805:e279b756475b v9.0.1235
patch 9.0.1235: MS-Windows console: not flushing termguicolors
Commit: https://github.com/vim/vim/commit/dc7179f9a4cc74d864d1f6414e691d25bac8f831
Author: Christopher Plewright <chris@createng.com>
Date: Mon Jan 23 12:33:23 2023 +0000
patch 9.0.1235: MS-Windows console: not flushing termguicolors
Problem: MS-Windows console: not flushing termguicolors.
Solution: Flush termguicolors. (Christopher Plewright, closes https://github.com/vim/vim/issues/11871)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 23 Jan 2023 13:45:07 +0100 |
parents | 9b13b3a63bc0 |
children | 0d27ddce621d |
rev | line source |
---|---|
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2 * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
4 * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
8 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
9 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
10 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
11 * typval.c: functions that deal with a typval |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
12 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
13 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
14 #include "vim.h" |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
15 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
16 #if defined(FEAT_EVAL) || defined(PROTO) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
17 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
18 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
19 * Allocate memory for a variable type-value, and make it empty (0 or NULL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
20 * value). |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
21 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
22 typval_T * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
23 alloc_tv(void) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
24 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
25 return ALLOC_CLEAR_ONE(typval_T); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
26 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
27 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
28 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
29 * Allocate memory for a variable type-value, and assign a string to it. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
30 * The string "s" must have been allocated, it is consumed. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
31 * Return NULL for out of memory, the variable otherwise. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
32 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
33 typval_T * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
34 alloc_string_tv(char_u *s) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
35 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
36 typval_T *rettv; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
37 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
38 rettv = alloc_tv(); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
39 if (rettv != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
40 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
41 rettv->v_type = VAR_STRING; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
42 rettv->vval.v_string = s; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
43 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
44 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
45 vim_free(s); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
46 return rettv; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
47 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
48 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
49 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
50 * Free the memory for a variable type-value. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
51 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
52 void |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
53 free_tv(typval_T *varp) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
54 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
55 if (varp != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
56 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
57 switch (varp->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
58 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
59 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
60 func_unref(varp->vval.v_string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
61 // FALLTHROUGH |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
62 case VAR_STRING: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
63 vim_free(varp->vval.v_string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
64 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
65 case VAR_PARTIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
66 partial_unref(varp->vval.v_partial); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
67 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
68 case VAR_BLOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
69 blob_unref(varp->vval.v_blob); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
70 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
71 case VAR_LIST: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
72 list_unref(varp->vval.v_list); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
73 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
74 case VAR_DICT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
75 dict_unref(varp->vval.v_dict); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
76 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
77 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
78 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
79 job_unref(varp->vval.v_job); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
80 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
81 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
82 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
83 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
84 channel_unref(varp->vval.v_channel); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
85 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
86 #endif |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
87 case VAR_CLASS: |
31404
60b1d266548d
patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents:
31396
diff
changeset
|
88 class_unref(varp->vval.v_class); |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
89 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
90 case VAR_OBJECT: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
91 object_unref(varp->vval.v_object); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
92 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
93 |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
94 case VAR_NUMBER: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
95 case VAR_FLOAT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
96 case VAR_ANY: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
97 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
98 case VAR_VOID: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
99 case VAR_BOOL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
100 case VAR_SPECIAL: |
24606
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
101 case VAR_INSTR: |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
102 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
103 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
104 vim_free(varp); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
105 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
106 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
107 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
108 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
109 * Free the memory for a variable value and set the value to NULL or 0. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
110 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
111 void |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
112 clear_tv(typval_T *varp) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
113 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
114 if (varp != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
115 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
116 switch (varp->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
117 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
118 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
119 func_unref(varp->vval.v_string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
120 // FALLTHROUGH |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
121 case VAR_STRING: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
122 VIM_CLEAR(varp->vval.v_string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
123 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
124 case VAR_PARTIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
125 partial_unref(varp->vval.v_partial); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
126 varp->vval.v_partial = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
127 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
128 case VAR_BLOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
129 blob_unref(varp->vval.v_blob); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
130 varp->vval.v_blob = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
131 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
132 case VAR_LIST: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
133 list_unref(varp->vval.v_list); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
134 varp->vval.v_list = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
135 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
136 case VAR_DICT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
137 dict_unref(varp->vval.v_dict); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
138 varp->vval.v_dict = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
139 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
140 case VAR_NUMBER: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
141 case VAR_BOOL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
142 case VAR_SPECIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
143 varp->vval.v_number = 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
144 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
145 case VAR_FLOAT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
146 varp->vval.v_float = 0.0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
147 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
148 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
149 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
150 job_unref(varp->vval.v_job); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
151 varp->vval.v_job = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
152 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
153 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
154 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
155 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
156 channel_unref(varp->vval.v_channel); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
157 varp->vval.v_channel = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
158 #endif |
24610
c1263588156b
patch 8.2.2844: Vim9: memory leak when using searchpair()
Bram Moolenaar <Bram@vim.org>
parents:
24606
diff
changeset
|
159 break; |
c1263588156b
patch 8.2.2844: Vim9: memory leak when using searchpair()
Bram Moolenaar <Bram@vim.org>
parents:
24606
diff
changeset
|
160 case VAR_INSTR: |
c1263588156b
patch 8.2.2844: Vim9: memory leak when using searchpair()
Bram Moolenaar <Bram@vim.org>
parents:
24606
diff
changeset
|
161 VIM_CLEAR(varp->vval.v_instr); |
c1263588156b
patch 8.2.2844: Vim9: memory leak when using searchpair()
Bram Moolenaar <Bram@vim.org>
parents:
24606
diff
changeset
|
162 break; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
163 case VAR_CLASS: |
31404
60b1d266548d
patch 9.0.1035: object members are not being marked as used
Bram Moolenaar <Bram@vim.org>
parents:
31396
diff
changeset
|
164 class_unref(varp->vval.v_class); |
31525
f7c82a85e88a
patch 9.0.1095: using freed memory when declaration fails
Bram Moolenaar <Bram@vim.org>
parents:
31404
diff
changeset
|
165 varp->vval.v_class = NULL; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
166 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
167 case VAR_OBJECT: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
168 object_unref(varp->vval.v_object); |
31525
f7c82a85e88a
patch 9.0.1095: using freed memory when declaration fails
Bram Moolenaar <Bram@vim.org>
parents:
31404
diff
changeset
|
169 varp->vval.v_object = NULL; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
170 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
171 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
172 case VAR_ANY: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
173 case VAR_VOID: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
174 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
175 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
176 varp->v_lock = 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
177 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
178 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
179 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
180 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
181 * Set the value of a variable to NULL without freeing items. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
182 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
183 void |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
184 init_tv(typval_T *varp) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
185 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
186 if (varp != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
187 CLEAR_POINTER(varp); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
188 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
189 |
21851
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
190 static varnumber_T |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
191 tv_get_bool_or_number_chk(typval_T *varp, int *denote, int want_bool) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
192 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
193 varnumber_T n = 0L; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
194 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
195 switch (varp->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
196 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
197 case VAR_NUMBER: |
22405
0ef3ae4ec70e
patch 8.2.1751: using 2 where bool is expected may throw an error
Bram Moolenaar <Bram@vim.org>
parents:
22298
diff
changeset
|
198 if (in_vim9script() && want_bool && varp->vval.v_number != 0 |
21913
9fc27a955f00
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool
Bram Moolenaar <Bram@vim.org>
parents:
21861
diff
changeset
|
199 && varp->vval.v_number != 1) |
9fc27a955f00
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool
Bram Moolenaar <Bram@vim.org>
parents:
21861
diff
changeset
|
200 { |
9fc27a955f00
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool
Bram Moolenaar <Bram@vim.org>
parents:
21861
diff
changeset
|
201 semsg(_(e_using_number_as_bool_nr), varp->vval.v_number); |
9fc27a955f00
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool
Bram Moolenaar <Bram@vim.org>
parents:
21861
diff
changeset
|
202 break; |
9fc27a955f00
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool
Bram Moolenaar <Bram@vim.org>
parents:
21861
diff
changeset
|
203 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
204 return varp->vval.v_number; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
205 case VAR_FLOAT: |
26962
85866e069c24
patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26958
diff
changeset
|
206 emsg(_(e_using_float_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
207 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
208 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
209 case VAR_PARTIAL: |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
210 emsg(_(e_using_funcref_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
211 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
212 case VAR_STRING: |
21831
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
213 if (in_vim9script()) |
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
214 { |
22860
53acb89ec9f2
patch 8.2.1977: Vim9: error for using a string in a condition is confusing
Bram Moolenaar <Bram@vim.org>
parents:
22405
diff
changeset
|
215 emsg_using_string_as(varp, !want_bool); |
21831
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
216 break; |
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
217 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
218 if (varp->vval.v_string != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
219 vim_str2nr(varp->vval.v_string, NULL, NULL, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
220 STR2NR_ALL, &n, NULL, 0, FALSE); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
221 return n; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
222 case VAR_LIST: |
26958
d92e0d85923f
patch 8.2.4008: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26952
diff
changeset
|
223 emsg(_(e_using_list_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
224 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
225 case VAR_DICT: |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
226 emsg(_(e_using_dictionary_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
227 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
228 case VAR_BOOL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
229 case VAR_SPECIAL: |
21851
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
230 if (!want_bool && in_vim9script()) |
21831
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
231 { |
22930
84567584951f
patch 8.2.2012: Vim9: confusing error message when using bool wrongly
Bram Moolenaar <Bram@vim.org>
parents:
22860
diff
changeset
|
232 if (varp->v_type == VAR_BOOL) |
84567584951f
patch 8.2.2012: Vim9: confusing error message when using bool wrongly
Bram Moolenaar <Bram@vim.org>
parents:
22860
diff
changeset
|
233 emsg(_(e_using_bool_as_number)); |
84567584951f
patch 8.2.2012: Vim9: confusing error message when using bool wrongly
Bram Moolenaar <Bram@vim.org>
parents:
22860
diff
changeset
|
234 else |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
235 emsg(_(e_using_special_as_number)); |
21831
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
236 break; |
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
237 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
238 return varp->vval.v_number == VVAL_TRUE ? 1 : 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
239 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
240 #ifdef FEAT_JOB_CHANNEL |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
241 emsg(_(e_using_job_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
242 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
243 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
244 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
245 #ifdef FEAT_JOB_CHANNEL |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
246 emsg(_(e_using_channel_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
247 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
248 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
249 case VAR_BLOB: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
250 emsg(_(e_using_blob_as_number)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
251 break; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
252 case VAR_CLASS: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
253 emsg(_(e_using_class_as_number)); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
254 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
255 case VAR_OBJECT: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
256 emsg(_(e_using_object_as_number)); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
257 break; |
24936
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
258 case VAR_VOID: |
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
259 emsg(_(e_cannot_use_void_value)); |
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
260 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
261 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
262 case VAR_ANY: |
24606
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
263 case VAR_INSTR: |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
264 internal_error_no_abort("tv_get_number(UNKNOWN)"); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
265 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
266 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
267 if (denote == NULL) // useful for values that must be unsigned |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
268 n = -1; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
269 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
270 *denote = TRUE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
271 return n; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
272 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
273 |
21851
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
274 /* |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
275 * Get the number value of a variable. |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
276 * If it is a String variable, uses vim_str2nr(). |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
277 * For incompatible types, return 0. |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
278 * tv_get_number_chk() is similar to tv_get_number(), but informs the |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
279 * caller of incompatible types: it sets *denote to TRUE if "denote" |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
280 * is not NULL or returns -1 otherwise. |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
281 */ |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
282 varnumber_T |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
283 tv_get_number(typval_T *varp) |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
284 { |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
285 int error = FALSE; |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
286 |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
287 return tv_get_number_chk(varp, &error); // return 0L on error |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
288 } |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
289 |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
290 varnumber_T |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
291 tv_get_number_chk(typval_T *varp, int *denote) |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
292 { |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
293 return tv_get_bool_or_number_chk(varp, denote, FALSE); |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
294 } |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
295 |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
296 /* |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
297 * Get the boolean value of "varp". This is like tv_get_number_chk(), |
21913
9fc27a955f00
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool
Bram Moolenaar <Bram@vim.org>
parents:
21861
diff
changeset
|
298 * but in Vim9 script accepts Number (0 and 1) and Bool/Special. |
21851
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
299 */ |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
300 varnumber_T |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
301 tv_get_bool(typval_T *varp) |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
302 { |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
303 return tv_get_bool_or_number_chk(varp, NULL, TRUE); |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
304 } |
727820154b1a
patch 8.2.1475: Vim9: can't use v:true for option flags
Bram Moolenaar <Bram@vim.org>
parents:
21831
diff
changeset
|
305 |
21861
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
306 /* |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
307 * Get the boolean value of "varp". This is like tv_get_number_chk(), |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
308 * but in Vim9 script accepts Number and Bool. |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
309 */ |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
310 varnumber_T |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
311 tv_get_bool_chk(typval_T *varp, int *denote) |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
312 { |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
313 return tv_get_bool_or_number_chk(varp, denote, TRUE); |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
314 } |
cd8dafe937ba
patch 8.2.1480: Vim9: skip expression in search() gives error
Bram Moolenaar <Bram@vim.org>
parents:
21851
diff
changeset
|
315 |
26696
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
316 static float_T |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
317 tv_get_float_chk(typval_T *varp, int *error) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
318 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
319 switch (varp->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
320 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
321 case VAR_NUMBER: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
322 return (float_T)(varp->vval.v_number); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
323 case VAR_FLOAT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
324 return varp->vval.v_float; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
325 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
326 case VAR_PARTIAL: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
327 emsg(_(e_using_funcref_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
328 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
329 case VAR_STRING: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
330 emsg(_(e_using_string_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
331 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
332 case VAR_LIST: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
333 emsg(_(e_using_list_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
334 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
335 case VAR_DICT: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
336 emsg(_(e_using_dictionary_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
337 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
338 case VAR_BOOL: |
27034
b31cc7630773
patch 8.2.4046: some error messages not in the right place
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
339 emsg(_(e_using_boolean_value_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
340 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
341 case VAR_SPECIAL: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
342 emsg(_(e_using_special_value_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
343 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
344 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
345 # ifdef FEAT_JOB_CHANNEL |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
346 emsg(_(e_using_job_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
347 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
348 # endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
349 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
350 # ifdef FEAT_JOB_CHANNEL |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
351 emsg(_(e_using_channel_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
352 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
353 # endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
354 case VAR_BLOB: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
355 emsg(_(e_using_blob_as_float)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
356 break; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
357 case VAR_CLASS: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
358 emsg(_(e_using_class_as_float)); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
359 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
360 case VAR_OBJECT: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
361 emsg(_(e_using_object_as_float)); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
362 break; |
24936
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
363 case VAR_VOID: |
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
364 emsg(_(e_cannot_use_void_value)); |
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
365 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
366 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
367 case VAR_ANY: |
24606
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
368 case VAR_INSTR: |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
369 internal_error_no_abort("tv_get_float(UNKNOWN)"); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
370 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
371 } |
26696
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
372 if (error != NULL) |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
373 *error = TRUE; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
374 return 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
375 } |
26696
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
376 |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
377 float_T |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
378 tv_get_float(typval_T *varp) |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
379 { |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
380 return tv_get_float_chk(varp, NULL); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
381 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
382 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
383 /* |
28674
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
384 * Give an error and return FAIL unless "args[idx]" is unknown |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
385 */ |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
386 int |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
387 check_for_unknown_arg(typval_T *args, int idx) |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
388 { |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
389 if (args[idx].v_type != VAR_UNKNOWN) |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
390 { |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
391 semsg(_(e_too_many_arguments), idx + 1); |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
392 return FAIL; |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
393 } |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
394 return OK; |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
395 } |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
396 |
38f7a132bba3
patch 8.2.4861: it is not easy to restore saved mappings
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
397 /* |
25272
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
398 * Give an error and return FAIL unless "args[idx]" is a string. |
23142
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
399 */ |
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
400 int |
24246
35603c7991d7
patch 8.2.2664: Vim9: not enough function arguments checked for string
Bram Moolenaar <Bram@vim.org>
parents:
24210
diff
changeset
|
401 check_for_string_arg(typval_T *args, int idx) |
23142
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
402 { |
24246
35603c7991d7
patch 8.2.2664: Vim9: not enough function arguments checked for string
Bram Moolenaar <Bram@vim.org>
parents:
24210
diff
changeset
|
403 if (args[idx].v_type != VAR_STRING) |
23142
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
404 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
405 semsg(_(e_string_required_for_argument_nr), idx + 1); |
23142
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
406 return FAIL; |
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
407 } |
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
408 return OK; |
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
409 } |
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
410 |
5f08d4a42898
patch 8.2.2117: some functions use any value as a string
Bram Moolenaar <Bram@vim.org>
parents:
22930
diff
changeset
|
411 /* |
24246
35603c7991d7
patch 8.2.2664: Vim9: not enough function arguments checked for string
Bram Moolenaar <Bram@vim.org>
parents:
24210
diff
changeset
|
412 * Give an error and return FAIL unless "args[idx]" is a non-empty string. |
23175
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
413 */ |
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
414 int |
24246
35603c7991d7
patch 8.2.2664: Vim9: not enough function arguments checked for string
Bram Moolenaar <Bram@vim.org>
parents:
24210
diff
changeset
|
415 check_for_nonempty_string_arg(typval_T *args, int idx) |
23175
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
416 { |
24246
35603c7991d7
patch 8.2.2664: Vim9: not enough function arguments checked for string
Bram Moolenaar <Bram@vim.org>
parents:
24210
diff
changeset
|
417 if (check_for_string_arg(args, idx) == FAIL) |
23175
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
418 return FAIL; |
24246
35603c7991d7
patch 8.2.2664: Vim9: not enough function arguments checked for string
Bram Moolenaar <Bram@vim.org>
parents:
24210
diff
changeset
|
419 if (args[idx].vval.v_string == NULL || *args[idx].vval.v_string == NUL) |
23175
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
420 { |
24424 | 421 semsg(_(e_non_empty_string_required_for_argument_nr), idx + 1); |
23175
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
422 return FAIL; |
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
423 } |
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
424 return OK; |
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
425 } |
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
426 |
d7294a6220ac
patch 8.2.2133: Vim9: checking for a non-empty string is too strict
Bram Moolenaar <Bram@vim.org>
parents:
23142
diff
changeset
|
427 /* |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
428 * Check for an optional string argument at 'idx' |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
429 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
430 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
431 check_for_opt_string_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
432 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
433 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
434 || check_for_string_arg(args, idx) != FAIL) ? OK : FAIL; |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
435 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
436 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
437 /* |
25272
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
438 * Give an error and return FAIL unless "args[idx]" is a number. |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
439 */ |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
440 int |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
441 check_for_number_arg(typval_T *args, int idx) |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
442 { |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
443 if (args[idx].v_type != VAR_NUMBER) |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
444 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
445 semsg(_(e_number_required_for_argument_nr), idx + 1); |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
446 return FAIL; |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
447 } |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
448 return OK; |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
449 } |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
450 |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25198
diff
changeset
|
451 /* |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
452 * Check for an optional number argument at 'idx' |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
453 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
454 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
455 check_for_opt_number_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
456 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
457 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
458 || check_for_number_arg(args, idx) != FAIL) ? OK : FAIL; |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
459 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
460 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
461 /* |
25368
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
462 * Give an error and return FAIL unless "args[idx]" is a float or a number. |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
463 */ |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
464 int |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
465 check_for_float_or_nr_arg(typval_T *args, int idx) |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
466 { |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
467 if (args[idx].v_type != VAR_FLOAT && args[idx].v_type != VAR_NUMBER) |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
468 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
469 semsg(_(e_float_or_number_required_for_argument_nr), idx + 1); |
25368
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
470 return FAIL; |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
471 } |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
472 return OK; |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
473 } |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
474 |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
475 /* |
25272
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
476 * Give an error and return FAIL unless "args[idx]" is a bool. |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
477 */ |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
478 int |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
479 check_for_bool_arg(typval_T *args, int idx) |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
480 { |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
481 if (args[idx].v_type != VAR_BOOL |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
482 && !(args[idx].v_type == VAR_NUMBER |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
483 && (args[idx].vval.v_number == 0 |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
484 || args[idx].vval.v_number == 1))) |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
485 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
486 semsg(_(e_bool_required_for_argument_nr), idx + 1); |
25272
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
487 return FAIL; |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
488 } |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
489 return OK; |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
490 } |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
491 |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
492 /* |
25802
5ef704de7709
patch 8.2.3436: check for optional bool type has confusing return type
Bram Moolenaar <Bram@vim.org>
parents:
25622
diff
changeset
|
493 * Check for an optional bool argument at 'idx'. |
5ef704de7709
patch 8.2.3436: check for optional bool type has confusing return type
Bram Moolenaar <Bram@vim.org>
parents:
25622
diff
changeset
|
494 * Return FAIL if the type is wrong. |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
495 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
496 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
497 check_for_opt_bool_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
498 { |
25802
5ef704de7709
patch 8.2.3436: check for optional bool type has confusing return type
Bram Moolenaar <Bram@vim.org>
parents:
25622
diff
changeset
|
499 if (args[idx].v_type == VAR_UNKNOWN) |
5ef704de7709
patch 8.2.3436: check for optional bool type has confusing return type
Bram Moolenaar <Bram@vim.org>
parents:
25622
diff
changeset
|
500 return OK; |
5ef704de7709
patch 8.2.3436: check for optional bool type has confusing return type
Bram Moolenaar <Bram@vim.org>
parents:
25622
diff
changeset
|
501 return check_for_bool_arg(args, idx); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
502 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
503 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
504 /* |
25806
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
505 * Give an error and return FAIL unless "args[idx]" is a blob. |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
506 */ |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
507 int |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
508 check_for_blob_arg(typval_T *args, int idx) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
509 { |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
510 if (args[idx].v_type != VAR_BLOB) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
511 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
512 semsg(_(e_blob_required_for_argument_nr), idx + 1); |
25806
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
513 return FAIL; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
514 } |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
515 return OK; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
516 } |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
517 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25802
diff
changeset
|
518 /* |
25272
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
519 * Give an error and return FAIL unless "args[idx]" is a list. |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
520 */ |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
521 int |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
522 check_for_list_arg(typval_T *args, int idx) |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
523 { |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
524 if (args[idx].v_type != VAR_LIST) |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
525 { |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
526 semsg(_(e_list_required_for_argument_nr), idx + 1); |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
527 return FAIL; |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
528 } |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
529 return OK; |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
530 } |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
531 |
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
532 /* |
30015
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
533 * Give an error and return FAIL unless "args[idx]" is a non-NULL list. |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
534 */ |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
535 int |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
536 check_for_nonnull_list_arg(typval_T *args, int idx) |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
537 { |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
538 if (check_for_list_arg(args, idx) == FAIL) |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
539 return FAIL; |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
540 |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
541 if (args[idx].vval.v_list == NULL) |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
542 { |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
543 semsg(_(e_non_null_list_required_for_argument_nr), idx + 1); |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
544 return FAIL; |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
545 } |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
546 return OK; |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
547 } |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
548 |
adb0de8be4ce
patch 9.0.0345: error message for list argument could be clearer
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
549 /* |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
550 * Check for an optional list argument at 'idx' |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
551 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
552 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
553 check_for_opt_list_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
554 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
555 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
556 || check_for_list_arg(args, idx) != FAIL) ? OK : FAIL; |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
557 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
558 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
559 /* |
25272
712e867f9721
patch 8.2.3173: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
560 * Give an error and return FAIL unless "args[idx]" is a dict. |
25198
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
561 */ |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
562 int |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
563 check_for_dict_arg(typval_T *args, int idx) |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
564 { |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
565 if (args[idx].v_type != VAR_DICT) |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
566 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
567 semsg(_(e_dict_required_for_argument_nr), idx + 1); |
25198
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
568 return FAIL; |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
569 } |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
570 return OK; |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
571 } |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
572 |
eafc0e07b188
patch 8.2.3135: Vim9: builtin function arguments not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
573 /* |
29994
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
574 * Give an error and return FAIL unless "args[idx]" is a non-NULL dict. |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
575 */ |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
576 int |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
577 check_for_nonnull_dict_arg(typval_T *args, int idx) |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
578 { |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
579 if (check_for_dict_arg(args, idx) == FAIL) |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
580 return FAIL; |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
581 |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
582 if (args[idx].vval.v_dict == NULL) |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
583 { |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
584 semsg(_(e_non_null_dict_required_for_argument_nr), idx + 1); |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
585 return FAIL; |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
586 } |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
587 return OK; |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
588 } |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
589 |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
590 /* |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
591 * Check for an optional dict argument at 'idx' |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
592 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
593 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
594 check_for_opt_dict_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
595 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
596 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
597 || check_for_dict_arg(args, idx) != FAIL) ? OK : FAIL; |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
598 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
599 |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
600 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
601 /* |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
602 * Give an error and return FAIL unless "args[idx]" is a channel or a job. |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
603 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
604 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
605 check_for_chan_or_job_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
606 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
607 if (args[idx].v_type != VAR_CHANNEL && args[idx].v_type != VAR_JOB) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
608 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
609 semsg(_(e_chan_or_job_required_for_argument_nr), idx + 1); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
610 return FAIL; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
611 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
612 return OK; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
613 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
614 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
615 /* |
25348
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
616 * Give an error and return FAIL unless "args[idx]" is an optional channel or a |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
617 * job. |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
618 */ |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
619 int |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
620 check_for_opt_chan_or_job_arg(typval_T *args, int idx) |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
621 { |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
622 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
623 || check_for_chan_or_job_arg(args, idx) != FAIL) ? OK : FAIL; |
25348
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
624 } |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
625 |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25338
diff
changeset
|
626 /* |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
627 * Give an error and return FAIL unless "args[idx]" is a job. |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
628 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
629 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
630 check_for_job_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
631 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
632 if (args[idx].v_type != VAR_JOB) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
633 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
634 semsg(_(e_job_required_for_argument_nr), idx + 1); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
635 return FAIL; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
636 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
637 return OK; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
638 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
639 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
640 /* |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
641 * Check for an optional job argument at 'idx'. |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
642 */ |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
643 int |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
644 check_for_opt_job_arg(typval_T *args, int idx) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
645 { |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
646 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
647 || check_for_job_arg(args, idx) != FAIL) ? OK : FAIL; |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
648 } |
31289
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
649 #else |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
650 /* |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
651 * Give an error and return FAIL unless "args[idx]" is an optional channel or a |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
652 * job. Used without the +channel feature, thus only VAR_UNKNOWN is accepted. |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
653 */ |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
654 int |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
655 check_for_opt_chan_or_job_arg(typval_T *args, int idx) |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
656 { |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
657 return args[idx].v_type == VAR_UNKNOWN ? OK : FAIL; |
4f1e70a709bb
patch 9.0.0978: build errors without the +channel feature
Bram Moolenaar <Bram@vim.org>
parents:
30986
diff
changeset
|
658 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
659 #endif |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
660 |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
661 /* |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
662 * Give an error and return FAIL unless "args[idx]" is a string or |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
663 * a number. |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
664 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
665 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
666 check_for_string_or_number_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
667 { |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
668 if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_NUMBER) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
669 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
670 semsg(_(e_string_or_number_required_for_argument_nr), idx + 1); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
671 return FAIL; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
672 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
673 return OK; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
674 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
675 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
676 /* |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
677 * Check for an optional string or number argument at 'idx'. |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
678 */ |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
679 int |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
680 check_for_opt_string_or_number_arg(typval_T *args, int idx) |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
681 { |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
682 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
683 || check_for_string_or_number_arg(args, idx) != FAIL) ? OK : FAIL; |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
684 } |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
685 |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
686 /* |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
687 * Give an error and return FAIL unless "args[idx]" is a buffer number. |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
688 * Buffer number can be a number or a string. |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
689 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
690 int |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
691 check_for_buffer_arg(typval_T *args, int idx) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
692 { |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
693 return check_for_string_or_number_arg(args, idx); |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
694 } |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
695 |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
696 /* |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
697 * Check for an optional buffer argument at 'idx' |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
698 */ |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
699 int |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
700 check_for_opt_buffer_arg(typval_T *args, int idx) |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
701 { |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
702 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
703 || check_for_buffer_arg(args, idx) != FAIL) ? OK : FAIL; |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
704 } |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
705 |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
706 /* |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
707 * Give an error and return FAIL unless "args[idx]" is a line number. |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
708 * Line number can be a number or a string. |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
709 */ |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
710 int |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
711 check_for_lnum_arg(typval_T *args, int idx) |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
712 { |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
713 return check_for_string_or_number_arg(args, idx); |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
714 } |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
715 |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
716 /* |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
717 * Check for an optional line number argument at 'idx' |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
718 */ |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
719 int |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
720 check_for_opt_lnum_arg(typval_T *args, int idx) |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
721 { |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
722 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
723 || check_for_lnum_arg(args, idx) != FAIL) ? OK : FAIL; |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
724 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
725 |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
726 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
727 /* |
25338
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
728 * Give an error and return FAIL unless "args[idx]" is a string or a blob. |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
729 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
730 int |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
731 check_for_string_or_blob_arg(typval_T *args, int idx) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
732 { |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
733 if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_BLOB) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
734 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
735 semsg(_(e_string_or_blob_required_for_argument_nr), idx + 1); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
736 return FAIL; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
737 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
738 return OK; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
739 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
740 #endif |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
741 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
742 /* |
25338
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
743 * Give an error and return FAIL unless "args[idx]" is a string or a list. |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
744 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
745 int |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
746 check_for_string_or_list_arg(typval_T *args, int idx) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
747 { |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
748 if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_LIST) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
749 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
750 semsg(_(e_string_or_list_required_for_argument_nr), idx + 1); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
751 return FAIL; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
752 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
753 return OK; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
754 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
755 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
756 /* |
26638
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
757 * Give an error and return FAIL unless "args[idx]" is a string, a list or a |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
758 * blob. |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
759 */ |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
760 int |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
761 check_for_string_or_list_or_blob_arg(typval_T *args, int idx) |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
762 { |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
763 if (args[idx].v_type != VAR_STRING |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
764 && args[idx].v_type != VAR_LIST |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
765 && args[idx].v_type != VAR_BLOB) |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
766 { |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
767 semsg(_(e_string_list_or_blob_required_for_argument_nr), idx + 1); |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
768 return FAIL; |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
769 } |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
770 return OK; |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
771 } |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
772 |
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
773 /* |
25368
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
774 * Check for an optional string or list argument at 'idx' |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
775 */ |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
776 int |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
777 check_for_opt_string_or_list_arg(typval_T *args, int idx) |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
778 { |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
779 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
780 || check_for_string_or_list_arg(args, idx) != FAIL) ? OK : FAIL; |
25368
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
781 } |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
782 |
1ffa8eb30353
patch 8.2.3221: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
783 /* |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
784 * Give an error and return FAIL unless "args[idx]" is a string or a dict. |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
785 */ |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
786 int |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
787 check_for_string_or_dict_arg(typval_T *args, int idx) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
788 { |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
789 if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_DICT) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
790 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
791 semsg(_(e_string_or_dict_required_for_argument_nr), idx + 1); |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
792 return FAIL; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
793 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
794 return OK; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
795 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
796 |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
797 /* |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
798 * Give an error and return FAIL unless "args[idx]" is a string or a number |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
799 * or a list. |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
800 */ |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
801 int |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
802 check_for_string_or_number_or_list_arg(typval_T *args, int idx) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
803 { |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
804 if (args[idx].v_type != VAR_STRING |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
805 && args[idx].v_type != VAR_NUMBER |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
806 && args[idx].v_type != VAR_LIST) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
807 { |
26638
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
808 semsg(_(e_string_number_or_list_required_for_argument_nr), idx + 1); |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
809 return FAIL; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
810 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
811 return OK; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
812 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
813 |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
814 /* |
25390
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
815 * Give an error and return FAIL unless "args[idx]" is an optional string |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
816 * or number or a list |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
817 */ |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
818 int |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
819 check_for_opt_string_or_number_or_list_arg(typval_T *args, int idx) |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
820 { |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
821 return (args[idx].v_type == VAR_UNKNOWN |
30228
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
822 || check_for_string_or_number_or_list_arg(args, idx) |
642b5e748028
patch 9.0.0450: return value of argument check functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
30188
diff
changeset
|
823 != FAIL) ? OK : FAIL; |
25390
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
824 } |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
825 |
a6c347a0c6e3
patch 8.2.3232: system() does not work without a second argument
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
826 /* |
30188
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
827 * Give an error and return FAIL unless "args[idx]" is a string or a number |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
828 * or a list or a blob. |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
829 */ |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
830 int |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
831 check_for_string_or_number_or_list_or_blob_arg(typval_T *args, int idx) |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
832 { |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
833 if (args[idx].v_type != VAR_STRING |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
834 && args[idx].v_type != VAR_NUMBER |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
835 && args[idx].v_type != VAR_LIST |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
836 && args[idx].v_type != VAR_BLOB) |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
837 { |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
838 semsg(_(e_string_number_list_or_blob_required_for_argument_nr), idx + 1); |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
839 return FAIL; |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
840 } |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
841 return OK; |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
842 } |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
843 |
ba22d5536d3e
patch 9.0.0430: cannot use repeat() with a blob
Bram Moolenaar <Bram@vim.org>
parents:
30015
diff
changeset
|
844 /* |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
845 * Give an error and return FAIL unless "args[idx]" is a string or a list |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
846 * or a dict. |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
847 */ |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
848 int |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
849 check_for_string_or_list_or_dict_arg(typval_T *args, int idx) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
850 { |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
851 if (args[idx].v_type != VAR_STRING |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
852 && args[idx].v_type != VAR_LIST |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
853 && args[idx].v_type != VAR_DICT) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
854 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
855 semsg(_(e_string_list_or_dict_required_for_argument_nr), idx + 1); |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
856 return FAIL; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
857 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
858 return OK; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
859 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
860 |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
861 /* |
26731
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
862 * Give an error and return FAIL unless "args[idx]" is a string |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
863 * or a function reference. |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
864 */ |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
865 int |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
866 check_for_string_or_func_arg(typval_T *args, int idx) |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
867 { |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
868 if (args[idx].v_type != VAR_PARTIAL |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
869 && args[idx].v_type != VAR_FUNC |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
870 && args[idx].v_type != VAR_STRING) |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
871 { |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
872 semsg(_(e_string_or_function_required_for_argument_nr), idx + 1); |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
873 return FAIL; |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
874 } |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
875 return OK; |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
876 } |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
877 |
7f4cc4e58f75
patch 8.2.3894: Vim9: no proper type check for first argument of call()
Bram Moolenaar <Bram@vim.org>
parents:
26696
diff
changeset
|
878 /* |
25338
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
879 * Give an error and return FAIL unless "args[idx]" is a list or a blob. |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
880 */ |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
881 int |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
882 check_for_list_or_blob_arg(typval_T *args, int idx) |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
883 { |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
884 if (args[idx].v_type != VAR_LIST && args[idx].v_type != VAR_BLOB) |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
885 { |
26638
6fd15d82e898
patch 8.2.3848: cannot use reduce() for a string
Bram Moolenaar <Bram@vim.org>
parents:
26622
diff
changeset
|
886 semsg(_(e_list_or_blob_required_for_argument_nr), idx + 1); |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
887 return FAIL; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
888 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
889 return OK; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
890 } |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
891 |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
892 /* |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
893 * Give an error and return FAIL unless "args[idx]" is a list or dict |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
894 */ |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
895 int |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
896 check_for_list_or_dict_arg(typval_T *args, int idx) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
897 { |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
898 if (args[idx].v_type != VAR_LIST |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
899 && args[idx].v_type != VAR_DICT) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
900 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
901 semsg(_(e_list_or_dict_required_for_argument_nr), idx + 1); |
25338
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
902 return FAIL; |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
903 } |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
904 return OK; |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
905 } |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
906 |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
907 /* |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
908 * Give an error and return FAIL unless "args[idx]" is a list or dict or a |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
909 * blob. |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
910 */ |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
911 int |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
912 check_for_list_or_dict_or_blob_arg(typval_T *args, int idx) |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
913 { |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
914 if (args[idx].v_type != VAR_LIST |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
915 && args[idx].v_type != VAR_DICT |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
916 && args[idx].v_type != VAR_BLOB) |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
917 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
918 semsg(_(e_list_dict_or_blob_required_for_argument_nr), idx + 1); |
25338
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
919 return FAIL; |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
920 } |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
921 return OK; |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
922 } |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
923 |
e2be9f3c5907
patch 8.2.3206: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25314
diff
changeset
|
924 /* |
26585
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
925 * Give an error and return FAIL unless "args[idx]" is a list or dict or a |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
926 * blob or a string. |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
927 */ |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
928 int |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
929 check_for_list_or_dict_or_blob_or_string_arg(typval_T *args, int idx) |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
930 { |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
931 if (args[idx].v_type != VAR_LIST |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
932 && args[idx].v_type != VAR_DICT |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
933 && args[idx].v_type != VAR_BLOB |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
934 && args[idx].v_type != VAR_STRING) |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
935 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
936 semsg(_(e_list_dict_blob_or_string_required_for_argument_nr), idx + 1); |
26585
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
937 return FAIL; |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
938 } |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
939 return OK; |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
940 } |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
941 |
0d2a709e2ff0
patch 8.2.3822: leaking memory in map() and filter(), no string in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
26441
diff
changeset
|
942 /* |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
943 * Give an error and return FAIL unless "args[idx]" is an optional buffer |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
944 * number or a dict. |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
945 */ |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
946 int |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
947 check_for_opt_buffer_or_dict_arg(typval_T *args, int idx) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
948 { |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
949 if (args[idx].v_type != VAR_UNKNOWN |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25368
diff
changeset
|
950 && args[idx].v_type != VAR_STRING |
25314
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
951 && args[idx].v_type != VAR_NUMBER |
7e620652bd13
patch 8.2.3194: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
952 && args[idx].v_type != VAR_DICT) |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
953 { |
26622
a28f91b893b2
patch 8.2.3840: useless test for negative index in check functions
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
954 semsg(_(e_string_required_for_argument_nr), idx + 1); |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
955 return FAIL; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
956 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
957 return OK; |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
958 } |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
959 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25278
diff
changeset
|
960 /* |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
961 * Get the string value of a variable. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
962 * If it is a Number variable, the number is converted into a string. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
963 * tv_get_string() uses a single, static buffer. YOU CAN ONLY USE IT ONCE! |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
964 * tv_get_string_buf() uses a given buffer. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
965 * If the String variable has never been set, return an empty string. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
966 * Never returns NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
967 * tv_get_string_chk() and tv_get_string_buf_chk() are similar, but return |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
968 * NULL on error. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
969 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
970 char_u * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
971 tv_get_string(typval_T *varp) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
972 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
973 static char_u mybuf[NUMBUFLEN]; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
974 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
975 return tv_get_string_buf(varp, mybuf); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
976 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
977 |
23786
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
978 /* |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
979 * Like tv_get_string() but don't allow number to string conversion for Vim9. |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
980 */ |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
981 char_u * |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
982 tv_get_string_strict(typval_T *varp) |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
983 { |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
984 static char_u mybuf[NUMBUFLEN]; |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
985 char_u *res = tv_get_string_buf_chk_strict( |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
986 varp, mybuf, in_vim9script()); |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
987 |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
988 return res != NULL ? res : (char_u *)""; |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
989 } |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
990 |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
991 char_u * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
992 tv_get_string_buf(typval_T *varp, char_u *buf) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
993 { |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
994 char_u *res = tv_get_string_buf_chk(varp, buf); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
995 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
996 return res != NULL ? res : (char_u *)""; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
997 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
998 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
999 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1000 * Careful: This uses a single, static buffer. YOU CAN ONLY USE IT ONCE! |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1001 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1002 char_u * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1003 tv_get_string_chk(typval_T *varp) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1004 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1005 static char_u mybuf[NUMBUFLEN]; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1006 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1007 return tv_get_string_buf_chk(varp, mybuf); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1008 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1009 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1010 char_u * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1011 tv_get_string_buf_chk(typval_T *varp, char_u *buf) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1012 { |
23786
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1013 return tv_get_string_buf_chk_strict(varp, buf, FALSE); |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1014 } |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1015 |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1016 char_u * |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1017 tv_get_string_buf_chk_strict(typval_T *varp, char_u *buf, int strict) |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1018 { |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1019 switch (varp->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1020 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1021 case VAR_NUMBER: |
23786
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1022 if (strict) |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1023 { |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1024 emsg(_(e_using_number_as_string)); |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1025 break; |
0512923e54e1
patch 8.2.2434: Vim9: no error when compiling str2nr() with a number
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
1026 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1027 vim_snprintf((char *)buf, NUMBUFLEN, "%lld", |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1028 (varnumber_T)varp->vval.v_number); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1029 return buf; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1030 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1031 case VAR_PARTIAL: |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1032 emsg(_(e_using_funcref_as_string)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1033 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1034 case VAR_LIST: |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1035 emsg(_(e_using_list_as_string)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1036 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1037 case VAR_DICT: |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1038 emsg(_(e_using_dictionary_as_string)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1039 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1040 case VAR_FLOAT: |
24820
b1093c1ac109
patch 8.2.2948: substitute() accepts a number but not a float expression
Bram Moolenaar <Bram@vim.org>
parents:
24812
diff
changeset
|
1041 if (strict) |
b1093c1ac109
patch 8.2.2948: substitute() accepts a number but not a float expression
Bram Moolenaar <Bram@vim.org>
parents:
24812
diff
changeset
|
1042 { |
26885
ed39730119bd
patch 8.2.3971: build fails
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
1043 emsg(_(e_using_float_as_string)); |
24820
b1093c1ac109
patch 8.2.2948: substitute() accepts a number but not a float expression
Bram Moolenaar <Bram@vim.org>
parents:
24812
diff
changeset
|
1044 break; |
b1093c1ac109
patch 8.2.2948: substitute() accepts a number but not a float expression
Bram Moolenaar <Bram@vim.org>
parents:
24812
diff
changeset
|
1045 } |
b1093c1ac109
patch 8.2.2948: substitute() accepts a number but not a float expression
Bram Moolenaar <Bram@vim.org>
parents:
24812
diff
changeset
|
1046 vim_snprintf((char *)buf, NUMBUFLEN, "%g", varp->vval.v_float); |
b1093c1ac109
patch 8.2.2948: substitute() accepts a number but not a float expression
Bram Moolenaar <Bram@vim.org>
parents:
24812
diff
changeset
|
1047 return buf; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1048 case VAR_STRING: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1049 if (varp->vval.v_string != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1050 return varp->vval.v_string; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1051 return (char_u *)""; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1052 case VAR_BOOL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1053 case VAR_SPECIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1054 STRCPY(buf, get_var_special_name(varp->vval.v_number)); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1055 return buf; |
28809
d0241e74bfdb
patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents:
28718
diff
changeset
|
1056 case VAR_BLOB: |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
1057 emsg(_(e_using_blob_as_string)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1058 break; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1059 case VAR_CLASS: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1060 emsg(_(e_using_class_as_string)); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1061 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1062 case VAR_OBJECT: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1063 emsg(_(e_using_object_as_string)); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1064 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1065 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1066 #ifdef FEAT_JOB_CHANNEL |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1067 if (in_vim9script()) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1068 { |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1069 semsg(_(e_using_invalid_value_as_string_str), "job"); |
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1070 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1071 } |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1072 return job_to_string_buf(varp, buf); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1073 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1074 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1075 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1076 #ifdef FEAT_JOB_CHANNEL |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1077 if (in_vim9script()) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1078 { |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1079 semsg(_(e_using_invalid_value_as_string_str), "channel"); |
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1080 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1081 } |
24812
8fdf839af1f4
patch 8.2.2944: Vim9: no error when using job or channel as a string
Bram Moolenaar <Bram@vim.org>
parents:
24614
diff
changeset
|
1082 return channel_to_string_buf(varp, buf); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1083 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1084 break; |
24936
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
1085 case VAR_VOID: |
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
1086 emsg(_(e_cannot_use_void_value)); |
345619f35112
patch 8.2.3005: Vim9: using a void value does not give a proper error message
Bram Moolenaar <Bram@vim.org>
parents:
24820
diff
changeset
|
1087 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1088 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1089 case VAR_ANY: |
24606
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
1090 case VAR_INSTR: |
24614
07b3d21a8b4b
patch 8.2.2846: Vim9: "echo Func()" does not give an error for using void
Bram Moolenaar <Bram@vim.org>
parents:
24610
diff
changeset
|
1091 semsg(_(e_using_invalid_value_as_string_str), |
07b3d21a8b4b
patch 8.2.2846: Vim9: "echo Func()" does not give an error for using void
Bram Moolenaar <Bram@vim.org>
parents:
24610
diff
changeset
|
1092 vartype_name(varp->v_type)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1093 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1094 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1095 return NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1096 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1097 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1098 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1099 * Turn a typeval into a string. Similar to tv_get_string_buf() but uses |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1100 * string() on Dict, List, etc. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1101 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1102 char_u * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1103 tv_stringify(typval_T *varp, char_u *buf) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1104 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1105 if (varp->v_type == VAR_LIST |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1106 || varp->v_type == VAR_DICT |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1107 || varp->v_type == VAR_BLOB |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1108 || varp->v_type == VAR_FUNC |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1109 || varp->v_type == VAR_PARTIAL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1110 || varp->v_type == VAR_FLOAT) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1111 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1112 typval_T tmp; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1113 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1114 f_string(varp, &tmp); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1115 tv_get_string_buf(&tmp, buf); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1116 clear_tv(varp); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1117 *varp = tmp; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1118 return tmp.vval.v_string; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1119 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1120 return tv_get_string_buf(varp, buf); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1121 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1122 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1123 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1124 * Return TRUE if typeval "tv" and its value are set to be locked (immutable). |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1125 * Also give an error message, using "name" or _("name") when use_gettext is |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1126 * TRUE. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1127 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1128 int |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1129 tv_check_lock(typval_T *tv, char_u *name, int use_gettext) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1130 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1131 int lock = 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1132 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1133 switch (tv->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1134 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1135 case VAR_BLOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1136 if (tv->vval.v_blob != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1137 lock = tv->vval.v_blob->bv_lock; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1138 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1139 case VAR_LIST: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1140 if (tv->vval.v_list != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1141 lock = tv->vval.v_list->lv_lock; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1142 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1143 case VAR_DICT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1144 if (tv->vval.v_dict != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1145 lock = tv->vval.v_dict->dv_lock; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1146 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1147 default: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1148 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1149 } |
22298
07e48ee8c3bb
patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
22043
diff
changeset
|
1150 return value_check_lock(tv->v_lock, name, use_gettext) |
07e48ee8c3bb
patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9
Bram Moolenaar <Bram@vim.org>
parents:
22043
diff
changeset
|
1151 || (lock != 0 && value_check_lock(lock, name, use_gettext)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1152 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1153 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1154 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1155 * Copy the values from typval_T "from" to typval_T "to". |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1156 * When needed allocates string or increases reference count. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1157 * Does not make a copy of a list, blob or dict but copies the reference! |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1158 * It is OK for "from" and "to" to point to the same item. This is used to |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1159 * make a copy later. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1160 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1161 void |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1162 copy_tv(typval_T *from, typval_T *to) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1163 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1164 to->v_type = from->v_type; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1165 to->v_lock = 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1166 switch (from->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1167 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1168 case VAR_NUMBER: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1169 case VAR_BOOL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1170 case VAR_SPECIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1171 to->vval.v_number = from->vval.v_number; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1172 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1173 case VAR_FLOAT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1174 to->vval.v_float = from->vval.v_float; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1175 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1176 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1177 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1178 to->vval.v_job = from->vval.v_job; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1179 if (to->vval.v_job != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1180 ++to->vval.v_job->jv_refcount; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1181 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1182 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1183 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1184 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1185 to->vval.v_channel = from->vval.v_channel; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1186 if (to->vval.v_channel != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1187 ++to->vval.v_channel->ch_refcount; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1188 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1189 #endif |
24606
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
1190 case VAR_INSTR: |
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
1191 to->vval.v_instr = from->vval.v_instr; |
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
1192 break; |
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
1193 |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1194 case VAR_CLASS: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1195 copy_class(from, to); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1196 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1197 |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1198 case VAR_OBJECT: |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1199 copy_object(from, to); |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1200 break; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
1201 |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1202 case VAR_STRING: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1203 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1204 if (from->vval.v_string == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1205 to->vval.v_string = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1206 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1207 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1208 to->vval.v_string = vim_strsave(from->vval.v_string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1209 if (from->v_type == VAR_FUNC) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1210 func_ref(to->vval.v_string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1211 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1212 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1213 case VAR_PARTIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1214 if (from->vval.v_partial == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1215 to->vval.v_partial = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1216 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1217 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1218 to->vval.v_partial = from->vval.v_partial; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1219 ++to->vval.v_partial->pt_refcount; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1220 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1221 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1222 case VAR_BLOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1223 if (from->vval.v_blob == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1224 to->vval.v_blob = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1225 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1226 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1227 to->vval.v_blob = from->vval.v_blob; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1228 ++to->vval.v_blob->bv_refcount; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1229 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1230 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1231 case VAR_LIST: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1232 if (from->vval.v_list == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1233 to->vval.v_list = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1234 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1235 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1236 to->vval.v_list = from->vval.v_list; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1237 ++to->vval.v_list->lv_refcount; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1238 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1239 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1240 case VAR_DICT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1241 if (from->vval.v_dict == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1242 to->vval.v_dict = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1243 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1244 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1245 to->vval.v_dict = from->vval.v_dict; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1246 ++to->vval.v_dict->dv_refcount; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1247 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1248 break; |
24940
0c415a0f54f9
patch 8.2.3007: Vim9: test for void value fails
Bram Moolenaar <Bram@vim.org>
parents:
24936
diff
changeset
|
1249 case VAR_VOID: |
0c415a0f54f9
patch 8.2.3007: Vim9: test for void value fails
Bram Moolenaar <Bram@vim.org>
parents:
24936
diff
changeset
|
1250 emsg(_(e_cannot_use_void_value)); |
0c415a0f54f9
patch 8.2.3007: Vim9: test for void value fails
Bram Moolenaar <Bram@vim.org>
parents:
24936
diff
changeset
|
1251 break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1252 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1253 case VAR_ANY: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1254 internal_error_no_abort("copy_tv(UNKNOWN)"); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1255 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1256 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1257 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1258 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1259 /* |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1260 * Compare "tv1" and "tv2". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1261 * Put the result in "tv1". Caller should clear "tv2". |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1262 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1263 int |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1264 typval_compare( |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1265 typval_T *tv1, // first operand |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1266 typval_T *tv2, // second operand |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1267 exprtype_T type, // operator |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1268 int ic) // ignore case |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1269 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1270 varnumber_T n1, n2; |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1271 int res = 0; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1272 int type_is = type == EXPR_IS || type == EXPR_ISNOT; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1273 |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1274 if (type_is && tv1->v_type != tv2->v_type) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1275 { |
29994
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29525
diff
changeset
|
1276 // For "is" a different type always means FALSE, for "isnot" |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1277 // it means TRUE. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1278 n1 = (type == EXPR_ISNOT); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1279 } |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1280 else if (((tv1->v_type == VAR_SPECIAL && tv1->vval.v_number == VVAL_NULL) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1281 || (tv2->v_type == VAR_SPECIAL |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1282 && tv2->vval.v_number == VVAL_NULL)) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1283 && tv1->v_type != tv2->v_type |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1284 && (type == EXPR_EQUAL || type == EXPR_NEQUAL)) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1285 { |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1286 n1 = typval_compare_null(tv1, tv2); |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1287 if (n1 == MAYBE) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1288 { |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1289 clear_tv(tv1); |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1290 return FAIL; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1291 } |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1292 if (type == EXPR_NEQUAL) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1293 n1 = !n1; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1294 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1295 else if (tv1->v_type == VAR_BLOB || tv2->v_type == VAR_BLOB) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1296 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1297 if (typval_compare_blob(tv1, tv2, type, &res) == FAIL) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1298 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1299 clear_tv(tv1); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1300 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1301 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1302 n1 = res; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1303 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1304 else if (tv1->v_type == VAR_LIST || tv2->v_type == VAR_LIST) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1305 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1306 if (typval_compare_list(tv1, tv2, type, ic, &res) == FAIL) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1307 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1308 clear_tv(tv1); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1309 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1310 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1311 n1 = res; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1312 } |
31604
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1313 else if (tv1->v_type == VAR_CLASS || tv2->v_type == VAR_CLASS) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1314 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1315 if (typval_compare_class(tv1, tv2, type, ic, &res) == FAIL) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1316 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1317 clear_tv(tv1); |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1318 return FAIL; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1319 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1320 n1 = res; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1321 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1322 else if (tv1->v_type == VAR_OBJECT || tv2->v_type == VAR_OBJECT) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1323 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1324 if (typval_compare_object(tv1, tv2, type, ic, &res) == FAIL) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1325 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1326 clear_tv(tv1); |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1327 return FAIL; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1328 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1329 n1 = res; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1330 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1331 else if (tv1->v_type == VAR_DICT || tv2->v_type == VAR_DICT) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1332 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1333 if (typval_compare_dict(tv1, tv2, type, ic, &res) == FAIL) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1334 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1335 clear_tv(tv1); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1336 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1337 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1338 n1 = res; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1339 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1340 else if (tv1->v_type == VAR_FUNC || tv2->v_type == VAR_FUNC |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1341 || tv1->v_type == VAR_PARTIAL || tv2->v_type == VAR_PARTIAL) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1342 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1343 if (typval_compare_func(tv1, tv2, type, ic, &res) == FAIL) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1344 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1345 clear_tv(tv1); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1346 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1347 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1348 n1 = res; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1349 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1350 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1351 // If one of the two variables is a float, compare as a float. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1352 // When using "=~" or "!~", always compare as string. |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1353 else if ((tv1->v_type == VAR_FLOAT || tv2->v_type == VAR_FLOAT) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1354 && type != EXPR_MATCH && type != EXPR_NOMATCH) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1355 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1356 float_T f1, f2; |
26696
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1357 int error = FALSE; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1358 |
26696
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1359 f1 = tv_get_float_chk(tv1, &error); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1360 if (!error) |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1361 f2 = tv_get_float_chk(tv2, &error); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1362 if (error) |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1363 { |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1364 clear_tv(tv1); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1365 return FAIL; |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1366 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1367 n1 = FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1368 switch (type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1369 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1370 case EXPR_IS: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1371 case EXPR_EQUAL: n1 = (f1 == f2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1372 case EXPR_ISNOT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1373 case EXPR_NEQUAL: n1 = (f1 != f2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1374 case EXPR_GREATER: n1 = (f1 > f2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1375 case EXPR_GEQUAL: n1 = (f1 >= f2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1376 case EXPR_SMALLER: n1 = (f1 < f2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1377 case EXPR_SEQUAL: n1 = (f1 <= f2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1378 case EXPR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1379 case EXPR_MATCH: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1380 default: break; // avoid gcc warning |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1381 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1382 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1383 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1384 // If one of the two variables is a number, compare as a number. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1385 // When using "=~" or "!~", always compare as string. |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1386 else if ((tv1->v_type == VAR_NUMBER || tv2->v_type == VAR_NUMBER) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1387 && type != EXPR_MATCH && type != EXPR_NOMATCH) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1388 { |
26696
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1389 int error = FALSE; |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1390 |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1391 n1 = tv_get_number_chk(tv1, &error); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1392 if (!error) |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1393 n2 = tv_get_number_chk(tv2, &error); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1394 if (error) |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1395 { |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1396 clear_tv(tv1); |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1397 return FAIL; |
1cee572f2fd7
patch 8.2.3877: function does not abort after a type error in compare
Bram Moolenaar <Bram@vim.org>
parents:
26644
diff
changeset
|
1398 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1399 switch (type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1400 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1401 case EXPR_IS: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1402 case EXPR_EQUAL: n1 = (n1 == n2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1403 case EXPR_ISNOT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1404 case EXPR_NEQUAL: n1 = (n1 != n2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1405 case EXPR_GREATER: n1 = (n1 > n2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1406 case EXPR_GEQUAL: n1 = (n1 >= n2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1407 case EXPR_SMALLER: n1 = (n1 < n2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1408 case EXPR_SEQUAL: n1 = (n1 <= n2); break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1409 case EXPR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1410 case EXPR_MATCH: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1411 default: break; // avoid gcc warning |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1412 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1413 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1414 else if (in_vim9script() && (tv1->v_type == VAR_BOOL |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1415 || tv2->v_type == VAR_BOOL |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1416 || (tv1->v_type == VAR_SPECIAL |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1417 && tv2->v_type == VAR_SPECIAL))) |
23555
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1418 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1419 if (tv1->v_type != tv2->v_type) |
23555
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1420 { |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1421 semsg(_(e_cannot_compare_str_with_str), |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1422 vartype_name(tv1->v_type), vartype_name(tv2->v_type)); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1423 clear_tv(tv1); |
23555
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1424 return FAIL; |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1425 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1426 n1 = tv1->vval.v_number; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1427 n2 = tv2->vval.v_number; |
23555
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1428 switch (type) |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1429 { |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1430 case EXPR_IS: |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1431 case EXPR_EQUAL: n1 = (n1 == n2); break; |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1432 case EXPR_ISNOT: |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1433 case EXPR_NEQUAL: n1 = (n1 != n2); break; |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1434 default: |
25278
55c85c3a43a0
patch 8.2.3176: Vim9: no type error for comparing number with string
Bram Moolenaar <Bram@vim.org>
parents:
25272
diff
changeset
|
1435 semsg(_(e_invalid_operation_for_str), |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1436 vartype_name(tv1->v_type)); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1437 clear_tv(tv1); |
23555
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1438 return FAIL; |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1439 } |
0f7bb6f706f0
patch 8.2.2320: Vim9: no error for comparing bool with string
Bram Moolenaar <Bram@vim.org>
parents:
23553
diff
changeset
|
1440 } |
28217
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1441 #ifdef FEAT_JOB_CHANNEL |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1442 else if (tv1->v_type == tv2->v_type |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1443 && (tv1->v_type == VAR_CHANNEL || tv1->v_type == VAR_JOB) |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1444 && (type == EXPR_NEQUAL || type == EXPR_EQUAL)) |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1445 { |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1446 if (tv1->v_type == VAR_CHANNEL) |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1447 n1 = tv1->vval.v_channel == tv2->vval.v_channel; |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1448 else |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1449 n1 = tv1->vval.v_job == tv2->vval.v_job; |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1450 if (type == EXPR_NEQUAL) |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1451 n1 = !n1; |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1452 } |
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1453 #endif |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1454 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1455 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1456 if (typval_compare_string(tv1, tv2, type, ic, &res) == FAIL) |
25278
55c85c3a43a0
patch 8.2.3176: Vim9: no type error for comparing number with string
Bram Moolenaar <Bram@vim.org>
parents:
25272
diff
changeset
|
1457 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1458 clear_tv(tv1); |
25278
55c85c3a43a0
patch 8.2.3176: Vim9: no type error for comparing number with string
Bram Moolenaar <Bram@vim.org>
parents:
25272
diff
changeset
|
1459 return FAIL; |
55c85c3a43a0
patch 8.2.3176: Vim9: no type error for comparing number with string
Bram Moolenaar <Bram@vim.org>
parents:
25272
diff
changeset
|
1460 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1461 n1 = res; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1462 } |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1463 clear_tv(tv1); |
21425
a6c316ef161a
patch 8.2.1263: Vim9: comperators use 'ignorecase' in Vim9 script
Bram Moolenaar <Bram@vim.org>
parents:
21120
diff
changeset
|
1464 if (in_vim9script()) |
a6c316ef161a
patch 8.2.1263: Vim9: comperators use 'ignorecase' in Vim9 script
Bram Moolenaar <Bram@vim.org>
parents:
21120
diff
changeset
|
1465 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1466 tv1->v_type = VAR_BOOL; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1467 tv1->vval.v_number = n1 ? VVAL_TRUE : VVAL_FALSE; |
21425
a6c316ef161a
patch 8.2.1263: Vim9: comperators use 'ignorecase' in Vim9 script
Bram Moolenaar <Bram@vim.org>
parents:
21120
diff
changeset
|
1468 } |
a6c316ef161a
patch 8.2.1263: Vim9: comperators use 'ignorecase' in Vim9 script
Bram Moolenaar <Bram@vim.org>
parents:
21120
diff
changeset
|
1469 else |
a6c316ef161a
patch 8.2.1263: Vim9: comperators use 'ignorecase' in Vim9 script
Bram Moolenaar <Bram@vim.org>
parents:
21120
diff
changeset
|
1470 { |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1471 tv1->v_type = VAR_NUMBER; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1472 tv1->vval.v_number = n1; |
21425
a6c316ef161a
patch 8.2.1263: Vim9: comperators use 'ignorecase' in Vim9 script
Bram Moolenaar <Bram@vim.org>
parents:
21120
diff
changeset
|
1473 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1474 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1475 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1476 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1477 |
23788
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1478 /* |
30986
360f286b5869
patch 9.0.0828: various typos
Bram Moolenaar <Bram@vim.org>
parents:
30761
diff
changeset
|
1479 * Compare "tv1" to "tv2" as lists according to "type" and "ic". |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1480 * Put the result, false or true, in "res". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1481 * Return FAIL and give an error message when the comparison can't be done. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1482 */ |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1483 int |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1484 typval_compare_list( |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1485 typval_T *tv1, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1486 typval_T *tv2, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1487 exprtype_T type, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1488 int ic, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1489 int *res) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1490 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1491 int val = 0; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1492 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1493 if (type == EXPR_IS || type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1494 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1495 val = (tv1->v_type == tv2->v_type |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1496 && tv1->vval.v_list == tv2->vval.v_list); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1497 if (type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1498 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1499 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1500 else if (tv1->v_type != tv2->v_type |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1501 || (type != EXPR_EQUAL && type != EXPR_NEQUAL)) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1502 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1503 if (tv1->v_type != tv2->v_type) |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1504 emsg(_(e_can_only_compare_list_with_list)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1505 else |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1506 emsg(_(e_invalid_operation_for_list)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1507 return FAIL; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1508 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1509 else |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1510 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1511 val = list_equal(tv1->vval.v_list, tv2->vval.v_list, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1512 ic, FALSE); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1513 if (type == EXPR_NEQUAL) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1514 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1515 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1516 *res = val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1517 return OK; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1518 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1519 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1520 /* |
28011
d10d5cc8e657
patch 8.2.4530: making comparison with null work changes legacy behavior
Bram Moolenaar <Bram@vim.org>
parents:
27928
diff
changeset
|
1521 * Compare v:null with another type. Return TRUE if the value is NULL. |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1522 */ |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1523 int |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1524 typval_compare_null(typval_T *tv1, typval_T *tv2) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1525 { |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1526 if ((tv1->v_type == VAR_SPECIAL && tv1->vval.v_number == VVAL_NULL) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1527 || (tv2->v_type == VAR_SPECIAL && tv2->vval.v_number == VVAL_NULL)) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1528 { |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1529 typval_T *tv = tv1->v_type == VAR_SPECIAL ? tv2 : tv1; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1530 |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1531 switch (tv->v_type) |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1532 { |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1533 case VAR_BLOB: return tv->vval.v_blob == NULL; |
27926
46c06f741d12
patch 8.2.4488: build error with +eval but without +channel or +job
Bram Moolenaar <Bram@vim.org>
parents:
27924
diff
changeset
|
1534 #ifdef FEAT_JOB_CHANNEL |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1535 case VAR_CHANNEL: return tv->vval.v_channel == NULL; |
27926
46c06f741d12
patch 8.2.4488: build error with +eval but without +channel or +job
Bram Moolenaar <Bram@vim.org>
parents:
27924
diff
changeset
|
1536 #endif |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1537 case VAR_DICT: return tv->vval.v_dict == NULL; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1538 case VAR_FUNC: return tv->vval.v_string == NULL; |
27926
46c06f741d12
patch 8.2.4488: build error with +eval but without +channel or +job
Bram Moolenaar <Bram@vim.org>
parents:
27924
diff
changeset
|
1539 #ifdef FEAT_JOB_CHANNEL |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1540 case VAR_JOB: return tv->vval.v_job == NULL; |
27926
46c06f741d12
patch 8.2.4488: build error with +eval but without +channel or +job
Bram Moolenaar <Bram@vim.org>
parents:
27924
diff
changeset
|
1541 #endif |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1542 case VAR_LIST: return tv->vval.v_list == NULL; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1543 case VAR_PARTIAL: return tv->vval.v_partial == NULL; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1544 case VAR_STRING: return tv->vval.v_string == NULL; |
27928
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1545 |
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1546 case VAR_NUMBER: if (!in_vim9script()) |
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1547 return tv->vval.v_number == 0; |
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1548 break; |
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1549 case VAR_FLOAT: if (!in_vim9script()) |
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1550 return tv->vval.v_float == 0.0; |
ca7a207d83cd
patch 8.2.4489: failing test for comparing v:null with number
Bram Moolenaar <Bram@vim.org>
parents:
27926
diff
changeset
|
1551 break; |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1552 default: break; |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1553 } |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1554 } |
28217
662d2d5db9a6
patch 8.2.4634: Vim9: cannot initialize a variable to null_list
Bram Moolenaar <Bram@vim.org>
parents:
28103
diff
changeset
|
1555 // although comparing null with number, float or bool is not very useful |
28103
1615d305c71d
patch 8.2.4576: Vim9: error for comparing with null can be annoying
Bram Moolenaar <Bram@vim.org>
parents:
28019
diff
changeset
|
1556 // we won't give an error |
1615d305c71d
patch 8.2.4576: Vim9: error for comparing with null can be annoying
Bram Moolenaar <Bram@vim.org>
parents:
28019
diff
changeset
|
1557 return FALSE; |
27924
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1558 } |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1559 |
e6e3abc28c7a
patch 8.2.4487: Vim9: cannot compare with v:null
Bram Moolenaar <Bram@vim.org>
parents:
27034
diff
changeset
|
1560 /* |
30986
360f286b5869
patch 9.0.0828: various typos
Bram Moolenaar <Bram@vim.org>
parents:
30761
diff
changeset
|
1561 * Compare "tv1" to "tv2" as blobs according to "type". |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1562 * Put the result, false or true, in "res". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1563 * Return FAIL and give an error message when the comparison can't be done. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1564 */ |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1565 int |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1566 typval_compare_blob( |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1567 typval_T *tv1, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1568 typval_T *tv2, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1569 exprtype_T type, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1570 int *res) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1571 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1572 int val = 0; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1573 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1574 if (type == EXPR_IS || type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1575 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1576 val = (tv1->v_type == tv2->v_type |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1577 && tv1->vval.v_blob == tv2->vval.v_blob); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1578 if (type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1579 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1580 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1581 else if (tv1->v_type != tv2->v_type |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1582 || (type != EXPR_EQUAL && type != EXPR_NEQUAL)) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1583 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1584 if (tv1->v_type != tv2->v_type) |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
1585 emsg(_(e_can_only_compare_blob_with_blob)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1586 else |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26782
diff
changeset
|
1587 emsg(_(e_invalid_operation_for_blob)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1588 return FAIL; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1589 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1590 else |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1591 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1592 val = blob_equal(tv1->vval.v_blob, tv2->vval.v_blob); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1593 if (type == EXPR_NEQUAL) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1594 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1595 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1596 *res = val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1597 return OK; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1598 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1599 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1600 /* |
31604
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1601 * Compare "tv1" to "tv2" as classes according to "type". |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1602 * Put the result, false or true, in "res". |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1603 * Return FAIL and give an error message when the comparison can't be done. |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1604 */ |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1605 int |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1606 typval_compare_class( |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1607 typval_T *tv1, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1608 typval_T *tv2, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1609 exprtype_T type UNUSED, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1610 int ic UNUSED, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1611 int *res) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1612 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1613 // TODO: use "type" |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1614 *res = tv1->vval.v_class == tv2->vval.v_class; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1615 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1616 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1617 |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1618 /* |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1619 * Compare "tv1" to "tv2" as objects according to "type". |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1620 * Put the result, false or true, in "res". |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1621 * Return FAIL and give an error message when the comparison can't be done. |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1622 */ |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1623 int |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1624 typval_compare_object( |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1625 typval_T *tv1, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1626 typval_T *tv2, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1627 exprtype_T type, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1628 int ic, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1629 int *res) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1630 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1631 int res_match = type == EXPR_EQUAL || type == EXPR_IS ? TRUE : FALSE; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1632 |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1633 if (tv1->vval.v_object == NULL && tv2->vval.v_object == NULL) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1634 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1635 *res = res_match; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1636 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1637 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1638 if (tv1->vval.v_object == NULL || tv2->vval.v_object == NULL) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1639 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1640 *res = !res_match; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1641 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1642 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1643 |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1644 class_T *cl1 = tv1->vval.v_object->obj_class; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1645 class_T *cl2 = tv2->vval.v_object->obj_class; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1646 if (cl1 != cl2 || cl1 == NULL || cl2 == NULL) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1647 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1648 *res = !res_match; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1649 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1650 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1651 |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1652 object_T *obj1 = tv1->vval.v_object; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1653 object_T *obj2 = tv2->vval.v_object; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1654 if (type == EXPR_IS || type == EXPR_ISNOT) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1655 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1656 *res = obj1 == obj2 ? res_match : !res_match; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1657 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1658 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1659 |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1660 for (int i = 0; i < cl1->class_obj_member_count; ++i) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1661 if (!tv_equal((typval_T *)(obj1 + 1) + i, |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1662 (typval_T *)(obj2 + 1) + i, ic, TRUE)) |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1663 { |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1664 *res = !res_match; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1665 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1666 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1667 *res = res_match; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1668 return OK; |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1669 } |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1670 |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
1671 /* |
30986
360f286b5869
patch 9.0.0828: various typos
Bram Moolenaar <Bram@vim.org>
parents:
30761
diff
changeset
|
1672 * Compare "tv1" to "tv2" as dictionaries according to "type" and "ic". |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1673 * Put the result, false or true, in "res". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1674 * Return FAIL and give an error message when the comparison can't be done. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1675 */ |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1676 int |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1677 typval_compare_dict( |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1678 typval_T *tv1, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1679 typval_T *tv2, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1680 exprtype_T type, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1681 int ic, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1682 int *res) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1683 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1684 int val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1685 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1686 if (type == EXPR_IS || type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1687 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1688 val = (tv1->v_type == tv2->v_type |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1689 && tv1->vval.v_dict == tv2->vval.v_dict); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1690 if (type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1691 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1692 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1693 else if (tv1->v_type != tv2->v_type |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1694 || (type != EXPR_EQUAL && type != EXPR_NEQUAL)) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1695 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1696 if (tv1->v_type != tv2->v_type) |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1697 emsg(_(e_can_only_compare_dictionary_with_dictionary)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1698 else |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1699 emsg(_(e_invalid_operation_for_dictionary)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1700 return FAIL; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1701 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1702 else |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1703 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1704 val = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic, FALSE); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1705 if (type == EXPR_NEQUAL) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1706 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1707 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1708 *res = val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1709 return OK; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1710 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1711 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1712 /* |
30986
360f286b5869
patch 9.0.0828: various typos
Bram Moolenaar <Bram@vim.org>
parents:
30761
diff
changeset
|
1713 * Compare "tv1" to "tv2" as funcrefs according to "type" and "ic". |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1714 * Put the result, false or true, in "res". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1715 * Return FAIL and give an error message when the comparison can't be done. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1716 */ |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1717 int |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1718 typval_compare_func( |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1719 typval_T *tv1, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1720 typval_T *tv2, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1721 exprtype_T type, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1722 int ic, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1723 int *res) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1724 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1725 int val = 0; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1726 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1727 if (type != EXPR_EQUAL && type != EXPR_NEQUAL |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1728 && type != EXPR_IS && type != EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1729 { |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
1730 emsg(_(e_invalid_operation_for_funcrefs)); |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1731 return FAIL; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1732 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1733 if ((tv1->v_type == VAR_PARTIAL && tv1->vval.v_partial == NULL) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1734 || (tv2->v_type == VAR_PARTIAL && tv2->vval.v_partial == NULL)) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1735 // When both partials are NULL, then they are equal. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1736 // Otherwise they are not equal. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1737 val = (tv1->vval.v_partial == tv2->vval.v_partial); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1738 else if (type == EXPR_IS || type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1739 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1740 if (tv1->v_type == VAR_FUNC && tv2->v_type == VAR_FUNC) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1741 // strings are considered the same if their value is |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1742 // the same |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1743 val = tv_equal(tv1, tv2, ic, FALSE); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1744 else if (tv1->v_type == VAR_PARTIAL && tv2->v_type == VAR_PARTIAL) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1745 val = (tv1->vval.v_partial == tv2->vval.v_partial); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1746 else |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1747 val = FALSE; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1748 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1749 else |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1750 val = tv_equal(tv1, tv2, ic, FALSE); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1751 if (type == EXPR_NEQUAL || type == EXPR_ISNOT) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1752 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1753 *res = val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1754 return OK; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1755 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1756 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1757 /* |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1758 * Compare "tv1" to "tv2" as strings according to "type" and "ic". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1759 * Put the result, false or true, in "res". |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1760 * Return FAIL and give an error message when the comparison can't be done. |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1761 */ |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1762 int |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1763 typval_compare_string( |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1764 typval_T *tv1, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1765 typval_T *tv2, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1766 exprtype_T type, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1767 int ic, |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1768 int *res) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1769 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1770 int i = 0; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1771 int val = FALSE; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1772 char_u *s1, *s2; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1773 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1774 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1775 if (in_vim9script() |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1776 && ((tv1->v_type != VAR_STRING && tv1->v_type != VAR_SPECIAL) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1777 || (tv2->v_type != VAR_STRING && tv2->v_type != VAR_SPECIAL))) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1778 { |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1779 semsg(_(e_cannot_compare_str_with_str), |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1780 vartype_name(tv1->v_type), vartype_name(tv2->v_type)); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1781 return FAIL; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1782 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1783 s1 = tv_get_string_buf(tv1, buf1); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1784 s2 = tv_get_string_buf(tv2, buf2); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1785 if (type != EXPR_MATCH && type != EXPR_NOMATCH) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1786 i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1787 switch (type) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1788 { |
28019
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1789 case EXPR_IS: if (in_vim9script()) |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1790 { |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1791 // Really check it is the same string, not just |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1792 // the same value. |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1793 val = tv1->vval.v_string == tv2->vval.v_string; |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1794 break; |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1795 } |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1796 // FALLTHROUGH |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1797 case EXPR_EQUAL: val = (i == 0); break; |
28019
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1798 case EXPR_ISNOT: if (in_vim9script()) |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1799 { |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1800 // Really check it is not the same string, not |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1801 // just a different value. |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1802 val = tv1->vval.v_string != tv2->vval.v_string; |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1803 break; |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1804 } |
53e2bf6032e5
patch 8.2.4534: Vim9: "is" operator with empty string and null returns true
Bram Moolenaar <Bram@vim.org>
parents:
28011
diff
changeset
|
1805 // FALLTHROUGH |
26644
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1806 case EXPR_NEQUAL: val = (i != 0); break; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1807 case EXPR_GREATER: val = (i > 0); break; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1808 case EXPR_GEQUAL: val = (i >= 0); break; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1809 case EXPR_SMALLER: val = (i < 0); break; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1810 case EXPR_SEQUAL: val = (i <= 0); break; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1811 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1812 case EXPR_MATCH: |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1813 case EXPR_NOMATCH: |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1814 val = pattern_match(s2, s1, ic); |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1815 if (type == EXPR_NOMATCH) |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1816 val = !val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1817 break; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1818 |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1819 default: break; // avoid gcc warning |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1820 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1821 *res = val; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1822 return OK; |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1823 } |
2fc1e528e0e1
patch 8.2.3851: Vim9: overhead when comparing string, dict or function
Bram Moolenaar <Bram@vim.org>
parents:
26638
diff
changeset
|
1824 /* |
23788
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1825 * Convert any type to a string, never give an error. |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1826 * When "quotes" is TRUE add quotes to a string. |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1827 * Returns an allocated string. |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1828 */ |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1829 char_u * |
23788
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1830 typval_tostring(typval_T *arg, int quotes) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1831 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1832 char_u *tofree; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1833 char_u numbuf[NUMBUFLEN]; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1834 char_u *ret = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1835 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1836 if (arg == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1837 return vim_strsave((char_u *)"(does not exist)"); |
23788
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1838 if (!quotes && arg->v_type == VAR_STRING) |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1839 { |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1840 ret = vim_strsave(arg->vval.v_string == NULL ? (char_u *)"" |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1841 : arg->vval.v_string); |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1842 } |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1843 else |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1844 { |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1845 ret = tv2string(arg, &tofree, numbuf, 0); |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1846 // Make a copy if we have a value but it's not in allocated memory. |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1847 if (ret != NULL && tofree == NULL) |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1848 ret = vim_strsave(ret); |
d12ef361d9de
patch 8.2.2435: setline() gives an error for some types
Bram Moolenaar <Bram@vim.org>
parents:
23786
diff
changeset
|
1849 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1850 return ret; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1851 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1852 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1853 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1854 * Return TRUE if typeval "tv" is locked: Either that value is locked itself |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1855 * or it refers to a List or Dictionary that is locked. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1856 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1857 int |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1858 tv_islocked(typval_T *tv) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1859 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1860 return (tv->v_lock & VAR_LOCKED) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1861 || (tv->v_type == VAR_LIST |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1862 && tv->vval.v_list != NULL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1863 && (tv->vval.v_list->lv_lock & VAR_LOCKED)) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1864 || (tv->v_type == VAR_DICT |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1865 && tv->vval.v_dict != NULL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1866 && (tv->vval.v_dict->dv_lock & VAR_LOCKED)); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1867 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1868 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1869 static int |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1870 func_equal( |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1871 typval_T *tv1, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1872 typval_T *tv2, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1873 int ic) // ignore case |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1874 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1875 char_u *s1, *s2; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1876 dict_T *d1, *d2; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1877 int a1, a2; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1878 int i; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1879 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1880 // empty and NULL function name considered the same |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1881 s1 = tv1->v_type == VAR_FUNC ? tv1->vval.v_string |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1882 : partial_name(tv1->vval.v_partial); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1883 if (s1 != NULL && *s1 == NUL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1884 s1 = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1885 s2 = tv2->v_type == VAR_FUNC ? tv2->vval.v_string |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1886 : partial_name(tv2->vval.v_partial); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1887 if (s2 != NULL && *s2 == NUL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1888 s2 = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1889 if (s1 == NULL || s2 == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1890 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1891 if (s1 != s2) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1892 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1893 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1894 else if (STRCMP(s1, s2) != 0) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1895 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1896 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1897 // empty dict and NULL dict is different |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1898 d1 = tv1->v_type == VAR_FUNC ? NULL : tv1->vval.v_partial->pt_dict; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1899 d2 = tv2->v_type == VAR_FUNC ? NULL : tv2->vval.v_partial->pt_dict; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1900 if (d1 == NULL || d2 == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1901 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1902 if (d1 != d2) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1903 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1904 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1905 else if (!dict_equal(d1, d2, ic, TRUE)) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1906 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1907 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1908 // empty list and no list considered the same |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1909 a1 = tv1->v_type == VAR_FUNC ? 0 : tv1->vval.v_partial->pt_argc; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1910 a2 = tv2->v_type == VAR_FUNC ? 0 : tv2->vval.v_partial->pt_argc; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1911 if (a1 != a2) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1912 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1913 for (i = 0; i < a1; ++i) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1914 if (!tv_equal(tv1->vval.v_partial->pt_argv + i, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1915 tv2->vval.v_partial->pt_argv + i, ic, TRUE)) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1916 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1917 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1918 return TRUE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1919 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1920 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1921 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1922 * Return TRUE if "tv1" and "tv2" have the same value. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1923 * Compares the items just like "==" would compare them, but strings and |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1924 * numbers are different. Floats and numbers are also different. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1925 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1926 int |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1927 tv_equal( |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1928 typval_T *tv1, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1929 typval_T *tv2, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1930 int ic, // ignore case |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1931 int recursive) // TRUE when used recursively |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1932 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1933 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1934 char_u *s1, *s2; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1935 static int recursive_cnt = 0; // catch recursive loops |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1936 int r; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1937 static int tv_equal_recurse_limit; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1938 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1939 // Catch lists and dicts that have an endless loop by limiting |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1940 // recursiveness to a limit. We guess they are equal then. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1941 // A fixed limit has the problem of still taking an awful long time. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1942 // Reduce the limit every time running into it. That should work fine for |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1943 // deeply linked structures that are not recursively linked and catch |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1944 // recursiveness quickly. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1945 if (!recursive) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1946 tv_equal_recurse_limit = 1000; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1947 if (recursive_cnt >= tv_equal_recurse_limit) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1948 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1949 --tv_equal_recurse_limit; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1950 return TRUE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1951 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1952 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1953 // For VAR_FUNC and VAR_PARTIAL compare the function name, bound dict and |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1954 // arguments. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1955 if ((tv1->v_type == VAR_FUNC |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1956 || (tv1->v_type == VAR_PARTIAL && tv1->vval.v_partial != NULL)) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1957 && (tv2->v_type == VAR_FUNC |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1958 || (tv2->v_type == VAR_PARTIAL && tv2->vval.v_partial != NULL))) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1959 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1960 ++recursive_cnt; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1961 r = func_equal(tv1, tv2, ic); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1962 --recursive_cnt; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1963 return r; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1964 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1965 |
23909
5db7d275543c
patch 8.2.2497: no error when using more than one character for a register
Bram Moolenaar <Bram@vim.org>
parents:
23788
diff
changeset
|
1966 if (tv1->v_type != tv2->v_type |
5db7d275543c
patch 8.2.2497: no error when using more than one character for a register
Bram Moolenaar <Bram@vim.org>
parents:
23788
diff
changeset
|
1967 && ((tv1->v_type != VAR_BOOL && tv1->v_type != VAR_SPECIAL) |
5db7d275543c
patch 8.2.2497: no error when using more than one character for a register
Bram Moolenaar <Bram@vim.org>
parents:
23788
diff
changeset
|
1968 || (tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL))) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1969 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1970 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1971 switch (tv1->v_type) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1972 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1973 case VAR_LIST: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1974 ++recursive_cnt; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1975 r = list_equal(tv1->vval.v_list, tv2->vval.v_list, ic, TRUE); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1976 --recursive_cnt; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1977 return r; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1978 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1979 case VAR_DICT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1980 ++recursive_cnt; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1981 r = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic, TRUE); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1982 --recursive_cnt; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1983 return r; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1984 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1985 case VAR_BLOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1986 return blob_equal(tv1->vval.v_blob, tv2->vval.v_blob); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1987 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1988 case VAR_NUMBER: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1989 case VAR_BOOL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1990 case VAR_SPECIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1991 return tv1->vval.v_number == tv2->vval.v_number; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1992 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1993 case VAR_STRING: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1994 s1 = tv_get_string_buf(tv1, buf1); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1995 s2 = tv_get_string_buf(tv2, buf2); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1996 return ((ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2)) == 0); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1997 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1998 case VAR_FLOAT: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1999 return tv1->vval.v_float == tv2->vval.v_float; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2000 case VAR_JOB: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2001 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2002 return tv1->vval.v_job == tv2->vval.v_job; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2003 #endif |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2004 case VAR_CHANNEL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2005 #ifdef FEAT_JOB_CHANNEL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2006 return tv1->vval.v_channel == tv2->vval.v_channel; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2007 #endif |
24606
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
2008 case VAR_INSTR: |
a4fda40e0bb9
patch 8.2.2842: Vim9: skip argument to searchpair() is not compiled
Bram Moolenaar <Bram@vim.org>
parents:
24424
diff
changeset
|
2009 return tv1->vval.v_instr == tv2->vval.v_instr; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2010 |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
2011 case VAR_CLASS: |
31604
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
2012 // A class only exists once, equality is identity. |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
2013 return tv1->vval.v_class == tv2->vval.v_class; |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
2014 |
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
2015 case VAR_OBJECT: |
31604
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
2016 (void)typval_compare_object(tv1, tv2, EXPR_EQUAL, ic, &r); |
9b13b3a63bc0
patch 9.0.1134: comparing objects uses identity instead of equality
Bram Moolenaar <Bram@vim.org>
parents:
31525
diff
changeset
|
2017 return r; |
31396
307f68a41b03
patch 9.0.1031: Vim9 class is not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
31289
diff
changeset
|
2018 |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2019 case VAR_PARTIAL: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2020 return tv1->vval.v_partial == tv2->vval.v_partial; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2021 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2022 case VAR_FUNC: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2023 return tv1->vval.v_string == tv2->vval.v_string; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2024 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2025 case VAR_UNKNOWN: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2026 case VAR_ANY: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2027 case VAR_VOID: |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2028 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2029 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2030 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2031 // VAR_UNKNOWN can be the result of a invalid expression, let's say it |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2032 // does not equal anything, not even itself. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2033 return FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2034 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2035 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2036 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2037 * Get an option value. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2038 * "arg" points to the '&' or '+' before the option name. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2039 * "arg" is advanced to character after the option name. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2040 * Return OK or FAIL. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2041 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2042 int |
21120
4d844a65183d
patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents:
20925
diff
changeset
|
2043 eval_option( |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2044 char_u **arg, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2045 typval_T *rettv, // when NULL, only check if option exists |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2046 int evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2047 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2048 char_u *option_end; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2049 long numval; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2050 char_u *stringval; |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2051 getoption_T opt_type; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2052 int c; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2053 int working = (**arg == '+'); // has("+option") |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2054 int ret = OK; |
26441
65ab0b035dd8
patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents:
26342
diff
changeset
|
2055 int scope; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2056 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2057 // Isolate the option name and find its value. |
26441
65ab0b035dd8
patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents:
26342
diff
changeset
|
2058 option_end = find_option_end(arg, &scope); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2059 if (option_end == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2060 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2061 if (rettv != NULL) |
26602
fac6673086df
patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26585
diff
changeset
|
2062 semsg(_(e_option_name_missing_str), *arg); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2063 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2064 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2065 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2066 if (!evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2067 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2068 *arg = option_end; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2069 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2070 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2071 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2072 c = *option_end; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2073 *option_end = NUL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2074 opt_type = get_option_value(*arg, &numval, |
26441
65ab0b035dd8
patch 8.2.3751: cannot assign a lambda to an option that takes a function
Bram Moolenaar <Bram@vim.org>
parents:
26342
diff
changeset
|
2075 rettv == NULL ? NULL : &stringval, NULL, scope); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2076 |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2077 if (opt_type == gov_unknown) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2078 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2079 if (rettv != NULL) |
26602
fac6673086df
patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26585
diff
changeset
|
2080 semsg(_(e_unknown_option_str), *arg); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2081 ret = FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2082 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2083 else if (rettv != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2084 { |
23519
cb66613dd9d5
patch 8.2.2302: Vim9: using an option value may use uninitialized memory
Bram Moolenaar <Bram@vim.org>
parents:
23422
diff
changeset
|
2085 rettv->v_lock = 0; |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2086 if (opt_type == gov_hidden_string) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2087 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2088 rettv->v_type = VAR_STRING; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2089 rettv->vval.v_string = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2090 } |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2091 else if (opt_type == gov_hidden_bool || opt_type == gov_hidden_number) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2092 { |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2093 rettv->v_type = in_vim9script() && opt_type == gov_hidden_bool |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2094 ? VAR_BOOL : VAR_NUMBER; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2095 rettv->vval.v_number = 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2096 } |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2097 else if (opt_type == gov_bool || opt_type == gov_number) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2098 { |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2099 if (in_vim9script() && opt_type == gov_bool) |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2100 { |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2101 rettv->v_type = VAR_BOOL; |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2102 rettv->vval.v_number = numval ? VVAL_TRUE : VVAL_FALSE; |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2103 } |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2104 else |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2105 { |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2106 rettv->v_type = VAR_NUMBER; |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2107 rettv->vval.v_number = numval; |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2108 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2109 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2110 else // string option |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2111 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2112 rettv->v_type = VAR_STRING; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2113 rettv->vval.v_string = stringval; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2114 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2115 } |
23422
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2116 else if (working && (opt_type == gov_hidden_bool |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2117 || opt_type == gov_hidden_number |
bb0c53f4ef8b
patch 8.2.2254: Vim9: bool option type is number
Bram Moolenaar <Bram@vim.org>
parents:
23276
diff
changeset
|
2118 || opt_type == gov_hidden_string)) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2119 ret = FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2120 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2121 *option_end = c; // put back for error messages |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2122 *arg = option_end; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2123 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2124 return ret; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2125 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2126 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2127 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2128 * Allocate a variable for a number constant. Also deals with "0z" for blob. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2129 * Return OK or FAIL. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2130 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2131 int |
21120
4d844a65183d
patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents:
20925
diff
changeset
|
2132 eval_number( |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2133 char_u **arg, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2134 typval_T *rettv, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2135 int evaluate, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2136 int want_string UNUSED) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2137 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2138 int len; |
25622
15b54e0a576b
patch 8.2.3347: check for legacy script is incomplete
Bram Moolenaar <Bram@vim.org>
parents:
25585
diff
changeset
|
2139 int skip_quotes = !in_old_script(4); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2140 char_u *p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2141 int get_float = FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2142 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2143 // We accept a float when the format matches |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2144 // "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?". This is very |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2145 // strict to avoid backwards compatibility problems. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2146 // With script version 2 and later the leading digit can be |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2147 // omitted. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2148 // Don't look for a float after the "." operator, so that |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2149 // ":let vers = 1.2.3" doesn't fail. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2150 if (**arg == '.') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2151 p = *arg; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2152 else |
25557
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2153 { |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2154 p = *arg + 1; |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2155 if (skip_quotes) |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2156 for (;;) |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2157 { |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2158 if (*p == '\'') |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2159 ++p; |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2160 if (!vim_isdigit(*p)) |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2161 break; |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2162 p = skipdigits(p); |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2163 } |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2164 else |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2165 p = skipdigits(p); |
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2166 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2167 if (!want_string && p[0] == '.' && vim_isdigit(p[1])) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2168 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2169 get_float = TRUE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2170 p = skipdigits(p + 2); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2171 if (*p == 'e' || *p == 'E') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2172 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2173 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2174 if (*p == '-' || *p == '+') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2175 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2176 if (!vim_isdigit(*p)) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2177 get_float = FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2178 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2179 p = skipdigits(p + 1); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2180 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2181 if (ASCII_ISALPHA(*p) || *p == '.') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2182 get_float = FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2183 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2184 if (get_float) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2185 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2186 float_T f; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2187 |
25557
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2188 *arg += string2float(*arg, &f, skip_quotes); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2189 if (evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2190 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2191 rettv->v_type = VAR_FLOAT; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2192 rettv->vval.v_float = f; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2193 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2194 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2195 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2196 if (**arg == '0' && ((*arg)[1] == 'z' || (*arg)[1] == 'Z')) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2197 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2198 char_u *bp; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2199 blob_T *blob = NULL; // init for gcc |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2200 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2201 // Blob constant: 0z0123456789abcdef |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2202 if (evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2203 blob = blob_alloc(); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2204 for (bp = *arg + 2; vim_isxdigit(bp[0]); bp += 2) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2205 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2206 if (!vim_isxdigit(bp[1])) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2207 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2208 if (blob != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2209 { |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26962
diff
changeset
|
2210 emsg(_(e_blob_literal_should_have_an_even_number_of_hex_characters)); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2211 ga_clear(&blob->bv_ga); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2212 VIM_CLEAR(blob); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2213 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2214 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2215 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2216 if (blob != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2217 ga_append(&blob->bv_ga, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2218 (hex2nr(*bp) << 4) + hex2nr(*(bp+1))); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2219 if (bp[2] == '.' && vim_isxdigit(bp[3])) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2220 ++bp; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2221 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2222 if (blob != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2223 rettv_blob_set(rettv, blob); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2224 *arg = bp; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2225 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2226 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2227 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2228 varnumber_T n; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2229 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2230 // decimal, hex or octal number |
25557
763ea8f075db
patch 8.2.3315: cannot use single quote in a float number for readability
Bram Moolenaar <Bram@vim.org>
parents:
25443
diff
changeset
|
2231 vim_str2nr(*arg, NULL, &len, skip_quotes |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2232 ? STR2NR_NO_OCT + STR2NR_QUOTE |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2233 : STR2NR_ALL, &n, NULL, 0, TRUE); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2234 if (len == 0) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2235 { |
26342
936f77929f16
patch 8.2.3702: first key in dict is seen as curly expression and fails
Bram Moolenaar <Bram@vim.org>
parents:
25806
diff
changeset
|
2236 if (evaluate) |
936f77929f16
patch 8.2.3702: first key in dict is seen as curly expression and fails
Bram Moolenaar <Bram@vim.org>
parents:
25806
diff
changeset
|
2237 semsg(_(e_invalid_expression_str), *arg); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2238 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2239 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2240 *arg += len; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2241 if (evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2242 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2243 rettv->v_type = VAR_NUMBER; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2244 rettv->vval.v_number = n; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2245 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2246 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2247 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2248 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2249 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2250 /* |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2251 * Evaluate a string constant and put the result in "rettv". |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2252 * "*arg" points to the double quote or to after it when "interpolate" is TRUE. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2253 * When "interpolate" is TRUE reduce "{{" to "{", reduce "}}" to "}" and stop |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2254 * at a single "{". |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2255 * Return OK or FAIL. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2256 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2257 int |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2258 eval_string(char_u **arg, typval_T *rettv, int evaluate, int interpolate) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2259 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2260 char_u *p; |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2261 char_u *end; |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2262 int extra = interpolate ? 1 : 0; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2263 int off = interpolate ? 0 : 1; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2264 int len; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2265 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2266 // Find the end of the string, skipping backslashed characters. |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2267 for (p = *arg + off; *p != NUL && *p != '"'; MB_PTR_ADV(p)) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2268 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2269 if (*p == '\\' && p[1] != NUL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2270 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2271 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2272 // A "\<x>" form occupies at least 4 characters, and produces up |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28217
diff
changeset
|
2273 // to 9 characters (6 for the char and 3 for a modifier): |
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28217
diff
changeset
|
2274 // reserve space for 5 extra. |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2275 if (*p == '<') |
29525
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2276 { |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2277 int modifiers = 0; |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2278 int flags = FSK_KEYCODE | FSK_IN_STRING; |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2279 |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28217
diff
changeset
|
2280 extra += 5; |
29525
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2281 |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2282 // Skip to the '>' to avoid using '{' inside for string |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2283 // interpolation. |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2284 if (p[1] != '*') |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2285 flags |= FSK_SIMPLIFY; |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2286 if (find_special_key(&p, &modifiers, flags, NULL) != 0) |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2287 --p; // leave "p" on the ">" |
5063dfe96a59
patch 9.0.0104: going beyond allocated memory when evaluating string constant
Bram Moolenaar <Bram@vim.org>
parents:
28821
diff
changeset
|
2288 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2289 } |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2290 else if (interpolate && (*p == '{' || *p == '}')) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2291 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2292 if (*p == '{' && p[1] != '{') // start of expression |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2293 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2294 ++p; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2295 if (p[-1] == '}' && *p != '}') // single '}' is an error |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2296 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2297 semsg(_(e_stray_closing_curly_str), *arg); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2298 return FAIL; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2299 } |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2300 --extra; // "{{" becomes "{", "}}" becomes "}" |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2301 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2302 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2303 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2304 if (*p != '"' && !(interpolate && *p == '{')) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2305 { |
26602
fac6673086df
patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26585
diff
changeset
|
2306 semsg(_(e_missing_double_quote_str), *arg); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2307 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2308 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2309 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2310 // If only parsing, set *arg and return here |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2311 if (!evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2312 { |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2313 *arg = p + off; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2314 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2315 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2316 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2317 // Copy the string into allocated memory, handling backslashed |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2318 // characters. |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2319 rettv->v_type = VAR_STRING; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2320 len = (int)(p - *arg + extra); |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2321 rettv->vval.v_string = alloc(len); |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2322 if (rettv->vval.v_string == NULL) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2323 return FAIL; |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2324 end = rettv->vval.v_string; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2325 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2326 for (p = *arg + off; *p != NUL && *p != '"'; ) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2327 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2328 if (*p == '\\') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2329 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2330 switch (*++p) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2331 { |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2332 case 'b': *end++ = BS; ++p; break; |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2333 case 'e': *end++ = ESC; ++p; break; |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2334 case 'f': *end++ = FF; ++p; break; |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2335 case 'n': *end++ = NL; ++p; break; |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2336 case 'r': *end++ = CAR; ++p; break; |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2337 case 't': *end++ = TAB; ++p; break; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2338 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2339 case 'X': // hex: "\x1", "\x12" |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2340 case 'x': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2341 case 'u': // Unicode: "\u0023" |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2342 case 'U': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2343 if (vim_isxdigit(p[1])) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2344 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2345 int n, nr; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2346 int c = toupper(*p); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2347 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2348 if (c == 'X') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2349 n = 2; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2350 else if (*p == 'u') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2351 n = 4; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2352 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2353 n = 8; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2354 nr = 0; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2355 while (--n >= 0 && vim_isxdigit(p[1])) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2356 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2357 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2358 nr = (nr << 4) + hex2nr(*p); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2359 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2360 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2361 // For "\u" store the number according to |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2362 // 'encoding'. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2363 if (c != 'X') |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2364 end += (*mb_char2bytes)(nr, end); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2365 else |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2366 *end++ = nr; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2367 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2368 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2369 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2370 // octal: "\1", "\12", "\123" |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2371 case '0': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2372 case '1': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2373 case '2': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2374 case '3': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2375 case '4': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2376 case '5': |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2377 case '6': |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2378 case '7': *end = *p++ - '0'; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2379 if (*p >= '0' && *p <= '7') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2380 { |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2381 *end = (*end << 3) + *p++ - '0'; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2382 if (*p >= '0' && *p <= '7') |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2383 *end = (*end << 3) + *p++ - '0'; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2384 } |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2385 ++end; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2386 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2387 |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
2388 // Special key, e.g.: "\<C-W>" |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2389 case '<': |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2390 { |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2391 int flags = FSK_KEYCODE | FSK_IN_STRING; |
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2392 |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
2393 if (p[1] != '*') |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2394 flags |= FSK_SIMPLIFY; |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28217
diff
changeset
|
2395 extra = trans_special(&p, end, flags, FALSE, NULL); |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2396 if (extra != 0) |
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2397 { |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2398 end += extra; |
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2399 if (end >= rettv->vval.v_string + len) |
21120
4d844a65183d
patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents:
20925
diff
changeset
|
2400 iemsg("eval_string() used more space than allocated"); |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2401 break; |
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20587
diff
changeset
|
2402 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2403 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2404 // FALLTHROUGH |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2405 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2406 default: MB_COPY_CHAR(p, end); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2407 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2408 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2409 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2410 else |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2411 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2412 if (interpolate && (*p == '{' || *p == '}')) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2413 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2414 if (*p == '{' && p[1] != '{') // start of expression |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2415 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2416 ++p; // reduce "{{" to "{" and "}}" to "}" |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2417 } |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2418 MB_COPY_CHAR(p, end); |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2419 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2420 } |
20925
0aeac2b45846
patch 8.2.1014: using "name" for a string result is confusing
Bram Moolenaar <Bram@vim.org>
parents:
20627
diff
changeset
|
2421 *end = NUL; |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2422 if (*p == '"' && !interpolate) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2423 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2424 *arg = p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2425 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2426 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2427 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2428 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2429 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2430 * Allocate a variable for a 'str''ing' constant. |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2431 * When "interpolate" is TRUE reduce "{{" to "{" and stop at a single "{". |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2432 * Return OK when a "rettv" was set to the string. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2433 * Return FAIL on error, "rettv" is not set. |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2434 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2435 int |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2436 eval_lit_string(char_u **arg, typval_T *rettv, int evaluate, int interpolate) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2437 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2438 char_u *p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2439 char_u *str; |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2440 int reduce = interpolate ? -1 : 0; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2441 int off = interpolate ? 0 : 1; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2442 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2443 // Find the end of the string, skipping ''. |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2444 for (p = *arg + off; *p != NUL; MB_PTR_ADV(p)) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2445 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2446 if (*p == '\'') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2447 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2448 if (p[1] != '\'') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2449 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2450 ++reduce; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2451 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2452 } |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2453 else if (interpolate) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2454 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2455 if (*p == '{') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2456 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2457 if (p[1] != '{') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2458 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2459 ++p; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2460 ++reduce; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2461 } |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2462 else if (*p == '}') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2463 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2464 ++p; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2465 if (*p != '}') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2466 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2467 semsg(_(e_stray_closing_curly_str), *arg); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2468 return FAIL; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2469 } |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2470 ++reduce; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2471 } |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2472 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2473 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2474 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2475 if (*p != '\'' && !(interpolate && *p == '{')) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2476 { |
26602
fac6673086df
patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26585
diff
changeset
|
2477 semsg(_(e_missing_single_quote_str), *arg); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2478 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2479 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2480 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2481 // If only parsing return after setting "*arg" |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2482 if (!evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2483 { |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2484 *arg = p + off; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2485 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2486 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2487 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2488 // Copy the string into allocated memory, handling '' to ' reduction and |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2489 // any expressions. |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2490 str = alloc((p - *arg) - reduce); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2491 if (str == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2492 return FAIL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2493 rettv->v_type = VAR_STRING; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2494 rettv->vval.v_string = str; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2495 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2496 for (p = *arg + off; *p != NUL; ) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2497 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2498 if (*p == '\'') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2499 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2500 if (p[1] != '\'') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2501 break; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2502 ++p; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2503 } |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2504 else if (interpolate && (*p == '{' || *p == '}')) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2505 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2506 if (*p == '{' && p[1] != '{') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2507 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2508 ++p; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2509 } |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2510 MB_COPY_CHAR(p, str); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2511 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2512 *str = NUL; |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2513 *arg = p + off; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2514 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2515 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2516 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2517 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2518 /* |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2519 * Evaluate a single or double quoted string possibly containing expressions. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2520 * "arg" points to the '$'. The result is put in "rettv". |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2521 * Returns OK or FAIL. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2522 */ |
28718
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2523 int |
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2524 eval_interp_string(char_u **arg, typval_T *rettv, int evaluate) |
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2525 { |
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2526 typval_T tv; |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2527 int ret = OK; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2528 int quote; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2529 garray_T ga; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2530 char_u *p; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2531 |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2532 ga_init2(&ga, 1, 80); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2533 |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2534 // *arg is on the '$' character, move it to the first string character. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2535 ++*arg; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2536 quote = **arg; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2537 ++*arg; |
28718
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2538 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2539 for (;;) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2540 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2541 // Get the string up to the matching quote or to a single '{'. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2542 // "arg" is advanced to either the quote or the '{'. |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2543 if (quote == '"') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2544 ret = eval_string(arg, &tv, evaluate, TRUE); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2545 else |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2546 ret = eval_lit_string(arg, &tv, evaluate, TRUE); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2547 if (ret == FAIL) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2548 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2549 if (evaluate) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2550 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2551 ga_concat(&ga, tv.vval.v_string); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2552 clear_tv(&tv); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2553 } |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2554 |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2555 if (**arg != '{') |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2556 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2557 // found terminating quote |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2558 ++*arg; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2559 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2560 } |
28821
006d525419fa
patch 8.2.4934: string interpolation fails when not evaluating
Bram Moolenaar <Bram@vim.org>
parents:
28813
diff
changeset
|
2561 p = eval_one_expr_in_str(*arg, &ga, evaluate); |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2562 if (p == NULL) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2563 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2564 ret = FAIL; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2565 break; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2566 } |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2567 *arg = p; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2568 } |
28718
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2569 |
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2570 rettv->v_type = VAR_STRING; |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2571 if (ret == FAIL || !evaluate || ga_append(&ga, NUL) == FAIL) |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2572 { |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2573 ga_clear(&ga); |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2574 rettv->vval.v_string = NULL; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2575 return ret; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2576 } |
28718
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2577 |
28813
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2578 rettv->vval.v_string = ga.ga_data; |
3626ca6a20ea
patch 8.2.4930: interpolated string expression requires escaping
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2579 return OK; |
28718
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2580 } |
723c7d940cba
patch 8.2.4883: string interpolation only works in heredoc
Bram Moolenaar <Bram@vim.org>
parents:
28674
diff
changeset
|
2581 |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2582 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2583 * Return a string with the string representation of a variable. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2584 * If the memory is allocated "tofree" is set to it, otherwise NULL. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2585 * "numbuf" is used for a number. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2586 * Puts quotes around strings, so that they can be parsed back by eval(). |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2587 * May return NULL. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2588 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2589 char_u * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2590 tv2string( |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2591 typval_T *tv, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2592 char_u **tofree, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2593 char_u *numbuf, |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2594 int copyID) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2595 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2596 return echo_string_core(tv, tofree, numbuf, copyID, FALSE, TRUE, FALSE); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2597 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2598 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2599 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2600 * Get the value of an environment variable. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2601 * "arg" is pointing to the '$'. It is advanced to after the name. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2602 * If the environment variable was not set, silently assume it is empty. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2603 * Return FAIL if the name is invalid. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2604 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2605 int |
21120
4d844a65183d
patch 8.2.1111: inconsistent naming of get_list_tv() and eval_dict()
Bram Moolenaar <Bram@vim.org>
parents:
20925
diff
changeset
|
2606 eval_env_var(char_u **arg, typval_T *rettv, int evaluate) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2607 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2608 char_u *string = NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2609 int len; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2610 int cc; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2611 char_u *name; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2612 int mustfree = FALSE; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2613 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2614 ++*arg; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2615 name = *arg; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2616 len = get_env_len(arg); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2617 if (evaluate) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2618 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2619 if (len == 0) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2620 return FAIL; // invalid empty name |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2621 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2622 cc = name[len]; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2623 name[len] = NUL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2624 // first try vim_getenv(), fast for normal environment vars |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2625 string = vim_getenv(name, &mustfree); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2626 if (string != NULL && *string != NUL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2627 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2628 if (!mustfree) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2629 string = vim_strsave(string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2630 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2631 else |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2632 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2633 if (mustfree) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2634 vim_free(string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2635 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2636 // next try expanding things like $VIM and ${HOME} |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2637 string = expand_env_save(name - 1); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2638 if (string != NULL && *string == '$') |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2639 VIM_CLEAR(string); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2640 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2641 name[len] = cc; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2642 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2643 rettv->v_type = VAR_STRING; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2644 rettv->vval.v_string = string; |
25585
10edc624b171
patch 8.2.3329: v_lock not set when getting value of environment variable
Bram Moolenaar <Bram@vim.org>
parents:
25563
diff
changeset
|
2645 rettv->v_lock = 0; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2646 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2647 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2648 return OK; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2649 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2650 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2651 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2652 * Get the lnum from the first argument. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2653 * Also accepts ".", "$", etc., but that only works for the current buffer. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2654 * Returns -1 on error. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2655 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2656 linenr_T |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2657 tv_get_lnum(typval_T *argvars) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2658 { |
23276
b79cdad3ea2e
patch 8.2.2184: Vim9: no error when using "2" for a line number
Bram Moolenaar <Bram@vim.org>
parents:
23175
diff
changeset
|
2659 linenr_T lnum = -1; |
30761
c9b31c8eb3b3
patch 9.0.0715: wrong argument for append() gives two error messages
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2660 int did_emsg_before = did_emsg; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2661 |
21831
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
2662 if (argvars[0].v_type != VAR_STRING || !in_vim9script()) |
d8422de73113
patch 8.2.1465: Vim9: subscript not handled properly
Bram Moolenaar <Bram@vim.org>
parents:
21425
diff
changeset
|
2663 lnum = (linenr_T)tv_get_number_chk(&argvars[0], NULL); |
30761
c9b31c8eb3b3
patch 9.0.0715: wrong argument for append() gives two error messages
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2664 if (lnum <= 0 && did_emsg_before == did_emsg |
c9b31c8eb3b3
patch 9.0.0715: wrong argument for append() gives two error messages
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2665 && argvars[0].v_type != VAR_NUMBER) |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2666 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2667 int fnum; |
26782
b7b82279426f
patch 8.2.3919: Vim9: wrong argument for append() results in two errors
Bram Moolenaar <Bram@vim.org>
parents:
26731
diff
changeset
|
2668 pos_T *fp; |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2669 |
24260
ad065f64eb20
patch 8.2.2671: error for line number in legacy script
Bram Moolenaar <Bram@vim.org>
parents:
24258
diff
changeset
|
2670 // no valid number, try using arg like line() |
26782
b7b82279426f
patch 8.2.3919: Vim9: wrong argument for append() results in two errors
Bram Moolenaar <Bram@vim.org>
parents:
26731
diff
changeset
|
2671 fp = var2fpos(&argvars[0], TRUE, &fnum, FALSE); |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2672 if (fp != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2673 lnum = fp->lnum; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2674 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2675 return lnum; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2676 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2677 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2678 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2679 * Get the lnum from the first argument. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2680 * Also accepts "$", then "buf" is used. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2681 * Returns 0 on error. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2682 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2683 linenr_T |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2684 tv_get_lnum_buf(typval_T *argvars, buf_T *buf) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2685 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2686 if (argvars[0].v_type == VAR_STRING |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2687 && argvars[0].vval.v_string != NULL |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2688 && argvars[0].vval.v_string[0] == '$' |
26782
b7b82279426f
patch 8.2.3919: Vim9: wrong argument for append() results in two errors
Bram Moolenaar <Bram@vim.org>
parents:
26731
diff
changeset
|
2689 && argvars[0].vval.v_string[1] == NUL |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2690 && buf != NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2691 return buf->b_ml.ml_line_count; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2692 return (linenr_T)tv_get_number_chk(&argvars[0], NULL); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2693 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2694 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2695 /* |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2696 * Get buffer by number or pattern. |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2697 */ |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2698 buf_T * |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2699 tv_get_buf(typval_T *tv, int curtab_only) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2700 { |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2701 char_u *name = tv->vval.v_string; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2702 buf_T *buf; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2703 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2704 if (tv->v_type == VAR_NUMBER) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2705 return buflist_findnr((int)tv->vval.v_number); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2706 if (tv->v_type != VAR_STRING) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2707 return NULL; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2708 if (name == NULL || *name == NUL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2709 return curbuf; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2710 if (name[0] == '$' && name[1] == NUL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2711 return lastbuf; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2712 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2713 buf = buflist_find_by_name(name, curtab_only); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2714 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2715 // If not found, try expanding the name, like done for bufexists(). |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2716 if (buf == NULL) |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2717 buf = find_buffer(tv); |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2718 |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2719 return buf; |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2720 } |
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2721 |
22025
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2722 /* |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2723 * Like tv_get_buf() but give an error message is the type is wrong. |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2724 */ |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2725 buf_T * |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2726 tv_get_buf_from_arg(typval_T *tv) |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2727 { |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2728 buf_T *buf; |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2729 |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2730 ++emsg_off; |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2731 buf = tv_get_buf(tv, FALSE); |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2732 --emsg_off; |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2733 if (buf == NULL |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2734 && tv->v_type != VAR_NUMBER |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2735 && tv->v_type != VAR_STRING) |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2736 // issue errmsg for type error |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2737 (void)tv_get_number(tv); |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2738 return buf; |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2739 } |
71f886a48ef5
patch 8.2.1562: Vim9: error when using "%" where a buffer is expected
Bram Moolenaar <Bram@vim.org>
parents:
21913
diff
changeset
|
2740 |
20587
f502455965c0
patch 8.2.0847: typval related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2741 #endif // FEAT_EVAL |