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