Download
jcs
/wikipedia
/pdjson.h
(View History)
jcs pdjson: Remove, no longer needed | Latest amendment: 34 on 2022-09-07 |
1 | /* |
2 | * This is free and unencumbered software released into the public domain. |
3 | * |
4 | * Anyone is free to copy, modify, publish, use, compile, sell, or |
5 | * distribute this software, either in source code form or as a compiled |
6 | * binary, for any purpose, commercial or non-commercial, and by any |
7 | * means. |
8 | * |
9 | * In jurisdictions that recognize copyright laws, the author or authors |
10 | * of this software dedicate any and all copyright interest in the |
11 | * software to the public domain. We make this dedication for the benefit |
12 | * of the public at large and to the detriment of our heirs and |
13 | * successors. We intend this dedication to be an overt act of |
14 | * relinquishment in perpetuity of all present and future rights to this |
15 | * software under copyright law. |
16 | * |
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
20 | * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
23 | * OTHER DEALINGS IN THE SOFTWARE. |
24 | * |
25 | * For more information, please refer to <http://unlicense.org/> |
26 | */ |
27 | |
28 | #ifndef PDJSON_H |
29 | #define PDJSON_H |
30 | |
31 | #include <stdio.h> |
32 | #include "util.h" |
33 | |
34 | #define PDJSON_STACK_MAX 20 |
35 | |
36 | enum json_type { |
37 | JSON_ERROR = 1, JSON_DONE, |
38 | JSON_OBJECT, JSON_OBJECT_END, JSON_ARRAY, JSON_ARRAY_END, |
39 | JSON_STRING, JSON_NUMBER, JSON_TRUE, JSON_FALSE, JSON_NULL |
40 | }; |
41 | |
42 | extern const char *json_typename[]; |
43 | |
44 | struct json_allocator { |
45 | void *(*malloc)(size_t); |
46 | void *(*realloc)(void *, size_t); |
47 | void (*free)(void *); |
48 | }; |
49 | |
50 | typedef short (*json_user_io)(void *user); |
51 | |
52 | typedef struct json_stream json_stream; |
53 | typedef struct json_allocator json_allocator; |
54 | |
55 | void json_open_buffer(json_stream *json, const void *buffer, size_t size); |
56 | void json_open_string(json_stream *json, const char *string); |
57 | void json_open_stream(json_stream *json, FILE *stream); |
58 | void json_open_user(json_stream *json, json_user_io get, json_user_io peek, |
59 | void *user); |
60 | void json_close(json_stream *json); |
61 | |
62 | void json_set_allocator(json_stream *json, json_allocator *a); |
63 | void json_set_streaming(json_stream *json, bool mode); |
64 | |
65 | enum json_type json_next(json_stream *json); |
66 | enum json_type json_peek(json_stream *json); |
67 | void json_reset(json_stream *json); |
68 | const char *json_get_string(json_stream *json, size_t *length); |
69 | double json_get_number(json_stream *json); |
70 | |
71 | enum json_type json_skip(json_stream *json); |
72 | enum json_type json_skip_until(json_stream *json, enum json_type type); |
73 | |
74 | size_t json_get_lineno(json_stream *json); |
75 | size_t json_get_position(json_stream *json); |
76 | size_t json_get_depth(json_stream *json); |
77 | enum json_type json_get_context(json_stream *json, size_t *count); |
78 | const char *json_get_error(json_stream *json); |
79 | |
80 | short json_source_get(json_stream *json); |
81 | short json_source_peek(json_stream *json); |
82 | bool json_isspace(short c); |
83 | |
84 | /* internal */ |
85 | |
86 | struct json_source { |
87 | short (*get)(struct json_source *); |
88 | short (*peek)(struct json_source *); |
89 | size_t position; |
90 | union { |
91 | struct { |
92 | FILE *stream; |
93 | } stream; |
94 | struct { |
95 | const char *buffer; |
96 | size_t length; |
97 | } buffer; |
98 | struct { |
99 | void *ptr; |
100 | json_user_io get; |
101 | json_user_io peek; |
102 | } user; |
103 | } source; |
104 | }; |
105 | |
106 | struct json_stream { |
107 | size_t lineno; |
108 | |
109 | struct json_stack *stack; |
110 | size_t stack_top; |
111 | size_t stack_size; |
112 | enum json_type next; |
113 | unsigned flags; |
114 | |
115 | struct { |
116 | char *string; |
117 | size_t string_fill; |
118 | size_t string_size; |
119 | } data; |
120 | |
121 | size_t ntokens; |
122 | |
123 | struct json_source source; |
124 | struct json_allocator alloc; |
125 | char errmsg[128]; |
126 | }; |
127 | |
128 | #endif |