Mercurial > vim
annotate src/blob.c @ 30922:ed6acfafa17e v9.0.0795
patch 9.0.0795: readblob() always reads the whole file
Commit: https://github.com/vim/vim/commit/11df3aeee548b959ccd4b9a4d3c44651eab6b3ce
Author: K.Takata <kentkt@csc.jp>
Date: Wed Oct 19 14:02:40 2022 +0100
patch 9.0.0795: readblob() always reads the whole file
Problem: readblob() always reads the whole file.
Solution: Add arguments to read part of the file. (Ken Takata,
closes #11402)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 19 Oct 2022 15:15:05 +0200 |
parents | b3de17181c19 |
children | 84f6f91ca02a |
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 /* |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
185 * Read blob from file "fd". |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
186 * Caller has allocated a blob in "rettv". |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
187 * Return OK or FAIL. |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
188 */ |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
189 int |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
190 read_blob(FILE *fd, typval_T *rettv, off_T offset, off_T size_arg) |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
191 { |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
192 blob_T *blob = rettv->vval.v_blob; |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
193 struct stat st; |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
194 int whence; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
195 off_T size = size_arg; |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
196 |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
197 if (fstat(fileno(fd), &st) < 0) |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
198 return FAIL; // can't read the file, error |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
199 |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
200 if (offset >= 0) |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
201 { |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
202 if (size == -1) |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
203 // size may become negative, checked below |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
204 size = st.st_size - offset; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
205 whence = SEEK_SET; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
206 } |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
207 else |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
208 { |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
209 if (size == -1) |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
210 size = -offset; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
211 whence = SEEK_END; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
212 } |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
213 // Trying to read bytes that aren't there results in an empty blob, not an |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
214 // error. |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
215 if (size < 0 || size > st.st_size) |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
216 return OK; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
217 if (vim_fseek(fd, offset, whence) != 0) |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
218 return OK; |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
219 |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
220 if (ga_grow(&blob->bv_ga, (int)size) == FAIL) |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
221 return FAIL; |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
222 blob->bv_ga.ga_len = (int)size; |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
223 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
|
224 < (size_t)blob->bv_ga.ga_len) |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
225 { |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
226 // An empty blob is returned on error. |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
227 blob_free(rettv->vval.v_blob); |
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
228 rettv->vval.v_blob = NULL; |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
229 return FAIL; |
30922
ed6acfafa17e
patch 9.0.0795: readblob() always reads the whole file
Bram Moolenaar <Bram@vim.org>
parents:
30566
diff
changeset
|
230 } |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
231 return OK; |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
232 } |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
233 |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
234 /* |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
235 * Write "blob" to file "fd". |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
236 * Return OK or FAIL. |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
237 */ |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
238 int |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
239 write_blob(FILE *fd, blob_T *blob) |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
240 { |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
241 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
|
242 < (size_t)blob->bv_ga.ga_len) |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
243 { |
26439
b18f3b0f317c
patch 8.2.3750: error messages are everywhere
Bram Moolenaar <Bram@vim.org>
parents:
26394
diff
changeset
|
244 emsg(_(e_error_while_writing)); |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
245 return FAIL; |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
246 } |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
247 return OK; |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
248 } |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
249 |
15466
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
250 /* |
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
|
251 * 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
|
252 */ |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
253 char_u * |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
254 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
|
255 { |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
256 int i; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
257 garray_T ga; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
258 |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
259 if (blob == NULL) |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
260 { |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
261 *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
|
262 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
|
263 } |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
264 |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
265 // 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
|
266 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
|
267 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
|
268 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
|
269 { |
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
|
270 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
|
271 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
|
272 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
|
273 ga_concat(&ga, numbuf); |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
274 } |
26652
a3f38923c037
patch 8.2.3855: illegal memory access when displaying a blob
Bram Moolenaar <Bram@vim.org>
parents:
26439
diff
changeset
|
275 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
|
276 *tofree = ga.ga_data; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
277 return *tofree; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
278 } |
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 /* |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
281 * 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
|
282 * 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
|
283 */ |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
284 blob_T * |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
285 string2blob(char_u *str) |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
286 { |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
287 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
|
288 char_u *s = str; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
289 |
16034
27f9f4c1400b
patch 8.1.1022: may use NULL pointer when out of memory
Bram Moolenaar <Bram@vim.org>
parents:
15589
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 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
|
296 { |
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
|
297 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 ++s; |
15466
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
303 } |
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
|
304 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
|
305 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
|
306 |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
307 ++blob->bv_refcount; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
308 return blob; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
309 |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
310 failed: |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
311 blob_free(blob); |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
312 return NULL; |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
313 } |
435fcefd2c8e
patch 8.1.0741: viminfo with Blob is not tested
Bram Moolenaar <Bram@vim.org>
parents:
15456
diff
changeset
|
314 |
30531
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 * 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
|
317 * 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
|
318 */ |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
319 static int |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
320 blob_slice( |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
321 blob_T *blob, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
322 long len, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
323 varnumber_T n1, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
324 varnumber_T n2, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
325 int exclusive, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
326 typval_T *rettv) |
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 if (n1 < 0) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
329 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
330 n1 = len + n1; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
331 if (n1 < 0) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
332 n1 = 0; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
333 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
334 if (n2 < 0) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
335 n2 = len + n2; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
336 else if (n2 >= len) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
337 n2 = len - (exclusive ? 0 : 1); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
338 if (exclusive) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
339 --n2; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
340 if (n1 >= len || n2 < 0 || n1 > n2) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
341 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
342 clear_tv(rettv); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
343 rettv->v_type = VAR_BLOB; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
344 rettv->vval.v_blob = NULL; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
345 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
346 else |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
347 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
348 blob_T *new_blob = blob_alloc(); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
349 long i; |
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 if (new_blob != NULL) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
352 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
353 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
|
354 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
355 blob_free(new_blob); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
356 return FAIL; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
357 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
358 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
|
359 for (i = n1; i <= n2; i++) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
360 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
|
361 |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
362 clear_tv(rettv); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
363 rettv_blob_set(rettv, new_blob); |
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 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
366 |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
367 return OK; |
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 |
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 * 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
|
372 * 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
|
373 */ |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
374 static int |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
375 blob_index( |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
376 blob_T *blob, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
377 int len, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
378 varnumber_T idx, |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
379 typval_T *rettv) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
380 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
381 // The resulting variable is a byte value. |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
382 // 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
|
383 if (idx < 0) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
384 idx = len + idx; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
385 if (idx < len && idx >= 0) |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
386 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
387 int v = blob_get(blob, idx); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
388 |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
389 clear_tv(rettv); |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
390 rettv->v_type = VAR_NUMBER; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
391 rettv->vval.v_number = v; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
392 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
393 else |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
394 { |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
395 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
|
396 return FAIL; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
397 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
398 |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
399 return OK; |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
400 } |
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
401 |
24432
aa150abca273
patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
22635
diff
changeset
|
402 int |
aa150abca273
patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
22635
diff
changeset
|
403 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
|
404 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
|
405 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
|
406 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
|
407 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
|
408 int exclusive, |
aa150abca273
patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
22635
diff
changeset
|
409 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
|
410 { |
30531
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
411 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
|
412 |
aa150abca273
patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
22635
diff
changeset
|
413 if (is_range) |
30531
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
414 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
|
415 else |
30531
2650a01b8bbc
patch 9.0.0601: too much indent
Bram Moolenaar <Bram@vim.org>
parents:
30425
diff
changeset
|
416 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
|
417 return OK; |
aa150abca273
patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
22635
diff
changeset
|
418 } |
aa150abca273
patch 8.2.2756: Vim9: blob index and slice not implemented yet
Bram Moolenaar <Bram@vim.org>
parents:
22635
diff
changeset
|
419 |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
420 /* |
24450
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
421 * 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
|
422 */ |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
423 int |
24454
53216e87f21c
patch 8.2.2767: compiler warning for unused argument
Bram Moolenaar <Bram@vim.org>
parents:
24450
diff
changeset
|
424 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
|
425 { |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
426 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
|
427 { |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
428 if (!quiet) |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
429 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
|
430 return FAIL; |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
431 } |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
432 return OK; |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
433 } |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
434 |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
435 /* |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
436 * 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
|
437 */ |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
438 int |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
439 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
|
440 { |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
441 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
|
442 { |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
443 if (!quiet) |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
444 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
|
445 return FAIL; |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
446 } |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
447 return OK; |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
448 } |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
449 |
3e1886f1e875
patch 8.2.2765: Vim9: not all blob operations work
Bram Moolenaar <Bram@vim.org>
parents:
24434
diff
changeset
|
450 /* |
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
|
451 * 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
|
452 * 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
|
453 * 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
|
454 */ |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
455 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
|
456 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
|
457 { |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
458 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
|
459 |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
460 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
|
461 { |
26863
6ee19c6ae8a2
patch 8.2.3960: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26684
diff
changeset
|
462 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
|
463 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
|
464 } |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
465 |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
466 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
|
467 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
|
468 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
|
469 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
|
470 } |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
471 |
602e528a8e43
patch 8.2.2757: Vim9: blob tests for legacy and Vim9 script are separate
Bram Moolenaar <Bram@vim.org>
parents:
24432
diff
changeset
|
472 /* |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
473 * "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
|
474 */ |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
475 void |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
476 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
|
477 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
478 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
|
479 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
|
480 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
|
481 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
482 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
|
483 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
484 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
|
485 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
|
486 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
487 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
488 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
489 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
|
490 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
491 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
492 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
|
493 if (error) |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
494 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
495 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
496 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
|
497 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
|
498 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
499 |
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 * "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
|
502 */ |
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
503 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
|
504 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
|
505 { |
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
|
506 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
|
507 blob_T *newblob; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
508 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
|
509 long idx; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
510 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
|
511 int len; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
512 char_u *p; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
513 |
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
|
514 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
|
515 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
|
516 |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
24478
diff
changeset
|
517 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
|
518 if (error) |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
519 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
520 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
521 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
|
522 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
523 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
|
524 // 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
|
525 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
|
526 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
|
527 { |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
528 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
|
529 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
530 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
531 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
|
532 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
533 // 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
|
534 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
|
535 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
|
536 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
|
537 --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
|
538 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
539 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
540 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
541 // 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
|
542 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
|
543 if (error) |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
544 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
545 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
|
546 // 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
|
547 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
|
548 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
|
549 { |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
550 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
|
551 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
552 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
553 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
|
554 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
|
555 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
556 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
|
557 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
|
558 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
559 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
|
560 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
561 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
562 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
|
563 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
|
564 (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
|
565 ++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
|
566 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
|
567 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
|
568 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
569 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
|
570 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
|
571 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
|
572 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
573 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
574 /* |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
575 * 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
|
576 * 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
|
577 */ |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
578 void |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
579 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
|
580 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
|
581 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
|
582 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
|
583 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
|
584 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
585 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
|
586 int i; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
587 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
|
588 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
|
589 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
|
590 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
|
591 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
|
592 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
|
593 funccall_T *fc; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
594 |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
595 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
|
596 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
597 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
|
598 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
|
599 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
600 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
|
601 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
602 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
603 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
|
604 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
|
605 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
606 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
|
607 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
608 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
|
609 } |
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 // 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
|
612 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
|
613 |
30566
b3de17181c19
patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents:
30531
diff
changeset
|
614 // 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
|
615 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
|
616 |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
617 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
|
618 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
619 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
|
620 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
|
621 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
|
622 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
|
623 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
|
624 || did_emsg) |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
625 break; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
626 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
|
627 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
628 clear_tv(&newtv); |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
629 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
|
630 break; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
631 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
632 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
|
633 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
634 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
|
635 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
|
636 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
637 else if (rem) |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
638 { |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
639 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
|
640 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
641 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
|
642 (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
|
643 --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
|
644 --i; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
645 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
646 ++idx; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
647 } |
30566
b3de17181c19
patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents:
30531
diff
changeset
|
648 |
b3de17181c19
patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents:
30531
diff
changeset
|
649 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
|
650 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
|
651 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
652 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
653 /* |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
654 * "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
|
655 */ |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
656 void |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
657 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
|
658 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 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
|
663 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
|
664 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
665 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
|
666 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
667 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
|
668 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
|
669 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
670 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
671 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
672 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
|
673 return; |
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 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
|
676 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
|
677 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
678 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
|
679 if (error) |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
680 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
|
681 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
|
682 { |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26863
diff
changeset
|
683 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
|
684 return; |
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
685 } |
26684
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 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
|
688 if (error) |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
689 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
690 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
|
691 { |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26863
diff
changeset
|
692 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
|
693 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
694 } |
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 (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
|
697 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
698 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
|
699 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
|
700 *(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
|
701 ++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
|
702 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
703 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
|
704 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
705 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
706 /* |
30425
6c2bbd7d9217
patch 9.0.0548: reduce() with a compiled lambda could be faster
Bram Moolenaar <Bram@vim.org>
parents:
30043
diff
changeset
|
707 * 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
|
708 * 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
|
709 * 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
|
710 */ |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
711 void |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
712 blob_reduce( |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
713 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
|
714 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
|
715 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
|
716 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
717 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
|
718 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
|
719 int r; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
720 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
|
721 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
|
722 int i; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
723 |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
724 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
|
725 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
726 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
|
727 { |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
728 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
|
729 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
730 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
731 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
|
732 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
|
733 i = 1; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
734 } |
30043
fd855ad74887
patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents:
28289
diff
changeset
|
735 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
|
736 return; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
737 else |
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 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
|
740 i = 0; |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
741 } |
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 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
|
744 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
|
745 return; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
746 |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
747 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
|
748 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
749 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
|
750 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
|
751 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
|
752 |
30566
b3de17181c19
patch 9.0.0618: calling function for reduce() has too much overhead
Bram Moolenaar <Bram@vim.org>
parents:
30531
diff
changeset
|
753 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
|
754 |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
755 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
|
756 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
|
757 return; |
17530
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
758 } |
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
759 } |
ef23ec1eee54
patch 8.1.1763: evalfunc.c is still too big
Bram Moolenaar <Bram@vim.org>
parents:
17344
diff
changeset
|
760 |
25806
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
761 /* |
26684
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
762 * "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
|
763 */ |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
764 void |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
765 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
|
766 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
767 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
|
768 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
769 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
|
770 { |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
771 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
|
772 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
773 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
|
774 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
|
775 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
776 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
|
777 } |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
778 |
2126feddeda6
patch 8.2.3871: list.c contains code for dict and blob
Bram Moolenaar <Bram@vim.org>
parents:
26652
diff
changeset
|
779 /* |
25806
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
780 * blob2list() function |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
781 */ |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
782 void |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
783 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
|
784 { |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
785 blob_T *blob; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
786 list_T *l; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
787 int i; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
788 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
789 if (rettv_list_alloc(rettv) == FAIL) |
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 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
792 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
|
793 return; |
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 blob = argvars->vval.v_blob; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
796 l = rettv->vval.v_list; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
797 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
|
798 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
|
799 } |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
800 |
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 * list2blob() function |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
803 */ |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
804 void |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
805 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
|
806 { |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
807 list_T *l; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
808 listitem_T *li; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
809 blob_T *blob; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
810 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
811 if (rettv_blob_alloc(rettv) == FAIL) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
812 return; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
813 blob = rettv->vval.v_blob; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
814 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
815 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
|
816 return; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
817 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
818 l = argvars->vval.v_list; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
819 if (l == NULL) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
820 return; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
821 |
26394
43d196ca5e7a
patch 8.2.3728: internal error when passing range() to list2blob()
Bram Moolenaar <Bram@vim.org>
parents:
25806
diff
changeset
|
822 CHECK_LIST_MATERIALIZE(l); |
25806
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
823 FOR_ALL_LIST_ITEMS(l, li) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
824 { |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
825 int error; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
826 varnumber_T n; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
827 |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
828 error = FALSE; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
829 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
|
830 if (error == TRUE || n < 0 || n > 255) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
831 { |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
832 if (!error) |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
833 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
|
834 ga_clear(&blob->bv_ga); |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
835 return; |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
836 } |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
837 ga_append(&blob->bv_ga, n); |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
838 } |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
839 } |
8d55e978f95b
patch 8.2.3438: cannot manipulate blobs
Bram Moolenaar <Bram@vim.org>
parents:
25495
diff
changeset
|
840 |
18757
c469e1930456
patch 8.1.2368: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17530
diff
changeset
|
841 #endif // defined(FEAT_EVAL) |