Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Tue Sep 11 11:15:08 2018 -0700
Revision:
48:81866008bba4
Parent:
40:3f3af6cd8a01
1.2.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 //
Azure.IoT Build 0:fa2de1b79154 5 // PUT NO INCLUDES BEFORE HERE
Azure.IoT Build 0:fa2de1b79154 6 //
Azure.IoT Build 0:fa2de1b79154 7 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 8 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 9 #include <stddef.h>
Azure.IoT Build 0:fa2de1b79154 10 #include <string.h>
AzureIoTClient 8:3db46d1e5471 11 #include <stdarg.h>
AzureIoTClient 8:3db46d1e5471 12 #include <stdio.h>
AzureIoTClient 8:3db46d1e5471 13
Azure.IoT Build 0:fa2de1b79154 14 //
Azure.IoT Build 0:fa2de1b79154 15 // PUT NO CLIENT LIBRARY INCLUDES BEFORE HERE
Azure.IoT Build 0:fa2de1b79154 16 //
Azure.IoT Build 0:fa2de1b79154 17
Azure.IoT Build 0:fa2de1b79154 18 #include "azure_c_shared_utility/strings.h"
AzureIoTClient 21:b92006c5b9ff 19 #include "azure_c_shared_utility/optimize_size.h"
Azure.IoT Build 6:c55b013dfc2a 20 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 21
Azure.IoT Build 0:fa2de1b79154 22 static const char hexToASCII[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
Azure.IoT Build 0:fa2de1b79154 23
Azure.IoT Build 0:fa2de1b79154 24 typedef struct STRING_TAG
Azure.IoT Build 0:fa2de1b79154 25 {
Azure.IoT Build 0:fa2de1b79154 26 char* s;
AzureIoTClient 30:ce3813c5a692 27 } STRING;
Azure.IoT Build 0:fa2de1b79154 28
Azure.IoT Build 0:fa2de1b79154 29 /*this function will allocate a new string with just '\0' in it*/
Azure.IoT Build 0:fa2de1b79154 30 /*return NULL if it fails*/
Azure.IoT Build 0:fa2de1b79154 31 /* Codes_SRS_STRING_07_001: [STRING_new shall allocate a new STRING_HANDLE pointing to an empty string.] */
Azure.IoT Build 0:fa2de1b79154 32 STRING_HANDLE STRING_new(void)
Azure.IoT Build 0:fa2de1b79154 33 {
Azure.IoT Build 0:fa2de1b79154 34 STRING* result;
Azure.IoT Build 0:fa2de1b79154 35 if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 36 {
Azure.IoT Build 0:fa2de1b79154 37 if ((result->s = (char*)malloc(1)) != NULL)
Azure.IoT Build 0:fa2de1b79154 38 {
Azure.IoT Build 0:fa2de1b79154 39 result->s[0] = '\0';
Azure.IoT Build 0:fa2de1b79154 40 }
Azure.IoT Build 0:fa2de1b79154 41 else
Azure.IoT Build 0:fa2de1b79154 42 {
Azure.IoT Build 0:fa2de1b79154 43 /* Codes_SRS_STRING_07_002: [STRING_new shall return an NULL STRING_HANDLE on any error that is encountered.] */
AzureIoTClient 40:3f3af6cd8a01 44 LogError("Failure allocating in STRING_new.");
Azure.IoT Build 0:fa2de1b79154 45 free(result);
Azure.IoT Build 0:fa2de1b79154 46 result = NULL;
Azure.IoT Build 0:fa2de1b79154 47 }
Azure.IoT Build 0:fa2de1b79154 48 }
Azure.IoT Build 0:fa2de1b79154 49 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 50 }
Azure.IoT Build 0:fa2de1b79154 51
Azure.IoT Build 0:fa2de1b79154 52 /*Codes_SRS_STRING_02_001: [STRING_clone shall produce a new string having the same content as the handle string.*/
Azure.IoT Build 0:fa2de1b79154 53 STRING_HANDLE STRING_clone(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 54 {
Azure.IoT Build 0:fa2de1b79154 55 STRING* result;
Azure.IoT Build 0:fa2de1b79154 56 /*Codes_SRS_STRING_02_002: [If parameter handle is NULL then STRING_clone shall return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 57 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 58 {
Azure.IoT Build 0:fa2de1b79154 59 result = NULL;
Azure.IoT Build 0:fa2de1b79154 60 }
Azure.IoT Build 0:fa2de1b79154 61 else
Azure.IoT Build 0:fa2de1b79154 62 {
Azure.IoT Build 0:fa2de1b79154 63 /*Codes_SRS_STRING_02_003: [If STRING_clone fails for any reason, it shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 64 if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 65 {
Azure.IoT Build 0:fa2de1b79154 66 STRING* source = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 67 /*Codes_SRS_STRING_02_003: [If STRING_clone fails for any reason, it shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 68 size_t sourceLen = strlen(source->s);
Azure.IoT Build 0:fa2de1b79154 69 if ((result->s = (char*)malloc(sourceLen + 1)) == NULL)
Azure.IoT Build 0:fa2de1b79154 70 {
AzureIoTClient 40:3f3af6cd8a01 71 LogError("Failure allocating clone value.");
Azure.IoT Build 0:fa2de1b79154 72 free(result);
Azure.IoT Build 0:fa2de1b79154 73 result = NULL;
Azure.IoT Build 0:fa2de1b79154 74 }
Azure.IoT Build 0:fa2de1b79154 75 else
Azure.IoT Build 0:fa2de1b79154 76 {
AzureIoTClient 19:2e0811512ceb 77 (void)memcpy(result->s, source->s, sourceLen + 1);
Azure.IoT Build 0:fa2de1b79154 78 }
Azure.IoT Build 0:fa2de1b79154 79 }
Azure.IoT Build 0:fa2de1b79154 80 else
Azure.IoT Build 0:fa2de1b79154 81 {
Azure.IoT Build 0:fa2de1b79154 82 /*not much to do, result is NULL from malloc*/
Azure.IoT Build 0:fa2de1b79154 83 }
Azure.IoT Build 0:fa2de1b79154 84 }
Azure.IoT Build 0:fa2de1b79154 85 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 86 }
Azure.IoT Build 0:fa2de1b79154 87
Azure.IoT Build 0:fa2de1b79154 88 /* Codes_SRS_STRING_07_003: [STRING_construct shall allocate a new string with the value of the specified const char*.] */
Azure.IoT Build 0:fa2de1b79154 89 STRING_HANDLE STRING_construct(const char* psz)
Azure.IoT Build 0:fa2de1b79154 90 {
Azure.IoT Build 0:fa2de1b79154 91 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 92 if (psz == NULL)
Azure.IoT Build 0:fa2de1b79154 93 {
Azure.IoT Build 0:fa2de1b79154 94 /* Codes_SRS_STRING_07_005: [If the supplied const char* is NULL STRING_construct shall return a NULL value.] */
Azure.IoT Build 0:fa2de1b79154 95 result = NULL;
Azure.IoT Build 0:fa2de1b79154 96 }
Azure.IoT Build 0:fa2de1b79154 97 else
Azure.IoT Build 0:fa2de1b79154 98 {
Azure.IoT Build 0:fa2de1b79154 99 STRING* str;
Azure.IoT Build 0:fa2de1b79154 100 if ((str = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 101 {
Azure.IoT Build 0:fa2de1b79154 102 size_t nLen = strlen(psz) + 1;
Azure.IoT Build 0:fa2de1b79154 103 if ((str->s = (char*)malloc(nLen)) != NULL)
Azure.IoT Build 0:fa2de1b79154 104 {
AzureIoTClient 19:2e0811512ceb 105 (void)memcpy(str->s, psz, nLen);
Azure.IoT Build 0:fa2de1b79154 106 result = (STRING_HANDLE)str;
Azure.IoT Build 0:fa2de1b79154 107 }
Azure.IoT Build 0:fa2de1b79154 108 /* Codes_SRS_STRING_07_032: [STRING_construct encounters any error it shall return a NULL value.] */
Azure.IoT Build 0:fa2de1b79154 109 else
Azure.IoT Build 0:fa2de1b79154 110 {
AzureIoTClient 40:3f3af6cd8a01 111 LogError("Failure allocating constructed value.");
Azure.IoT Build 0:fa2de1b79154 112 free(str);
Azure.IoT Build 0:fa2de1b79154 113 result = NULL;
Azure.IoT Build 0:fa2de1b79154 114 }
Azure.IoT Build 0:fa2de1b79154 115 }
Azure.IoT Build 0:fa2de1b79154 116 else
Azure.IoT Build 0:fa2de1b79154 117 {
Azure.IoT Build 0:fa2de1b79154 118 /* Codes_SRS_STRING_07_032: [STRING_construct encounters any error it shall return a NULL value.] */
AzureIoTClient 40:3f3af6cd8a01 119 LogError("Failure allocating value.");
Azure.IoT Build 0:fa2de1b79154 120 result = NULL;
Azure.IoT Build 0:fa2de1b79154 121 }
Azure.IoT Build 0:fa2de1b79154 122 }
Azure.IoT Build 0:fa2de1b79154 123 return result;
Azure.IoT Build 0:fa2de1b79154 124 }
Azure.IoT Build 0:fa2de1b79154 125
AzureIoTClient 25:8507bf644fdf 126 #if defined(__GNUC__)
AzureIoTClient 25:8507bf644fdf 127 __attribute__ ((format (printf, 1, 2)))
AzureIoTClient 25:8507bf644fdf 128 #endif
AzureIoTClient 8:3db46d1e5471 129 STRING_HANDLE STRING_construct_sprintf(const char* format, ...)
AzureIoTClient 8:3db46d1e5471 130 {
AzureIoTClient 8:3db46d1e5471 131 STRING* result;
AzureIoTClient 48:81866008bba4 132
AzureIoTClient 35:98add15351f3 133 #ifdef STRINGS_C_SPRINTF_BUFFER_SIZE
AzureIoTClient 35:98add15351f3 134 size_t maxBufSize = STRINGS_C_SPRINTF_BUFFER_SIZE;
AzureIoTClient 35:98add15351f3 135 char buf[STRINGS_C_SPRINTF_BUFFER_SIZE];
Azure.IoT.Build 16:18e7ebd42bb2 136 #else
Azure.IoT.Build 16:18e7ebd42bb2 137 size_t maxBufSize = 0;
Azure.IoT.Build 16:18e7ebd42bb2 138 char* buf = NULL;
Azure.IoT.Build 16:18e7ebd42bb2 139 #endif
Azure.IoT.Build 16:18e7ebd42bb2 140
AzureIoTClient 8:3db46d1e5471 141 if (format != NULL)
AzureIoTClient 8:3db46d1e5471 142 {
AzureIoTClient 8:3db46d1e5471 143 va_list arg_list;
AzureIoTClient 30:ce3813c5a692 144 int length;
AzureIoTClient 8:3db46d1e5471 145 va_start(arg_list, format);
AzureIoTClient 8:3db46d1e5471 146
AzureIoTClient 8:3db46d1e5471 147 /* Codes_SRS_STRING_07_041: [STRING_construct_sprintf shall determine the size of the resulting string and allocate the necessary memory.] */
Azure.IoT.Build 16:18e7ebd42bb2 148 length = vsnprintf(buf, maxBufSize, format, arg_list);
AzureIoTClient 8:3db46d1e5471 149 va_end(arg_list);
AzureIoTClient 8:3db46d1e5471 150 if (length > 0)
AzureIoTClient 8:3db46d1e5471 151 {
AzureIoTClient 8:3db46d1e5471 152 result = (STRING*)malloc(sizeof(STRING));
AzureIoTClient 8:3db46d1e5471 153 if (result != NULL)
AzureIoTClient 8:3db46d1e5471 154 {
AzureIoTClient 8:3db46d1e5471 155 result->s = (char*)malloc(length+1);
AzureIoTClient 8:3db46d1e5471 156 if (result->s != NULL)
AzureIoTClient 8:3db46d1e5471 157 {
AzureIoTClient 8:3db46d1e5471 158 va_start(arg_list, format);
AzureIoTClient 8:3db46d1e5471 159 if (vsnprintf(result->s, length+1, format, arg_list) < 0)
AzureIoTClient 8:3db46d1e5471 160 {
AzureIoTClient 8:3db46d1e5471 161 /* Codes_SRS_STRING_07_040: [If any error is encountered STRING_construct_sprintf shall return NULL.] */
AzureIoTClient 8:3db46d1e5471 162 free(result->s);
AzureIoTClient 8:3db46d1e5471 163 free(result);
AzureIoTClient 8:3db46d1e5471 164 result = NULL;
AzureIoTClient 8:3db46d1e5471 165 LogError("Failure: vsnprintf formatting failed.");
AzureIoTClient 8:3db46d1e5471 166 }
AzureIoTClient 8:3db46d1e5471 167 va_end(arg_list);
AzureIoTClient 8:3db46d1e5471 168 }
AzureIoTClient 8:3db46d1e5471 169 else
AzureIoTClient 8:3db46d1e5471 170 {
AzureIoTClient 8:3db46d1e5471 171 /* Codes_SRS_STRING_07_040: [If any error is encountered STRING_construct_sprintf shall return NULL.] */
AzureIoTClient 8:3db46d1e5471 172 free(result);
AzureIoTClient 8:3db46d1e5471 173 result = NULL;
AzureIoTClient 40:3f3af6cd8a01 174 LogError("Failure: allocation sprintf value failed.");
AzureIoTClient 8:3db46d1e5471 175 }
AzureIoTClient 8:3db46d1e5471 176 }
AzureIoTClient 8:3db46d1e5471 177 else
AzureIoTClient 8:3db46d1e5471 178 {
AzureIoTClient 8:3db46d1e5471 179 LogError("Failure: allocation failed.");
AzureIoTClient 8:3db46d1e5471 180 }
AzureIoTClient 8:3db46d1e5471 181 }
AzureIoTClient 8:3db46d1e5471 182 else if (length == 0)
AzureIoTClient 8:3db46d1e5471 183 {
AzureIoTClient 8:3db46d1e5471 184 result = (STRING*)STRING_new();
AzureIoTClient 8:3db46d1e5471 185 }
AzureIoTClient 8:3db46d1e5471 186 else
AzureIoTClient 8:3db46d1e5471 187 {
AzureIoTClient 8:3db46d1e5471 188 /* Codes_SRS_STRING_07_039: [If the parameter format is NULL then STRING_construct_sprintf shall return NULL.] */
AzureIoTClient 8:3db46d1e5471 189 result = NULL;
AzureIoTClient 8:3db46d1e5471 190 LogError("Failure: vsnprintf return 0 length");
AzureIoTClient 8:3db46d1e5471 191 }
AzureIoTClient 8:3db46d1e5471 192 }
AzureIoTClient 8:3db46d1e5471 193 else
AzureIoTClient 8:3db46d1e5471 194 {
AzureIoTClient 8:3db46d1e5471 195 LogError("Failure: invalid argument.");
AzureIoTClient 8:3db46d1e5471 196 result = NULL;
AzureIoTClient 8:3db46d1e5471 197 }
AzureIoTClient 8:3db46d1e5471 198 /* Codes_SRS_STRING_07_045: [STRING_construct_sprintf shall allocate a new string with the value of the specified printf formated const char. ] */
AzureIoTClient 8:3db46d1e5471 199 return (STRING_HANDLE)result;
AzureIoTClient 8:3db46d1e5471 200 }
AzureIoTClient 8:3db46d1e5471 201
Azure.IoT Build 0:fa2de1b79154 202 /*this function will return a new STRING with the memory for the actual string passed in as a parameter.*/
Azure.IoT Build 0:fa2de1b79154 203 /*return NULL if it fails.*/
Azure.IoT Build 0:fa2de1b79154 204 /* The supplied memory must have been allocated with malloc! */
Azure.IoT Build 0:fa2de1b79154 205 /* Codes_SRS_STRING_07_006: [STRING_new_with_memory shall return a STRING_HANDLE by using the supplied char* memory.] */
Azure.IoT Build 0:fa2de1b79154 206 STRING_HANDLE STRING_new_with_memory(const char* memory)
Azure.IoT Build 0:fa2de1b79154 207 {
Azure.IoT Build 0:fa2de1b79154 208 STRING* result;
Azure.IoT Build 0:fa2de1b79154 209 if (memory == NULL)
Azure.IoT Build 0:fa2de1b79154 210 {
Azure.IoT Build 0:fa2de1b79154 211 /* Codes_SRS_STRING_07_007: [STRING_new_with_memory shall return a NULL STRING_HANDLE if the supplied char* is NULL.] */
Azure.IoT Build 0:fa2de1b79154 212 result = NULL;
Azure.IoT Build 0:fa2de1b79154 213 }
Azure.IoT Build 0:fa2de1b79154 214 else
Azure.IoT Build 0:fa2de1b79154 215 {
Azure.IoT Build 0:fa2de1b79154 216 if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 217 {
Azure.IoT Build 0:fa2de1b79154 218 result->s = (char*)memory;
Azure.IoT Build 0:fa2de1b79154 219 }
AzureIoTClient 40:3f3af6cd8a01 220 else
AzureIoTClient 40:3f3af6cd8a01 221 {
AzureIoTClient 40:3f3af6cd8a01 222 LogError("Failure: allocating memory string");
AzureIoTClient 40:3f3af6cd8a01 223 }
Azure.IoT Build 0:fa2de1b79154 224 }
Azure.IoT Build 0:fa2de1b79154 225 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 226 }
Azure.IoT Build 0:fa2de1b79154 227
Azure.IoT Build 0:fa2de1b79154 228 /* Codes_SRS_STRING_07_008: [STRING_new_quoted shall return a valid STRING_HANDLE Copying the supplied const char* value surrounded by quotes.] */
Azure.IoT Build 0:fa2de1b79154 229 STRING_HANDLE STRING_new_quoted(const char* source)
Azure.IoT Build 0:fa2de1b79154 230 {
Azure.IoT Build 0:fa2de1b79154 231 STRING* result;
Azure.IoT Build 0:fa2de1b79154 232 if (source == NULL)
Azure.IoT Build 0:fa2de1b79154 233 {
Azure.IoT Build 0:fa2de1b79154 234 /* Codes_SRS_STRING_07_009: [STRING_new_quoted shall return a NULL STRING_HANDLE if the supplied const char* is NULL.] */
Azure.IoT Build 0:fa2de1b79154 235 result = NULL;
Azure.IoT Build 0:fa2de1b79154 236 }
Azure.IoT Build 0:fa2de1b79154 237 else if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 238 {
Azure.IoT Build 0:fa2de1b79154 239 size_t sourceLength = strlen(source);
Azure.IoT Build 0:fa2de1b79154 240 if ((result->s = (char*)malloc(sourceLength + 3)) != NULL)
Azure.IoT Build 0:fa2de1b79154 241 {
Azure.IoT Build 0:fa2de1b79154 242 result->s[0] = '"';
AzureIoTClient 19:2e0811512ceb 243 (void)memcpy(result->s + 1, source, sourceLength);
Azure.IoT Build 0:fa2de1b79154 244 result->s[sourceLength + 1] = '"';
Azure.IoT Build 0:fa2de1b79154 245 result->s[sourceLength + 2] = '\0';
Azure.IoT Build 0:fa2de1b79154 246 }
Azure.IoT Build 0:fa2de1b79154 247 else
Azure.IoT Build 0:fa2de1b79154 248 {
Azure.IoT Build 0:fa2de1b79154 249 /* Codes_SRS_STRING_07_031: [STRING_new_quoted shall return a NULL STRING_HANDLE if any error is encountered.] */
AzureIoTClient 40:3f3af6cd8a01 250 LogError("Failure allocating quoted string value.");
Azure.IoT Build 0:fa2de1b79154 251 free(result);
Azure.IoT Build 0:fa2de1b79154 252 result = NULL;
Azure.IoT Build 0:fa2de1b79154 253 }
Azure.IoT Build 0:fa2de1b79154 254 }
Azure.IoT Build 0:fa2de1b79154 255 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 256 }
Azure.IoT Build 0:fa2de1b79154 257
Azure.IoT Build 0:fa2de1b79154 258 /*this function takes a regular const char* and turns in into "this is a\"JSON\" strings\u0008" (starting and ending quote included)*/
Azure.IoT Build 0:fa2de1b79154 259 /*the newly created handle needs to be disposed of with STRING_delete*/
Azure.IoT Build 0:fa2de1b79154 260 /*returns NULL if there are errors*/
Azure.IoT Build 0:fa2de1b79154 261 STRING_HANDLE STRING_new_JSON(const char* source)
Azure.IoT Build 0:fa2de1b79154 262 {
Azure.IoT Build 0:fa2de1b79154 263 STRING* result;
Azure.IoT Build 0:fa2de1b79154 264 if (source == NULL)
Azure.IoT Build 0:fa2de1b79154 265 {
Azure.IoT Build 0:fa2de1b79154 266 /*Codes_SRS_STRING_02_011: [If source is NULL then STRING_new_JSON shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 267 result = NULL;
AzureIoTClient 1:9190c0f4d23a 268 LogError("invalid arg (NULL)");
Azure.IoT Build 0:fa2de1b79154 269 }
Azure.IoT Build 0:fa2de1b79154 270 else
Azure.IoT Build 0:fa2de1b79154 271 {
Azure.IoT Build 0:fa2de1b79154 272 size_t i;
Azure.IoT Build 0:fa2de1b79154 273 size_t nControlCharacters = 0; /*counts how many characters are to be expanded from 1 character to \uxxxx (6 characters)*/
Azure.IoT Build 0:fa2de1b79154 274 size_t nEscapeCharacters = 0;
Azure.IoT Build 0:fa2de1b79154 275 size_t vlen = strlen(source);
Azure.IoT Build 0:fa2de1b79154 276
Azure.IoT Build 0:fa2de1b79154 277 for (i = 0; i < vlen; i++)
Azure.IoT Build 0:fa2de1b79154 278 {
Azure.IoT Build 0:fa2de1b79154 279 /*Codes_SRS_STRING_02_014: [If any character has the value outside [1...127] then STRING_new_JSON shall fail and return NULL.] */
Azure.IoT Build 0:fa2de1b79154 280 if ((unsigned char)source[i] >= 128) /*this be a UNICODE character begin*/
Azure.IoT Build 0:fa2de1b79154 281 {
Azure.IoT Build 0:fa2de1b79154 282 break;
Azure.IoT Build 0:fa2de1b79154 283 }
Azure.IoT Build 0:fa2de1b79154 284 else
Azure.IoT Build 0:fa2de1b79154 285 {
Azure.IoT Build 0:fa2de1b79154 286 if (source[i] <= 0x1F)
Azure.IoT Build 0:fa2de1b79154 287 {
Azure.IoT Build 0:fa2de1b79154 288 nControlCharacters++;
Azure.IoT Build 0:fa2de1b79154 289 }
Azure.IoT Build 0:fa2de1b79154 290 else if (
Azure.IoT Build 0:fa2de1b79154 291 (source[i] == '"') ||
Azure.IoT Build 0:fa2de1b79154 292 (source[i] == '\\') ||
Azure.IoT Build 0:fa2de1b79154 293 (source[i] == '/')
Azure.IoT Build 0:fa2de1b79154 294 )
Azure.IoT Build 0:fa2de1b79154 295 {
Azure.IoT Build 0:fa2de1b79154 296 nEscapeCharacters++;
Azure.IoT Build 0:fa2de1b79154 297 }
Azure.IoT Build 0:fa2de1b79154 298 }
Azure.IoT Build 0:fa2de1b79154 299 }
Azure.IoT Build 0:fa2de1b79154 300
Azure.IoT Build 0:fa2de1b79154 301 if (i < vlen)
Azure.IoT Build 0:fa2de1b79154 302 {
Azure.IoT Build 0:fa2de1b79154 303 result = NULL;
AzureIoTClient 1:9190c0f4d23a 304 LogError("invalid character in input string");
Azure.IoT Build 0:fa2de1b79154 305 }
Azure.IoT Build 0:fa2de1b79154 306 else
Azure.IoT Build 0:fa2de1b79154 307 {
Azure.IoT Build 0:fa2de1b79154 308 if ((result = (STRING*)malloc(sizeof(STRING))) == NULL)
Azure.IoT Build 0:fa2de1b79154 309 {
Azure.IoT Build 0:fa2de1b79154 310 /*Codes_SRS_STRING_02_021: [If the complete JSON representation cannot be produced, then STRING_new_JSON shall fail and return NULL.] */
AzureIoTClient 40:3f3af6cd8a01 311 LogError("malloc json failure");
Azure.IoT Build 0:fa2de1b79154 312 }
Azure.IoT Build 0:fa2de1b79154 313 else if ((result->s = (char*)malloc(vlen + 5 * nControlCharacters + nEscapeCharacters + 3)) == NULL)
Azure.IoT Build 0:fa2de1b79154 314 {
Azure.IoT Build 0:fa2de1b79154 315 /*Codes_SRS_STRING_02_021: [If the complete JSON representation cannot be produced, then STRING_new_JSON shall fail and return NULL.] */
Azure.IoT Build 0:fa2de1b79154 316 free(result);
Azure.IoT Build 0:fa2de1b79154 317 result = NULL;
AzureIoTClient 1:9190c0f4d23a 318 LogError("malloc failed");
Azure.IoT Build 0:fa2de1b79154 319 }
Azure.IoT Build 0:fa2de1b79154 320 else
Azure.IoT Build 0:fa2de1b79154 321 {
Azure.IoT Build 0:fa2de1b79154 322 size_t pos = 0;
Azure.IoT Build 0:fa2de1b79154 323 /*Codes_SRS_STRING_02_012: [The string shall begin with the quote character.] */
Azure.IoT Build 0:fa2de1b79154 324 result->s[pos++] = '"';
Azure.IoT Build 0:fa2de1b79154 325 for (i = 0; i < vlen; i++)
Azure.IoT Build 0:fa2de1b79154 326 {
Azure.IoT Build 0:fa2de1b79154 327 if (source[i] <= 0x1F)
Azure.IoT Build 0:fa2de1b79154 328 {
Azure.IoT Build 0:fa2de1b79154 329 /*Codes_SRS_STRING_02_019: [If the character code is less than 0x20 then it shall be represented as \u00xx, where xx is the hex representation of the character code.]*/
Azure.IoT Build 0:fa2de1b79154 330 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 331 result->s[pos++] = 'u';
Azure.IoT Build 0:fa2de1b79154 332 result->s[pos++] = '0';
Azure.IoT Build 0:fa2de1b79154 333 result->s[pos++] = '0';
Azure.IoT Build 0:fa2de1b79154 334 result->s[pos++] = hexToASCII[(source[i] & 0xF0) >> 4]; /*high nibble*/
Azure.IoT Build 0:fa2de1b79154 335 result->s[pos++] = hexToASCII[source[i] & 0x0F]; /*low nibble*/
Azure.IoT Build 0:fa2de1b79154 336 }
Azure.IoT Build 0:fa2de1b79154 337 else if (source[i] == '"')
Azure.IoT Build 0:fa2de1b79154 338 {
Azure.IoT Build 0:fa2de1b79154 339 /*Codes_SRS_STRING_02_016: [If the character is " (quote) then it shall be repsented as \".] */
Azure.IoT Build 0:fa2de1b79154 340 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 341 result->s[pos++] = '"';
Azure.IoT Build 0:fa2de1b79154 342 }
Azure.IoT Build 0:fa2de1b79154 343 else if (source[i] == '\\')
Azure.IoT Build 0:fa2de1b79154 344 {
Azure.IoT Build 0:fa2de1b79154 345 /*Codes_SRS_STRING_02_017: [If the character is \ (backslash) then it shall represented as \\.] */
Azure.IoT Build 0:fa2de1b79154 346 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 347 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 348 }
Azure.IoT Build 0:fa2de1b79154 349 else if (source[i] == '/')
Azure.IoT Build 0:fa2de1b79154 350 {
Azure.IoT Build 0:fa2de1b79154 351 /*Codes_SRS_STRING_02_018: [If the character is / (slash) then it shall be represented as \/.] */
Azure.IoT Build 0:fa2de1b79154 352 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 353 result->s[pos++] = '/';
Azure.IoT Build 0:fa2de1b79154 354 }
Azure.IoT Build 0:fa2de1b79154 355 else
Azure.IoT Build 0:fa2de1b79154 356 {
Azure.IoT Build 0:fa2de1b79154 357 /*Codes_SRS_STRING_02_013: [The string shall copy the characters of source "as they are" (until the '\0' character) with the following exceptions:] */
Azure.IoT Build 0:fa2de1b79154 358 result->s[pos++] = source[i];
Azure.IoT Build 0:fa2de1b79154 359 }
Azure.IoT Build 0:fa2de1b79154 360 }
Azure.IoT Build 0:fa2de1b79154 361 /*Codes_SRS_STRING_02_020: [The string shall end with " (quote).] */
Azure.IoT Build 0:fa2de1b79154 362 result->s[pos++] = '"';
Azure.IoT Build 0:fa2de1b79154 363 /*zero terminating it*/
Azure.IoT Build 0:fa2de1b79154 364 result->s[pos] = '\0';
Azure.IoT Build 0:fa2de1b79154 365 }
Azure.IoT Build 0:fa2de1b79154 366 }
Azure.IoT Build 0:fa2de1b79154 367
Azure.IoT Build 0:fa2de1b79154 368 }
Azure.IoT Build 0:fa2de1b79154 369 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 370 }
Azure.IoT Build 0:fa2de1b79154 371
Azure.IoT Build 0:fa2de1b79154 372 /*this function will concatenate to the string s1 the string s2, resulting in s1+s2*/
Azure.IoT Build 0:fa2de1b79154 373 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 374 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 375 /* Codes_SRS_STRING_07_012: [STRING_concat shall concatenate the given STRING_HANDLE and the const char* value and place the value in the handle.] */
Azure.IoT Build 0:fa2de1b79154 376 int STRING_concat(STRING_HANDLE handle, const char* s2)
Azure.IoT Build 0:fa2de1b79154 377 {
Azure.IoT Build 0:fa2de1b79154 378 int result;
Azure.IoT Build 0:fa2de1b79154 379 if ((handle == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 380 {
Azure.IoT Build 0:fa2de1b79154 381 /* Codes_SRS_STRING_07_013: [STRING_concat shall return a nonzero number if an error is encountered.] */
AzureIoTClient 21:b92006c5b9ff 382 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 383 }
Azure.IoT Build 0:fa2de1b79154 384 else
Azure.IoT Build 0:fa2de1b79154 385 {
Azure.IoT Build 0:fa2de1b79154 386 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 387 size_t s1Length = strlen(s1->s);
Azure.IoT Build 0:fa2de1b79154 388 size_t s2Length = strlen(s2);
Azure.IoT Build 0:fa2de1b79154 389 char* temp = (char*)realloc(s1->s, s1Length + s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 390 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 391 {
Azure.IoT Build 0:fa2de1b79154 392 /* Codes_SRS_STRING_07_013: [STRING_concat shall return a nonzero number if an error is encountered.] */
AzureIoTClient 40:3f3af6cd8a01 393 LogError("Failure reallocating value.");
AzureIoTClient 21:b92006c5b9ff 394 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 395 }
Azure.IoT Build 0:fa2de1b79154 396 else
Azure.IoT Build 0:fa2de1b79154 397 {
Azure.IoT Build 0:fa2de1b79154 398 s1->s = temp;
AzureIoTClient 19:2e0811512ceb 399 (void)memcpy(s1->s + s1Length, s2, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 400 result = 0;
Azure.IoT Build 0:fa2de1b79154 401 }
Azure.IoT Build 0:fa2de1b79154 402 }
Azure.IoT Build 0:fa2de1b79154 403 return result;
Azure.IoT Build 0:fa2de1b79154 404 }
Azure.IoT Build 0:fa2de1b79154 405
Azure.IoT Build 0:fa2de1b79154 406 /*this function will concatenate to the string s1 the string s2, resulting in s1+s2*/
Azure.IoT Build 0:fa2de1b79154 407 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 408 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 409 /* Codes_SRS_STRING_07_034: [String_Concat_with_STRING shall concatenate a given STRING_HANDLE variable with a source STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 410 int STRING_concat_with_STRING(STRING_HANDLE s1, STRING_HANDLE s2)
Azure.IoT Build 0:fa2de1b79154 411 {
Azure.IoT Build 0:fa2de1b79154 412 int result;
Azure.IoT Build 0:fa2de1b79154 413 if ((s1 == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 414 {
Azure.IoT Build 0:fa2de1b79154 415 /* Codes_SRS_STRING_07_035: [String_Concat_with_STRING shall return a nonzero number if an error is encountered.] */
AzureIoTClient 40:3f3af6cd8a01 416 LogError("Invalid argument specified");
AzureIoTClient 21:b92006c5b9ff 417 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 418 }
Azure.IoT Build 0:fa2de1b79154 419 else
Azure.IoT Build 0:fa2de1b79154 420 {
Azure.IoT Build 0:fa2de1b79154 421 STRING* dest = (STRING*)s1;
Azure.IoT Build 0:fa2de1b79154 422 STRING* src = (STRING*)s2;
Azure.IoT Build 0:fa2de1b79154 423
Azure.IoT Build 0:fa2de1b79154 424 size_t s1Length = strlen(dest->s);
Azure.IoT Build 0:fa2de1b79154 425 size_t s2Length = strlen(src->s);
Azure.IoT Build 0:fa2de1b79154 426 char* temp = (char*)realloc(dest->s, s1Length + s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 427 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 428 {
Azure.IoT Build 0:fa2de1b79154 429 /* Codes_SRS_STRING_07_035: [String_Concat_with_STRING shall return a nonzero number if an error is encountered.] */
AzureIoTClient 40:3f3af6cd8a01 430 LogError("Failure reallocating value");
AzureIoTClient 21:b92006c5b9ff 431 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 432 }
Azure.IoT Build 0:fa2de1b79154 433 else
Azure.IoT Build 0:fa2de1b79154 434 {
Azure.IoT Build 0:fa2de1b79154 435 dest->s = temp;
Azure.IoT Build 0:fa2de1b79154 436 /* Codes_SRS_STRING_07_034: [String_Concat_with_STRING shall concatenate a given STRING_HANDLE variable with a source STRING_HANDLE.] */
AzureIoTClient 19:2e0811512ceb 437 (void)memcpy(dest->s + s1Length, src->s, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 438 result = 0;
Azure.IoT Build 0:fa2de1b79154 439 }
Azure.IoT Build 0:fa2de1b79154 440 }
Azure.IoT Build 0:fa2de1b79154 441 return result;
Azure.IoT Build 0:fa2de1b79154 442 }
Azure.IoT Build 0:fa2de1b79154 443
Azure.IoT Build 0:fa2de1b79154 444 /*this function will copy the string from s2 to s1*/
Azure.IoT Build 0:fa2de1b79154 445 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 446 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 447 /* Codes_SRS_STRING_07_016: [STRING_copy shall copy the const char* into the supplied STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 448 int STRING_copy(STRING_HANDLE handle, const char* s2)
Azure.IoT Build 0:fa2de1b79154 449 {
Azure.IoT Build 0:fa2de1b79154 450 int result;
Azure.IoT Build 0:fa2de1b79154 451 if ((handle == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 452 {
Azure.IoT Build 0:fa2de1b79154 453 /* Codes_SRS_STRING_07_017: [STRING_copy shall return a nonzero value if any of the supplied parameters are NULL.] */
AzureIoTClient 21:b92006c5b9ff 454 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 455 }
Azure.IoT Build 0:fa2de1b79154 456 else
Azure.IoT Build 0:fa2de1b79154 457 {
Azure.IoT Build 0:fa2de1b79154 458 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 459 /* Codes_SRS_STRING_07_026: [If the underlying char* refered to by s1 handle is equal to char* s2 than STRING_copy shall be a noop and return 0.] */
Azure.IoT Build 0:fa2de1b79154 460 if (s1->s != s2)
Azure.IoT Build 0:fa2de1b79154 461 {
Azure.IoT Build 0:fa2de1b79154 462 size_t s2Length = strlen(s2);
Azure.IoT Build 0:fa2de1b79154 463 char* temp = (char*)realloc(s1->s, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 464 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 465 {
AzureIoTClient 40:3f3af6cd8a01 466 LogError("Failure reallocating value.");
Azure.IoT Build 0:fa2de1b79154 467 /* Codes_SRS_STRING_07_027: [STRING_copy shall return a nonzero value if any error is encountered.] */
AzureIoTClient 21:b92006c5b9ff 468 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 469 }
Azure.IoT Build 0:fa2de1b79154 470 else
Azure.IoT Build 0:fa2de1b79154 471 {
Azure.IoT Build 0:fa2de1b79154 472 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 473 memmove(s1->s, s2, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 474 result = 0;
Azure.IoT Build 0:fa2de1b79154 475 }
Azure.IoT Build 0:fa2de1b79154 476 }
Azure.IoT Build 0:fa2de1b79154 477 else
Azure.IoT Build 0:fa2de1b79154 478 {
Azure.IoT Build 0:fa2de1b79154 479 /* Codes_SRS_STRING_07_033: [If overlapping pointer address is given to STRING_copy the behavior is undefined.] */
Azure.IoT Build 0:fa2de1b79154 480 result = 0;
Azure.IoT Build 0:fa2de1b79154 481 }
Azure.IoT Build 0:fa2de1b79154 482 }
Azure.IoT Build 0:fa2de1b79154 483 return result;
Azure.IoT Build 0:fa2de1b79154 484 }
Azure.IoT Build 0:fa2de1b79154 485
Azure.IoT Build 0:fa2de1b79154 486 /*this function will copy n chars from s2 to the string s1, resulting in n chars only from s2 being stored in s1.*/
Azure.IoT Build 0:fa2de1b79154 487 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 488 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 489 /* Codes_SRS_STRING_07_018: [STRING_copy_n shall copy the number of characters in const char* or the size_t whichever is lesser.] */
Azure.IoT Build 0:fa2de1b79154 490 int STRING_copy_n(STRING_HANDLE handle, const char* s2, size_t n)
Azure.IoT Build 0:fa2de1b79154 491 {
Azure.IoT Build 0:fa2de1b79154 492 int result;
Azure.IoT Build 0:fa2de1b79154 493 if ((handle == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 494 {
Azure.IoT Build 0:fa2de1b79154 495 /* Codes_SRS_STRING_07_019: [STRING_copy_n shall return a nonzero value if STRING_HANDLE or const char* is NULL.] */
AzureIoTClient 21:b92006c5b9ff 496 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 497 }
Azure.IoT Build 0:fa2de1b79154 498 else
Azure.IoT Build 0:fa2de1b79154 499 {
Azure.IoT Build 0:fa2de1b79154 500 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 501 size_t s2Length = strlen(s2);
Azure.IoT Build 0:fa2de1b79154 502 char* temp;
Azure.IoT Build 0:fa2de1b79154 503 if (s2Length > n)
Azure.IoT Build 0:fa2de1b79154 504 {
Azure.IoT Build 0:fa2de1b79154 505 s2Length = n;
Azure.IoT Build 0:fa2de1b79154 506 }
Azure.IoT Build 0:fa2de1b79154 507
Azure.IoT Build 0:fa2de1b79154 508 temp = (char*)realloc(s1->s, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 509 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 510 {
AzureIoTClient 40:3f3af6cd8a01 511 LogError("Failure reallocating value.");
Azure.IoT Build 0:fa2de1b79154 512 /* Codes_SRS_STRING_07_028: [STRING_copy_n shall return a nonzero value if any error is encountered.] */
AzureIoTClient 21:b92006c5b9ff 513 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 514 }
Azure.IoT Build 0:fa2de1b79154 515 else
Azure.IoT Build 0:fa2de1b79154 516 {
Azure.IoT Build 0:fa2de1b79154 517 s1->s = temp;
AzureIoTClient 19:2e0811512ceb 518 (void)memcpy(s1->s, s2, s2Length);
Azure.IoT Build 0:fa2de1b79154 519 s1->s[s2Length] = 0;
Azure.IoT Build 0:fa2de1b79154 520 result = 0;
Azure.IoT Build 0:fa2de1b79154 521 }
Azure.IoT Build 0:fa2de1b79154 522
Azure.IoT Build 0:fa2de1b79154 523 }
Azure.IoT Build 0:fa2de1b79154 524 return result;
Azure.IoT Build 0:fa2de1b79154 525 }
Azure.IoT Build 0:fa2de1b79154 526
AzureIoTClient 25:8507bf644fdf 527 #if defined(__GNUC__)
AzureIoTClient 25:8507bf644fdf 528 __attribute__ ((format (printf, 2, 3)))
AzureIoTClient 25:8507bf644fdf 529 #endif
AzureIoTClient 8:3db46d1e5471 530 int STRING_sprintf(STRING_HANDLE handle, const char* format, ...)
AzureIoTClient 8:3db46d1e5471 531 {
AzureIoTClient 8:3db46d1e5471 532 int result;
AzureIoTClient 48:81866008bba4 533
AzureIoTClient 35:98add15351f3 534 #ifdef STRINGS_C_SPRINTF_BUFFER_SIZE
AzureIoTClient 35:98add15351f3 535 size_t maxBufSize = STRINGS_C_SPRINTF_BUFFER_SIZE;
AzureIoTClient 35:98add15351f3 536 char buf[STRINGS_C_SPRINTF_BUFFER_SIZE];
Azure.IoT.Build 16:18e7ebd42bb2 537 #else
Azure.IoT.Build 16:18e7ebd42bb2 538 size_t maxBufSize = 0;
Azure.IoT.Build 16:18e7ebd42bb2 539 char* buf = NULL;
Azure.IoT.Build 16:18e7ebd42bb2 540 #endif
AzureIoTClient 48:81866008bba4 541
AzureIoTClient 8:3db46d1e5471 542 if (handle == NULL || format == NULL)
AzureIoTClient 8:3db46d1e5471 543 {
AzureIoTClient 8:3db46d1e5471 544 /* Codes_SRS_STRING_07_042: [if the parameters s1 or format are NULL then STRING_sprintf shall return non zero value.] */
AzureIoTClient 8:3db46d1e5471 545 LogError("Invalid arg (NULL)");
AzureIoTClient 21:b92006c5b9ff 546 result = __FAILURE__;
AzureIoTClient 8:3db46d1e5471 547 }
AzureIoTClient 8:3db46d1e5471 548 else
AzureIoTClient 8:3db46d1e5471 549 {
AzureIoTClient 8:3db46d1e5471 550 va_list arg_list;
AzureIoTClient 30:ce3813c5a692 551 int s2Length;
AzureIoTClient 8:3db46d1e5471 552 va_start(arg_list, format);
AzureIoTClient 8:3db46d1e5471 553
Azure.IoT.Build 16:18e7ebd42bb2 554 s2Length = vsnprintf(buf, maxBufSize, format, arg_list);
AzureIoTClient 8:3db46d1e5471 555 va_end(arg_list);
AzureIoTClient 8:3db46d1e5471 556 if (s2Length < 0)
AzureIoTClient 8:3db46d1e5471 557 {
AzureIoTClient 8:3db46d1e5471 558 /* Codes_SRS_STRING_07_043: [If any error is encountered STRING_sprintf shall return a non zero value.] */
AzureIoTClient 8:3db46d1e5471 559 LogError("Failure vsnprintf return < 0");
AzureIoTClient 21:b92006c5b9ff 560 result = __FAILURE__;
AzureIoTClient 8:3db46d1e5471 561 }
AzureIoTClient 8:3db46d1e5471 562 else if (s2Length == 0)
AzureIoTClient 8:3db46d1e5471 563 {
AzureIoTClient 8:3db46d1e5471 564 // Don't need to reallocate and nothing should be added
AzureIoTClient 8:3db46d1e5471 565 result = 0;
AzureIoTClient 8:3db46d1e5471 566 }
AzureIoTClient 8:3db46d1e5471 567 else
AzureIoTClient 8:3db46d1e5471 568 {
AzureIoTClient 8:3db46d1e5471 569 STRING* s1 = (STRING*)handle;
AzureIoTClient 30:ce3813c5a692 570 char* temp;
AzureIoTClient 8:3db46d1e5471 571 size_t s1Length = strlen(s1->s);
AzureIoTClient 9:079c39803432 572 temp = (char*)realloc(s1->s, s1Length + s2Length + 1);
AzureIoTClient 8:3db46d1e5471 573 if (temp != NULL)
AzureIoTClient 8:3db46d1e5471 574 {
AzureIoTClient 8:3db46d1e5471 575 s1->s = temp;
AzureIoTClient 8:3db46d1e5471 576 va_start(arg_list, format);
AzureIoTClient 8:3db46d1e5471 577 if (vsnprintf(s1->s + s1Length, s1Length + s2Length + 1, format, arg_list) < 0)
AzureIoTClient 8:3db46d1e5471 578 {
AzureIoTClient 8:3db46d1e5471 579 /* Codes_SRS_STRING_07_043: [If any error is encountered STRING_sprintf shall return a non zero value.] */
AzureIoTClient 8:3db46d1e5471 580 LogError("Failure vsnprintf formatting error");
AzureIoTClient 8:3db46d1e5471 581 s1->s[s1Length] = '\0';
AzureIoTClient 21:b92006c5b9ff 582 result = __FAILURE__;
AzureIoTClient 8:3db46d1e5471 583 }
AzureIoTClient 8:3db46d1e5471 584 else
AzureIoTClient 8:3db46d1e5471 585 {
AzureIoTClient 8:3db46d1e5471 586 /* Codes_SRS_STRING_07_044: [On success STRING_sprintf shall return 0.]*/
AzureIoTClient 8:3db46d1e5471 587 result = 0;
AzureIoTClient 8:3db46d1e5471 588 }
AzureIoTClient 8:3db46d1e5471 589 va_end(arg_list);
AzureIoTClient 8:3db46d1e5471 590 }
AzureIoTClient 8:3db46d1e5471 591 else
AzureIoTClient 8:3db46d1e5471 592 {
AzureIoTClient 8:3db46d1e5471 593 /* Codes_SRS_STRING_07_043: [If any error is encountered STRING_sprintf shall return a non zero value.] */
AzureIoTClient 8:3db46d1e5471 594 LogError("Failure unable to reallocate memory");
AzureIoTClient 21:b92006c5b9ff 595 result = __FAILURE__;
AzureIoTClient 8:3db46d1e5471 596 }
AzureIoTClient 8:3db46d1e5471 597 }
AzureIoTClient 8:3db46d1e5471 598 }
AzureIoTClient 8:3db46d1e5471 599 return result;
AzureIoTClient 8:3db46d1e5471 600 }
AzureIoTClient 8:3db46d1e5471 601
Azure.IoT Build 0:fa2de1b79154 602 /*this function will quote the string passed as argument string =>"string"*/
Azure.IoT Build 0:fa2de1b79154 603 /*returns 0 if success*/ /*doesn't change the string otherwise*/
Azure.IoT Build 0:fa2de1b79154 604 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 605 /* Codes_SRS_STRING_07_014: [STRING_quote shall "quote" the supplied STRING_HANDLE and return 0 on success.] */
Azure.IoT Build 0:fa2de1b79154 606 int STRING_quote(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 607 {
Azure.IoT Build 0:fa2de1b79154 608 int result;
Azure.IoT Build 0:fa2de1b79154 609 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 610 {
Azure.IoT Build 0:fa2de1b79154 611 /* Codes_SRS_STRING_07_015: [STRING_quote shall return a nonzero value if any of the supplied parameters are NULL.] */
AzureIoTClient 21:b92006c5b9ff 612 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 613 }
Azure.IoT Build 0:fa2de1b79154 614 else
Azure.IoT Build 0:fa2de1b79154 615 {
Azure.IoT Build 0:fa2de1b79154 616 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 617 size_t s1Length = strlen(s1->s);
Azure.IoT Build 0:fa2de1b79154 618 char* temp = (char*)realloc(s1->s, s1Length + 2 + 1);/*2 because 2 quotes, 1 because '\0'*/
Azure.IoT Build 0:fa2de1b79154 619 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 620 {
AzureIoTClient 40:3f3af6cd8a01 621 LogError("Failure reallocating value.");
Azure.IoT Build 0:fa2de1b79154 622 /* Codes_SRS_STRING_07_029: [STRING_quote shall return a nonzero value if any error is encountered.] */
AzureIoTClient 21:b92006c5b9ff 623 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 624 }
Azure.IoT Build 0:fa2de1b79154 625 else
Azure.IoT Build 0:fa2de1b79154 626 {
Azure.IoT Build 0:fa2de1b79154 627 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 628 memmove(s1->s + 1, s1->s, s1Length);
Azure.IoT Build 0:fa2de1b79154 629 s1->s[0] = '"';
Azure.IoT Build 0:fa2de1b79154 630 s1->s[s1Length + 1] = '"';
Azure.IoT Build 0:fa2de1b79154 631 s1->s[s1Length + 2] = '\0';
Azure.IoT Build 0:fa2de1b79154 632 result = 0;
Azure.IoT Build 0:fa2de1b79154 633 }
Azure.IoT Build 0:fa2de1b79154 634 }
Azure.IoT Build 0:fa2de1b79154 635 return result;
Azure.IoT Build 0:fa2de1b79154 636 }
Azure.IoT Build 0:fa2de1b79154 637 /*this function will revert a string to an empty state*/
Azure.IoT Build 0:fa2de1b79154 638 /*Returns 0 if the revert was succesful*/
Azure.IoT Build 0:fa2de1b79154 639 /* Codes_SRS_STRING_07_022: [STRING_empty shall revert the STRING_HANDLE to an empty state.] */
Azure.IoT Build 0:fa2de1b79154 640 int STRING_empty(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 641 {
Azure.IoT Build 0:fa2de1b79154 642 int result;
Azure.IoT Build 0:fa2de1b79154 643 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 644 {
Azure.IoT Build 0:fa2de1b79154 645 /* Codes_SRS_STRING_07_023: [STRING_empty shall return a nonzero value if the STRING_HANDLE is NULL.] */
AzureIoTClient 21:b92006c5b9ff 646 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 647 }
Azure.IoT Build 0:fa2de1b79154 648 else
Azure.IoT Build 0:fa2de1b79154 649 {
Azure.IoT Build 0:fa2de1b79154 650 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 651 char* temp = (char*)realloc(s1->s, 1);
Azure.IoT Build 0:fa2de1b79154 652 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 653 {
AzureIoTClient 40:3f3af6cd8a01 654 LogError("Failure reallocating value.");
Azure.IoT Build 0:fa2de1b79154 655 /* Codes_SRS_STRING_07_030: [STRING_empty shall return a nonzero value if the STRING_HANDLE is NULL.] */
AzureIoTClient 21:b92006c5b9ff 656 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 657 }
Azure.IoT Build 0:fa2de1b79154 658 else
Azure.IoT Build 0:fa2de1b79154 659 {
Azure.IoT Build 0:fa2de1b79154 660 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 661 s1->s[0] = '\0';
Azure.IoT Build 0:fa2de1b79154 662 result = 0;
Azure.IoT Build 0:fa2de1b79154 663 }
Azure.IoT Build 0:fa2de1b79154 664 }
Azure.IoT Build 0:fa2de1b79154 665 return result;
Azure.IoT Build 0:fa2de1b79154 666 }
Azure.IoT Build 0:fa2de1b79154 667
Azure.IoT Build 0:fa2de1b79154 668 /*this function will deallocate a string constructed by str_new*/
Azure.IoT Build 0:fa2de1b79154 669 /* Codes_SRS_STRING_07_010: [STRING_delete will free the memory allocated by the STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 670 void STRING_delete(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 671 {
Azure.IoT Build 0:fa2de1b79154 672 /* Codes_SRS_STRING_07_011: [STRING_delete will not attempt to free anything with a NULL STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 673 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 674 {
Azure.IoT Build 0:fa2de1b79154 675 STRING* value = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 676 free(value->s);
Azure.IoT Build 0:fa2de1b79154 677 value->s = NULL;
Azure.IoT Build 0:fa2de1b79154 678 free(value);
Azure.IoT Build 0:fa2de1b79154 679 }
Azure.IoT Build 0:fa2de1b79154 680 }
Azure.IoT Build 0:fa2de1b79154 681
Azure.IoT Build 0:fa2de1b79154 682 /* Codes_SRS_STRING_07_020: [STRING_c_str shall return the const char* associated with the given STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 683 const char* STRING_c_str(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 684 {
Azure.IoT Build 0:fa2de1b79154 685 const char* result;
Azure.IoT Build 0:fa2de1b79154 686 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 687 {
Azure.IoT Build 0:fa2de1b79154 688 result = ((STRING*)handle)->s;
Azure.IoT Build 0:fa2de1b79154 689 }
Azure.IoT Build 0:fa2de1b79154 690 else
Azure.IoT Build 0:fa2de1b79154 691 {
Azure.IoT Build 0:fa2de1b79154 692 /* Codes_SRS_STRING_07_021: [STRING_c_str shall return NULL if the STRING_HANDLE is NULL.] */
Azure.IoT Build 0:fa2de1b79154 693 result = NULL;
Azure.IoT Build 0:fa2de1b79154 694 }
Azure.IoT Build 0:fa2de1b79154 695 return result;
Azure.IoT Build 0:fa2de1b79154 696 }
Azure.IoT Build 0:fa2de1b79154 697
Azure.IoT Build 0:fa2de1b79154 698 /* Codes_SRS_STRING_07_024: [STRING_length shall return the length of the underlying char* for the given handle] */
Azure.IoT Build 0:fa2de1b79154 699 size_t STRING_length(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 700 {
Azure.IoT Build 0:fa2de1b79154 701 size_t result = 0;
Azure.IoT Build 0:fa2de1b79154 702 /* Codes_SRS_STRING_07_025: [STRING_length shall return zero if the given handle is NULL.] */
Azure.IoT Build 0:fa2de1b79154 703 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 704 {
Azure.IoT Build 0:fa2de1b79154 705 STRING* value = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 706 result = strlen(value->s);
Azure.IoT Build 0:fa2de1b79154 707 }
Azure.IoT Build 0:fa2de1b79154 708 return result;
Azure.IoT Build 0:fa2de1b79154 709 }
Azure.IoT Build 0:fa2de1b79154 710
Azure.IoT Build 0:fa2de1b79154 711 /*Codes_SRS_STRING_02_007: [STRING_construct_n shall construct a STRING_HANDLE from first "n" characters of the string pointed to by psz parameter.]*/
Azure.IoT Build 0:fa2de1b79154 712 STRING_HANDLE STRING_construct_n(const char* psz, size_t n)
Azure.IoT Build 0:fa2de1b79154 713 {
Azure.IoT Build 0:fa2de1b79154 714 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 715 /*Codes_SRS_STRING_02_008: [If psz is NULL then STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 716 if (psz == NULL)
Azure.IoT Build 0:fa2de1b79154 717 {
Azure.IoT Build 0:fa2de1b79154 718 result = NULL;
AzureIoTClient 1:9190c0f4d23a 719 LogError("invalid arg (NULL)");
Azure.IoT Build 0:fa2de1b79154 720 }
Azure.IoT Build 0:fa2de1b79154 721 else
Azure.IoT Build 0:fa2de1b79154 722 {
Azure.IoT Build 0:fa2de1b79154 723 size_t len = strlen(psz);
Azure.IoT Build 0:fa2de1b79154 724 /*Codes_SRS_STRING_02_009: [If n is bigger than the size of the string psz, then STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 725 if (n > len)
Azure.IoT Build 0:fa2de1b79154 726 {
Azure.IoT Build 0:fa2de1b79154 727 result = NULL;
AzureIoTClient 1:9190c0f4d23a 728 LogError("invalig arg (n is bigger than the size of the string)");
Azure.IoT Build 0:fa2de1b79154 729 }
Azure.IoT Build 0:fa2de1b79154 730 else
Azure.IoT Build 0:fa2de1b79154 731 {
Azure.IoT Build 0:fa2de1b79154 732 STRING* str;
Azure.IoT Build 0:fa2de1b79154 733 if ((str = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 734 {
Azure.IoT Build 0:fa2de1b79154 735 if ((str->s = (char*)malloc(len + 1)) != NULL)
Azure.IoT Build 0:fa2de1b79154 736 {
AzureIoTClient 19:2e0811512ceb 737 (void)memcpy(str->s, psz, n);
Azure.IoT Build 0:fa2de1b79154 738 str->s[n] = '\0';
Azure.IoT Build 0:fa2de1b79154 739 result = (STRING_HANDLE)str;
Azure.IoT Build 0:fa2de1b79154 740 }
Azure.IoT Build 0:fa2de1b79154 741 /* Codes_SRS_STRING_02_010: [In all other error cases, STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 742 else
Azure.IoT Build 0:fa2de1b79154 743 {
AzureIoTClient 40:3f3af6cd8a01 744 LogError("Failure allocating value.");
Azure.IoT Build 0:fa2de1b79154 745 free(str);
Azure.IoT Build 0:fa2de1b79154 746 result = NULL;
Azure.IoT Build 0:fa2de1b79154 747 }
Azure.IoT Build 0:fa2de1b79154 748 }
Azure.IoT Build 0:fa2de1b79154 749 else
Azure.IoT Build 0:fa2de1b79154 750 {
Azure.IoT Build 0:fa2de1b79154 751 /* Codes_SRS_STRING_02_010: [In all other error cases, STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 752 result = NULL;
Azure.IoT Build 0:fa2de1b79154 753 }
Azure.IoT Build 0:fa2de1b79154 754 }
Azure.IoT Build 0:fa2de1b79154 755 }
Azure.IoT Build 0:fa2de1b79154 756 return result;
Azure.IoT Build 0:fa2de1b79154 757 }
Azure.IoT Build 0:fa2de1b79154 758
Azure.IoT Build 0:fa2de1b79154 759 /* Codes_SRS_STRING_07_034: [STRING_compare returns an integer greater than, equal to, or less than zero, accordingly as the string pointed to by s1 is greater than, equal to, or less than the string s2.] */
Azure.IoT Build 0:fa2de1b79154 760 int STRING_compare(STRING_HANDLE s1, STRING_HANDLE s2)
Azure.IoT Build 0:fa2de1b79154 761 {
Azure.IoT Build 0:fa2de1b79154 762 int result;
Azure.IoT Build 0:fa2de1b79154 763 if (s1 == NULL && s2 == NULL)
Azure.IoT Build 0:fa2de1b79154 764 {
Azure.IoT Build 0:fa2de1b79154 765 /* Codes_SRS_STRING_07_035: [If h1 and h2 are both NULL then STRING_compare shall return 0.]*/
Azure.IoT Build 0:fa2de1b79154 766 result = 0;
Azure.IoT Build 0:fa2de1b79154 767 }
Azure.IoT Build 0:fa2de1b79154 768 else if (s1 == NULL)
Azure.IoT Build 0:fa2de1b79154 769 {
Azure.IoT Build 0:fa2de1b79154 770 /* Codes_SRS_STRING_07_036: [If h1 is NULL and h2 is nonNULL then STRING_compare shall return 1.]*/
Azure.IoT Build 0:fa2de1b79154 771 result = 1;
Azure.IoT Build 0:fa2de1b79154 772 }
Azure.IoT Build 0:fa2de1b79154 773 else if (s2 == NULL)
Azure.IoT Build 0:fa2de1b79154 774 {
Azure.IoT Build 0:fa2de1b79154 775 /* Codes_SRS_STRING_07_037: [If h2 is NULL and h1 is nonNULL then STRING_compare shall return -1.] */
Azure.IoT Build 0:fa2de1b79154 776 result = -1;
Azure.IoT Build 0:fa2de1b79154 777 }
Azure.IoT Build 0:fa2de1b79154 778 else
Azure.IoT Build 0:fa2de1b79154 779 {
Azure.IoT Build 0:fa2de1b79154 780 /* Codes_SRS_STRING_07_038: [STRING_compare shall compare the char s variable using the strcmp function.] */
Azure.IoT Build 0:fa2de1b79154 781 STRING* value1 = (STRING*)s1;
Azure.IoT Build 0:fa2de1b79154 782 STRING* value2 = (STRING*)s2;
Azure.IoT Build 0:fa2de1b79154 783 result = strcmp(value1->s, value2->s);
Azure.IoT Build 0:fa2de1b79154 784 }
Azure.IoT Build 0:fa2de1b79154 785 return result;
Azure.IoT Build 0:fa2de1b79154 786 }
AzureIoTClient 4:2bd2074fe6c4 787
AzureIoTClient 4:2bd2074fe6c4 788 STRING_HANDLE STRING_from_byte_array(const unsigned char* source, size_t size)
AzureIoTClient 4:2bd2074fe6c4 789 {
AzureIoTClient 4:2bd2074fe6c4 790 STRING* result;
AzureIoTClient 4:2bd2074fe6c4 791 /*Codes_SRS_STRING_02_022: [ If source is NULL and size > 0 then STRING_from_BUFFER shall fail and return NULL. ]*/
AzureIoTClient 4:2bd2074fe6c4 792 if ((source == NULL) && (size > 0))
AzureIoTClient 4:2bd2074fe6c4 793 {
AzureIoTClient 4:2bd2074fe6c4 794 LogError("invalid parameter (NULL)");
AzureIoTClient 4:2bd2074fe6c4 795 result = NULL;
AzureIoTClient 4:2bd2074fe6c4 796 }
AzureIoTClient 4:2bd2074fe6c4 797 else
AzureIoTClient 4:2bd2074fe6c4 798 {
AzureIoTClient 4:2bd2074fe6c4 799 /*Codes_SRS_STRING_02_023: [ Otherwise, STRING_from_BUFFER shall build a string that has the same content (byte-by-byte) as source and return a non-NULL handle. ]*/
AzureIoTClient 4:2bd2074fe6c4 800 result = (STRING*)malloc(sizeof(STRING));
AzureIoTClient 4:2bd2074fe6c4 801 if (result == NULL)
AzureIoTClient 4:2bd2074fe6c4 802 {
AzureIoTClient 4:2bd2074fe6c4 803 /*Codes_SRS_STRING_02_024: [ If building the string fails, then STRING_from_BUFFER shall fail and return NULL. ]*/
AzureIoTClient 4:2bd2074fe6c4 804 LogError("oom - unable to malloc");
AzureIoTClient 4:2bd2074fe6c4 805 /*return as is*/
AzureIoTClient 4:2bd2074fe6c4 806 }
AzureIoTClient 4:2bd2074fe6c4 807 else
AzureIoTClient 4:2bd2074fe6c4 808 {
AzureIoTClient 4:2bd2074fe6c4 809 /*Codes_SRS_STRING_02_023: [ Otherwise, STRING_from_BUFFER shall build a string that has the same content (byte-by-byte) as source and return a non-NULL handle. ]*/
AzureIoTClient 4:2bd2074fe6c4 810 result->s = (char*)malloc(size + 1);
AzureIoTClient 4:2bd2074fe6c4 811 if (result->s == NULL)
AzureIoTClient 4:2bd2074fe6c4 812 {
AzureIoTClient 4:2bd2074fe6c4 813 /*Codes_SRS_STRING_02_024: [ If building the string fails, then STRING_from_BUFFER shall fail and return NULL. ]*/
AzureIoTClient 4:2bd2074fe6c4 814 LogError("oom - unable to malloc");
AzureIoTClient 4:2bd2074fe6c4 815 free(result);
AzureIoTClient 4:2bd2074fe6c4 816 result = NULL;
AzureIoTClient 4:2bd2074fe6c4 817 }
AzureIoTClient 4:2bd2074fe6c4 818 else
AzureIoTClient 4:2bd2074fe6c4 819 {
AzureIoTClient 19:2e0811512ceb 820 (void)memcpy(result->s, source, size);
AzureIoTClient 4:2bd2074fe6c4 821 result->s[size] = '\0'; /*all is fine*/
AzureIoTClient 4:2bd2074fe6c4 822 }
AzureIoTClient 4:2bd2074fe6c4 823 }
AzureIoTClient 4:2bd2074fe6c4 824 }
AzureIoTClient 4:2bd2074fe6c4 825 return (STRING_HANDLE)result;
AzureIoTClient 4:2bd2074fe6c4 826 }
AzureIoTClient 30:ce3813c5a692 827
AzureIoTClient 30:ce3813c5a692 828 int STRING_replace(STRING_HANDLE handle, char target, char replace)
AzureIoTClient 30:ce3813c5a692 829 {
AzureIoTClient 30:ce3813c5a692 830 int result;
AzureIoTClient 30:ce3813c5a692 831 if (handle == NULL)
AzureIoTClient 30:ce3813c5a692 832 {
AzureIoTClient 30:ce3813c5a692 833 /* Codes_SRS_STRING_07_046: [ If handle is NULL STRING_replace shall return a non-zero value. ] */
AzureIoTClient 30:ce3813c5a692 834 result = __FAILURE__;
AzureIoTClient 30:ce3813c5a692 835 }
AzureIoTClient 30:ce3813c5a692 836 else if (target == replace)
AzureIoTClient 30:ce3813c5a692 837 {
AzureIoTClient 30:ce3813c5a692 838 /* Codes_SRS_STRING_07_048: [ If target and replace are equal STRING_replace, shall do nothing shall return zero. ] */
AzureIoTClient 30:ce3813c5a692 839 result = 0;
AzureIoTClient 30:ce3813c5a692 840 }
AzureIoTClient 30:ce3813c5a692 841 else
AzureIoTClient 30:ce3813c5a692 842 {
AzureIoTClient 30:ce3813c5a692 843 size_t length;
AzureIoTClient 30:ce3813c5a692 844 size_t index;
AzureIoTClient 30:ce3813c5a692 845 /* Codes_SRS_STRING_07_047: [ STRING_replace shall replace all instances of target with replace. ] */
AzureIoTClient 30:ce3813c5a692 846 STRING* str_value = (STRING*)handle;
AzureIoTClient 30:ce3813c5a692 847 length = strlen(str_value->s);
AzureIoTClient 30:ce3813c5a692 848 for (index = 0; index < length; index++)
AzureIoTClient 30:ce3813c5a692 849 {
AzureIoTClient 30:ce3813c5a692 850 if (str_value->s[index] == target)
AzureIoTClient 30:ce3813c5a692 851 {
AzureIoTClient 30:ce3813c5a692 852 str_value->s[index] = replace;
AzureIoTClient 30:ce3813c5a692 853 }
AzureIoTClient 30:ce3813c5a692 854 }
AzureIoTClient 30:ce3813c5a692 855 /* Codes_SRS_STRING_07_049: [ On success STRING_replace shall return zero. ] */
AzureIoTClient 30:ce3813c5a692 856 result = 0;
AzureIoTClient 30:ce3813c5a692 857 }
AzureIoTClient 30:ce3813c5a692 858 return result;
AzureIoTClient 30:ce3813c5a692 859 }