xref: /netbsd-src/external/bsd/ntp/dist/libjsmn/jsmn.h (revision cdfa2a7ef92791ba9db70a584a1d904730e6fb46)
1*cdfa2a7eSchristos /*	$NetBSD: jsmn.h,v 1.5 2020/05/25 20:47:24 christos Exp $	*/
2b8ecfcfeSchristos 
3b8ecfcfeSchristos #ifndef __JSMN_H_
4b8ecfcfeSchristos #define __JSMN_H_
5b8ecfcfeSchristos 
65d681e99Schristos #include <stddef.h>
75d681e99Schristos 
85d681e99Schristos #ifdef __cplusplus
95d681e99Schristos extern "C" {
105d681e99Schristos #endif
115d681e99Schristos 
12b8ecfcfeSchristos /**
13b8ecfcfeSchristos  * JSON type identifier. Basic types are:
14b8ecfcfeSchristos  * 	o Object
15b8ecfcfeSchristos  * 	o Array
16b8ecfcfeSchristos  * 	o String
17b8ecfcfeSchristos  * 	o Other primitive: number, boolean (true/false) or null
18b8ecfcfeSchristos  */
19b8ecfcfeSchristos typedef enum {
20b8ecfcfeSchristos 	JSMN_PRIMITIVE = 0,
21b8ecfcfeSchristos 	JSMN_OBJECT = 1,
22b8ecfcfeSchristos 	JSMN_ARRAY = 2,
23b8ecfcfeSchristos 	JSMN_STRING = 3
24b8ecfcfeSchristos } jsmntype_t;
25b8ecfcfeSchristos 
26b8ecfcfeSchristos typedef enum {
27b8ecfcfeSchristos 	/* Not enough tokens were provided */
28b8ecfcfeSchristos 	JSMN_ERROR_NOMEM = -1,
29b8ecfcfeSchristos 	/* Invalid character inside JSON string */
30b8ecfcfeSchristos 	JSMN_ERROR_INVAL = -2,
31b8ecfcfeSchristos 	/* The string is not a full JSON packet, more bytes expected */
325d681e99Schristos 	JSMN_ERROR_PART = -3
33b8ecfcfeSchristos } jsmnerr_t;
34b8ecfcfeSchristos 
35b8ecfcfeSchristos /**
36b8ecfcfeSchristos  * JSON token description.
37b8ecfcfeSchristos  * @param		type	type (object, array, string etc.)
38b8ecfcfeSchristos  * @param		start	start position in JSON data string
39b8ecfcfeSchristos  * @param		end		end position in JSON data string
40b8ecfcfeSchristos  */
41b8ecfcfeSchristos typedef struct {
42b8ecfcfeSchristos 	jsmntype_t type;
43b8ecfcfeSchristos 	int start;
44b8ecfcfeSchristos 	int end;
45b8ecfcfeSchristos 	int size;
46b8ecfcfeSchristos #ifdef JSMN_PARENT_LINKS
47b8ecfcfeSchristos 	int parent;
48b8ecfcfeSchristos #endif
49b8ecfcfeSchristos } jsmntok_t;
50b8ecfcfeSchristos 
51b8ecfcfeSchristos /**
52b8ecfcfeSchristos  * JSON parser. Contains an array of token blocks available. Also stores
53b8ecfcfeSchristos  * the string being parsed now and current position in that string
54b8ecfcfeSchristos  */
55b8ecfcfeSchristos typedef struct {
56b8ecfcfeSchristos 	unsigned int pos; /* offset in the JSON string */
575d681e99Schristos 	unsigned int toknext; /* next token to allocate */
58b8ecfcfeSchristos 	int toksuper; /* superior token node, e.g parent object or array */
59b8ecfcfeSchristos } jsmn_parser;
60b8ecfcfeSchristos 
61b8ecfcfeSchristos /**
62b8ecfcfeSchristos  * Create JSON parser over an array of tokens
63b8ecfcfeSchristos  */
64b8ecfcfeSchristos void jsmn_init(jsmn_parser *parser);
65b8ecfcfeSchristos 
66b8ecfcfeSchristos /**
67b8ecfcfeSchristos  * Run JSON parser. It parses a JSON data string into and array of tokens, each describing
68b8ecfcfeSchristos  * a single JSON object.
69b8ecfcfeSchristos  */
705d681e99Schristos jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
71b8ecfcfeSchristos 		jsmntok_t *tokens, unsigned int num_tokens);
72b8ecfcfeSchristos 
735d681e99Schristos #ifdef __cplusplus
745d681e99Schristos }
755d681e99Schristos #endif
765d681e99Schristos 
77b8ecfcfeSchristos #endif /* __JSMN_H_ */
78