| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| #ifndef OPENTITAN_SW_DEVICE_LIB_UJSON_UJSON_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_UJSON_UJSON_H_ |
| #include <stdint.h> |
| |
| #include "sw/device/lib/base/status.h" |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * Input/Output context for ujson. |
| */ |
| typedef struct ujson { |
| /** A generic pointer holding context for the IO routines. */ |
| void *io_context; |
| /** A pointer to an IO function for writing data to the output. */ |
| status_t (*putbuf)(void *, const char *, size_t); |
| /** A pointer to an IO function for reading data from the input. */ |
| status_t (*getc)(void *); |
| /** An internal single character buffer for ungetting a character. */ |
| int16_t buffer; |
| } ujson_t; |
| |
| // clang-format off |
| #define UJSON_INIT(context_, getc_, putbuf_) \ |
| { \ |
| .io_context = (void*)(context_), \ |
| .putbuf_ = (putbuf_), \ |
| .getc = (getc_), \ |
| .buffer = -1, \ |
| } |
| // clang-format on |
| |
| /** |
| * Initializes and returns a ujson context. |
| * |
| * @param context An IO context for the `getc` and `putbuf` functions. |
| * @param getc A function to read a character from the input. |
| * @param putbuf A function to write a buffer to the output. |
| * @return An initialized ujson_t context. |
| */ |
| ujson_t ujson_init(void *context, status_t (*getc)(void *), |
| status_t (*putbuf)(void *, const char *, size_t)); |
| |
| /** |
| * Gets a single character from the input. |
| * |
| * @param uj A ujson IO context. |
| * @return The next character or an error. |
| */ |
| status_t ujson_getc(ujson_t *uj); |
| |
| /** |
| * Pushes a single character back to the input. |
| * |
| * @param uj A ujson IO context. |
| * @param ch The character to put back to the input buffer. |
| * @return OK or an error. |
| */ |
| status_t ujson_ungetc(ujson_t *uj, char ch); |
| |
| /** |
| * Writes a buffer to the output. |
| * |
| * @param uj A ujson IO context. |
| * @param buf The buffer to write to the output. |
| * @param len The length of the buffer. |
| * @return OK or an error. |
| */ |
| status_t ujson_putbuf(ujson_t *uj, const char *buf, size_t len); |
| |
| /** |
| * Compares two strings for equality. |
| * |
| * @param a A string. |
| * @param b A string. |
| * @return true of the strings are equal; false otherwise. |
| */ |
| bool ujson_streq(const char *a, const char *b); |
| |
| /** |
| * Consumes a character from the input. |
| * |
| * Consume all whitespace until a non-whitespace character is found. |
| * The non-whitespace character must be `ch`. |
| * |
| * @param uj A ujson IO context. |
| * @param ch The character to consume. |
| * @return OK or an error. |
| */ |
| status_t ujson_consume(ujson_t *uj, char ch); |
| |
| /** |
| * Find and consume a character from the input. |
| * |
| * Consume all whitespace until a non-whitespace character is found. |
| * If the character is `ch`, return OK(1). |
| * If the character is not `ch`, unget the character and return OK(0). |
| * |
| * @param uj A ujson IO context. |
| * @param ch The character to consume. |
| * @return OK or an error. |
| */ |
| status_t ujson_consume_maybe(ujson_t *uj, char ch); |
| |
| /** |
| * Parse a JSON quoted string. |
| * |
| * Consume whitespace until finding a double-quote. Consume all characters |
| * (obeying json escape sequences) until the next double-quote. If the |
| * input string exceeds the length of the user buffer, the the user |
| * buffer will contain a truncated string and the entire input json string |
| * will be consumed. |
| * |
| * @param uj A ujson IO context. |
| * @param str A buffer to write the string into. |
| * @param len The length of the target buffer. |
| * @return OK or an error. |
| */ |
| status_t ujson_parse_qs(ujson_t *uj, char *str, size_t len); |
| |
| /** |
| * Parse a JSON integer. |
| * |
| * @param uj A ujson IO context. |
| * @param result: The parsed integer. |
| * @param rsz: The size of the integer (in bytes). |
| * @return OK or an error. |
| */ |
| status_t ujson_parse_integer(ujson_t *uj, void *result, size_t rsz); |
| |
| /** |
| * The following functions parse integers of specific sizes. |
| */ |
| status_t ujson_deserialize_uint64_t(ujson_t *uj, uint64_t *value); |
| status_t ujson_deserialize_uint32_t(ujson_t *uj, uint32_t *value); |
| status_t ujson_deserialize_uint16_t(ujson_t *uj, uint16_t *value); |
| status_t ujson_deserialize_uint8_t(ujson_t *uj, uint8_t *value); |
| status_t ujson_deserialize_size_t(ujson_t *uj, size_t *value); |
| status_t ujson_deserialize_int64_t(ujson_t *uj, int64_t *value); |
| status_t ujson_deserialize_int32_t(ujson_t *uj, int32_t *value); |
| status_t ujson_deserialize_int16_t(ujson_t *uj, int16_t *value); |
| status_t ujson_deserialize_int8_t(ujson_t *uj, int8_t *value); |
| |
| /** |
| * Deserialize a boolean. |
| * |
| * @param uj A ujson IO context. |
| * @param value Pointer to the value to deserialize into. |
| * @return OK or an error. |
| */ |
| status_t ujson_deserialize_bool(ujson_t *uj, bool *value); |
| |
| /** |
| * Deserialize a status_t. |
| * |
| * @param uj A ujson IO context. |
| * @param value Pointer to the value to deserialize into. |
| * @return OK or an error. |
| */ |
| status_t ujson_deserialize_status_t(ujson_t *uj, status_t *value); |
| |
| /** |
| * Serialize a string. |
| * |
| * @param uj A ujson IO context. |
| * @param buf The string to serialize. |
| * @return OK or an error. |
| */ |
| status_t ujson_serialize_string(ujson_t *uj, const char *buf); |
| |
| /** |
| * Serialize an integer. |
| * |
| * @param uj A ujson IO context. |
| * @param value A pointer to the integer to serialize. |
| * @return OK or an error. |
| */ |
| status_t ujson_serialize_uint64_t(ujson_t *uj, const uint64_t *value); |
| status_t ujson_serialize_uint32_t(ujson_t *uj, const uint32_t *value); |
| status_t ujson_serialize_uint16_t(ujson_t *uj, const uint16_t *value); |
| status_t ujson_serialize_uint8_t(ujson_t *uj, const uint8_t *value); |
| status_t ujson_serialize_size_t(ujson_t *uj, const size_t *value); |
| status_t ujson_serialize_int64_t(ujson_t *uj, const int64_t *value); |
| status_t ujson_serialize_int32_t(ujson_t *uj, const int32_t *value); |
| status_t ujson_serialize_int16_t(ujson_t *uj, const int16_t *value); |
| status_t ujson_serialize_int8_t(ujson_t *uj, const int8_t *value); |
| |
| /** |
| * Serialize a boolean. |
| * |
| * @param uj A ujson IO context. |
| * @param value Pointer to the value to serialize. |
| * @return OK or an error. |
| */ |
| status_t ujson_serialize_bool(ujson_t *uj, const bool *value); |
| |
| /** |
| * Serialize a status_t. |
| * |
| * @param uj A ujson IO context. |
| * @param value Pointer to the value to serialize. |
| * @return OK or an error. |
| */ |
| status_t ujson_serialize_status_t(ujson_t *uj, const status_t *value); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif // OPENTITAN_SW_DEVICE_LIB_UJSON_UJSON_H_ |