Mercurial > vim
annotate src/json.c @ 19154:d5a6e9fb73b6
Added tag v8.2.0136 for changeset 9efea787c3a6523e4714b094ea5415f872689d33
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 20 Jan 2020 21:45:04 +0100 |
parents | ba9f50bfda83 |
children | 94eda51ba9ba |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9969
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
2 * |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
4 * |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
8 */ |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
9 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
10 /* |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
11 * json.c: Encoding and decoding JSON. |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
12 * |
7782
3a99194bd187
commit https://github.com/vim/vim/commit/009d84a34f3678ec93921bee3bc05be2fd606264
Christian Brabandt <cb@256bit.org>
parents:
7736
diff
changeset
|
13 * Follows this standard: https://tools.ietf.org/html/rfc7159.html |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
14 */ |
8295
18fd94bd4eb8
commit https://github.com/vim/vim/commit/fefecb0fbe14c44d46f91036d76bbb6c28162da8
Christian Brabandt <cb@256bit.org>
parents:
8293
diff
changeset
|
15 #define USING_FLOAT_STUFF |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
16 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
17 #include "vim.h" |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
18 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
19 #if defined(FEAT_EVAL) || defined(PROTO) |
8228
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
20 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
21 static int json_encode_item(garray_T *gap, typval_T *val, int copyID, int options); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
22 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
23 /* |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
24 * Encode "val" into a JSON format string. |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
25 * The result is added to "gap" |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
26 * Returns FAIL on failure and makes gap->ga_data empty. |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
27 */ |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
28 static int |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
29 json_encode_gap(garray_T *gap, typval_T *val, int options) |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
30 { |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
31 if (json_encode_item(gap, val, get_copyID(), options) == FAIL) |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
32 { |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
33 ga_clear(gap); |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
34 gap->ga_data = vim_strsave((char_u *)""); |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
35 return FAIL; |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
36 } |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
37 return OK; |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
38 } |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
39 |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
40 /* |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
41 * Encode "val" into a JSON format string. |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
42 * The result is in allocated memory. |
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
43 * The result is empty when encoding fails. |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
44 * "options" can contain JSON_JS, JSON_NO_NONE and JSON_NL. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
45 */ |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
46 char_u * |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
47 json_encode(typval_T *val, int options) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
48 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
49 garray_T ga; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
50 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
51 // Store bytes in the growarray. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
52 ga_init2(&ga, 1, 4000); |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
53 json_encode_gap(&ga, val, options); |
16306
a2c598cbe220
patch 8.1.1158: json encoded string is sometimes missing the final NUL
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
54 ga_append(&ga, NUL); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
55 return ga.ga_data; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
56 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
57 |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
58 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO) |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
59 /* |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
60 * Encode ["nr", "val"] into a JSON format string in allocated memory. |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
61 * "options" can contain JSON_JS, JSON_NO_NONE and JSON_NL. |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
62 * Returns NULL when out of memory. |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
63 */ |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
64 char_u * |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
65 json_encode_nr_expr(int nr, typval_T *val, int options) |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
66 { |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
67 typval_T listtv; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
68 typval_T nrtv; |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
69 garray_T ga; |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
70 |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
71 nrtv.v_type = VAR_NUMBER; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
72 nrtv.vval.v_number = nr; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
73 if (rettv_list_alloc(&listtv) == FAIL) |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
74 return NULL; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
75 if (list_append_tv(listtv.vval.v_list, &nrtv) == FAIL |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
76 || list_append_tv(listtv.vval.v_list, val) == FAIL) |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
77 { |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
78 list_unref(listtv.vval.v_list); |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
79 return NULL; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
80 } |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
81 |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
82 ga_init2(&ga, 1, 4000); |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
83 if (json_encode_gap(&ga, &listtv, options) == OK && (options & JSON_NL)) |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
84 ga_append(&ga, '\n'); |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
85 list_unref(listtv.vval.v_list); |
16306
a2c598cbe220
patch 8.1.1158: json encoded string is sometimes missing the final NUL
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
86 ga_append(&ga, NUL); |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
87 return ga.ga_data; |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
88 } |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
89 #endif |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
90 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
91 static void |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
92 write_string(garray_T *gap, char_u *str) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
93 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
94 char_u *res = str; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
95 char_u numbuf[NUMBUFLEN]; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
96 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
97 if (res == NULL) |
13031
c35d266308c2
patch 8.0.1391: encoding empty string to JSON sometimes gives "null"
Christian Brabandt <cb@256bit.org>
parents:
10839
diff
changeset
|
98 ga_concat(gap, (char_u *)"\"\""); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
99 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
100 { |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
101 #if defined(USE_ICONV) |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
102 vimconv_T conv; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
103 char_u *converted = NULL; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
104 |
8293
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
105 if (!enc_utf8) |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
106 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
107 // Convert the text from 'encoding' to utf-8, the JSON string is |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
108 // always utf-8. |
8293
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
109 conv.vc_type = CONV_NONE; |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
110 convert_setup(&conv, p_enc, (char_u*)"utf-8"); |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
111 if (conv.vc_type != CONV_NONE) |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
112 converted = res = string_convert(&conv, res, NULL); |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
113 convert_setup(&conv, NULL, NULL); |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
114 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
115 #endif |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
116 ga_append(gap, '"'); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
117 while (*res != NUL) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
118 { |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
119 int c; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
120 // always use utf-8 encoding, ignore 'encoding' |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
121 c = utf_ptr2char(res); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
122 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
123 switch (c) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
124 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
125 case 0x08: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
126 ga_append(gap, '\\'); ga_append(gap, 'b'); break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
127 case 0x09: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
128 ga_append(gap, '\\'); ga_append(gap, 't'); break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
129 case 0x0a: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
130 ga_append(gap, '\\'); ga_append(gap, 'n'); break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
131 case 0x0c: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
132 ga_append(gap, '\\'); ga_append(gap, 'f'); break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
133 case 0x0d: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
134 ga_append(gap, '\\'); ga_append(gap, 'r'); break; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
135 case 0x22: // " |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
136 case 0x5c: // backslash |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
137 ga_append(gap, '\\'); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
138 ga_append(gap, c); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
139 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
140 default: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
141 if (c >= 0x20) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
142 { |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
143 numbuf[utf_char2bytes(c, numbuf)] = NUL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
144 ga_concat(gap, numbuf); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
145 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
146 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
147 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
148 vim_snprintf((char *)numbuf, NUMBUFLEN, |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
149 "\\u%04lx", (long)c); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
150 ga_concat(gap, numbuf); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
151 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
152 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
153 res += utf_ptr2len(res); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
154 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
155 ga_append(gap, '"'); |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
156 #if defined(USE_ICONV) |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
157 vim_free(converted); |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
158 #endif |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
159 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
160 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
161 |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
162 /* |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
163 * Return TRUE if "key" can be used without quotes. |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
164 * That is when it starts with a letter and only contains letters, digits and |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
165 * underscore. |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
166 */ |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
167 static int |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
168 is_simple_key(char_u *key) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
169 { |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
170 char_u *p; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
171 |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
172 if (!ASCII_ISALPHA(*key)) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
173 return FALSE; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
174 for (p = key + 1; *p != NUL; ++p) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
175 if (!ASCII_ISALPHA(*p) && *p != '_' && !vim_isdigit(*p)) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
176 return FALSE; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
177 return TRUE; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
178 } |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
179 |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
180 /* |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
181 * Encode "val" into "gap". |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
182 * Return FAIL or OK. |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
183 */ |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
184 static int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
185 json_encode_item(garray_T *gap, typval_T *val, int copyID, int options) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
186 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
187 char_u numbuf[NUMBUFLEN]; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
188 char_u *res; |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
189 blob_T *b; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
190 list_T *l; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
191 dict_T *d; |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
192 int i; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
193 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
194 switch (val->v_type) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
195 { |
19102
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
196 case VAR_BOOL: |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
197 switch (val->vval.v_number) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
198 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
199 case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
200 case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break; |
19102
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
201 } |
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
202 break; |
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
203 |
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
204 case VAR_SPECIAL: |
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
205 switch (val->vval.v_number) |
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
206 { |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
207 case VVAL_NONE: if ((options & JSON_JS) != 0 |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
208 && (options & JSON_NO_NONE) == 0) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
209 // empty item |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
210 break; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
211 // FALLTHROUGH |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
212 case VVAL_NULL: ga_concat(gap, (char_u *)"null"); break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
213 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
214 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
215 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
216 case VAR_NUMBER: |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
217 vim_snprintf((char *)numbuf, NUMBUFLEN, "%lld", |
15517
2ad5f0ffaa2e
patch 8.1.0766: various problems when using Vim on VMS
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
218 (long_long_T)val->vval.v_number); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
219 ga_concat(gap, numbuf); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
220 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
221 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
222 case VAR_STRING: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
223 res = val->vval.v_string; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
224 write_string(gap, res); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
225 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
226 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
227 case VAR_FUNC: |
8538
c337c813c64d
commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents:
8414
diff
changeset
|
228 case VAR_PARTIAL: |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
229 case VAR_JOB: |
8041
c6443e78cf2d
commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents:
7967
diff
changeset
|
230 case VAR_CHANNEL: |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
231 // no JSON equivalent TODO: better error |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
232 emsg(_(e_invarg)); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
233 return FAIL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
234 |
15454
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
235 case VAR_BLOB: |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
236 b = val->vval.v_blob; |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
237 if (b == NULL || b->bv_ga.ga_len == 0) |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
238 ga_concat(gap, (char_u *)"[]"); |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
239 else |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
240 { |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
241 ga_append(gap, '['); |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
242 for (i = 0; i < b->bv_ga.ga_len; i++) |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
243 { |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
244 if (i > 0) |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
245 ga_concat(gap, (char_u *)","); |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
246 vim_snprintf((char *)numbuf, NUMBUFLEN, "%d", |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
247 (int)blob_get(b, i)); |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
248 ga_concat(gap, numbuf); |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
249 } |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
250 ga_append(gap, ']'); |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
251 } |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
252 break; |
1d2b5c016f17
patch 8.1.0735: cannot handle binary data
Bram Moolenaar <Bram@vim.org>
parents:
15446
diff
changeset
|
253 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
254 case VAR_LIST: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
255 l = val->vval.v_list; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
256 if (l == NULL) |
13031
c35d266308c2
patch 8.0.1391: encoding empty string to JSON sometimes gives "null"
Christian Brabandt <cb@256bit.org>
parents:
10839
diff
changeset
|
257 ga_concat(gap, (char_u *)"[]"); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
258 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
259 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
260 if (l->lv_copyID == copyID) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
261 ga_concat(gap, (char_u *)"[]"); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
262 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
263 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
264 listitem_T *li; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
265 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
266 l->lv_copyID = copyID; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
267 ga_append(gap, '['); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
268 for (li = l->lv_first; li != NULL && !got_int; ) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
269 { |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
270 if (json_encode_item(gap, &li->li_tv, copyID, |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
271 options & JSON_JS) == FAIL) |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
272 return FAIL; |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
273 if ((options & JSON_JS) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
274 && li->li_next == NULL |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
275 && li->li_tv.v_type == VAR_SPECIAL |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
276 && li->li_tv.vval.v_number == VVAL_NONE) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
277 // add an extra comma if the last item is v:none |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
278 ga_append(gap, ','); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
279 li = li->li_next; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
280 if (li != NULL) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
281 ga_append(gap, ','); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
282 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
283 ga_append(gap, ']'); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
284 l->lv_copyID = 0; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
285 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
286 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
287 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
288 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
289 case VAR_DICT: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
290 d = val->vval.v_dict; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
291 if (d == NULL) |
13031
c35d266308c2
patch 8.0.1391: encoding empty string to JSON sometimes gives "null"
Christian Brabandt <cb@256bit.org>
parents:
10839
diff
changeset
|
292 ga_concat(gap, (char_u *)"{}"); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
293 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
294 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
295 if (d->dv_copyID == copyID) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
296 ga_concat(gap, (char_u *)"{}"); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
297 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
298 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
299 int first = TRUE; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
300 int todo = (int)d->dv_hashtab.ht_used; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
301 hashitem_T *hi; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
302 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
303 d->dv_copyID = copyID; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
304 ga_append(gap, '{'); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
305 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
306 for (hi = d->dv_hashtab.ht_array; todo > 0 && !got_int; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
307 ++hi) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
308 if (!HASHITEM_EMPTY(hi)) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
309 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
310 --todo; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
311 if (first) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
312 first = FALSE; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
313 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
314 ga_append(gap, ','); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
315 if ((options & JSON_JS) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
316 && is_simple_key(hi->hi_key)) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
317 ga_concat(gap, hi->hi_key); |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
318 else |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
319 write_string(gap, hi->hi_key); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
320 ga_append(gap, ':'); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
321 if (json_encode_item(gap, &dict_lookup(hi)->di_tv, |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
322 copyID, options | JSON_NO_NONE) == FAIL) |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
323 return FAIL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
324 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
325 ga_append(gap, '}'); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
326 d->dv_copyID = 0; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
327 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
328 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
329 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
330 |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
331 case VAR_FLOAT: |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
332 #ifdef FEAT_FLOAT |
8228
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
333 # if defined(HAVE_MATH_H) |
8275
ff900e499f79
commit https://github.com/vim/vim/commit/7ce686c990ea8c490d16be7f1c6bd95eb48816f9
Christian Brabandt <cb@256bit.org>
parents:
8230
diff
changeset
|
334 if (isnan(val->vval.v_float)) |
8228
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
335 ga_concat(gap, (char_u *)"NaN"); |
8275
ff900e499f79
commit https://github.com/vim/vim/commit/7ce686c990ea8c490d16be7f1c6bd95eb48816f9
Christian Brabandt <cb@256bit.org>
parents:
8230
diff
changeset
|
336 else if (isinf(val->vval.v_float)) |
15446
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
337 { |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
338 if (val->vval.v_float < 0.0) |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
339 ga_concat(gap, (char_u *)"-Infinity"); |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
340 else |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
341 ga_concat(gap, (char_u *)"Infinity"); |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
342 } |
8228
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
343 else |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
344 # endif |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
345 { |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
346 vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
347 val->vval.v_float); |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
348 ga_concat(gap, numbuf); |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
349 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
350 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
351 #endif |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
352 case VAR_UNKNOWN: |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10344
diff
changeset
|
353 internal_error("json_encode_item()"); |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
354 return FAIL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
355 } |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
356 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
357 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
358 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
359 /* |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
360 * When "reader" has less than NUMBUFLEN bytes available, call the fill |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
361 * callback to get more. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
362 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
363 static void |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
364 fill_numbuflen(js_read_T *reader) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
365 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
366 if (reader->js_fill != NULL && (int)(reader->js_end - reader->js_buf) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
367 - reader->js_used < NUMBUFLEN) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
368 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
369 if (reader->js_fill(reader)) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
370 reader->js_end = reader->js_buf + STRLEN(reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
371 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
372 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
373 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
374 /* |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
375 * Skip white space in "reader". All characters <= space are considered white |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
376 * space. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
377 * Also tops up readahead when needed. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
378 */ |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
379 static void |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
380 json_skip_white(js_read_T *reader) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
381 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
382 int c; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
383 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
384 for (;;) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
385 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
386 c = reader->js_buf[reader->js_used]; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
387 if (reader->js_fill != NULL && c == NUL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
388 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
389 if (reader->js_fill(reader)) |
8755
7038ec89d1fd
commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents:
8655
diff
changeset
|
390 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
391 reader->js_end = reader->js_buf + STRLEN(reader->js_buf); |
8755
7038ec89d1fd
commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents:
8655
diff
changeset
|
392 continue; |
7038ec89d1fd
commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents:
8655
diff
changeset
|
393 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
394 } |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
395 if (c == NUL || c > ' ') |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
396 break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
397 ++reader->js_used; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
398 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
399 fill_numbuflen(reader); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
400 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
401 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
402 static int |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
403 json_decode_string(js_read_T *reader, typval_T *res, int quote) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
404 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
405 garray_T ga; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
406 int len; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
407 char_u *p; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
408 int c; |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
409 varnumber_T nr; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
410 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
411 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
412 ga_init2(&ga, 1, 200); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
413 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
414 p = reader->js_buf + reader->js_used + 1; // skip over " or ' |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
415 while (*p != quote) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
416 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
417 // The JSON is always expected to be utf-8, thus use utf functions |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
418 // here. The string is converted below if needed. |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
419 if (*p == NUL || p[1] == NUL || utf_ptr2len(p) < utf_byte2len(*p)) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
420 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
421 // Not enough bytes to make a character or end of the string. Get |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
422 // more if possible. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
423 if (reader->js_fill == NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
424 break; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
425 len = (int)(reader->js_end - p); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
426 reader->js_used = (int)(p - reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
427 if (!reader->js_fill(reader)) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
428 break; // didn't get more |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
429 p = reader->js_buf + reader->js_used; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
430 reader->js_end = reader->js_buf + STRLEN(reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
431 continue; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
432 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
433 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
434 if (*p == '\\') |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
435 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
436 c = -1; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
437 switch (p[1]) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
438 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
439 case '\\': c = '\\'; break; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
440 case '"': c = '"'; break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
441 case 'b': c = BS; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
442 case 't': c = TAB; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
443 case 'n': c = NL; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
444 case 'f': c = FF; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
445 case 'r': c = CAR; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
446 case 'u': |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
447 if (reader->js_fill != NULL |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
448 && (int)(reader->js_end - p) < NUMBUFLEN) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
449 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
450 reader->js_used = (int)(p - reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
451 if (reader->js_fill(reader)) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
452 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
453 p = reader->js_buf + reader->js_used; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
454 reader->js_end = reader->js_buf |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
455 + STRLEN(reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
456 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
457 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
458 nr = 0; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
459 len = 0; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
460 vim_str2nr(p + 2, NULL, &len, |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
461 STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4, TRUE); |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
462 if (len == 0) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
463 { |
16815
6fdb0ae0cac3
patch 8.1.1409: Coverity warns for using uninitialized memory
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
464 if (res != NULL) |
6fdb0ae0cac3
patch 8.1.1409: Coverity warns for using uninitialized memory
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
465 ga_clear(&ga); |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
466 return FAIL; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
467 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
468 p += len + 2; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
469 if (0xd800 <= nr && nr <= 0xdfff |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
470 && (int)(reader->js_end - p) >= 6 |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
471 && *p == '\\' && *(p+1) == 'u') |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
472 { |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
473 varnumber_T nr2 = 0; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
474 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
475 // decode surrogate pair: \ud812\u3456 |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
476 len = 0; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
477 vim_str2nr(p + 2, NULL, &len, |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
478 STR2NR_HEX + STR2NR_FORCE, &nr2, NULL, 4, TRUE); |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
479 if (len == 0) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
480 { |
16815
6fdb0ae0cac3
patch 8.1.1409: Coverity warns for using uninitialized memory
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
481 if (res != NULL) |
6fdb0ae0cac3
patch 8.1.1409: Coverity warns for using uninitialized memory
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
482 ga_clear(&ga); |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
483 return FAIL; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
484 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
485 if (0xdc00 <= nr2 && nr2 <= 0xdfff) |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
486 { |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
487 p += len + 2; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
488 nr = (((nr - 0xd800) << 10) | |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
489 ((nr2 - 0xdc00) & 0x3ff)) + 0x10000; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
490 } |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
491 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
492 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
493 { |
8989
e600e696c0a1
commit https://github.com/vim/vim/commit/dc633cf82758f67f656cda7fa8ccc30414ee53f8
Christian Brabandt <cb@256bit.org>
parents:
8755
diff
changeset
|
494 char_u buf[NUMBUFLEN]; |
16815
6fdb0ae0cac3
patch 8.1.1409: Coverity warns for using uninitialized memory
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
495 |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
496 buf[utf_char2bytes((int)nr, buf)] = NUL; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
497 ga_concat(&ga, buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
498 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
499 break; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
500 default: |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
501 // not a special char, skip over backslash |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
502 ++p; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
503 continue; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
504 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
505 if (c > 0) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
506 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
507 p += 2; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
508 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
509 ga_append(&ga, c); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
510 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
511 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
512 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
513 { |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
514 len = utf_ptr2len(p); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
515 if (res != NULL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
516 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
517 if (ga_grow(&ga, len) == FAIL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
518 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
519 ga_clear(&ga); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
520 return FAIL; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
521 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
522 mch_memmove((char *)ga.ga_data + ga.ga_len, p, (size_t)len); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
523 ga.ga_len += len; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
524 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
525 p += len; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
526 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
527 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
528 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
529 reader->js_used = (int)(p - reader->js_buf); |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
530 if (*p == quote) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
531 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
532 ++reader->js_used; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
533 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
534 { |
8308
c1f29c1a968a
commit https://github.com/vim/vim/commit/80e78847395b5c8ada7861674774d81bd0a42789
Christian Brabandt <cb@256bit.org>
parents:
8306
diff
changeset
|
535 ga_append(&ga, NUL); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
536 res->v_type = VAR_STRING; |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
537 #if defined(USE_ICONV) |
8306
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
538 if (!enc_utf8) |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
539 { |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
540 vimconv_T conv; |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
541 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
542 // Convert the utf-8 string to 'encoding'. |
8306
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
543 conv.vc_type = CONV_NONE; |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
544 convert_setup(&conv, (char_u*)"utf-8", p_enc); |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
545 if (conv.vc_type != CONV_NONE) |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
546 { |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
547 res->vval.v_string = |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
548 string_convert(&conv, ga.ga_data, NULL); |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
549 vim_free(ga.ga_data); |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
550 } |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
551 convert_setup(&conv, NULL, NULL); |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
552 } |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
553 else |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
554 #endif |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
555 res->vval.v_string = ga.ga_data; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
556 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
557 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
558 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
559 if (res != NULL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
560 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
561 res->v_type = VAR_SPECIAL; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
562 res->vval.v_number = VVAL_NONE; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
563 ga_clear(&ga); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
564 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
565 return MAYBE; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
566 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
567 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
568 typedef enum { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
569 JSON_ARRAY, // parsing items in an array |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
570 JSON_OBJECT_KEY, // parsing key of an object |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
571 JSON_OBJECT // parsing item in an object, after the key |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
572 } json_decode_T; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
573 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
574 typedef struct { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
575 json_decode_T jd_type; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
576 typval_T jd_tv; // the list or dict |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
577 typval_T jd_key_tv; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
578 char_u *jd_key; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
579 } json_dec_item_T; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
580 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
581 /* |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
582 * Decode one item and put it in "res". If "res" is NULL only advance. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
583 * Must already have skipped white space. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
584 * |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
585 * Return FAIL for a decoding error (and give an error). |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
586 * Return MAYBE for an incomplete message. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
587 */ |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
588 static int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
589 json_decode_item(js_read_T *reader, typval_T *res, int options) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
590 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
591 char_u *p; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
592 int len; |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
593 int retval; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
594 garray_T stack; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
595 typval_T item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
596 typval_T *cur_item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
597 json_dec_item_T *top_item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
598 char_u key_buf[NUMBUFLEN]; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
599 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
600 ga_init2(&stack, sizeof(json_dec_item_T), 100); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
601 cur_item = res; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
602 init_tv(&item); |
10561
e025378406d1
patch 8.0.0170: crash in channel test
Christian Brabandt <cb@256bit.org>
parents:
10559
diff
changeset
|
603 if (res != NULL) |
e025378406d1
patch 8.0.0170: crash in channel test
Christian Brabandt <cb@256bit.org>
parents:
10559
diff
changeset
|
604 init_tv(res); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
605 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
606 fill_numbuflen(reader); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
607 p = reader->js_buf + reader->js_used; |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
608 for (;;) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
609 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
610 top_item = NULL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
611 if (stack.ga_len > 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
612 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
613 top_item = ((json_dec_item_T *)stack.ga_data) + stack.ga_len - 1; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
614 json_skip_white(reader); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
615 p = reader->js_buf + reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
616 if (*p == NUL) |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
617 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
618 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
619 if (top_item->jd_type == JSON_OBJECT) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
620 // did get the key, clear it |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
621 clear_tv(&top_item->jd_key_tv); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
622 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
623 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
624 if (top_item->jd_type == JSON_OBJECT_KEY |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
625 || top_item->jd_type == JSON_ARRAY) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
626 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
627 // Check for end of object or array. |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
628 if (*p == (top_item->jd_type == JSON_ARRAY ? ']' : '}')) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
629 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
630 ++reader->js_used; // consume the ']' or '}' |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
631 --stack.ga_len; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
632 if (stack.ga_len == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
633 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
634 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
635 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
636 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
637 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
638 cur_item = &top_item->jd_tv; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
639 goto item_end; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
640 } |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
641 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
642 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
643 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
644 if (top_item != NULL && top_item->jd_type == JSON_OBJECT_KEY |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
645 && (options & JSON_JS) |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
646 && reader->js_buf[reader->js_used] != '"' |
13456
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
647 && reader->js_buf[reader->js_used] != '\'' |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
648 && reader->js_buf[reader->js_used] != '[' |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
649 && reader->js_buf[reader->js_used] != '{') |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
650 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
651 char_u *key; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
652 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
653 // accept an object key that is not in quotes |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
654 key = p = reader->js_buf + reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
655 while (*p != NUL && *p != ':' && *p > ' ') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
656 ++p; |
10652
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
657 if (cur_item != NULL) |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
658 { |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
659 cur_item->v_type = VAR_STRING; |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
660 cur_item->vval.v_string = vim_strnsave(key, (int)(p - key)); |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
661 top_item->jd_key = cur_item->vval.v_string; |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
662 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
663 reader->js_used += (int)(p - key); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
664 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
665 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
666 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
667 switch (*p) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
668 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
669 case '[': // start of array |
13456
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
670 if (top_item && top_item->jd_type == JSON_OBJECT_KEY) |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
671 { |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
672 retval = FAIL; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
673 break; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
674 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
675 if (ga_grow(&stack, 1) == FAIL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
676 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
677 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
678 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
679 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
680 if (cur_item != NULL && rettv_list_alloc(cur_item) == FAIL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
681 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
682 cur_item->v_type = VAR_SPECIAL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
683 cur_item->vval.v_number = VVAL_NONE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
684 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
685 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
686 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
687 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
688 ++reader->js_used; // consume the '[' |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
689 top_item = ((json_dec_item_T *)stack.ga_data) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
690 + stack.ga_len; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
691 top_item->jd_type = JSON_ARRAY; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
692 ++stack.ga_len; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
693 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
694 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
695 top_item->jd_tv = *cur_item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
696 cur_item = &item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
697 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
698 continue; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
699 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
700 case '{': // start of object |
13456
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
701 if (top_item && top_item->jd_type == JSON_OBJECT_KEY) |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
702 { |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
703 retval = FAIL; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
704 break; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
705 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
706 if (ga_grow(&stack, 1) == FAIL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
707 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
708 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
709 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
710 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
711 if (cur_item != NULL && rettv_dict_alloc(cur_item) == FAIL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
712 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
713 cur_item->v_type = VAR_SPECIAL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
714 cur_item->vval.v_number = VVAL_NONE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
715 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
716 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
717 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
718 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
719 ++reader->js_used; // consume the '{' |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
720 top_item = ((json_dec_item_T *)stack.ga_data) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
721 + stack.ga_len; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
722 top_item->jd_type = JSON_OBJECT_KEY; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
723 ++stack.ga_len; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
724 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
725 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
726 top_item->jd_tv = *cur_item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
727 cur_item = &top_item->jd_key_tv; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
728 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
729 continue; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
730 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
731 case '"': // string |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
732 retval = json_decode_string(reader, cur_item, *p); |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
733 break; |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
734 |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
735 case '\'': |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
736 if (options & JSON_JS) |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
737 retval = json_decode_string(reader, cur_item, *p); |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
738 else |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
739 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
740 emsg(_(e_invarg)); |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
741 retval = FAIL; |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
742 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
743 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
744 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
745 case ',': // comma: empty item |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
746 if ((options & JSON_JS) == 0) |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
747 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
748 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
749 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
750 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
751 } |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
752 // FALLTHROUGH |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
753 case NUL: // empty |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
754 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
755 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
756 cur_item->v_type = VAR_SPECIAL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
757 cur_item->vval.v_number = VVAL_NONE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
758 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
759 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
760 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
761 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
762 default: |
15446
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
763 if (VIM_ISDIGIT(*p) || (*p == '-' && VIM_ISDIGIT(p[1]))) |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
764 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
765 #ifdef FEAT_FLOAT |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
766 char_u *sp = p; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
767 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
768 if (*sp == '-') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
769 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
770 ++sp; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
771 if (*sp == NUL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
772 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
773 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
774 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
775 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
776 if (!VIM_ISDIGIT(*sp)) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
777 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
778 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
779 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
780 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
781 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
782 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
783 sp = skipdigits(sp); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
784 if (*sp == '.' || *sp == 'e' || *sp == 'E') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
785 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
786 if (cur_item == NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
787 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
788 float_T f; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
789 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
790 len = string2float(p, &f); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
791 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
792 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
793 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
794 cur_item->v_type = VAR_FLOAT; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
795 len = string2float(p, &cur_item->vval.v_float); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
796 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
797 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
798 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
799 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
800 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
801 varnumber_T nr; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
802 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
803 vim_str2nr(reader->js_buf + reader->js_used, |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
804 NULL, &len, 0, // what |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
805 &nr, NULL, 0, TRUE); |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
806 if (len == 0) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
807 { |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
808 emsg(_(e_invarg)); |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
809 retval = FAIL; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
810 goto theend; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16306
diff
changeset
|
811 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
812 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
813 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
814 cur_item->v_type = VAR_NUMBER; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
815 cur_item->vval.v_number = nr; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
816 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
817 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
818 reader->js_used += len; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
819 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
820 break; |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
821 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
822 if (STRNICMP((char *)p, "false", 5) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
823 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
824 reader->js_used += 5; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
825 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
826 { |
19102
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
827 cur_item->v_type = VAR_BOOL; |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
828 cur_item->vval.v_number = VVAL_FALSE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
829 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
830 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
831 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
832 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
833 if (STRNICMP((char *)p, "true", 4) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
834 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
835 reader->js_used += 4; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
836 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
837 { |
19102
ba9f50bfda83
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
838 cur_item->v_type = VAR_BOOL; |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
839 cur_item->vval.v_number = VVAL_TRUE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
840 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
841 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
842 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
843 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
844 if (STRNICMP((char *)p, "null", 4) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
845 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
846 reader->js_used += 4; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
847 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
848 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
849 cur_item->v_type = VAR_SPECIAL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
850 cur_item->vval.v_number = VVAL_NULL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
851 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
852 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
853 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
854 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
855 #ifdef FEAT_FLOAT |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
856 if (STRNICMP((char *)p, "NaN", 3) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
857 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
858 reader->js_used += 3; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
859 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
860 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
861 cur_item->v_type = VAR_FLOAT; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
862 cur_item->vval.v_float = NAN; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
863 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
864 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
865 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
866 } |
15446
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
867 if (STRNICMP((char *)p, "-Infinity", 9) == 0) |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
868 { |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
869 reader->js_used += 9; |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
870 if (cur_item != NULL) |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
871 { |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
872 cur_item->v_type = VAR_FLOAT; |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
873 cur_item->vval.v_float = -INFINITY; |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
874 } |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
875 retval = OK; |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
876 break; |
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
877 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
878 if (STRNICMP((char *)p, "Infinity", 8) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
879 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
880 reader->js_used += 8; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
881 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
882 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
883 cur_item->v_type = VAR_FLOAT; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
884 cur_item->vval.v_float = INFINITY; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
885 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
886 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
887 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
888 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
889 #endif |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
890 // check for truncated name |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
891 len = (int)(reader->js_end - (reader->js_buf + reader->js_used)); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
892 if ( |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
893 (len < 5 && STRNICMP((char *)p, "false", len) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
894 #ifdef FEAT_FLOAT |
15446
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
895 || (len < 9 && STRNICMP((char *)p, "-Infinity", len) == 0) |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
896 || (len < 8 && STRNICMP((char *)p, "Infinity", len) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
897 || (len < 3 && STRNICMP((char *)p, "NaN", len) == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
898 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
899 || (len < 4 && (STRNICMP((char *)p, "true", len) == 0 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
900 || STRNICMP((char *)p, "null", len) == 0))) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
901 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
902 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
903 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
904 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
905 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
906 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
907 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
908 // We are finished when retval is FAIL or MAYBE and when at the |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
909 // toplevel. |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
910 if (retval == FAIL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
911 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
912 if (retval == MAYBE || stack.ga_len == 0) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
913 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
914 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
915 if (top_item != NULL && top_item->jd_type == JSON_OBJECT_KEY |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
916 && cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
917 { |
15211
de63593896b3
patch 8.1.0615: get_tv function names are not consistent
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
918 top_item->jd_key = tv_get_string_buf_chk(cur_item, key_buf); |
10839
287049007bbc
patch 8.0.0309: cannot use an empty key in json
Christian Brabandt <cb@256bit.org>
parents:
10652
diff
changeset
|
919 if (top_item->jd_key == NULL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
920 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
921 clear_tv(cur_item); |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
922 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
923 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
924 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
925 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
926 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
927 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
928 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
929 item_end: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
930 top_item = ((json_dec_item_T *)stack.ga_data) + stack.ga_len - 1; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
931 switch (top_item->jd_type) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
932 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
933 case JSON_ARRAY: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
934 if (res != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
935 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
936 listitem_T *li = listitem_alloc(); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
937 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
938 if (li == NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
939 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
940 clear_tv(cur_item); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
941 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
942 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
943 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
944 li->li_tv = *cur_item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
945 list_append(top_item->jd_tv.vval.v_list, li); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
946 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
947 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
948 cur_item = &item; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
949 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
950 json_skip_white(reader); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
951 p = reader->js_buf + reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
952 if (*p == ',') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
953 ++reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
954 else if (*p != ']') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
955 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
956 if (*p == NUL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
957 retval = MAYBE; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
958 else |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
959 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
960 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
961 retval = FAIL; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
962 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
963 goto theend; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
964 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
965 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
966 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
967 case JSON_OBJECT_KEY: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
968 json_skip_white(reader); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
969 p = reader->js_buf + reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
970 if (*p != ':') |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
971 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
972 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
973 clear_tv(cur_item); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
974 if (*p == NUL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
975 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
976 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
977 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
978 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
979 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
980 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
981 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
982 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
983 ++reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
984 json_skip_white(reader); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
985 top_item->jd_type = JSON_OBJECT; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
986 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
987 cur_item = &item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
988 break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
989 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
990 case JSON_OBJECT: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
991 if (cur_item != NULL |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
992 && dict_find(top_item->jd_tv.vval.v_dict, |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
993 top_item->jd_key, -1) != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
994 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
995 semsg(_("E938: Duplicate key in JSON: \"%s\""), |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
996 top_item->jd_key); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
997 clear_tv(&top_item->jd_key_tv); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
998 clear_tv(cur_item); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
999 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1000 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1001 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1002 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1003 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1004 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1005 dictitem_T *di = dictitem_alloc(top_item->jd_key); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1006 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1007 clear_tv(&top_item->jd_key_tv); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1008 if (di == NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1009 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1010 clear_tv(cur_item); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1011 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1012 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1013 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1014 di->di_tv = *cur_item; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1015 di->di_tv.v_lock = 0; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1016 if (dict_add(top_item->jd_tv.vval.v_dict, di) == FAIL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1017 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1018 dictitem_free(di); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1019 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1020 goto theend; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1021 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1022 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1023 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1024 json_skip_white(reader); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1025 p = reader->js_buf + reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1026 if (*p == ',') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1027 ++reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1028 else if (*p != '}') |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1029 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1030 if (*p == NUL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1031 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1032 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1033 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
1034 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1035 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1036 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1037 goto theend; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1038 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1039 top_item->jd_type = JSON_OBJECT_KEY; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1040 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1041 cur_item = &top_item->jd_key_tv; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1042 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1043 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1044 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1045 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
1046 // Get here when parsing failed. |
10299
7b2f95633e28
commit https://github.com/vim/vim/commit/7756e7465d627ff9cd01e59625484a8c302ef853
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
1047 if (res != NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1048 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1049 clear_tv(res); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1050 res->v_type = VAR_SPECIAL; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1051 res->vval.v_number = VVAL_NONE; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1052 } |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
1053 emsg(_(e_invarg)); |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1054 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1055 theend: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1056 ga_clear(&stack); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1057 return retval; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1058 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1059 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1060 /* |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1061 * Decode the JSON from "reader" and store the result in "res". |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1062 * "options" can be JSON_JS or zero; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1063 * Return FAIL if not the whole message was consumed. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1064 */ |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17474
diff
changeset
|
1065 static int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1066 json_decode_all(js_read_T *reader, typval_T *res, int options) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1067 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1068 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1069 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
1070 // We find the end once, to avoid calling strlen() many times. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1071 reader->js_end = reader->js_buf + STRLEN(reader->js_buf); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1072 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1073 ret = json_decode_item(reader, res, options); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1074 if (ret != OK) |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1075 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1076 if (ret == MAYBE) |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
1077 emsg(_(e_invarg)); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1078 return FAIL; |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1079 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1080 json_skip_white(reader); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1081 if (reader->js_buf[reader->js_used] != NUL) |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1082 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15454
diff
changeset
|
1083 emsg(_(e_trailing)); |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1084 return FAIL; |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1085 } |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1086 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1087 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1088 |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
1089 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1090 /* |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1091 * Decode the JSON from "reader" and store the result in "res". |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1092 * "options" can be JSON_JS or zero; |
8655
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1093 * Return FAIL for a decoding error. |
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1094 * Return MAYBE for an incomplete message. |
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1095 * Consumes the message anyway. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1096 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1097 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1098 json_decode(js_read_T *reader, typval_T *res, int options) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1099 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1100 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1101 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
1102 // We find the end once, to avoid calling strlen() many times. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1103 reader->js_end = reader->js_buf + STRLEN(reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1104 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1105 ret = json_decode_item(reader, res, options); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1106 json_skip_white(reader); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1107 |
8655
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1108 return ret; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1109 } |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
1110 #endif |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1111 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1112 /* |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1113 * Decode the JSON from "reader" to find the end of the message. |
10652
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
1114 * "options" can be JSON_JS or zero. |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
1115 * This is only used for testing. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1116 * Return FAIL if the message has a decoding error. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1117 * Return MAYBE if the message is truncated, need to read more. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1118 * This only works reliable if the message contains an object, array or |
15446
8ac454818352
patch 8.1.0731: JS encoding does not handle negative infinity
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
1119 * string. A number might be truncated without knowing. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1120 * Does not advance the reader. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1121 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1122 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1123 json_find_end(js_read_T *reader, int options) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1124 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1125 int used_save = reader->js_used; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1126 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1127 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
1128 // We find the end once, to avoid calling strlen() many times. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1129 reader->js_end = reader->js_buf + STRLEN(reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1130 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1131 ret = json_decode_item(reader, NULL, options); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1132 reader->js_used = used_save; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1133 return ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1134 } |
17472
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1135 |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1136 /* |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1137 * "js_decode()" function |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1138 */ |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1139 void |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1140 f_js_decode(typval_T *argvars, typval_T *rettv) |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1141 { |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1142 js_read_T reader; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1143 |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1144 reader.js_buf = tv_get_string(&argvars[0]); |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1145 reader.js_fill = NULL; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1146 reader.js_used = 0; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1147 if (json_decode_all(&reader, rettv, JSON_JS) != OK) |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1148 emsg(_(e_invarg)); |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1149 } |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1150 |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1151 /* |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1152 * "js_encode()" function |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1153 */ |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1154 void |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1155 f_js_encode(typval_T *argvars, typval_T *rettv) |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1156 { |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1157 rettv->v_type = VAR_STRING; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1158 rettv->vval.v_string = json_encode(&argvars[0], JSON_JS); |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1159 } |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1160 |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1161 /* |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1162 * "json_decode()" function |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1163 */ |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1164 void |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1165 f_json_decode(typval_T *argvars, typval_T *rettv) |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1166 { |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1167 js_read_T reader; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1168 |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1169 reader.js_buf = tv_get_string(&argvars[0]); |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1170 reader.js_fill = NULL; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1171 reader.js_used = 0; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1172 json_decode_all(&reader, rettv, 0); |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1173 } |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1174 |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1175 /* |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1176 * "json_encode()" function |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1177 */ |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1178 void |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1179 f_json_encode(typval_T *argvars, typval_T *rettv) |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1180 { |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1181 rettv->v_type = VAR_STRING; |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1182 rettv->vval.v_string = json_encode(&argvars[0], 0); |
dfd87ef822aa
patch 8.1.1734: the evalfunc.c file is too big
Bram Moolenaar <Bram@vim.org>
parents:
16815
diff
changeset
|
1183 } |
17474
f8c197962c1e
patch 8.1.1735: can't build with tiny features
Bram Moolenaar <Bram@vim.org>
parents:
17472
diff
changeset
|
1184 #endif |