annotate src/blob.c @ 30566:b3de17181c19 v9.0.0618

patch 9.0.0618: calling function for reduce() has too much overhead Commit: https://github.com/vim/vim/commit/82418263fa91792e851cb0de879d1595327d5531 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Sep 28 16:16:15 2022 +0100 patch 9.0.0618: calling function for reduce() has too much overhead Problem: Calling function for reduce() has too much overhead. Solution: Do not create a funccall_T every time.
author Bram Moolenaar <Bram@vim.org>
date Wed, 28 Sep 2022 17:30:04 +0200
parents 2650a01b8bbc
children ed6acfafa17e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * blob.c: Blob support by Yasuhiro Matsumoto
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 #if defined(FEAT_EVAL) || defined(PROTO)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 * Allocate an empty blob.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 * Caller should take care of the reference count.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 blob_T *
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 blob_alloc(void)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 {
28289
cdaff4db7760 patch 8.2.4670: memory allocation failures for new tab page not tested
Bram Moolenaar <Bram@vim.org>
parents: 27426
diff changeset
25 blob_T *blob = ALLOC_CLEAR_ONE_ID(blob_T, aid_blob_alloc);
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 if (blob != NULL)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 ga_init2(&blob->bv_ga, 1, 100);
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29 return blob;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 * Allocate an empty blob for a return value, with reference count set.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 * Returns OK or FAIL.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 int
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 rettv_blob_alloc(typval_T *rettv)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 blob_T *b = blob_alloc();
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 if (b == NULL)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 return FAIL;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 rettv_blob_set(rettv, b);
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 return OK;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 * Set a blob as the return value.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 void
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 rettv_blob_set(typval_T *rettv, blob_T *b)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54 rettv->v_type = VAR_BLOB;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 rettv->vval.v_blob = b;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56 if (b != NULL)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 ++b->bv_refcount;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
60 int
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 18757
diff changeset
61 blob_copy(blob_T *from, typval_T *to)
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
62 {
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
63 int len;
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
64
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
65 to->v_type = VAR_BLOB;
17344
a0eb2ff0f297 patch 8.1.1671: copying a blob may result in it being locked
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
66 to->v_lock = 0;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 18757
diff changeset
67 if (from == NULL)
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
68 {
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
69 to->vval.v_blob = NULL;
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
70 return OK;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
71 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
72
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
73 if (rettv_blob_alloc(to) == FAIL)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
74 return FAIL;
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
75
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
76 len = from->bv_ga.ga_len;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
77 if (len > 0)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
78 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
79 to->vval.v_blob->bv_ga.ga_data =
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
80 vim_memsave(from->bv_ga.ga_data, len);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
81 if (to->vval.v_blob->bv_ga.ga_data == NULL)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
82 len = 0;
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
83 }
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
84 to->vval.v_blob->bv_ga.ga_len = len;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
85 to->vval.v_blob->bv_ga.ga_maxlen = len;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
86
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
87 return OK;
15581
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
88 }
c2382f0d1279 patch 8.1.0798: changing a blob while iterating over it works strangely
Bram Moolenaar <Bram@vim.org>
parents: 15515
diff changeset
89
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 void
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 blob_free(blob_T *b)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
92 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93 ga_clear(&b->bv_ga);
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 vim_free(b);
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
95 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98 * Unreference a blob: decrement the reference count and free it when it
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 * becomes zero.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
101 void
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 blob_unref(blob_T *b)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
104 if (b != NULL && --b->bv_refcount <= 0)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
105 blob_free(b);
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
108 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 * Get the length of data.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
110 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
111 long
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 blob_len(blob_T *b)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
113 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
114 if (b == NULL)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
115 return 0L;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
116 return b->bv_ga.ga_len;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
117 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
120 * Get byte "idx" in blob "b".
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121 * Caller must check that "idx" is valid.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 */
15589
44ea60ca593b patch 8.1.0802: negative index doesn't work for Blob
Bram Moolenaar <Bram@vim.org>
parents: 15581
diff changeset
123 int
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
124 blob_get(blob_T *b, int idx)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
125 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 return ((char_u*)b->bv_ga.ga_data)[idx];
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129 /*
24475
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
130 * Store one byte "byte" in blob "blob" at "idx".
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
131 * Caller must make sure that "idx" is valid.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
132 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 void
24475
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
134 blob_set(blob_T *blob, int idx, int byte)
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
135 {
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
136 ((char_u*)blob->bv_ga.ga_data)[idx] = byte;
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
137 }
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
138
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
139 /*
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
140 * Store one byte "byte" in blob "blob" at "idx".
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
141 * Append one byte if needed.
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
142 */
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
143 void
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
144 blob_set_append(blob_T *blob, int idx, int byte)
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145 {
24475
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
146 garray_T *gap = &blob->bv_ga;
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
147
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
148 // Allow for appending a byte. Setting a byte beyond
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
149 // the end is an error otherwise.
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
150 if (idx < gap->ga_len
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
151 || (idx == gap->ga_len && ga_grow(gap, 1) == OK))
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
152 {
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
153 blob_set(blob, idx, byte);
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
154 if (idx == gap->ga_len)
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
155 ++gap->ga_len;
96905804bf5a patch 8.2.2777: Vim9: blob operations not tested in all ways
Bram Moolenaar <Bram@vim.org>
parents: 24454
diff changeset
156 }
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 * Return TRUE when two blobs have exactly the same values.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
161 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
162 int
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
163 blob_equal(
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164 blob_T *b1,
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165 blob_T *b2)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 {
15456
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
167 int i;
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
168 int len1 = blob_len(b1);
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
169 int len2 = blob_len(b2);
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
170
15456
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
171 // empty and NULL are considered the same
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
172 if (len1 == 0 && len2 == 0)
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
173 return TRUE;
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 if (b1 == b2)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 return TRUE;
15456
f01eb1aed348 patch 8.1.0736: code for Blob not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 15454
diff changeset
176 if (len1 != len2)
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 return FALSE;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179 for (i = 0; i < b1->bv_ga.ga_len; i++)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 if (blob_get(b1, i) != blob_get(b2, i)) return FALSE;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 return TRUE;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
182 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 * Read "blob" from file "fd".
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 * Return OK or FAIL.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 int
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 read_blob(FILE *fd, blob_T *blob)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 struct stat st;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 if (fstat(fileno(fd), &st) < 0)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 return FAIL;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 if (ga_grow(&blob->bv_ga, st.st_size) == FAIL)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 return FAIL;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 blob->bv_ga.ga_len = st.st_size;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 if (fread(blob->bv_ga.ga_data, 1, blob->bv_ga.ga_len, fd)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 < (size_t)blob->bv_ga.ga_len)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 return FAIL;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 return OK;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 /*
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 * Write "blob" to file "fd".
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 * Return OK or FAIL.
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 */
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 int
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 write_blob(FILE *fd, blob_T *blob)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 {
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 if (fwrite(blob->bv_ga.ga_data, 1, blob->bv_ga.ga_len, fd)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 < (size_t)blob->bv_ga.ga_len)
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 {
26439
b18f3b0f317c patch 8.2.3750: error messages are everywhere
Bram Moolenaar <Bram@vim.org>
parents: 26394
diff changeset
214 emsg(_(e_error_while_writing));
15454
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215 return FAIL;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 return OK;
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 }
1d2b5c016f17 patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
220 /*
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
221 * Convert a blob to a readable form: "0z00112233.44556677.8899"
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
222 */
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
223 char_u *
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
224 blob2string(blob_T *blob, char_u **tofree, char_u *numbuf)
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
225 {
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
226 int i;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
227 garray_T ga;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
228
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
229 if (blob == NULL)
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
230 {
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
231 *tofree = NULL;
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
232 return (char_u *)"0z";
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
233 }
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
234
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
235 // Store bytes in the growarray.
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
236 ga_init2(&ga, 1, 4000);
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
237 ga_concat(&ga, (char_u *)"0z");
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
238 for (i = 0; i < blob_len(blob); i++)
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
239 {
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
240 if (i > 0 && (i & 3) == 0)
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
241 ga_concat(&ga, (char_u *)".");
27426
41e0dcf38521 patch 8.2.4241: some type casts are redundant
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
242 vim_snprintf((char *)numbuf, NUMBUFLEN, "%02X", blob_get(blob, i));
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
243 ga_concat(&ga, numbuf);
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
244 }
26652
a3f38923c037 patch 8.2.3855: illegal memory access when displaying a blob
Bram Moolenaar <Bram@vim.org>
parents: 26439
diff changeset
245 ga_append(&ga, NUL); // append a NUL at the end
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
246 *tofree = ga.ga_data;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
247 return *tofree;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
248 }
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
249
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
250 /*
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
251 * Convert a string variable, in the format of blob2string(), to a blob.
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
252 * Return NULL when conversion failed.
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
253 */
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
254 blob_T *
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
255 string2blob(char_u *str)
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
256 {
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
257 blob_T *blob = blob_alloc();
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
258 char_u *s = str;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
259
16034
27f9f4c1400b patch 8.1.1022: may use NULL pointer when out of memory
Bram Moolenaar <Bram@vim.org>
parents: 15589
diff changeset
260 if (blob == NULL)
27f9f4c1400b patch 8.1.1022: may use NULL pointer when out of memory
Bram Moolenaar <Bram@vim.org>
parents: 15589
diff changeset
261 return NULL;
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
262 if (s[0] != '0' || (s[1] != 'z' && s[1] != 'Z'))
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
263 goto failed;
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
264 s += 2;
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
265 while (vim_isxdigit(*s))
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
266 {
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
267 if (!vim_isxdigit(s[1]))
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
268 goto failed;
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
269 ga_append(&blob->bv_ga, (hex2nr(s[0]) << 4) + hex2nr(s[1]));
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
270 s += 2;
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
271 if (*s == '.' && vim_isxdigit(s[1]))
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
272 ++s;
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
273 }
15515
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
274 if (*skipwhite(s) != NUL)
99a4cc4782ac patch 8.1.0765: string format of a Blob can't be parsed back
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
275 goto failed; // text after final digit
15466
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
276
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
277 ++blob->bv_refcount;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
278 return blob;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
279
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
280 failed:
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
281 blob_free(blob);
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
282 return NULL;
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
283 }
435fcefd2c8e patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents: 15456
diff changeset
284
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
285 /*
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
286 * Returns a slice of 'blob' from index 'n1' to 'n2' in 'rettv'. The length of
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
287 * the blob is 'len'. Returns an empty blob if the indexes are out of range.
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
288 */
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
289 static int
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
290 blob_slice(
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
291 blob_T *blob,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
292 long len,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
293 varnumber_T n1,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
294 varnumber_T n2,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
295 int exclusive,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
296 typval_T *rettv)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
297 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
298 if (n1 < 0)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
299 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
300 n1 = len + n1;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
301 if (n1 < 0)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
302 n1 = 0;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
303 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
304 if (n2 < 0)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
305 n2 = len + n2;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
306 else if (n2 >= len)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
307 n2 = len - (exclusive ? 0 : 1);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
308 if (exclusive)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
309 --n2;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
310 if (n1 >= len || n2 < 0 || n1 > n2)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
311 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
312 clear_tv(rettv);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
313 rettv->v_type = VAR_BLOB;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
314 rettv->vval.v_blob = NULL;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
315 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
316 else
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
317 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
318 blob_T *new_blob = blob_alloc();
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
319 long i;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
320
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
321 if (new_blob != NULL)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
322 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
323 if (ga_grow(&new_blob->bv_ga, n2 - n1 + 1) == FAIL)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
324 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
325 blob_free(new_blob);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
326 return FAIL;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
327 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
328 new_blob->bv_ga.ga_len = n2 - n1 + 1;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
329 for (i = n1; i <= n2; i++)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
330 blob_set(new_blob, i - n1, blob_get(blob, i));
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
331
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
332 clear_tv(rettv);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
333 rettv_blob_set(rettv, new_blob);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
334 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
335 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
336
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
337 return OK;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
338 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
339
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
340 /*
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
341 * Return the byte value in 'blob' at index 'idx' in 'rettv'. If the index is
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
342 * too big or negative that is an error. The length of the blob is 'len'.
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
343 */
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
344 static int
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
345 blob_index(
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
346 blob_T *blob,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
347 int len,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
348 varnumber_T idx,
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
349 typval_T *rettv)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
350 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
351 // The resulting variable is a byte value.
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
352 // If the index is too big or negative that is an error.
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
353 if (idx < 0)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
354 idx = len + idx;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
355 if (idx < len && idx >= 0)
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
356 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
357 int v = blob_get(blob, idx);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
358
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
359 clear_tv(rettv);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
360 rettv->v_type = VAR_NUMBER;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
361 rettv->vval.v_number = v;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
362 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
363 else
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
364 {
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
365 semsg(_(e_blob_index_out_of_range_nr), idx);
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
366 return FAIL;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
367 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
368
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
369 return OK;
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
370 }
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
371
24432
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
372 int
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
373 blob_slice_or_index(
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
374 blob_T *blob,
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
375 int is_range,
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
376 varnumber_T n1,
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
377 varnumber_T n2,
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
378 int exclusive,
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
379 typval_T *rettv)
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
380 {
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
381 long len = blob_len(blob);
24432
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
382
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
383 if (is_range)
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
384 return blob_slice(blob, len, n1, n2, exclusive, rettv);
24432
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
385 else
30531
2650a01b8bbc patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents: 30425
diff changeset
386 return blob_index(blob, len, n1, rettv);
24432
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
387 return OK;
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
388 }
aa150abca273 patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents: 22635
diff changeset
389
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
390 /*
24450
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
391 * Check if "n1"- is a valid index for a blobl with length "bloblen".
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
392 */
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
393 int
24454
53216e87f21c patch 8.2.2767: compiler warning for unused argument
Bram Moolenaar <Bram@vim.org>
parents: 24450
diff changeset
394 check_blob_index(long bloblen, varnumber_T n1, int quiet)
24450
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
395 {
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
396 if (n1 < 0 || n1 > bloblen)
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
397 {
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
398 if (!quiet)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
399 semsg(_(e_blob_index_out_of_range_nr), n1);
24450
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
400 return FAIL;
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
401 }
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
402 return OK;
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
403 }
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
404
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
405 /*
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
406 * Check if "n1"-"n2" is a valid range for a blob with length "bloblen".
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
407 */
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
408 int
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
409 check_blob_range(long bloblen, varnumber_T n1, varnumber_T n2, int quiet)
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
410 {
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
411 if (n2 < 0 || n2 >= bloblen || n2 < n1)
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
412 {
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
413 if (!quiet)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
414 semsg(_(e_blob_index_out_of_range_nr), n2);
24450
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
415 return FAIL;
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
416 }
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
417 return OK;
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
418 }
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
419
3e1886f1e875 patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents: 24434
diff changeset
420 /*
24434
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
421 * Set bytes "n1" to "n2" (inclusive) in "dest" to the value of "src".
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
422 * Caller must make sure "src" is a blob.
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
423 * Returns FAIL if the number of bytes does not match.
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
424 */
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
425 int
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
426 blob_set_range(blob_T *dest, long n1, long n2, typval_T *src)
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
427 {
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
428 int il, ir;
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
429
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
430 if (n2 - n1 + 1 != blob_len(src->vval.v_blob))
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
431 {
26863
6ee19c6ae8a2 patch 8.2.3960: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26684
diff changeset
432 emsg(_(e_blob_value_does_not_have_right_number_of_bytes));
24434
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
433 return FAIL;
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
434 }
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
435
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
436 ir = 0;
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
437 for (il = n1; il <= n2; il++)
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
438 blob_set(dest, il, blob_get(src->vval.v_blob, ir++));
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
439 return OK;
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
440 }
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
441
602e528a8e43 patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents: 24432
diff changeset
442 /*
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
443 * "add(blob, item)" function
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
444 */
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
445 void
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
446 blob_add(typval_T *argvars, typval_T *rettv)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
447 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
448 blob_T *b = argvars[0].vval.v_blob;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
449 int error = FALSE;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
450 varnumber_T n;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
451
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
452 if (b == NULL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
453 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
454 if (in_vim9script())
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
455 emsg(_(e_cannot_add_to_null_blob));
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
456 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
457 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
458
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
459 if (value_check_lock(b->bv_lock, (char_u *)N_("add() argument"), TRUE))
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
460 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
461
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
462 n = tv_get_number_chk(&argvars[1], &error);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
463 if (error)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
464 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
465
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
466 ga_append(&b->bv_ga, (int)n);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
467 copy_tv(&argvars[0], rettv);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
468 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
469
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
470 /*
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
471 * "remove({blob}, {idx} [, {end}])" function
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
472 */
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
473 void
25495
7144d2ffc86b patch 8.2.3284: no error for insert() or remove() changing a locked blob
Bram Moolenaar <Bram@vim.org>
parents: 25338
diff changeset
474 blob_remove(typval_T *argvars, typval_T *rettv, char_u *arg_errmsg)
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
475 {
25495
7144d2ffc86b patch 8.2.3284: no error for insert() or remove() changing a locked blob
Bram Moolenaar <Bram@vim.org>
parents: 25338
diff changeset
476 blob_T *b = argvars[0].vval.v_blob;
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
477 blob_T *newblob;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
478 int error = FALSE;
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24478
diff changeset
479 long idx;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
480 long end;
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
481 int len;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
482 char_u *p;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
483
25495
7144d2ffc86b patch 8.2.3284: no error for insert() or remove() changing a locked blob
Bram Moolenaar <Bram@vim.org>
parents: 25338
diff changeset
484 if (b != NULL && value_check_lock(b->bv_lock, arg_errmsg, TRUE))
7144d2ffc86b patch 8.2.3284: no error for insert() or remove() changing a locked blob
Bram Moolenaar <Bram@vim.org>
parents: 25338
diff changeset
485 return;
7144d2ffc86b patch 8.2.3284: no error for insert() or remove() changing a locked blob
Bram Moolenaar <Bram@vim.org>
parents: 25338
diff changeset
486
25302
4d3c68196d05 patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents: 24478
diff changeset
487 idx = (long)tv_get_number_chk(&argvars[1], &error);
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
488 if (error)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
489 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
490
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
491 len = blob_len(b);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
492
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
493 if (idx < 0)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
494 // count from the end
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
495 idx = len + idx;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
496 if (idx < 0 || idx >= len)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
497 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
498 semsg(_(e_blob_index_out_of_range_nr), idx);
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
499 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
500 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
501 if (argvars[2].v_type == VAR_UNKNOWN)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
502 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
503 // Remove one item, return its value.
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
504 p = (char_u *)b->bv_ga.ga_data;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
505 rettv->vval.v_number = (varnumber_T) *(p + idx);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
506 mch_memmove(p + idx, p + idx + 1, (size_t)len - idx - 1);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
507 --b->bv_ga.ga_len;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
508 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
509 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
510
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
511 // Remove range of items, return blob with values.
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
512 end = (long)tv_get_number_chk(&argvars[2], &error);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
513 if (error)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
514 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
515 if (end < 0)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
516 // count from the end
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
517 end = len + end;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
518 if (end >= len || idx > end)
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
519 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
520 semsg(_(e_blob_index_out_of_range_nr), end);
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
521 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
522 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
523 newblob = blob_alloc();
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
524 if (newblob == NULL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
525 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
526 newblob->bv_ga.ga_len = end - idx + 1;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
527 if (ga_grow(&newblob->bv_ga, end - idx + 1) == FAIL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
528 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
529 vim_free(newblob);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
530 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
531 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
532 p = (char_u *)b->bv_ga.ga_data;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
533 mch_memmove((char_u *)newblob->bv_ga.ga_data, p + idx,
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
534 (size_t)(end - idx + 1));
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
535 ++newblob->bv_refcount;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
536 rettv->v_type = VAR_BLOB;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
537 rettv->vval.v_blob = newblob;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
538
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
539 if (len - end - 1 > 0)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
540 mch_memmove(p + idx, p + end + 1, (size_t)(len - end - 1));
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
541 b->bv_ga.ga_len -= end - idx + 1;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
542 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
543
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
544 /*
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
545 * Implementation of map() and filter() for a Blob. Apply "expr" to every
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
546 * number in Blob "blob_arg" and return the result in "rettv".
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
547 */
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
548 void
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
549 blob_filter_map(
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
550 blob_T *blob_arg,
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
551 filtermap_T filtermap,
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
552 typval_T *expr,
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
553 typval_T *rettv)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
554 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
555 blob_T *b;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
556 int i;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
557 typval_T tv;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
558 varnumber_T val;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
559 blob_T *b_ret;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
560 int idx = 0;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
561 int rem;
30566
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
562 typval_T newtv;
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
563 funccall_T *fc;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
564
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
565 if (filtermap == FILTERMAP_MAPNEW)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
566 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
567 rettv->v_type = VAR_BLOB;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
568 rettv->vval.v_blob = NULL;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
569 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
570 if ((b = blob_arg) == NULL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
571 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
572
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
573 b_ret = b;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
574 if (filtermap == FILTERMAP_MAPNEW)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
575 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
576 if (blob_copy(b, rettv) == FAIL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
577 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
578 b_ret = rettv->vval.v_blob;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
579 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
580
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
581 // set_vim_var_nr() doesn't set the type
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
582 set_vim_var_type(VV_KEY, VAR_NUMBER);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
583
30566
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
584 // Create one funccal_T for all eval_expr_typval() calls.
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
585 fc = eval_expr_get_funccal(expr, &newtv);
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
586
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
587 for (i = 0; i < b->bv_ga.ga_len; i++)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
588 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
589 tv.v_type = VAR_NUMBER;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
590 val = blob_get(b, i);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
591 tv.vval.v_number = val;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
592 set_vim_var_nr(VV_KEY, idx);
30566
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
593 if (filter_map_one(&tv, expr, filtermap, fc, &newtv, &rem) == FAIL
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
594 || did_emsg)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
595 break;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
596 if (newtv.v_type != VAR_NUMBER && newtv.v_type != VAR_BOOL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
597 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
598 clear_tv(&newtv);
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
599 emsg(_(e_invalid_operation_for_blob));
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
600 break;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
601 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
602 if (filtermap != FILTERMAP_FILTER)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
603 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
604 if (newtv.vval.v_number != val)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
605 blob_set(b_ret, i, newtv.vval.v_number);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
606 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
607 else if (rem)
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
608 {
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
609 char_u *p = (char_u *)blob_arg->bv_ga.ga_data;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
610
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
611 mch_memmove(p + i, p + i + 1,
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
612 (size_t)b->bv_ga.ga_len - i - 1);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
613 --b->bv_ga.ga_len;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
614 --i;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
615 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
616 ++idx;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
617 }
30566
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
618
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
619 if (fc != NULL)
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
620 remove_funccal();
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
621 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
622
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
623 /*
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
624 * "insert(blob, {item} [, {idx}])" function
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
625 */
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
626 void
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
627 blob_insert_func(typval_T *argvars, typval_T *rettv)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
628 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
629 blob_T *b = argvars[0].vval.v_blob;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
630 long before = 0;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
631 int error = FALSE;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
632 int val, len;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
633 char_u *p;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
634
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
635 if (b == NULL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
636 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
637 if (in_vim9script())
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
638 emsg(_(e_cannot_add_to_null_blob));
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
639 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
640 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
641
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
642 if (value_check_lock(b->bv_lock, (char_u *)N_("insert() argument"), TRUE))
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
643 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
644
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
645 len = blob_len(b);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
646 if (argvars[2].v_type != VAR_UNKNOWN)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
647 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
648 before = (long)tv_get_number_chk(&argvars[2], &error);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
649 if (error)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
650 return; // type error; errmsg already given
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
651 if (before < 0 || before > len)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
652 {
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26863
diff changeset
653 semsg(_(e_invalid_argument_str), tv_get_string(&argvars[2]));
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
654 return;
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
655 }
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
656 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
657 val = tv_get_number_chk(&argvars[1], &error);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
658 if (error)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
659 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
660 if (val < 0 || val > 255)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
661 {
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26863
diff changeset
662 semsg(_(e_invalid_argument_str), tv_get_string(&argvars[1]));
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
663 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
664 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
665
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
666 if (ga_grow(&b->bv_ga, 1) == FAIL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
667 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
668 p = (char_u *)b->bv_ga.ga_data;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
669 mch_memmove(p + before + 1, p + before, (size_t)len - before);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
670 *(p + before) = val;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
671 ++b->bv_ga.ga_len;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
672
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
673 copy_tv(&argvars[0], rettv);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
674 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
675
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
676 /*
30425
6c2bbd7d9217 patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents: 30043
diff changeset
677 * Implementaion of reduce() for Blob "argvars[0]" using the function "expr"
6c2bbd7d9217 patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents: 30043
diff changeset
678 * starting with the optional initial value "argvars[2]" and return the result
6c2bbd7d9217 patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents: 30043
diff changeset
679 * in "rettv".
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
680 */
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
681 void
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
682 blob_reduce(
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
683 typval_T *argvars,
30425
6c2bbd7d9217 patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents: 30043
diff changeset
684 typval_T *expr,
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
685 typval_T *rettv)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
686 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
687 blob_T *b = argvars[0].vval.v_blob;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
688 int called_emsg_start = called_emsg;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
689 int r;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
690 typval_T initial;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
691 typval_T argv[3];
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
692 int i;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
693
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
694 if (argvars[2].v_type == VAR_UNKNOWN)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
695 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
696 if (b == NULL || b->bv_ga.ga_len == 0)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
697 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
698 semsg(_(e_reduce_of_an_empty_str_with_no_initial_value), "Blob");
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
699 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
700 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
701 initial.v_type = VAR_NUMBER;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
702 initial.vval.v_number = blob_get(b, 0);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
703 i = 1;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
704 }
30043
fd855ad74887 patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents: 28289
diff changeset
705 else if (check_for_number_arg(argvars, 2) == FAIL)
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
706 return;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
707 else
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
708 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
709 initial = argvars[2];
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
710 i = 0;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
711 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
712
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
713 copy_tv(&initial, rettv);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
714 if (b == NULL)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
715 return;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
716
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
717 for ( ; i < b->bv_ga.ga_len; i++)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
718 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
719 argv[0] = *rettv;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
720 argv[1].v_type = VAR_NUMBER;
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
721 argv[1].vval.v_number = blob_get(b, i);
30425
6c2bbd7d9217 patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents: 30043
diff changeset
722
30566
b3de17181c19 patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents: 30531
diff changeset
723 r = eval_expr_typval(expr, argv, 2, NULL, rettv);
30425
6c2bbd7d9217 patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents: 30043
diff changeset
724
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
725 clear_tv(&argv[0]);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
726 if (r == FAIL || called_emsg != called_emsg_start)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
727 return;
17530
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
728 }
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
729 }
ef23ec1eee54 patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents: 17344
diff changeset
730
25806
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
731 /*
26684
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
732 * "reverse({blob})" function
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
733 */
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
734 void
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
735 blob_reverse(blob_T *b, typval_T *rettv)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
736 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
737 int i, len = blob_len(b);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
738
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
739 for (i = 0; i < len / 2; i++)
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
740 {
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
741 int tmp = blob_get(b, i);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
742
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
743 blob_set(b, i, blob_get(b, len - i - 1));
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
744 blob_set(b, len - i - 1, tmp);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
745 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
746 rettv_blob_set(rettv, b);
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
747 }
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
748
2126feddeda6 patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents: 26652
diff changeset
749 /*
25806
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
750 * blob2list() function
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
751 */
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
752 void
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
753 f_blob2list(typval_T *argvars, typval_T *rettv)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
754 {
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
755 blob_T *blob;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
756 list_T *l;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
757 int i;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
758
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
759 if (rettv_list_alloc(rettv) == FAIL)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
760 return;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
761
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
762 if (check_for_blob_arg(argvars, 0) == FAIL)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
763 return;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
764
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
765 blob = argvars->vval.v_blob;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
766 l = rettv->vval.v_list;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
767 for (i = 0; i < blob_len(blob); i++)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
768 list_append_number(l, blob_get(blob, i));
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
769 }
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
770
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
771 /*
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
772 * list2blob() function
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
773 */
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
774 void
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
775 f_list2blob(typval_T *argvars, typval_T *rettv)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
776 {
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
777 list_T *l;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
778 listitem_T *li;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
779 blob_T *blob;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
780
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
781 if (rettv_blob_alloc(rettv) == FAIL)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
782 return;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
783 blob = rettv->vval.v_blob;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
784
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
785 if (check_for_list_arg(argvars, 0) == FAIL)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
786 return;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
787
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
788 l = argvars->vval.v_list;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
789 if (l == NULL)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
790 return;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
791
26394
43d196ca5e7a patch 8.2.3728: internal error when passing range() to list2blob()
Bram Moolenaar <Bram@vim.org>
parents: 25806
diff changeset
792 CHECK_LIST_MATERIALIZE(l);
25806
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
793 FOR_ALL_LIST_ITEMS(l, li)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
794 {
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
795 int error;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
796 varnumber_T n;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
797
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
798 error = FALSE;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
799 n = tv_get_number_chk(&li->li_tv, &error);
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
800 if (error == TRUE || n < 0 || n > 255)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
801 {
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
802 if (!error)
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
803 semsg(_(e_invalid_value_for_blob_nr), n);
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
804 ga_clear(&blob->bv_ga);
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
805 return;
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
806 }
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
807 ga_append(&blob->bv_ga, n);
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
808 }
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
809 }
8d55e978f95b patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents: 25495
diff changeset
810
18757
c469e1930456 patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 17530
diff changeset
811 #endif // defined(FEAT_EVAL)