blob: 22cd0430f2a84cfd749bb7e39a65eb94acf8569b [file] [log] [blame]
// JSON Tokenizer. Copyright (c) 2012, Rasmus Andersson. All rights reserved.
// Use of this source code is governed by a MIT-style license that can be
// found in the LICENSE file.
#ifndef JSONT_INCLUDED
#define JSONT_INCLUDED
#include <stdint.h> // uint8_t, int64_t
#include <stdlib.h> // size_t
#include <string.h> // strlen
#include <stdbool.h> // bool
#ifndef _JSONT_IN_SOURCE
typedef struct jsont_ctx jsont_ctx_t;
typedef uint8_t jsont_tok_t;
#endif
#ifndef JSONT_ERRINFO_CUSTOM
#define jsont_err_t const char*
#endif
// Token types
enum {
JSONT_END = 0, // Input ended
JSONT_ERR, // Error
JSONT_OBJECT_START, // {
JSONT_OBJECT_END, // }
JSONT_ARRAY_START, // [
JSONT_ARRAY_END, // ]
JSONT_TRUE, // true
JSONT_FALSE, // false
JSONT_NULL, // null
_JSONT_VALUES_START,
JSONT_NUMBER_INT, // number value without a fraction part
JSONT_NUMBER_FLOAT, // number value with a fraction part
JSONT_STRING, // string value
JSONT_FIELD_NAME, // field name
_JSONT_VALUES_END,
_JSONT_COMMA,
};
#ifdef __cplusplus
extern "C" {
#endif
// Create a new JSON tokenizer context. `user_data` can be anything and is
// accessible through `jsont_user_data`.
jsont_ctx_t* jsont_create(void* user_data);
// Destroy a JSON tokenizer context. This will free any internal data, except
// from the input buffer.
void jsont_destroy(jsont_ctx_t* ctx);
// Reset the tokenizer to parse the data pointed to by `bytes`. The tokenizer
// does NOT take ownership of `bytes`. This function can be used to recycle a
// tokenizer context, minimizing memory reallocation.
void jsont_reset(jsont_ctx_t* ctx, const uint8_t* bytes, size_t length);
// Read and return the next token. See `jsont_tok_t` enum for a list of
// possible return values and their meaning.
jsont_tok_t jsont_next(jsont_ctx_t* ctx);
// Returns the current token (last token read by `jsont_next`).
jsont_tok_t jsont_current(const jsont_ctx_t* ctx);
// Returns a slice of the input which represents the current value, or nothing
// (returns 0) if the current token has no value (e.g. start of an object).
size_t jsont_data_value(jsont_ctx_t* ctx, const uint8_t** bytes);
// Returns true if the current data value is equal to `bytes` of `length`
bool jsont_data_equals(jsont_ctx_t* ctx, const uint8_t* bytes, size_t length);
// Returns true if the current data value is equal to c string `str`
static inline bool jsont_str_equals(jsont_ctx_t* ctx, const char* str) {
return jsont_data_equals(ctx, (const uint8_t*)str, strlen(str));
}
// Retrieve a newly allocated c-string. Similar to `jsont_data_value` but
// returns a newly allocated copy of the current value as a C string
// (terminated by a null byte). The calling code is responsible for calling
// `free()` on the returned value.
char* jsont_strcpy_value(jsont_ctx_t* ctx);
// Returns the current integer value.If the number is too large or too small,
// this function sets errno and returns INT64_MAX or INT64_MIN.
int64_t jsont_int_value(jsont_ctx_t* ctx);
// Returns the current floating-point number value. Sets errno and returns a
// value that isnan(N)==true on error.
double jsont_float_value(jsont_ctx_t* ctx);
// Get the last byte read. Suitable for debugging JSONT_ERR.
uint8_t jsont_current_byte(jsont_ctx_t* ctx);
// Get the current offset of the last byte read.
size_t jsont_current_offset(jsont_ctx_t* ctx);
// Get information on the last error (by default a printable text message).
// Returns NULL if no error has occured since a call to `jsont_reset`.
jsont_err_t jsont_error_info(jsont_ctx_t* ctx);
// Returns the value passed to `jsont_create`.
void* jsont_user_data(const jsont_ctx_t* ctx);
// ----------------- C++ -----------------
#ifdef __cplusplus
} // extern "C"
#endif
#endif // JSONT_INCLUDED