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