Mercurial > vim
annotate src/json.c @ 10629:16fc46021e51 v8.0.0204
patch 8.0.0204: compiler warns for uninitialized variable
commit https://github.com/vim/vim/commit/eb46f8fa14a586779f55b1c7f1648f559618322e
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jan 17 19:48:53 2017 +0100
patch 8.0.0204: compiler warns for uninitialized variable
Problem: Compiler warns for uninitialized variable. (Tony Mechelynck)
Solution: When skipping set "id" to -1.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 17 Jan 2017 20:00:04 +0100 |
parents | dffda1f9b501 |
children | bb4360d64eb2 |
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) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
95 ga_concat(gap, (char_u *)"null"); |
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", |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
8989
diff
changeset
|
220 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) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
240 ga_concat(gap, (char_u *)"null"); |
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) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
275 ga_concat(gap, (char_u *)"null"); |
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] != '"' |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
624 && 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
|
625 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
626 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
|
627 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
628 /* 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
|
629 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
|
630 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
|
631 ++p; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
632 cur_item->v_type = VAR_STRING; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
633 cur_item->vval.v_string = vim_strnsave(key, (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
|
634 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
|
635 top_item->jd_key = cur_item->vval.v_string; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
636 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
637 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
638 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
639 switch (*p) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
640 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
641 case '[': /* start of array */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
642 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
|
643 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
644 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
645 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
646 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
647 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
|
648 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
649 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
|
650 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
|
651 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
652 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
653 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
654 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
655 ++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
|
656 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
|
657 + 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
|
658 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
|
659 ++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
|
660 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
|
661 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
662 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
|
663 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
|
664 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
665 continue; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
666 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
667 case '{': /* start of object */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
668 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
|
669 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
670 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
671 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
672 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
673 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
|
674 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
675 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
|
676 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
|
677 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
678 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
679 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
680 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
681 ++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
|
682 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
|
683 + 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
|
684 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
|
685 ++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
|
686 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
|
687 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
688 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
|
689 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
|
690 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
691 continue; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
692 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
693 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
|
694 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
|
695 break; |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
696 |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
697 case '\'': |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
698 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
|
699 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
|
700 else |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
701 { |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
702 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
|
703 retval = FAIL; |
bac9cec298ed
patch 8.0.0171: JS style JSON does not support single quotes
Christian Brabandt <cb@256bit.org>
parents:
10561
diff
changeset
|
704 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
705 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
706 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
707 case ',': /* 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
|
708 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
|
709 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
710 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
|
711 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
712 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
713 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
714 /* FALLTHROUGH */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
715 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
|
716 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
|
717 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
718 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
|
719 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
|
720 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
721 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
722 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
723 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
724 default: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
725 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
|
726 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
727 #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
|
728 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
|
729 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
730 if (*sp == '-') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
731 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
732 ++sp; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
733 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
|
734 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
735 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
736 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
737 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
738 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
|
739 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
740 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
|
741 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
742 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
743 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
744 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
745 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
|
746 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
|
747 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
748 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
|
749 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
750 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
|
751 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
752 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
|
753 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
754 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
755 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
756 cur_item->v_type = VAR_FLOAT; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
757 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
|
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 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
761 #endif |
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 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
|
764 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
765 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
|
766 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
|
767 &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
|
768 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
|
769 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
770 cur_item->v_type = VAR_NUMBER; |
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->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
|
772 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
773 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
774 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
|
775 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
776 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
|
777 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
778 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
|
779 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
780 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
|
781 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
|
782 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
783 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
|
784 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
|
785 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
786 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
787 break; |
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 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
|
790 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
791 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
|
792 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
|
793 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
794 cur_item->v_type = VAR_SPECIAL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
795 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
|
796 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
797 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
798 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
799 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
800 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
|
801 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
802 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
|
803 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
|
804 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
805 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
|
806 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
|
807 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
808 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
809 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
810 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
811 #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
|
812 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
|
813 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
814 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
|
815 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
|
816 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
817 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
|
818 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
|
819 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
820 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
821 break; |
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 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
|
824 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
825 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
|
826 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
|
827 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
828 cur_item->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
|
829 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
|
830 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
831 retval = OK; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
832 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
833 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
834 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
835 /* 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
|
836 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
|
837 if ( |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
838 (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
|
839 #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
|
840 || (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
|
841 || (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
|
842 #endif |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
843 || (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
|
844 || 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
|
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 = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
847 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
848 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
849 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
850 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
851 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
852 /* 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
|
853 * toplevel. */ |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
854 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
|
855 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
856 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
|
857 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
858 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
859 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
|
860 && 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
|
861 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
862 top_item->jd_key = get_tv_string_buf_chk(cur_item, key_buf); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
863 if (top_item->jd_key == NULL || *top_item->jd_key == NUL) |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
864 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
865 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
|
866 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
|
867 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
868 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
869 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
870 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
871 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
872 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
873 item_end: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
874 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
|
875 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
|
876 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
877 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
|
878 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
|
879 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
880 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
|
881 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
882 if (li == NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
883 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
884 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
|
885 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
886 goto theend; |
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 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
|
889 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
|
890 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
891 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
|
892 cur_item = &item; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
893 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
894 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
|
895 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
|
896 if (*p == ',') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
897 ++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
|
898 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
|
899 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
900 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
|
901 retval = MAYBE; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
902 else |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
903 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
904 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
|
905 retval = FAIL; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
906 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
907 goto theend; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
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 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
910 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
911 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
|
912 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
|
913 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
|
914 if (*p != ':') |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
915 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
916 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
|
917 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
|
918 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
|
919 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
920 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
921 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
922 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
|
923 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
924 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
925 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
926 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
927 ++reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
928 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
|
929 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
|
930 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
931 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
|
932 break; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
933 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
934 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
|
935 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
|
936 && 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
|
937 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
|
938 { |
10581
dffda1f9b501
patch 8.0.0180: error E937 is used twice
Christian Brabandt <cb@256bit.org>
parents:
10563
diff
changeset
|
939 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
|
940 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
|
941 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
|
942 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
|
943 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
944 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
945 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
946 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
947 if (cur_item != NULL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
948 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
949 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
|
950 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
951 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
|
952 if (di == NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
953 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
954 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
|
955 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
956 goto theend; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
957 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
958 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
|
959 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
|
960 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
|
961 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
962 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
|
963 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
964 goto theend; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
965 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
966 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
967 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
968 json_skip_white(reader); |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
969 p = reader->js_buf + reader->js_used; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
970 if (*p == ',') |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
971 ++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
|
972 else if (*p != '}') |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
973 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
974 if (*p == NUL) |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
975 retval = MAYBE; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
976 else |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
977 { |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
978 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
|
979 retval = FAIL; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
980 } |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
981 goto theend; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
982 } |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
983 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
|
984 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
|
985 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
|
986 break; |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
987 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
988 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
989 |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
990 /* Get here when parsing failed. */ |
10299
7b2f95633e28
commit https://github.com/vim/vim/commit/7756e7465d627ff9cd01e59625484a8c302ef853
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
991 if (res != NULL) |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
992 { |
10559
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
993 clear_tv(res); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
994 res->v_type = VAR_SPECIAL; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
995 res->vval.v_number = VVAL_NONE; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
996 } |
10553
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
997 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
|
998 |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
999 theend: |
4d8be28b5913
patch 8.0.0169: json_decode() may run out of stack space
Christian Brabandt <cb@256bit.org>
parents:
10553
diff
changeset
|
1000 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
|
1001 return retval; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1002 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1003 |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1004 /* |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1005 * 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
|
1006 * "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
|
1007 * 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
|
1008 */ |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1009 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1010 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
|
1011 { |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1012 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1013 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1014 /* 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
|
1015 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
|
1016 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1017 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
|
1018 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
|
1019 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1020 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
|
1021 EMSG(_(e_invarg)); |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1022 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
|
1023 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1024 json_skip_white(reader); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1025 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
|
1026 { |
f83b6a0b6148
patch 8.0.0166: JSON with a duplicate key gives an internal error
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
1027 EMSG(_(e_trailing)); |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1028 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
|
1029 } |
7868
17e6ff1a74f1
commit https://github.com/vim/vim/commit/19d2f1589850d7db1ce77efec052929246f156e2
Christian Brabandt <cb@256bit.org>
parents:
7864
diff
changeset
|
1030 return OK; |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1031 } |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1032 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1033 /* |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1034 * 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
|
1035 * "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
|
1036 * Return FAIL for a decoding error. |
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1037 * Return MAYBE for an incomplete message. |
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1038 * Consumes the message anyway. |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1039 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1040 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1041 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
|
1042 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1043 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1044 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1045 /* 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
|
1046 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
|
1047 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1048 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
|
1049 json_skip_white(reader); |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1050 |
8655
1eb302bf2475
commit https://github.com/vim/vim/commit/ba61ac0d61f46de7d29c64bb0de6d25c2e378be0
Christian Brabandt <cb@256bit.org>
parents:
8538
diff
changeset
|
1051 return ret; |
7883
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1052 } |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1053 |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1054 /* |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1055 * Decode the JSON from "reader" to find the end of the message. |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1056 * "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
|
1057 * 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
|
1058 * 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
|
1059 * 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
|
1060 * 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
|
1061 * Does not advance the reader. |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1062 */ |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1063 int |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1064 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
|
1065 { |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1066 int used_save = reader->js_used; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1067 int ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1068 |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1069 /* 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
|
1070 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
|
1071 json_skip_white(reader); |
7967
45ea5ebf3a98
commit https://github.com/vim/vim/commit/595e64e259faefb330866852e1b9f6168544572a
Christian Brabandt <cb@256bit.org>
parents:
7965
diff
changeset
|
1072 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
|
1073 reader->js_used = used_save; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1074 return ret; |
98a96e0ca73b
commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e
Christian Brabandt <cb@256bit.org>
parents:
7868
diff
changeset
|
1075 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
diff
changeset
|
1076 #endif |