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