Andrew Reed
/
CITY1082-i2c_master_wifi_mqtt
CITY3032-wifi-mqtt
connectivity-utilities/JSON_parser/cy_json_parser.h@5:f62a9e4a499a, 2021-11-13 (annotated)
- Committer:
- reedas
- Date:
- Sat Nov 13 12:02:49 2021 +0000
- Revision:
- 5:f62a9e4a499a
- Parent:
- 4:7ebc3d28bcb2
trying to include mbed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
reedas | 4:7ebc3d28bcb2 | 1 | /* |
reedas | 4:7ebc3d28bcb2 | 2 | * Copyright 2019-2021, Cypress Semiconductor Corporation (an Infineon company) or |
reedas | 4:7ebc3d28bcb2 | 3 | * an affiliate of Cypress Semiconductor Corporation. All rights reserved. |
reedas | 4:7ebc3d28bcb2 | 4 | * |
reedas | 4:7ebc3d28bcb2 | 5 | * This software, including source code, documentation and related |
reedas | 4:7ebc3d28bcb2 | 6 | * materials ("Software") is owned by Cypress Semiconductor Corporation |
reedas | 4:7ebc3d28bcb2 | 7 | * or one of its affiliates ("Cypress") and is protected by and subject to |
reedas | 4:7ebc3d28bcb2 | 8 | * worldwide patent protection (United States and foreign), |
reedas | 4:7ebc3d28bcb2 | 9 | * United States copyright laws and international treaty provisions. |
reedas | 4:7ebc3d28bcb2 | 10 | * Therefore, you may use this Software only as provided in the license |
reedas | 4:7ebc3d28bcb2 | 11 | * agreement accompanying the software package from which you |
reedas | 4:7ebc3d28bcb2 | 12 | * obtained this Software ("EULA"). |
reedas | 4:7ebc3d28bcb2 | 13 | * If no EULA applies, Cypress hereby grants you a personal, non-exclusive, |
reedas | 4:7ebc3d28bcb2 | 14 | * non-transferable license to copy, modify, and compile the Software |
reedas | 4:7ebc3d28bcb2 | 15 | * source code solely for use in connection with Cypress's |
reedas | 4:7ebc3d28bcb2 | 16 | * integrated circuit products. Any reproduction, modification, translation, |
reedas | 4:7ebc3d28bcb2 | 17 | * compilation, or representation of this Software except as specified |
reedas | 4:7ebc3d28bcb2 | 18 | * above is prohibited without the express written permission of Cypress. |
reedas | 4:7ebc3d28bcb2 | 19 | * |
reedas | 4:7ebc3d28bcb2 | 20 | * Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, |
reedas | 4:7ebc3d28bcb2 | 21 | * EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED |
reedas | 4:7ebc3d28bcb2 | 22 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress |
reedas | 4:7ebc3d28bcb2 | 23 | * reserves the right to make changes to the Software without notice. Cypress |
reedas | 4:7ebc3d28bcb2 | 24 | * does not assume any liability arising out of the application or use of the |
reedas | 4:7ebc3d28bcb2 | 25 | * Software or any product or circuit described in the Software. Cypress does |
reedas | 4:7ebc3d28bcb2 | 26 | * not authorize its products for use in any products where a malfunction or |
reedas | 4:7ebc3d28bcb2 | 27 | * failure of the Cypress product may reasonably be expected to result in |
reedas | 4:7ebc3d28bcb2 | 28 | * significant property damage, injury or death ("High Risk Product"). By |
reedas | 4:7ebc3d28bcb2 | 29 | * including Cypress's product in a High Risk Product, the manufacturer |
reedas | 4:7ebc3d28bcb2 | 30 | * of such system or application assumes all risk of such use and in doing |
reedas | 4:7ebc3d28bcb2 | 31 | * so agrees to indemnify Cypress against all liability. |
reedas | 4:7ebc3d28bcb2 | 32 | */ |
reedas | 4:7ebc3d28bcb2 | 33 | /** |
reedas | 4:7ebc3d28bcb2 | 34 | * @file |
reedas | 4:7ebc3d28bcb2 | 35 | * The JSON parser utility library provides helper functions to parse JSON objects |
reedas | 4:7ebc3d28bcb2 | 36 | */ |
reedas | 4:7ebc3d28bcb2 | 37 | #pragma once |
reedas | 4:7ebc3d28bcb2 | 38 | |
reedas | 4:7ebc3d28bcb2 | 39 | #include <stdint.h> |
reedas | 4:7ebc3d28bcb2 | 40 | #include <stdbool.h> |
reedas | 4:7ebc3d28bcb2 | 41 | #include "cy_result_mw.h" |
reedas | 4:7ebc3d28bcb2 | 42 | |
reedas | 4:7ebc3d28bcb2 | 43 | #ifdef __cplusplus |
reedas | 4:7ebc3d28bcb2 | 44 | extern "C" { |
reedas | 4:7ebc3d28bcb2 | 45 | #endif |
reedas | 4:7ebc3d28bcb2 | 46 | |
reedas | 4:7ebc3d28bcb2 | 47 | /** |
reedas | 4:7ebc3d28bcb2 | 48 | * |
reedas | 4:7ebc3d28bcb2 | 49 | * @addtogroup json_utils |
reedas | 4:7ebc3d28bcb2 | 50 | * |
reedas | 4:7ebc3d28bcb2 | 51 | * The JSON format is often used for serializing and transmitting structured data over a network connection. |
reedas | 4:7ebc3d28bcb2 | 52 | * It is used primarily to transmit data between a server and web application, serving as an alternative to XML. |
reedas | 4:7ebc3d28bcb2 | 53 | * JSON is JavaScript Object Notation. The JSON parser utility library provides helper functions to parse JSON objects and |
reedas | 4:7ebc3d28bcb2 | 54 | * calls the function registered by the caller |
reedas | 4:7ebc3d28bcb2 | 55 | * |
reedas | 4:7ebc3d28bcb2 | 56 | */ |
reedas | 4:7ebc3d28bcb2 | 57 | /****************************************************** |
reedas | 4:7ebc3d28bcb2 | 58 | * Macros |
reedas | 4:7ebc3d28bcb2 | 59 | ******************************************************/ |
reedas | 4:7ebc3d28bcb2 | 60 | |
reedas | 4:7ebc3d28bcb2 | 61 | /****************************************************** |
reedas | 4:7ebc3d28bcb2 | 62 | * Constants |
reedas | 4:7ebc3d28bcb2 | 63 | ******************************************************/ |
reedas | 4:7ebc3d28bcb2 | 64 | /** Results returned by JSON library */ |
reedas | 4:7ebc3d28bcb2 | 65 | #define CY_RSLT_MODULE_JSON_ERR_CODE_START (0) /** JSON parser result code base */ |
reedas | 4:7ebc3d28bcb2 | 66 | #define CY_RSLT_JSON_ERROR_BASE CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_JSON_BASE, CY_RSLT_MODULE_JSON_ERR_CODE_START) |
reedas | 4:7ebc3d28bcb2 | 67 | |
reedas | 4:7ebc3d28bcb2 | 68 | #define CY_RSLT_JSON_GENERIC_ERROR ((cy_rslt_t)(CY_RSLT_JSON_ERROR_BASE + 1)) /** JSON parser generic error result */ |
reedas | 4:7ebc3d28bcb2 | 69 | |
reedas | 4:7ebc3d28bcb2 | 70 | #define OBJECT_START_TOKEN '{' |
reedas | 4:7ebc3d28bcb2 | 71 | #define OBJECT_END_TOKEN '}' |
reedas | 4:7ebc3d28bcb2 | 72 | |
reedas | 4:7ebc3d28bcb2 | 73 | #define ARRAY_START_TOKEN '[' |
reedas | 4:7ebc3d28bcb2 | 74 | #define ARRAY_END_TOKEN ']' |
reedas | 4:7ebc3d28bcb2 | 75 | |
reedas | 4:7ebc3d28bcb2 | 76 | #define STRING_TOKEN '"' |
reedas | 4:7ebc3d28bcb2 | 77 | |
reedas | 4:7ebc3d28bcb2 | 78 | #define START_OF_VALUE ':' |
reedas | 4:7ebc3d28bcb2 | 79 | |
reedas | 4:7ebc3d28bcb2 | 80 | #define COMMA_SEPARATOR ',' |
reedas | 4:7ebc3d28bcb2 | 81 | |
reedas | 4:7ebc3d28bcb2 | 82 | #define ESCAPE_TOKEN '\\' |
reedas | 4:7ebc3d28bcb2 | 83 | |
reedas | 4:7ebc3d28bcb2 | 84 | #define TRUE_TOKEN 't' |
reedas | 4:7ebc3d28bcb2 | 85 | |
reedas | 4:7ebc3d28bcb2 | 86 | #define FALSE_TOKEN 'f' |
reedas | 4:7ebc3d28bcb2 | 87 | |
reedas | 4:7ebc3d28bcb2 | 88 | #define NULL_TOKEN 'n' |
reedas | 4:7ebc3d28bcb2 | 89 | |
reedas | 4:7ebc3d28bcb2 | 90 | /****************************************************** |
reedas | 4:7ebc3d28bcb2 | 91 | * Enumerations |
reedas | 4:7ebc3d28bcb2 | 92 | ******************************************************/ |
reedas | 4:7ebc3d28bcb2 | 93 | /******************************************************************************/ |
reedas | 4:7ebc3d28bcb2 | 94 | /** \addtogroup group_json_enums |
reedas | 4:7ebc3d28bcb2 | 95 | * Documentation of all the enums provided by JSON parser utility library. |
reedas | 4:7ebc3d28bcb2 | 96 | *//** \{ */ |
reedas | 4:7ebc3d28bcb2 | 97 | /******************************************************************************/ |
reedas | 4:7ebc3d28bcb2 | 98 | |
reedas | 4:7ebc3d28bcb2 | 99 | /** JSON data types */ |
reedas | 4:7ebc3d28bcb2 | 100 | typedef enum |
reedas | 4:7ebc3d28bcb2 | 101 | { |
reedas | 4:7ebc3d28bcb2 | 102 | JSON_STRING_TYPE, /**< JSON string datatype */ |
reedas | 4:7ebc3d28bcb2 | 103 | JSON_NUMBER_TYPE, /**< JSON integer datatype */ |
reedas | 4:7ebc3d28bcb2 | 104 | JSON_VALUE_TYPE, /**< JSON value datatype. |
reedas | 4:7ebc3d28bcb2 | 105 | **< This type is deprecated and it will be removed in the future release. |
reedas | 4:7ebc3d28bcb2 | 106 | */ |
reedas | 4:7ebc3d28bcb2 | 107 | JSON_FLOAT_TYPE, /**< JSON float datatype */ |
reedas | 4:7ebc3d28bcb2 | 108 | JSON_ARRAY_TYPE, /**< JSON array datatype */ |
reedas | 4:7ebc3d28bcb2 | 109 | JSON_OBJECT_TYPE, /**< JSON object */ |
reedas | 4:7ebc3d28bcb2 | 110 | JSON_BOOLEAN_TYPE, /**< JSON boolean datatype */ |
reedas | 4:7ebc3d28bcb2 | 111 | JSON_NULL_TYPE, /**< JSON null object */ |
reedas | 4:7ebc3d28bcb2 | 112 | UNKNOWN_JSON_TYPE /**< JSON unknown type */ |
reedas | 4:7ebc3d28bcb2 | 113 | } cy_JSON_type_t; |
reedas | 4:7ebc3d28bcb2 | 114 | |
reedas | 4:7ebc3d28bcb2 | 115 | /** \} */ |
reedas | 4:7ebc3d28bcb2 | 116 | |
reedas | 4:7ebc3d28bcb2 | 117 | /****************************************************** |
reedas | 4:7ebc3d28bcb2 | 118 | * Type Definitions |
reedas | 4:7ebc3d28bcb2 | 119 | ******************************************************/ |
reedas | 4:7ebc3d28bcb2 | 120 | /******************************************************************************/ |
reedas | 4:7ebc3d28bcb2 | 121 | /** \addtogroup group_json_structures |
reedas | 4:7ebc3d28bcb2 | 122 | * Documentation of the data structures defined and used by JSON parser utility library. |
reedas | 4:7ebc3d28bcb2 | 123 | *//** \{ */ |
reedas | 4:7ebc3d28bcb2 | 124 | /******************************************************************************/ |
reedas | 4:7ebc3d28bcb2 | 125 | |
reedas | 4:7ebc3d28bcb2 | 126 | /****************************************************** |
reedas | 4:7ebc3d28bcb2 | 127 | * Structures |
reedas | 4:7ebc3d28bcb2 | 128 | ******************************************************/ |
reedas | 4:7ebc3d28bcb2 | 129 | /** JSON parser object */ |
reedas | 4:7ebc3d28bcb2 | 130 | typedef struct cy_JSON_object { |
reedas | 4:7ebc3d28bcb2 | 131 | |
reedas | 4:7ebc3d28bcb2 | 132 | char* object_string; /**< JSON object as a string */ |
reedas | 4:7ebc3d28bcb2 | 133 | uint8_t object_string_length; /**< Length of the JSON string */ |
reedas | 4:7ebc3d28bcb2 | 134 | cy_JSON_type_t value_type; /**< JSON data type of value parsed */ |
reedas | 4:7ebc3d28bcb2 | 135 | char* value; /**< JSON string value parsed */ |
reedas | 4:7ebc3d28bcb2 | 136 | uint16_t value_length; /**< length of string value parsed */ |
reedas | 4:7ebc3d28bcb2 | 137 | uint32_t intval; /**< JSON integer value parsed */ |
reedas | 4:7ebc3d28bcb2 | 138 | float floatval; /**< JSON float value parsed */ |
reedas | 4:7ebc3d28bcb2 | 139 | bool boolval; /**< JSON boolean value parsed */ |
reedas | 4:7ebc3d28bcb2 | 140 | struct cy_JSON_object* parent_object; /**< Pointer to parent JSON object */ |
reedas | 4:7ebc3d28bcb2 | 141 | } cy_JSON_object_t; |
reedas | 4:7ebc3d28bcb2 | 142 | |
reedas | 4:7ebc3d28bcb2 | 143 | /** Callback function used for registering with JSON parse |
reedas | 4:7ebc3d28bcb2 | 144 | * |
reedas | 4:7ebc3d28bcb2 | 145 | * @param[in] json_object : JSON object which contains the key=value pair parsed by the JSON parser |
reedas | 4:7ebc3d28bcb2 | 146 | * @param[in] arg : User argument passed in when registering the callback |
reedas | 4:7ebc3d28bcb2 | 147 | * |
reedas | 4:7ebc3d28bcb2 | 148 | * @return cy_rslt_t |
reedas | 4:7ebc3d28bcb2 | 149 | */ |
reedas | 4:7ebc3d28bcb2 | 150 | typedef cy_rslt_t (*cy_JSON_callback_t)( cy_JSON_object_t* json_object, void *arg ); |
reedas | 4:7ebc3d28bcb2 | 151 | |
reedas | 4:7ebc3d28bcb2 | 152 | /** \} */ |
reedas | 4:7ebc3d28bcb2 | 153 | |
reedas | 4:7ebc3d28bcb2 | 154 | #define JSON_IS_NOT_ESC_CHAR( ch ) ( ( ch != '\b' ) && \ |
reedas | 4:7ebc3d28bcb2 | 155 | ( ch != '\f' ) && \ |
reedas | 4:7ebc3d28bcb2 | 156 | ( ch != '\n' ) && \ |
reedas | 4:7ebc3d28bcb2 | 157 | ( ch != '\r' ) && \ |
reedas | 4:7ebc3d28bcb2 | 158 | ( ch != '\t' ) && \ |
reedas | 4:7ebc3d28bcb2 | 159 | ( ch != '\"' ) && \ |
reedas | 4:7ebc3d28bcb2 | 160 | ( ch != '\\' ) ) |
reedas | 4:7ebc3d28bcb2 | 161 | |
reedas | 4:7ebc3d28bcb2 | 162 | /****************************************************** |
reedas | 4:7ebc3d28bcb2 | 163 | * Global Variables |
reedas | 4:7ebc3d28bcb2 | 164 | ******************************************************/ |
reedas | 4:7ebc3d28bcb2 | 165 | |
reedas | 4:7ebc3d28bcb2 | 166 | /*****************************************************************************/ |
reedas | 4:7ebc3d28bcb2 | 167 | /** |
reedas | 4:7ebc3d28bcb2 | 168 | * |
reedas | 4:7ebc3d28bcb2 | 169 | * @addtogroup group_json_func |
reedas | 4:7ebc3d28bcb2 | 170 | * |
reedas | 4:7ebc3d28bcb2 | 171 | * The JSON parser utility library provides helper functions to parse JSON objects |
reedas | 4:7ebc3d28bcb2 | 172 | * |
reedas | 4:7ebc3d28bcb2 | 173 | * |
reedas | 4:7ebc3d28bcb2 | 174 | * @{ |
reedas | 4:7ebc3d28bcb2 | 175 | */ |
reedas | 4:7ebc3d28bcb2 | 176 | /*****************************************************************************/ |
reedas | 4:7ebc3d28bcb2 | 177 | |
reedas | 4:7ebc3d28bcb2 | 178 | |
reedas | 4:7ebc3d28bcb2 | 179 | /** Register callback to be invoked by JSON parser while parsing the JSON data |
reedas | 4:7ebc3d28bcb2 | 180 | * |
reedas | 4:7ebc3d28bcb2 | 181 | * @param[in] json_callback : Pointer to the callback function to be invoked while parsing the JSON data |
reedas | 4:7ebc3d28bcb2 | 182 | * @param[in] arg : User argument passed in when registering the callback |
reedas | 4:7ebc3d28bcb2 | 183 | * |
reedas | 4:7ebc3d28bcb2 | 184 | * @return cy_rslt_t |
reedas | 4:7ebc3d28bcb2 | 185 | */ |
reedas | 4:7ebc3d28bcb2 | 186 | cy_rslt_t cy_JSON_parser_register_callback( cy_JSON_callback_t json_callback, void *arg ); |
reedas | 4:7ebc3d28bcb2 | 187 | |
reedas | 4:7ebc3d28bcb2 | 188 | /** Returns the current callback function registered with the JSON parser |
reedas | 4:7ebc3d28bcb2 | 189 | * |
reedas | 4:7ebc3d28bcb2 | 190 | * @return @ref cy_JSON_callback_t |
reedas | 4:7ebc3d28bcb2 | 191 | */ |
reedas | 4:7ebc3d28bcb2 | 192 | cy_JSON_callback_t cy_JSON_parser_get_callback( void ); |
reedas | 4:7ebc3d28bcb2 | 193 | |
reedas | 4:7ebc3d28bcb2 | 194 | /** Parse the JSON data. |
reedas | 4:7ebc3d28bcb2 | 195 | * |
reedas | 4:7ebc3d28bcb2 | 196 | * This function will parse the JSON input string through a single parse, calling a callback whenever it encounters milestones |
reedas | 4:7ebc3d28bcb2 | 197 | * an object, passing in object name, JSON value type, and a value (if value is string or number ) |
reedas | 4:7ebc3d28bcb2 | 198 | * |
reedas | 4:7ebc3d28bcb2 | 199 | * @param[in] json_input : Pointer to the JSON data |
reedas | 4:7ebc3d28bcb2 | 200 | * @param[in] input_length : Length of the JSON data pointed by `json_input1` |
reedas | 4:7ebc3d28bcb2 | 201 | * |
reedas | 4:7ebc3d28bcb2 | 202 | * @return cy_rslt_t |
reedas | 4:7ebc3d28bcb2 | 203 | * |
reedas | 4:7ebc3d28bcb2 | 204 | * @note: Currently escape values are not supported. |
reedas | 4:7ebc3d28bcb2 | 205 | */ |
reedas | 4:7ebc3d28bcb2 | 206 | cy_rslt_t cy_JSON_parser( const char* json_input, uint32_t input_length ); |
reedas | 4:7ebc3d28bcb2 | 207 | |
reedas | 4:7ebc3d28bcb2 | 208 | /** @} */ |
reedas | 4:7ebc3d28bcb2 | 209 | |
reedas | 4:7ebc3d28bcb2 | 210 | #ifdef __cplusplus |
reedas | 4:7ebc3d28bcb2 | 211 | } /*extern "C" */ |
reedas | 4:7ebc3d28bcb2 | 212 | #endif |