CITY3032-wifi-mqtt

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?

UserRevisionLine numberNew 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 * String utilities
reedas 4:7ebc3d28bcb2 36 */
reedas 4:7ebc3d28bcb2 37
reedas 4:7ebc3d28bcb2 38 #include <string.h>
reedas 4:7ebc3d28bcb2 39 #include <stdint.h>
reedas 4:7ebc3d28bcb2 40 #include <stdlib.h>
reedas 4:7ebc3d28bcb2 41
reedas 4:7ebc3d28bcb2 42 #include "cy_string_utils.h"
reedas 4:7ebc3d28bcb2 43
reedas 4:7ebc3d28bcb2 44 #ifdef __cplusplus
reedas 4:7ebc3d28bcb2 45 extern "C" {
reedas 4:7ebc3d28bcb2 46 #endif
reedas 4:7ebc3d28bcb2 47
reedas 4:7ebc3d28bcb2 48 /******************************************************
reedas 4:7ebc3d28bcb2 49 * Macros
reedas 4:7ebc3d28bcb2 50 ******************************************************/
reedas 4:7ebc3d28bcb2 51
reedas 4:7ebc3d28bcb2 52 /******************************************************
reedas 4:7ebc3d28bcb2 53 * Constants
reedas 4:7ebc3d28bcb2 54 ******************************************************/
reedas 4:7ebc3d28bcb2 55
reedas 4:7ebc3d28bcb2 56 /******************************************************
reedas 4:7ebc3d28bcb2 57 * Enumerations
reedas 4:7ebc3d28bcb2 58 ******************************************************/
reedas 4:7ebc3d28bcb2 59
reedas 4:7ebc3d28bcb2 60 /******************************************************
reedas 4:7ebc3d28bcb2 61 * Type Definitions
reedas 4:7ebc3d28bcb2 62 ******************************************************/
reedas 4:7ebc3d28bcb2 63
reedas 4:7ebc3d28bcb2 64 /******************************************************
reedas 4:7ebc3d28bcb2 65 * Structures
reedas 4:7ebc3d28bcb2 66 ******************************************************/
reedas 4:7ebc3d28bcb2 67
reedas 4:7ebc3d28bcb2 68 /******************************************************
reedas 4:7ebc3d28bcb2 69 * Function Declarations
reedas 4:7ebc3d28bcb2 70 ******************************************************/
reedas 4:7ebc3d28bcb2 71
reedas 4:7ebc3d28bcb2 72 /******************************************************
reedas 4:7ebc3d28bcb2 73 * Variables Definitions
reedas 4:7ebc3d28bcb2 74 ******************************************************/
reedas 4:7ebc3d28bcb2 75
reedas 4:7ebc3d28bcb2 76 /******************************************************
reedas 4:7ebc3d28bcb2 77 * Function Definitions
reedas 4:7ebc3d28bcb2 78 ******************************************************/
reedas 4:7ebc3d28bcb2 79
reedas 4:7ebc3d28bcb2 80 /**
reedas 4:7ebc3d28bcb2 81 ******************************************************************************
reedas 4:7ebc3d28bcb2 82 * Convert an ASCII hex character into a nibble
reedas 4:7ebc3d28bcb2 83 *
reedas 4:7ebc3d28bcb2 84 * @param[in] char : The single hex character to convert to a nibble
reedas 4:7ebc3d28bcb2 85 * @param[out] nibble : Pointer to store The value of the nibble in the lower 4 bits
reedas 4:7ebc3d28bcb2 86 *
reedas 4:7ebc3d28bcb2 87 * @return 0 = SUCCESS
reedas 4:7ebc3d28bcb2 88 * -1 = not a hex character
reedas 4:7ebc3d28bcb2 89 */
reedas 4:7ebc3d28bcb2 90 static inline char cy_hexchar_to_nibble( char hexchar, uint8_t* nibble )
reedas 4:7ebc3d28bcb2 91 {
reedas 4:7ebc3d28bcb2 92 if ( ( hexchar >= '0' ) && ( hexchar <= '9' ) )
reedas 4:7ebc3d28bcb2 93 {
reedas 4:7ebc3d28bcb2 94 *nibble = (uint8_t)( hexchar - '0' );
reedas 4:7ebc3d28bcb2 95 return 0;
reedas 4:7ebc3d28bcb2 96 }
reedas 4:7ebc3d28bcb2 97 else if ( ( hexchar >= 'A' ) && ( hexchar <= 'F' ) )
reedas 4:7ebc3d28bcb2 98 {
reedas 4:7ebc3d28bcb2 99 *nibble = (uint8_t) ( hexchar - 'A' + 10 );
reedas 4:7ebc3d28bcb2 100 return 0;
reedas 4:7ebc3d28bcb2 101 }
reedas 4:7ebc3d28bcb2 102 else if ( ( hexchar >= 'a' ) && ( hexchar <= 'f' ) )
reedas 4:7ebc3d28bcb2 103 {
reedas 4:7ebc3d28bcb2 104 *nibble = (uint8_t) ( hexchar - 'a' + 10 );
reedas 4:7ebc3d28bcb2 105 return 0;
reedas 4:7ebc3d28bcb2 106 }
reedas 4:7ebc3d28bcb2 107 return -1;
reedas 4:7ebc3d28bcb2 108 }
reedas 4:7ebc3d28bcb2 109
reedas 4:7ebc3d28bcb2 110 static uint8_t cy_string_to_generic( const char* string, uint16_t str_length, uint32_t* value_out, uint8_t is_unsigned, uint8_t is_hex )
reedas 4:7ebc3d28bcb2 111 {
reedas 4:7ebc3d28bcb2 112 uint8_t nibble;
reedas 4:7ebc3d28bcb2 113 uint8_t characters_processed = 0;
reedas 4:7ebc3d28bcb2 114
reedas 4:7ebc3d28bcb2 115 if ( string == NULL )
reedas 4:7ebc3d28bcb2 116 {
reedas 4:7ebc3d28bcb2 117 return 0;
reedas 4:7ebc3d28bcb2 118 }
reedas 4:7ebc3d28bcb2 119
reedas 4:7ebc3d28bcb2 120 *value_out = 0;
reedas 4:7ebc3d28bcb2 121
reedas 4:7ebc3d28bcb2 122 while ( ( characters_processed != str_length ) &&
reedas 4:7ebc3d28bcb2 123 ( 0 == cy_hexchar_to_nibble( *string, &nibble ) ) &&
reedas 4:7ebc3d28bcb2 124 ( ( is_hex != 0 ) || ( nibble < 10 ) )
reedas 4:7ebc3d28bcb2 125 )
reedas 4:7ebc3d28bcb2 126 {
reedas 4:7ebc3d28bcb2 127 if ( is_hex != 0 )
reedas 4:7ebc3d28bcb2 128 {
reedas 4:7ebc3d28bcb2 129 if ( ( ( *value_out > ( 0x7fffffff >> 4 ) ) && ( is_unsigned == 0 ) ) ||
reedas 4:7ebc3d28bcb2 130 ( *value_out > ( 0xffffffff >> 4 ) )
reedas 4:7ebc3d28bcb2 131 )
reedas 4:7ebc3d28bcb2 132 {
reedas 4:7ebc3d28bcb2 133 break;
reedas 4:7ebc3d28bcb2 134 }
reedas 4:7ebc3d28bcb2 135 *value_out = ( *value_out << 4 ) + nibble;
reedas 4:7ebc3d28bcb2 136 }
reedas 4:7ebc3d28bcb2 137 else
reedas 4:7ebc3d28bcb2 138 {
reedas 4:7ebc3d28bcb2 139 if ( ( ( *value_out > ( 0x7fffffff / 10 ) ) && ( is_unsigned == 0 ) ) ||
reedas 4:7ebc3d28bcb2 140 ( *value_out > ( 0xffffffff / 10 ) )
reedas 4:7ebc3d28bcb2 141 )
reedas 4:7ebc3d28bcb2 142 {
reedas 4:7ebc3d28bcb2 143 break;
reedas 4:7ebc3d28bcb2 144 }
reedas 4:7ebc3d28bcb2 145 *value_out = ( *value_out * 10 ) + nibble;
reedas 4:7ebc3d28bcb2 146 }
reedas 4:7ebc3d28bcb2 147 string++;
reedas 4:7ebc3d28bcb2 148 characters_processed++;
reedas 4:7ebc3d28bcb2 149 }
reedas 4:7ebc3d28bcb2 150
reedas 4:7ebc3d28bcb2 151 return characters_processed;
reedas 4:7ebc3d28bcb2 152 }
reedas 4:7ebc3d28bcb2 153
reedas 4:7ebc3d28bcb2 154 /*!
reedas 4:7ebc3d28bcb2 155 ******************************************************************************
reedas 4:7ebc3d28bcb2 156 * Convert a decimal or hexidecimal string to an integer.
reedas 4:7ebc3d28bcb2 157 *
reedas 4:7ebc3d28bcb2 158 * @param[in] str The string containing the value.
reedas 4:7ebc3d28bcb2 159 *
reedas 4:7ebc3d28bcb2 160 * @return The value represented by the string.
reedas 4:7ebc3d28bcb2 161 */
reedas 4:7ebc3d28bcb2 162 uint32_t cy_generic_string_to_unsigned( const char* str )
reedas 4:7ebc3d28bcb2 163 {
reedas 4:7ebc3d28bcb2 164 uint32_t val = 0;
reedas 4:7ebc3d28bcb2 165 uint8_t is_hex = 0;
reedas 4:7ebc3d28bcb2 166
reedas 4:7ebc3d28bcb2 167 if ( (strncmp( str, "0x", 2) == 0) || (strncmp(str, "0X", 2) == 0))
reedas 4:7ebc3d28bcb2 168 {
reedas 4:7ebc3d28bcb2 169 is_hex = 1;
reedas 4:7ebc3d28bcb2 170 str += 2;
reedas 4:7ebc3d28bcb2 171 }
reedas 4:7ebc3d28bcb2 172
reedas 4:7ebc3d28bcb2 173 cy_string_to_generic( str, strlen(str), &val, 1, is_hex );
reedas 4:7ebc3d28bcb2 174
reedas 4:7ebc3d28bcb2 175 return val;
reedas 4:7ebc3d28bcb2 176 }
reedas 4:7ebc3d28bcb2 177
reedas 4:7ebc3d28bcb2 178 /**
reedas 4:7ebc3d28bcb2 179 * Converts a decimal/hexidecimal string (with optional sign) to a signed long int
reedas 4:7ebc3d28bcb2 180 * Better than strtol or atol or atoi because the return value indicates if an error occurred
reedas 4:7ebc3d28bcb2 181 *
reedas 4:7ebc3d28bcb2 182 * @param string[in] : The string buffer to be converted
reedas 4:7ebc3d28bcb2 183 * @param str_length[in] : The maximum number of characters to process in the string buffer
reedas 4:7ebc3d28bcb2 184 * @param value_out[out] : The unsigned in that will receive value of the the decimal string
reedas 4:7ebc3d28bcb2 185 * @param is_hex[in] : 0 = Decimal string, 1 = Hexidecimal string
reedas 4:7ebc3d28bcb2 186 *
reedas 4:7ebc3d28bcb2 187 * @return the number of characters successfully converted (including sign). i.e. 0 = error
reedas 4:7ebc3d28bcb2 188 *
reedas 4:7ebc3d28bcb2 189 */
reedas 4:7ebc3d28bcb2 190 uint8_t cy_string_to_signed( const char* string, uint16_t str_length, int32_t* value_out, uint8_t is_hex )
reedas 4:7ebc3d28bcb2 191 {
reedas 4:7ebc3d28bcb2 192 uint8_t characters_processed = 0;
reedas 4:7ebc3d28bcb2 193 uint8_t retval;
reedas 4:7ebc3d28bcb2 194 char first_char;
reedas 4:7ebc3d28bcb2 195
reedas 4:7ebc3d28bcb2 196 if ( string == NULL )
reedas 4:7ebc3d28bcb2 197 {
reedas 4:7ebc3d28bcb2 198 return 0;
reedas 4:7ebc3d28bcb2 199 }
reedas 4:7ebc3d28bcb2 200
reedas 4:7ebc3d28bcb2 201 first_char = *string;
reedas 4:7ebc3d28bcb2 202
reedas 4:7ebc3d28bcb2 203 if ( ( first_char == '-' ) || ( *string == '+' ) )
reedas 4:7ebc3d28bcb2 204 {
reedas 4:7ebc3d28bcb2 205 characters_processed++;
reedas 4:7ebc3d28bcb2 206 string++;
reedas 4:7ebc3d28bcb2 207 str_length--;
reedas 4:7ebc3d28bcb2 208 }
reedas 4:7ebc3d28bcb2 209
reedas 4:7ebc3d28bcb2 210 retval = cy_string_to_generic( string, str_length, (uint32_t*)value_out, 0, is_hex );
reedas 4:7ebc3d28bcb2 211 if ( retval == 0 )
reedas 4:7ebc3d28bcb2 212 {
reedas 4:7ebc3d28bcb2 213 return 0;
reedas 4:7ebc3d28bcb2 214 }
reedas 4:7ebc3d28bcb2 215
reedas 4:7ebc3d28bcb2 216 if ( first_char == '-' )
reedas 4:7ebc3d28bcb2 217 {
reedas 4:7ebc3d28bcb2 218 *value_out = -(*value_out);
reedas 4:7ebc3d28bcb2 219 }
reedas 4:7ebc3d28bcb2 220 return (uint8_t) ( characters_processed + retval );
reedas 4:7ebc3d28bcb2 221 }
reedas 4:7ebc3d28bcb2 222
reedas 4:7ebc3d28bcb2 223 /**
reedas 4:7ebc3d28bcb2 224 * Converts a decimal/hexidecimal string to an unsigned long int
reedas 4:7ebc3d28bcb2 225 * Better than strtol or atol or atoi because the return value indicates if an error occurred
reedas 4:7ebc3d28bcb2 226 *
reedas 4:7ebc3d28bcb2 227 * @param string[in] : The string buffer to be converted
reedas 4:7ebc3d28bcb2 228 * @param str_length[in] : The maximum number of characters to process in the string buffer
reedas 4:7ebc3d28bcb2 229 * @param value_out[out] : The unsigned in that will receive value of the the decimal string
reedas 4:7ebc3d28bcb2 230 * @param is_hex[in] : 0 = Decimal string, 1 = Hexidecimal string
reedas 4:7ebc3d28bcb2 231 *
reedas 4:7ebc3d28bcb2 232 * @return the number of characters successfully converted. i.e. 0 = error
reedas 4:7ebc3d28bcb2 233 *
reedas 4:7ebc3d28bcb2 234 */
reedas 4:7ebc3d28bcb2 235 uint8_t cy_string_to_unsigned( const char* string, uint8_t str_length, uint32_t* value_out, uint8_t is_hex )
reedas 4:7ebc3d28bcb2 236 {
reedas 4:7ebc3d28bcb2 237 return cy_string_to_generic( string, str_length, value_out, 1, is_hex );
reedas 4:7ebc3d28bcb2 238 }
reedas 4:7ebc3d28bcb2 239
reedas 4:7ebc3d28bcb2 240 #ifdef __cplusplus
reedas 4:7ebc3d28bcb2 241 }
reedas 4:7ebc3d28bcb2 242 #endif