127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#ifndef __JSMN_H_ 227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#define __JSMN_H_ 327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#ifdef __cplusplus 527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongextern "C" { 627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#endif 727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong/** 927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * JSON type identifier. Basic types are: 1027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * o Object 1127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * o Array 1227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * o String 1327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * o Other primitive: number, boolean (true/false) or null 1427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong */ 1527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongtypedef enum { 1627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_PRIMITIVE = 0, 1727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_OBJECT = 1, 1827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_ARRAY = 2, 1927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_STRING = 3 2027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong} jsmntype_t; 2127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 2227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongtypedef enum { 2327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong /* Not enough tokens were provided */ 2427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_ERROR_NOMEM = -1, 2527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong /* Invalid character inside JSON string */ 2627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_ERROR_INVAL = -2, 2727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong /* The string is not a full JSON packet, more bytes expected */ 2827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong JSMN_ERROR_PART = -3, 2927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong} jsmnerr_t; 3027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 3127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong/** 3227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * JSON token description. 3327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * @param type type (object, array, string etc.) 3427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * @param start start position in JSON data string 3527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * @param end end position in JSON data string 3627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong */ 3727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongtypedef struct { 3827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong jsmntype_t type; 3927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong int start; 4027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong int end; 4127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong int size; 4227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#ifdef JSMN_PARENT_LINKS 4327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong int parent; 4427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#endif 4527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong} jsmntok_t; 4627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 4727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong/** 4827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * JSON parser. Contains an array of token blocks available. Also stores 4927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * the string being parsed now and current position in that string 5027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong */ 5127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongtypedef struct { 5227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong unsigned int pos; /* offset in the JSON string */ 5327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong unsigned int toknext; /* next token to allocate */ 5427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong int toksuper; /* superior token node, e.g parent object or array */ 5527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong} jsmn_parser; 5627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 5727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong/** 5827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * Create JSON parser over an array of tokens 5927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong */ 6027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongvoid jsmn_init(jsmn_parser *parser); 6127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 6227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong/** 6327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * Run JSON parser. It parses a JSON data string into and array of tokens, each describing 6427b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong * a single JSON object. 6527b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong */ 6627b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wongjsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, 6727b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong jsmntok_t *tokens, unsigned int num_tokens); 6827b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 6927b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#ifdef __cplusplus 7027b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong} 7127b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#endif 7227b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong 7327b5a35db0630b86791fa037a12da7b37c2aab49Edwin Wong#endif /* __JSMN_H_ */ 74