Mercurial > vim
annotate src/json.c @ 15003:bd0d66403ac4
Added tag v8.1.0512 for changeset 9ae60773dd035818d2d378a7a2d5a14c93003557
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 05 Nov 2018 20:30:09 +0100 |
parents | 27b9a84395b5 |
children | de63593896b3 |
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 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
51 /* Store bytes in the growarray. */ |
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); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
54 return ga.ga_data; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
55 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
56 |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
57 /* |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
58 * 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
|
59 * "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
|
60 * Returns NULL when out of memory. |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
61 */ |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
62 char_u * |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
63 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
|
64 { |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
65 typval_T listtv; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
66 typval_T nrtv; |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
67 garray_T ga; |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
68 |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
69 nrtv.v_type = VAR_NUMBER; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
70 nrtv.vval.v_number = nr; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
71 if (rettv_list_alloc(&listtv) == FAIL) |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
72 return NULL; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
73 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
|
74 || 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
|
75 { |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
76 list_unref(listtv.vval.v_list); |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
77 return NULL; |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
78 } |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
79 |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
80 ga_init2(&ga, 1, 4000); |
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
81 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
|
82 ga_append(&ga, '\n'); |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
83 list_unref(listtv.vval.v_list); |
9969
176e34b0d678
commit https://github.com/vim/vim/commit/f1f0792e55e72cdc7c833b30f565a9b02f18bb1e
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
84 return ga.ga_data; |
7864
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
85 } |
6b0891de44a9
commit https://github.com/vim/vim/commit/fb1f62691eae7c79a28b3b17a60e72ce198c71a2
Christian Brabandt <cb@256bit.org>
parents:
7791
diff
changeset
|
86 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
87 static void |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
88 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
|
89 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
90 char_u *res = str; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
91 char_u numbuf[NUMBUFLEN]; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
92 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
93 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
|
94 ga_concat(gap, (char_u *)"\"\""); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
95 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
96 { |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
97 #if defined(FEAT_MBYTE) && defined(USE_ICONV) |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
98 vimconv_T conv; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
99 char_u *converted = NULL; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
100 |
8293
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
101 if (!enc_utf8) |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
102 { |
8306
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
103 /* Convert the text from 'encoding' to utf-8, the JSON string is |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
104 * always utf-8. */ |
8293
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
105 conv.vc_type = CONV_NONE; |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
106 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
|
107 if (conv.vc_type != CONV_NONE) |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
108 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
|
109 convert_setup(&conv, NULL, NULL); |
367a7fed630b
commit https://github.com/vim/vim/commit/f97ddbeb255c64a2b3d9db4b049278cd286070a6
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
110 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
111 #endif |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
112 ga_append(gap, '"'); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
113 while (*res != NUL) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
114 { |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
115 int c; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
116 #ifdef FEAT_MBYTE |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
117 /* always use utf-8 encoding, ignore 'encoding' */ |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
118 c = utf_ptr2char(res); |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
119 #else |
8304
097886a3379b
commit https://github.com/vim/vim/commit/0f526f5652e0a5432493b3f2a1cb34ab99a9da0a
Christian Brabandt <cb@256bit.org>
parents:
8295
diff
changeset
|
120 c = *res; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
121 #endif |
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; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
135 case 0x22: /* " */ |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
136 case 0x5c: /* \ */ |
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 { |
7791
6f81cf49da14
commit https://github.com/vim/vim/commit/fa06a517b5d5e37f40ab7c884bd334f089988fac
Christian Brabandt <cb@256bit.org>
parents:
7782
diff
changeset
|
143 #ifdef FEAT_MBYTE |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
144 numbuf[utf_char2bytes(c, numbuf)] = NUL; |
7791
6f81cf49da14
commit https://github.com/vim/vim/commit/fa06a517b5d5e37f40ab7c884bd334f089988fac
Christian Brabandt <cb@256bit.org>
parents:
7782
diff
changeset
|
145 #else |
6f81cf49da14
commit https://github.com/vim/vim/commit/fa06a517b5d5e37f40ab7c884bd334f089988fac
Christian Brabandt <cb@256bit.org>
parents:
7782
diff
changeset
|
146 numbuf[0] = c; |
6f81cf49da14
commit https://github.com/vim/vim/commit/fa06a517b5d5e37f40ab7c884bd334f089988fac
Christian Brabandt <cb@256bit.org>
parents:
7782
diff
changeset
|
147 numbuf[1] = NUL; |
6f81cf49da14
commit https://github.com/vim/vim/commit/fa06a517b5d5e37f40ab7c884bd334f089988fac
Christian Brabandt <cb@256bit.org>
parents:
7782
diff
changeset
|
148 #endif |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
149 ga_concat(gap, numbuf); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
150 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
151 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
152 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
153 vim_snprintf((char *)numbuf, NUMBUFLEN, |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
154 "\\u%04lx", (long)c); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
155 ga_concat(gap, numbuf); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
156 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
157 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
158 #ifdef FEAT_MBYTE |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
159 res += utf_ptr2len(res); |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
160 #else |
8304
097886a3379b
commit https://github.com/vim/vim/commit/0f526f5652e0a5432493b3f2a1cb34ab99a9da0a
Christian Brabandt <cb@256bit.org>
parents:
8295
diff
changeset
|
161 ++res; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
162 #endif |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
163 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
164 ga_append(gap, '"'); |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
165 #if defined(FEAT_MBYTE) && defined(USE_ICONV) |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
166 vim_free(converted); |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
167 #endif |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
168 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
169 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
170 |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
171 /* |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
172 * 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
|
173 * 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
|
174 * underscore. |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
175 */ |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
176 static int |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
177 is_simple_key(char_u *key) |
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 char_u *p; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
180 |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
181 if (!ASCII_ISALPHA(*key)) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
182 return FALSE; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
183 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
|
184 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
|
185 return FALSE; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
186 return TRUE; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
187 } |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
188 |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
189 /* |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
190 * Encode "val" into "gap". |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
191 * Return FAIL or OK. |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
192 */ |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
193 static int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
194 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
|
195 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
196 char_u numbuf[NUMBUFLEN]; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
197 char_u *res; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
198 list_T *l; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
199 dict_T *d; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
200 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
201 switch (val->v_type) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
202 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
203 case VAR_SPECIAL: |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
204 switch (val->vval.v_number) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
205 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
206 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
|
207 case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break; |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
208 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
|
209 && (options & JSON_NO_NONE) == 0) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
210 /* empty item */ |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
211 break; |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
212 /* FALLTHROUGH */ |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
213 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
|
214 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
215 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
216 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
217 case VAR_NUMBER: |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
218 vim_snprintf((char *)numbuf, NUMBUFLEN, "%lld", |
13610
e76499e85744
patch 8.0.1677: no compiler warning for wrong format in vim_snprintf()
Christian Brabandt <cb@256bit.org>
parents:
13456
diff
changeset
|
219 (long long)val->vval.v_number); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
220 ga_concat(gap, numbuf); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
221 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
222 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
223 case VAR_STRING: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
224 res = val->vval.v_string; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
225 write_string(gap, res); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
226 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
227 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
228 case VAR_FUNC: |
8538
c337c813c64d
commit https://github.com/vim/vim/commit/1735bc988c546cc962c5f94792815b4d7cb79710
Christian Brabandt <cb@256bit.org>
parents:
8414
diff
changeset
|
229 case VAR_PARTIAL: |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
230 case VAR_JOB: |
8041
c6443e78cf2d
commit https://github.com/vim/vim/commit/7707344ddec9069b495b2a5ed41f2104466fc88b
Christian Brabandt <cb@256bit.org>
parents:
7967
diff
changeset
|
231 case VAR_CHANNEL: |
7947
b2922673917a
commit https://github.com/vim/vim/commit/4f8b8faec31a934920a723053e8dcf47b6fac08c
Christian Brabandt <cb@256bit.org>
parents:
7931
diff
changeset
|
232 /* no JSON equivalent TODO: better error */ |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
233 EMSG(_(e_invarg)); |
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
234 return FAIL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
235 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
236 case VAR_LIST: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
237 l = val->vval.v_list; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
238 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
|
239 ga_concat(gap, (char_u *)"[]"); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
240 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
241 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
242 if (l->lv_copyID == copyID) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
243 ga_concat(gap, (char_u *)"[]"); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
244 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
245 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
246 listitem_T *li; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
247 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
248 l->lv_copyID = copyID; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
249 ga_append(gap, '['); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
250 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
|
251 { |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
252 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
|
253 options & JSON_JS) == FAIL) |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
254 return FAIL; |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
255 if ((options & JSON_JS) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
256 && li->li_next == NULL |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
257 && 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
|
258 && li->li_tv.vval.v_number == VVAL_NONE) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
259 /* add an extra comma if the last item is v:none */ |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
260 ga_append(gap, ','); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
261 li = li->li_next; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
262 if (li != NULL) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
263 ga_append(gap, ','); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
264 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
265 ga_append(gap, ']'); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
266 l->lv_copyID = 0; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
267 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
268 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
269 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
270 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
271 case VAR_DICT: |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
272 d = val->vval.v_dict; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
273 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
|
274 ga_concat(gap, (char_u *)"{}"); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
275 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
276 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
277 if (d->dv_copyID == copyID) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
278 ga_concat(gap, (char_u *)"{}"); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
279 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
280 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
281 int first = TRUE; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
282 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
|
283 hashitem_T *hi; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
284 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
285 d->dv_copyID = copyID; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
286 ga_append(gap, '{'); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
287 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
288 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
|
289 ++hi) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
290 if (!HASHITEM_EMPTY(hi)) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
291 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
292 --todo; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
293 if (first) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
294 first = FALSE; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
295 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
296 ga_append(gap, ','); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
297 if ((options & JSON_JS) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
298 && is_simple_key(hi->hi_key)) |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
299 ga_concat(gap, hi->hi_key); |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
300 else |
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
301 write_string(gap, hi->hi_key); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
302 ga_append(gap, ':'); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
303 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
|
304 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
|
305 return FAIL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
306 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
307 ga_append(gap, '}'); |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
308 d->dv_copyID = 0; |
7712
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 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
311 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
312 |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
313 case VAR_FLOAT: |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
314 #ifdef FEAT_FLOAT |
8228
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
315 # if defined(HAVE_MATH_H) |
8275
ff900e499f79
commit https://github.com/vim/vim/commit/7ce686c990ea8c490d16be7f1c6bd95eb48816f9
Christian Brabandt <cb@256bit.org>
parents:
8230
diff
changeset
|
316 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
|
317 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
|
318 else if (isinf(val->vval.v_float)) |
8228
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
319 ga_concat(gap, (char_u *)"Infinity"); |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
320 else |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
321 # endif |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
322 { |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
323 vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
324 val->vval.v_float); |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
325 ga_concat(gap, numbuf); |
a0e552c51c34
commit https://github.com/vim/vim/commit/f1b6ac72293e658bb6e68c5cfd926c405b1b6f34
Christian Brabandt <cb@256bit.org>
parents:
8146
diff
changeset
|
326 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
327 break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
328 #endif |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
329 case VAR_UNKNOWN: |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10344
diff
changeset
|
330 internal_error("json_encode_item()"); |
7965
646d5148fee2
commit https://github.com/vim/vim/commit/55fab439a6f3bba6dbe780ac034b84d5822a1a96
Christian Brabandt <cb@256bit.org>
parents:
7947
diff
changeset
|
331 return FAIL; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
332 } |
7736
f2ddad8cbce7
commit https://github.com/vim/vim/commit/fcaaae6b3fdbf3421a1ff95a25ae16d82381c39a
Christian Brabandt <cb@256bit.org>
parents:
7732
diff
changeset
|
333 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
334 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
335 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
336 /* |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
337 * 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
|
338 * callback to get more. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
339 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
340 static void |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
341 fill_numbuflen(js_read_T *reader) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
342 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
343 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
|
344 - reader->js_used < NUMBUFLEN) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
345 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
346 if (reader->js_fill(reader)) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
347 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
|
348 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
349 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
350 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
351 /* |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
352 * 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
|
353 * space. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
354 * Also tops up readahead when needed. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
355 */ |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
356 static void |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
357 json_skip_white(js_read_T *reader) |
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 int c; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
360 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
361 for (;;) |
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 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
|
364 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
|
365 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
366 if (reader->js_fill(reader)) |
8755
7038ec89d1fd
commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents:
8655
diff
changeset
|
367 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
368 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
|
369 continue; |
7038ec89d1fd
commit https://github.com/vim/vim/commit/46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee
Christian Brabandt <cb@256bit.org>
parents:
8655
diff
changeset
|
370 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
371 } |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
372 if (c == NUL || c > ' ') |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
373 break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
374 ++reader->js_used; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
375 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
376 fill_numbuflen(reader); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
377 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
378 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
379 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
|
380 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
|
381 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
382 garray_T ga; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
383 int len; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
384 char_u *p; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
385 int c; |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
386 varnumber_T nr; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
387 |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
388 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
389 ga_init2(&ga, 1, 200); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
390 |
10563
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
391 p = reader->js_buf + reader->js_used + 1; /* skip over " or ' */ |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
392 while (*p != quote) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
393 { |
8306
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
394 /* The JSON is always expected to be utf-8, thus use utf functions |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
395 * here. The string is converted below if needed. */ |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
396 if (*p == NUL || p[1] == NUL |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
397 #ifdef FEAT_MBYTE |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
398 || utf_ptr2len(p) < utf_byte2len(*p) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
399 #endif |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
400 ) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
401 { |
8306
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
402 /* Not enough bytes to make a character or end of the string. Get |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
403 * more if possible. */ |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
404 if (reader->js_fill == NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
405 break; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
406 len = (int)(reader->js_end - p); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
407 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
|
408 if (!reader->js_fill(reader)) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
409 break; /* didn't get more */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
410 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
|
411 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
|
412 continue; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
413 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
414 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
415 if (*p == '\\') |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
416 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
417 c = -1; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
418 switch (p[1]) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
419 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
420 case '\\': c = '\\'; break; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
421 case '"': c = '"'; break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
422 case 'b': c = BS; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
423 case 't': c = TAB; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
424 case 'n': c = NL; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
425 case 'f': c = FF; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
426 case 'r': c = CAR; break; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
427 case 'u': |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
428 if (reader->js_fill != NULL |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
429 && (int)(reader->js_end - p) < NUMBUFLEN) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
430 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
431 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
|
432 if (reader->js_fill(reader)) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
433 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
434 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
|
435 reader->js_end = reader->js_buf |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
436 + STRLEN(reader->js_buf); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
437 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
438 } |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
439 nr = 0; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
440 len = 0; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
441 vim_str2nr(p + 2, NULL, &len, |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
442 STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
443 p += len + 2; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
444 if (0xd800 <= nr && nr <= 0xdfff |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
445 && (int)(reader->js_end - p) >= 6 |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
446 && *p == '\\' && *(p+1) == 'u') |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
447 { |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
448 varnumber_T nr2 = 0; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
449 |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
450 /* decode surrogate pair: \ud812\u3456 */ |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
451 len = 0; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
452 vim_str2nr(p + 2, NULL, &len, |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
453 STR2NR_HEX + STR2NR_FORCE, &nr2, NULL, 4); |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
454 if (0xdc00 <= nr2 && nr2 <= 0xdfff) |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
455 { |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
456 p += len + 2; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
457 nr = (((nr - 0xd800) << 10) | |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
458 ((nr2 - 0xdc00) & 0x3ff)) + 0x10000; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
459 } |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
460 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
461 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
462 { |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
463 #ifdef FEAT_MBYTE |
8989
e600e696c0a1
commit https://github.com/vim/vim/commit/dc633cf82758f67f656cda7fa8ccc30414ee53f8
Christian Brabandt <cb@256bit.org>
parents:
8755
diff
changeset
|
464 char_u buf[NUMBUFLEN]; |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
465 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
|
466 ga_concat(&ga, buf); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
467 #else |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
468 ga_append(&ga, (int)nr); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
469 #endif |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
470 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
471 break; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
472 default: |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
473 /* not a special char, skip over \ */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
474 ++p; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
475 continue; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
476 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
477 if (c > 0) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
478 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
479 p += 2; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
480 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
481 ga_append(&ga, c); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
482 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
483 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
484 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
485 { |
8283
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
486 #ifdef FEAT_MBYTE |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
487 len = utf_ptr2len(p); |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
488 #else |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
489 len = 1; |
b8a56d4d83e0
commit https://github.com/vim/vim/commit/b6ff81188d27fae774d9ad2dfb498f596d697d4b
Christian Brabandt <cb@256bit.org>
parents:
8275
diff
changeset
|
490 #endif |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
491 if (res != NULL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
492 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
493 if (ga_grow(&ga, len) == FAIL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
494 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
495 ga_clear(&ga); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
496 return FAIL; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
497 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
498 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
|
499 ga.ga_len += len; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
500 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
501 p += len; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
502 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
503 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
504 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
505 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
|
506 if (*p == quote) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
507 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
508 ++reader->js_used; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
509 if (res != NULL) |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
510 { |
8308
c1f29c1a968a
commit https://github.com/vim/vim/commit/80e78847395b5c8ada7861674774d81bd0a42789
Christian Brabandt <cb@256bit.org>
parents:
8306
diff
changeset
|
511 ga_append(&ga, NUL); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
512 res->v_type = VAR_STRING; |
8306
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
513 #if defined(FEAT_MBYTE) && defined(USE_ICONV) |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
514 if (!enc_utf8) |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
515 { |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
516 vimconv_T conv; |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
517 |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
518 /* Convert the utf-8 string to 'encoding'. */ |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
519 conv.vc_type = CONV_NONE; |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
520 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
|
521 if (conv.vc_type != CONV_NONE) |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
522 { |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
523 res->vval.v_string = |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
524 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
|
525 vim_free(ga.ga_data); |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
526 } |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
527 convert_setup(&conv, NULL, NULL); |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
528 } |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
529 else |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
530 #endif |
7fcf3f6020c1
commit https://github.com/vim/vim/commit/b36287283781e09d8874157b9d9bdc5243a2f319
Christian Brabandt <cb@256bit.org>
parents:
8304
diff
changeset
|
531 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
|
532 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
533 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
534 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
535 if (res != NULL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
536 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
537 res->v_type = VAR_SPECIAL; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
538 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
|
539 ga_clear(&ga); |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
540 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
541 return MAYBE; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
542 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
543 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
544 typedef enum { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
545 JSON_ARRAY, /* parsing items in an array */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
546 JSON_OBJECT_KEY, /* parsing key of an object */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
547 JSON_OBJECT /* parsing item in an object, after the key */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
548 } 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
|
549 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
550 typedef struct { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
551 json_decode_T jd_type; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
552 typval_T jd_tv; /* the list or dict */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
553 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
|
554 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
|
555 } 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
|
556 |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
557 /* |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
558 * 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
|
559 * 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
|
560 * |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
561 * 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
|
562 * Return MAYBE for an incomplete message. |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
563 */ |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
564 static int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
565 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
|
566 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
567 char_u *p; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
568 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
|
569 int retval; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
570 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
|
571 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
|
572 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
|
573 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
|
574 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
|
575 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
576 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
|
577 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
|
578 init_tv(&item); |
10561
e025378406d1
patch 8.0.0170: crash in channel test
Christian Brabandt <cb@256bit.org>
parents:
10559
diff
changeset
|
579 if (res != NULL) |
e025378406d1
patch 8.0.0170: crash in channel test
Christian Brabandt <cb@256bit.org>
parents:
10559
diff
changeset
|
580 init_tv(res); |
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 fill_numbuflen(reader); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
583 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
|
584 for (;;) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
585 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
586 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
|
587 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
|
588 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
589 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
|
590 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
|
591 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
|
592 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
|
593 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
594 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
595 if (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
|
596 /* did get the key, clear it */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
597 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
|
598 goto theend; |
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 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
|
601 || 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
|
602 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
603 /* Check for end of object or array. */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
604 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
|
605 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
606 ++reader->js_used; /* consume the ']' or '}' */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
607 --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
|
608 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
|
609 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
610 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
611 goto theend; |
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 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
|
614 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
|
615 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
|
616 } |
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 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
619 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
620 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
|
621 && (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
|
622 && 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
|
623 && reader->js_buf[reader->js_used] != '\'' |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
624 && reader->js_buf[reader->js_used] != '[' |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
625 && 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
|
626 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
627 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
|
628 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
629 /* accept an object key that is not in quotes */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
630 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
|
631 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
|
632 ++p; |
10652
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
633 if (cur_item != NULL) |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
634 { |
bb4360d64eb2
patch 8.0.0216: decoding js style json may fail
Christian Brabandt <cb@256bit.org>
parents:
10581
diff
changeset
|
635 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
|
636 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
|
637 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
|
638 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
639 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
|
640 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
641 else |
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 switch (*p) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
644 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
645 case '[': /* start of array */ |
13456
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
646 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
|
647 { |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
648 retval = FAIL; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
649 break; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
650 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
651 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
|
652 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
653 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
654 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
655 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
656 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
|
657 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
658 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
|
659 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
|
660 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
661 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
662 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
663 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
664 ++reader->js_used; /* consume the '[' */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
665 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
|
666 + 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
|
667 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
|
668 ++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
|
669 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
|
670 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
671 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
|
672 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
|
673 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
674 continue; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
675 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
676 case '{': /* start of object */ |
13456
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
677 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
|
678 { |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
679 retval = FAIL; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
680 break; |
7495e3ee1a69
patch 8.0.1602: crash in parsing JSON
Christian Brabandt <cb@256bit.org>
parents:
13031
diff
changeset
|
681 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
682 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
|
683 { |
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 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
687 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
|
688 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
689 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
|
690 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
|
691 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
692 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
693 } |
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 ++reader->js_used; /* consume the '{' */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
696 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
|
697 + 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
|
698 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
|
699 ++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
|
700 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
|
701 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
702 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
|
703 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
|
704 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
705 continue; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
706 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
707 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
|
708 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
|
709 break; |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
710 |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
711 case '\'': |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
712 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
|
713 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
|
714 else |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
715 { |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
716 EMSG(_(e_invarg)); |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
717 retval = FAIL; |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
718 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
719 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
720 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
721 case ',': /* comma: empty item */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
722 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
|
723 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
724 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
|
725 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
726 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
727 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
728 /* FALLTHROUGH */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
729 case NUL: /* empty */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
730 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
|
731 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
732 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
|
733 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
|
734 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
735 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
736 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
737 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
738 default: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
739 if (VIM_ISDIGIT(*p) || *p == '-') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
740 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
741 #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
|
742 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
|
743 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
744 if (*sp == '-') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
745 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
746 ++sp; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
747 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
|
748 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
749 retval = MAYBE; |
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 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
752 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
|
753 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
754 EMSG(_(e_invarg)); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
755 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
756 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
757 } |
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 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
|
760 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
|
761 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
762 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
|
763 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
764 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
|
765 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
766 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
|
767 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
768 else |
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 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
|
771 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
|
772 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
773 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
774 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
775 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
776 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
777 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
|
778 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
779 vim_str2nr(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
|
780 NULL, &len, 0, /* what */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
781 &nr, NULL, 0); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
782 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
|
783 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
784 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
|
785 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
|
786 } |
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 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
|
789 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
790 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
|
791 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
792 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
|
793 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
794 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
|
795 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
|
796 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
797 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
|
798 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
|
799 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
800 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
801 break; |
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 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
|
804 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
805 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
|
806 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
|
807 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
808 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
|
809 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
|
810 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
811 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
812 break; |
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 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
|
815 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
816 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
|
817 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
|
818 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
819 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
|
820 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
|
821 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
822 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
823 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
824 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
825 #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
|
826 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
|
827 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
828 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
|
829 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
|
830 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
831 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
|
832 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
|
833 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
834 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
835 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
836 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
837 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
|
838 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
839 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
|
840 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
|
841 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
842 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
|
843 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
|
844 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
845 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
846 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
847 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
848 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
849 /* check for truncated name */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
850 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
|
851 if ( |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
852 (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
|
853 #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
|
854 || (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
|
855 || (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
|
856 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
857 || (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
|
858 || 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
|
859 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
860 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
861 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
862 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
863 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
864 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
865 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
866 /* We are finished when retval is FAIL or MAYBE and when at the |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
867 * toplevel. */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
868 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
|
869 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
870 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
|
871 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
872 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
873 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
|
874 && 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
|
875 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
876 top_item->jd_key = get_tv_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
|
877 if (top_item->jd_key == NULL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
878 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
879 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
|
880 EMSG(_(e_invarg)); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
881 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
882 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
883 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
884 } |
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 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
887 item_end: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
888 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
|
889 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
|
890 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
891 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
|
892 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
|
893 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
894 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
|
895 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
896 if (li == NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
897 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
898 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
|
899 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
900 goto theend; |
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 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
|
903 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
|
904 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
905 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
|
906 cur_item = &item; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
907 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
908 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
|
909 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
|
910 if (*p == ',') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
911 ++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
|
912 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
|
913 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
914 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
|
915 retval = MAYBE; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
916 else |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
917 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
918 EMSG(_(e_invarg)); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
919 retval = FAIL; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
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 goto theend; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
922 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
923 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
924 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
925 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
|
926 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
|
927 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
|
928 if (*p != ':') |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
929 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
930 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
|
931 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
|
932 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
|
933 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
934 else |
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 EMSG(_(e_invarg)); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
937 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
938 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
939 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
940 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
941 ++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
|
942 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
|
943 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
|
944 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
|
945 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
|
946 break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
947 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
948 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
|
949 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
|
950 && 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
|
951 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
|
952 { |
10581
dffda1f9b501
patch 8.0.0180: error E937 is used twice
Christian Brabandt <cb@256bit.org>
parents:
10563
diff
changeset
|
953 EMSG2(_("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
|
954 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
|
955 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
|
956 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
|
957 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
958 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
959 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
960 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
961 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
|
962 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
963 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
|
964 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
965 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
|
966 if (di == NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
967 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
968 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
|
969 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
970 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
971 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
972 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
|
973 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
|
974 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
|
975 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
976 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
|
977 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
978 goto theend; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
979 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
980 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
981 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
982 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
|
983 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
|
984 if (*p == ',') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
985 ++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
|
986 else if (*p != '}') |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
987 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
988 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
|
989 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
990 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
991 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
992 EMSG(_(e_invarg)); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
993 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
994 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
995 goto theend; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
996 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
997 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
|
998 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
|
999 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
|
1000 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1001 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1002 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1003 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1004 /* Get here when parsing failed. */ |
10299
7b2f95633e28
commit https://github.com/vim/vim/commit/7756e7465d627ff9cd01e59625484a8c302ef853
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
1005 if (res != NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1006 { |
10559
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(res); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1008 res->v_type = VAR_SPECIAL; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1009 res->vval.v_number = VVAL_NONE; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1010 } |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1011 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
|
1012 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1013 theend: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1014 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
|
1015 return retval; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1016 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1017 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1018 /* |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1019 * 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
|
1020 * "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
|
1021 * 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
|
1022 */ |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1023 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1024 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
|
1025 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1026 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1027 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1028 /* 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
|
1029 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
|
1030 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1031 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
|
1032 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
|
1033 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1034 if (ret == MAYBE) |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1035 EMSG(_(e_invarg)); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1036 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
|
1037 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1038 json_skip_white(reader); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1039 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
|
1040 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1041 EMSG(_(e_trailing)); |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1042 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
|
1043 } |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1044 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1045 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1046 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1047 /* |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1048 * 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
|
1049 * "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
|
1050 * Return FAIL for a decoding error. |
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1051 * Return MAYBE for an incomplete message. |
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1052 * Consumes the message anyway. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1053 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1054 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1055 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
|
1056 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1057 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1058 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1059 /* 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
|
1060 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
|
1061 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1062 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
|
1063 json_skip_white(reader); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1064 |
8655
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1065 return ret; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1066 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1067 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1068 /* |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1069 * 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
|
1070 * "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
|
1071 * 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
|
1072 * 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
|
1073 * 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
|
1074 * This only works reliable if the message contains an object, array or |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1075 * string. A number might be trucated without knowing. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1076 * Does not advance the reader. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1077 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1078 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1079 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
|
1080 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1081 int used_save = reader->js_used; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1082 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1083 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1084 /* 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
|
1085 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
|
1086 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1087 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
|
1088 reader->js_used = used_save; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1089 return ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1090 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1091 #endif |