![](/media/cache/profiles/20200518_163046.jpg.50x50_q85.jpg)
CITY3032-wifi-mqtt
connectivity-utilities/cy_string/cy_string_utils.c@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 | * 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 |