blob: 1934cf3bf2d8be21987c5c682723d14ef9ec18ad [file] [log] [blame]
/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __JSON_H
#define __JSON_H
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
enum json_tokens {
JSON_TOK_NONE = '_',
JSON_TOK_OBJECT_START = '{',
JSON_TOK_OBJECT_END = '}',
JSON_TOK_STRING = '"',
JSON_TOK_COLON = ':',
JSON_TOK_COMMA = ',',
JSON_TOK_NUMBER = '0',
JSON_TOK_TRUE = 't',
JSON_TOK_FALSE = 'f',
JSON_TOK_NULL = 'n',
JSON_TOK_ERROR = '!',
JSON_TOK_EOF = '\0',
};
struct json_obj_descr {
const char *field_name;
size_t field_name_len;
size_t offset;
/* Valid values here: JSON_TOK_STRING, JSON_TOK_NUMBER,
* JSON_TOK_TRUE, JSON_TOK_FALSE. (All others ignored.)
*/
enum json_tokens type;
};
/**
* @brief Parses the JSON-encoded object pointer to by @param json, with
* size @param len, according to the descriptor pointed to by @param descr.
* Values are stored in a struct pointed to by @param val. Set up the
* descriptor like this:
*
* struct s { int foo; char *bar; }
* struct json_obj_descr descr[] = {
* { .field_name = "foo",
* .field_name_len = 3,
* .offset = offsetof(struct s, foo),
* .type = JSON_TOK_NUMBER },
* { .field_name = "bar",
* .field_name_len = 3,
* .offset = offsetof(struct s, bar),
* .type = JSON_TOK_STRING }
* };
*
* Since this parser is designed for machine-to-machine communications,
* some liberties were taken to simplify the design: (1) strings are not
* unescaped; (2) no UTF-8 validation is performed; (3) only integer
* numbers are supported; (4) nested objects are not supported, including
* arrays and objects within objects.
*
* @param json Pointer to JSON-encoded value to be parsed
*
* @param len Length of JSON-encoded value
*
* @param descr Pointer to the descriptor array
*
* @param descr_len Number of elements in the descriptor array. Must be less
* than 31 due to implementation detail reasons (if more fields are
* necessary, use two descriptors)
*
* @param val Pointer to the struct to hold the decoded values
*
* @return < 0 if error, bitmap of decoded fields on success (bit 0
* is set if first field in the descriptor has been properly decoded, etc).
*/
int json_obj_parse(char *json, size_t len,
const struct json_obj_descr *descr, size_t descr_len,
void *val);
/**
* @brief Escapes the string so it can be used to encode JSON objects
*
* @param str The string to escape; the escape string is stored the
* buffer pointed to by this parameter
*
* @param len Points to a size_t containing the size before and after
* the escaping process
*
* @param buf_size The size of buffer str points to
*
* @return 0 if string has been escaped properly, or -ENOMEM if there
* was not enough space to escape the buffer
*/
ssize_t json_escape(char *str, size_t *len, size_t buf_size);
/**
* @brief Calculates the JSON-escaped string length
*
* @param str The string to analyze
*
* @param len String size
*
* @return The length str would have if it were escaped
*/
size_t json_calc_escaped_len(const char *str, size_t len);
#endif /* __JSON_H */