Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
Azure.IoT Build
Date:
Fri Apr 08 12:01:36 2016 -0700
Revision:
0:fa2de1b79154
Child:
1:9190c0f4d23a
1.0.4

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 #ifdef _CRTDBG_MAP_ALLOC
Azure.IoT Build 0:fa2de1b79154 9 #include <crtdbg.h>
Azure.IoT Build 0:fa2de1b79154 10 #endif
Azure.IoT Build 0:fa2de1b79154 11 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 12
Azure.IoT Build 0:fa2de1b79154 13 #include <stddef.h>
Azure.IoT Build 0:fa2de1b79154 14 #include <string.h>
Azure.IoT Build 0:fa2de1b79154 15 //
Azure.IoT Build 0:fa2de1b79154 16 // PUT NO CLIENT LIBRARY INCLUDES BEFORE HERE
Azure.IoT Build 0:fa2de1b79154 17 //
Azure.IoT Build 0:fa2de1b79154 18
Azure.IoT Build 0:fa2de1b79154 19 #include "azure_c_shared_utility/strings.h"
Azure.IoT Build 0:fa2de1b79154 20 #include "azure_c_shared_utility/iot_logging.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;
Azure.IoT Build 0:fa2de1b79154 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.] */
Azure.IoT Build 0:fa2de1b79154 44 free(result);
Azure.IoT Build 0:fa2de1b79154 45 result = NULL;
Azure.IoT Build 0:fa2de1b79154 46 }
Azure.IoT Build 0:fa2de1b79154 47 }
Azure.IoT Build 0:fa2de1b79154 48 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 49 }
Azure.IoT Build 0:fa2de1b79154 50
Azure.IoT Build 0:fa2de1b79154 51 /*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 52 STRING_HANDLE STRING_clone(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 53 {
Azure.IoT Build 0:fa2de1b79154 54 STRING* result;
Azure.IoT Build 0:fa2de1b79154 55 /*Codes_SRS_STRING_02_002: [If parameter handle is NULL then STRING_clone shall return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 56 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 57 {
Azure.IoT Build 0:fa2de1b79154 58 result = NULL;
Azure.IoT Build 0:fa2de1b79154 59 }
Azure.IoT Build 0:fa2de1b79154 60 else
Azure.IoT Build 0:fa2de1b79154 61 {
Azure.IoT Build 0:fa2de1b79154 62 /*Codes_SRS_STRING_02_003: [If STRING_clone fails for any reason, it shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 63 if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 64 {
Azure.IoT Build 0:fa2de1b79154 65 STRING* source = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 66 /*Codes_SRS_STRING_02_003: [If STRING_clone fails for any reason, it shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 67 size_t sourceLen = strlen(source->s);
Azure.IoT Build 0:fa2de1b79154 68 if ((result->s = (char*)malloc(sourceLen + 1)) == NULL)
Azure.IoT Build 0:fa2de1b79154 69 {
Azure.IoT Build 0:fa2de1b79154 70 free(result);
Azure.IoT Build 0:fa2de1b79154 71 result = NULL;
Azure.IoT Build 0:fa2de1b79154 72 }
Azure.IoT Build 0:fa2de1b79154 73 else
Azure.IoT Build 0:fa2de1b79154 74 {
Azure.IoT Build 0:fa2de1b79154 75 memcpy(result->s, source->s, sourceLen + 1);
Azure.IoT Build 0:fa2de1b79154 76 }
Azure.IoT Build 0:fa2de1b79154 77 }
Azure.IoT Build 0:fa2de1b79154 78 else
Azure.IoT Build 0:fa2de1b79154 79 {
Azure.IoT Build 0:fa2de1b79154 80 /*not much to do, result is NULL from malloc*/
Azure.IoT Build 0:fa2de1b79154 81 }
Azure.IoT Build 0:fa2de1b79154 82 }
Azure.IoT Build 0:fa2de1b79154 83 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 84 }
Azure.IoT Build 0:fa2de1b79154 85
Azure.IoT Build 0:fa2de1b79154 86 /* 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 87 STRING_HANDLE STRING_construct(const char* psz)
Azure.IoT Build 0:fa2de1b79154 88 {
Azure.IoT Build 0:fa2de1b79154 89 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 90 if (psz == NULL)
Azure.IoT Build 0:fa2de1b79154 91 {
Azure.IoT Build 0:fa2de1b79154 92 /* Codes_SRS_STRING_07_005: [If the supplied const char* is NULL STRING_construct shall return a NULL value.] */
Azure.IoT Build 0:fa2de1b79154 93 result = NULL;
Azure.IoT Build 0:fa2de1b79154 94 }
Azure.IoT Build 0:fa2de1b79154 95 else
Azure.IoT Build 0:fa2de1b79154 96 {
Azure.IoT Build 0:fa2de1b79154 97 STRING* str;
Azure.IoT Build 0:fa2de1b79154 98 if ((str = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 99 {
Azure.IoT Build 0:fa2de1b79154 100 size_t nLen = strlen(psz) + 1;
Azure.IoT Build 0:fa2de1b79154 101 if ((str->s = (char*)malloc(nLen)) != NULL)
Azure.IoT Build 0:fa2de1b79154 102 {
Azure.IoT Build 0:fa2de1b79154 103 memcpy(str->s, psz, nLen);
Azure.IoT Build 0:fa2de1b79154 104 result = (STRING_HANDLE)str;
Azure.IoT Build 0:fa2de1b79154 105 }
Azure.IoT Build 0:fa2de1b79154 106 /* Codes_SRS_STRING_07_032: [STRING_construct encounters any error it shall return a NULL value.] */
Azure.IoT Build 0:fa2de1b79154 107 else
Azure.IoT Build 0:fa2de1b79154 108 {
Azure.IoT Build 0:fa2de1b79154 109 free(str);
Azure.IoT Build 0:fa2de1b79154 110 result = NULL;
Azure.IoT Build 0:fa2de1b79154 111 }
Azure.IoT Build 0:fa2de1b79154 112 }
Azure.IoT Build 0:fa2de1b79154 113 else
Azure.IoT Build 0:fa2de1b79154 114 {
Azure.IoT Build 0:fa2de1b79154 115 /* Codes_SRS_STRING_07_032: [STRING_construct encounters any error it shall return a NULL value.] */
Azure.IoT Build 0:fa2de1b79154 116 result = NULL;
Azure.IoT Build 0:fa2de1b79154 117 }
Azure.IoT Build 0:fa2de1b79154 118 }
Azure.IoT Build 0:fa2de1b79154 119 return result;
Azure.IoT Build 0:fa2de1b79154 120 }
Azure.IoT Build 0:fa2de1b79154 121
Azure.IoT Build 0:fa2de1b79154 122 /*this function will return a new STRING with the memory for the actual string passed in as a parameter.*/
Azure.IoT Build 0:fa2de1b79154 123 /*return NULL if it fails.*/
Azure.IoT Build 0:fa2de1b79154 124 /* The supplied memory must have been allocated with malloc! */
Azure.IoT Build 0:fa2de1b79154 125 /* 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 126 STRING_HANDLE STRING_new_with_memory(const char* memory)
Azure.IoT Build 0:fa2de1b79154 127 {
Azure.IoT Build 0:fa2de1b79154 128 STRING* result;
Azure.IoT Build 0:fa2de1b79154 129 if (memory == NULL)
Azure.IoT Build 0:fa2de1b79154 130 {
Azure.IoT Build 0:fa2de1b79154 131 /* 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 132 result = NULL;
Azure.IoT Build 0:fa2de1b79154 133 }
Azure.IoT Build 0:fa2de1b79154 134 else
Azure.IoT Build 0:fa2de1b79154 135 {
Azure.IoT Build 0:fa2de1b79154 136 if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 137 {
Azure.IoT Build 0:fa2de1b79154 138 result->s = (char*)memory;
Azure.IoT Build 0:fa2de1b79154 139 }
Azure.IoT Build 0:fa2de1b79154 140 }
Azure.IoT Build 0:fa2de1b79154 141 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 142 }
Azure.IoT Build 0:fa2de1b79154 143
Azure.IoT Build 0:fa2de1b79154 144 /* 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 145 STRING_HANDLE STRING_new_quoted(const char* source)
Azure.IoT Build 0:fa2de1b79154 146 {
Azure.IoT Build 0:fa2de1b79154 147 STRING* result;
Azure.IoT Build 0:fa2de1b79154 148 if (source == NULL)
Azure.IoT Build 0:fa2de1b79154 149 {
Azure.IoT Build 0:fa2de1b79154 150 /* 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 151 result = NULL;
Azure.IoT Build 0:fa2de1b79154 152 }
Azure.IoT Build 0:fa2de1b79154 153 else if ((result = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 154 {
Azure.IoT Build 0:fa2de1b79154 155 size_t sourceLength = strlen(source);
Azure.IoT Build 0:fa2de1b79154 156 if ((result->s = (char*)malloc(sourceLength + 3)) != NULL)
Azure.IoT Build 0:fa2de1b79154 157 {
Azure.IoT Build 0:fa2de1b79154 158 result->s[0] = '"';
Azure.IoT Build 0:fa2de1b79154 159 memcpy(result->s + 1, source, sourceLength);
Azure.IoT Build 0:fa2de1b79154 160 result->s[sourceLength + 1] = '"';
Azure.IoT Build 0:fa2de1b79154 161 result->s[sourceLength + 2] = '\0';
Azure.IoT Build 0:fa2de1b79154 162 }
Azure.IoT Build 0:fa2de1b79154 163 else
Azure.IoT Build 0:fa2de1b79154 164 {
Azure.IoT Build 0:fa2de1b79154 165 /* Codes_SRS_STRING_07_031: [STRING_new_quoted shall return a NULL STRING_HANDLE if any error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 166 free(result);
Azure.IoT Build 0:fa2de1b79154 167 result = NULL;
Azure.IoT Build 0:fa2de1b79154 168 }
Azure.IoT Build 0:fa2de1b79154 169 }
Azure.IoT Build 0:fa2de1b79154 170 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 171 }
Azure.IoT Build 0:fa2de1b79154 172
Azure.IoT Build 0:fa2de1b79154 173 /*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 174 /*the newly created handle needs to be disposed of with STRING_delete*/
Azure.IoT Build 0:fa2de1b79154 175 /*returns NULL if there are errors*/
Azure.IoT Build 0:fa2de1b79154 176 STRING_HANDLE STRING_new_JSON(const char* source)
Azure.IoT Build 0:fa2de1b79154 177 {
Azure.IoT Build 0:fa2de1b79154 178 STRING* result;
Azure.IoT Build 0:fa2de1b79154 179 if (source == NULL)
Azure.IoT Build 0:fa2de1b79154 180 {
Azure.IoT Build 0:fa2de1b79154 181 /*Codes_SRS_STRING_02_011: [If source is NULL then STRING_new_JSON shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 182 result = NULL;
Azure.IoT Build 0:fa2de1b79154 183 LogError("invalid arg (NULL)\r\n");
Azure.IoT Build 0:fa2de1b79154 184 }
Azure.IoT Build 0:fa2de1b79154 185 else
Azure.IoT Build 0:fa2de1b79154 186 {
Azure.IoT Build 0:fa2de1b79154 187 size_t i;
Azure.IoT Build 0:fa2de1b79154 188 size_t nControlCharacters = 0; /*counts how many characters are to be expanded from 1 character to \uxxxx (6 characters)*/
Azure.IoT Build 0:fa2de1b79154 189 size_t nEscapeCharacters = 0;
Azure.IoT Build 0:fa2de1b79154 190 size_t vlen = strlen(source);
Azure.IoT Build 0:fa2de1b79154 191
Azure.IoT Build 0:fa2de1b79154 192 for (i = 0; i < vlen; i++)
Azure.IoT Build 0:fa2de1b79154 193 {
Azure.IoT Build 0:fa2de1b79154 194 /*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 195 if ((unsigned char)source[i] >= 128) /*this be a UNICODE character begin*/
Azure.IoT Build 0:fa2de1b79154 196 {
Azure.IoT Build 0:fa2de1b79154 197 break;
Azure.IoT Build 0:fa2de1b79154 198 }
Azure.IoT Build 0:fa2de1b79154 199 else
Azure.IoT Build 0:fa2de1b79154 200 {
Azure.IoT Build 0:fa2de1b79154 201 if (source[i] <= 0x1F)
Azure.IoT Build 0:fa2de1b79154 202 {
Azure.IoT Build 0:fa2de1b79154 203 nControlCharacters++;
Azure.IoT Build 0:fa2de1b79154 204 }
Azure.IoT Build 0:fa2de1b79154 205 else if (
Azure.IoT Build 0:fa2de1b79154 206 (source[i] == '"') ||
Azure.IoT Build 0:fa2de1b79154 207 (source[i] == '\\') ||
Azure.IoT Build 0:fa2de1b79154 208 (source[i] == '/')
Azure.IoT Build 0:fa2de1b79154 209 )
Azure.IoT Build 0:fa2de1b79154 210 {
Azure.IoT Build 0:fa2de1b79154 211 nEscapeCharacters++;
Azure.IoT Build 0:fa2de1b79154 212 }
Azure.IoT Build 0:fa2de1b79154 213 }
Azure.IoT Build 0:fa2de1b79154 214 }
Azure.IoT Build 0:fa2de1b79154 215
Azure.IoT Build 0:fa2de1b79154 216 if (i < vlen)
Azure.IoT Build 0:fa2de1b79154 217 {
Azure.IoT Build 0:fa2de1b79154 218 result = NULL;
Azure.IoT Build 0:fa2de1b79154 219 LogError("invalid character in input string\r\n");
Azure.IoT Build 0:fa2de1b79154 220 }
Azure.IoT Build 0:fa2de1b79154 221 else
Azure.IoT Build 0:fa2de1b79154 222 {
Azure.IoT Build 0:fa2de1b79154 223 if ((result = (STRING*)malloc(sizeof(STRING))) == NULL)
Azure.IoT Build 0:fa2de1b79154 224 {
Azure.IoT Build 0:fa2de1b79154 225 /*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 226 LogError("malloc failure\r\n");
Azure.IoT Build 0:fa2de1b79154 227 }
Azure.IoT Build 0:fa2de1b79154 228 else if ((result->s = (char*)malloc(vlen + 5 * nControlCharacters + nEscapeCharacters + 3)) == NULL)
Azure.IoT Build 0:fa2de1b79154 229 {
Azure.IoT Build 0:fa2de1b79154 230 /*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 231 free(result);
Azure.IoT Build 0:fa2de1b79154 232 result = NULL;
Azure.IoT Build 0:fa2de1b79154 233 LogError("malloc failed\r\n");
Azure.IoT Build 0:fa2de1b79154 234 }
Azure.IoT Build 0:fa2de1b79154 235 else
Azure.IoT Build 0:fa2de1b79154 236 {
Azure.IoT Build 0:fa2de1b79154 237 size_t pos = 0;
Azure.IoT Build 0:fa2de1b79154 238 /*Codes_SRS_STRING_02_012: [The string shall begin with the quote character.] */
Azure.IoT Build 0:fa2de1b79154 239 result->s[pos++] = '"';
Azure.IoT Build 0:fa2de1b79154 240 for (i = 0; i < vlen; i++)
Azure.IoT Build 0:fa2de1b79154 241 {
Azure.IoT Build 0:fa2de1b79154 242 if (source[i] <= 0x1F)
Azure.IoT Build 0:fa2de1b79154 243 {
Azure.IoT Build 0:fa2de1b79154 244 /*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 245 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 246 result->s[pos++] = 'u';
Azure.IoT Build 0:fa2de1b79154 247 result->s[pos++] = '0';
Azure.IoT Build 0:fa2de1b79154 248 result->s[pos++] = '0';
Azure.IoT Build 0:fa2de1b79154 249 result->s[pos++] = hexToASCII[(source[i] & 0xF0) >> 4]; /*high nibble*/
Azure.IoT Build 0:fa2de1b79154 250 result->s[pos++] = hexToASCII[source[i] & 0x0F]; /*low nibble*/
Azure.IoT Build 0:fa2de1b79154 251 }
Azure.IoT Build 0:fa2de1b79154 252 else if (source[i] == '"')
Azure.IoT Build 0:fa2de1b79154 253 {
Azure.IoT Build 0:fa2de1b79154 254 /*Codes_SRS_STRING_02_016: [If the character is " (quote) then it shall be repsented as \".] */
Azure.IoT Build 0:fa2de1b79154 255 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 256 result->s[pos++] = '"';
Azure.IoT Build 0:fa2de1b79154 257 }
Azure.IoT Build 0:fa2de1b79154 258 else if (source[i] == '\\')
Azure.IoT Build 0:fa2de1b79154 259 {
Azure.IoT Build 0:fa2de1b79154 260 /*Codes_SRS_STRING_02_017: [If the character is \ (backslash) then it shall represented as \\.] */
Azure.IoT Build 0:fa2de1b79154 261 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 262 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 263 }
Azure.IoT Build 0:fa2de1b79154 264 else if (source[i] == '/')
Azure.IoT Build 0:fa2de1b79154 265 {
Azure.IoT Build 0:fa2de1b79154 266 /*Codes_SRS_STRING_02_018: [If the character is / (slash) then it shall be represented as \/.] */
Azure.IoT Build 0:fa2de1b79154 267 result->s[pos++] = '\\';
Azure.IoT Build 0:fa2de1b79154 268 result->s[pos++] = '/';
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 /*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 273 result->s[pos++] = source[i];
Azure.IoT Build 0:fa2de1b79154 274 }
Azure.IoT Build 0:fa2de1b79154 275 }
Azure.IoT Build 0:fa2de1b79154 276 /*Codes_SRS_STRING_02_020: [The string shall end with " (quote).] */
Azure.IoT Build 0:fa2de1b79154 277 result->s[pos++] = '"';
Azure.IoT Build 0:fa2de1b79154 278 /*zero terminating it*/
Azure.IoT Build 0:fa2de1b79154 279 result->s[pos] = '\0';
Azure.IoT Build 0:fa2de1b79154 280 }
Azure.IoT Build 0:fa2de1b79154 281 }
Azure.IoT Build 0:fa2de1b79154 282
Azure.IoT Build 0:fa2de1b79154 283 }
Azure.IoT Build 0:fa2de1b79154 284 return (STRING_HANDLE)result;
Azure.IoT Build 0:fa2de1b79154 285 }
Azure.IoT Build 0:fa2de1b79154 286
Azure.IoT Build 0:fa2de1b79154 287 /*this function will concatenate to the string s1 the string s2, resulting in s1+s2*/
Azure.IoT Build 0:fa2de1b79154 288 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 289 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 290 /* 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 291 int STRING_concat(STRING_HANDLE handle, const char* s2)
Azure.IoT Build 0:fa2de1b79154 292 {
Azure.IoT Build 0:fa2de1b79154 293 int result;
Azure.IoT Build 0:fa2de1b79154 294 if ((handle == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 295 {
Azure.IoT Build 0:fa2de1b79154 296 /* Codes_SRS_STRING_07_013: [STRING_concat shall return a nonzero number if an error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 297 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 298 }
Azure.IoT Build 0:fa2de1b79154 299 else
Azure.IoT Build 0:fa2de1b79154 300 {
Azure.IoT Build 0:fa2de1b79154 301 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 302 size_t s1Length = strlen(s1->s);
Azure.IoT Build 0:fa2de1b79154 303 size_t s2Length = strlen(s2);
Azure.IoT Build 0:fa2de1b79154 304 char* temp = (char*)realloc(s1->s, s1Length + s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 305 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 306 {
Azure.IoT Build 0:fa2de1b79154 307 /* Codes_SRS_STRING_07_013: [STRING_concat shall return a nonzero number if an error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 308 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 309 }
Azure.IoT Build 0:fa2de1b79154 310 else
Azure.IoT Build 0:fa2de1b79154 311 {
Azure.IoT Build 0:fa2de1b79154 312 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 313 memcpy(s1->s + s1Length, s2, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 314 result = 0;
Azure.IoT Build 0:fa2de1b79154 315 }
Azure.IoT Build 0:fa2de1b79154 316 }
Azure.IoT Build 0:fa2de1b79154 317 return result;
Azure.IoT Build 0:fa2de1b79154 318 }
Azure.IoT Build 0:fa2de1b79154 319
Azure.IoT Build 0:fa2de1b79154 320 /*this function will concatenate to the string s1 the string s2, resulting in s1+s2*/
Azure.IoT Build 0:fa2de1b79154 321 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 322 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 323 /* 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 324 int STRING_concat_with_STRING(STRING_HANDLE s1, STRING_HANDLE s2)
Azure.IoT Build 0:fa2de1b79154 325 {
Azure.IoT Build 0:fa2de1b79154 326 int result;
Azure.IoT Build 0:fa2de1b79154 327 if ((s1 == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 328 {
Azure.IoT Build 0:fa2de1b79154 329 /* Codes_SRS_STRING_07_035: [String_Concat_with_STRING shall return a nonzero number if an error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 330 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 331 }
Azure.IoT Build 0:fa2de1b79154 332 else
Azure.IoT Build 0:fa2de1b79154 333 {
Azure.IoT Build 0:fa2de1b79154 334 STRING* dest = (STRING*)s1;
Azure.IoT Build 0:fa2de1b79154 335 STRING* src = (STRING*)s2;
Azure.IoT Build 0:fa2de1b79154 336
Azure.IoT Build 0:fa2de1b79154 337 size_t s1Length = strlen(dest->s);
Azure.IoT Build 0:fa2de1b79154 338 size_t s2Length = strlen(src->s);
Azure.IoT Build 0:fa2de1b79154 339 char* temp = (char*)realloc(dest->s, s1Length + s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 340 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 341 {
Azure.IoT Build 0:fa2de1b79154 342 /* Codes_SRS_STRING_07_035: [String_Concat_with_STRING shall return a nonzero number if an error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 343 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 344 }
Azure.IoT Build 0:fa2de1b79154 345 else
Azure.IoT Build 0:fa2de1b79154 346 {
Azure.IoT Build 0:fa2de1b79154 347 dest->s = temp;
Azure.IoT Build 0:fa2de1b79154 348 /* 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 349 memcpy(dest->s + s1Length, src->s, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 350 result = 0;
Azure.IoT Build 0:fa2de1b79154 351 }
Azure.IoT Build 0:fa2de1b79154 352 }
Azure.IoT Build 0:fa2de1b79154 353 return result;
Azure.IoT Build 0:fa2de1b79154 354 }
Azure.IoT Build 0:fa2de1b79154 355
Azure.IoT Build 0:fa2de1b79154 356 /*this function will copy the string from s2 to s1*/
Azure.IoT Build 0:fa2de1b79154 357 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 358 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 359 /* Codes_SRS_STRING_07_016: [STRING_copy shall copy the const char* into the supplied STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 360 int STRING_copy(STRING_HANDLE handle, const char* s2)
Azure.IoT Build 0:fa2de1b79154 361 {
Azure.IoT Build 0:fa2de1b79154 362 int result;
Azure.IoT Build 0:fa2de1b79154 363 if ((handle == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 364 {
Azure.IoT Build 0:fa2de1b79154 365 /* Codes_SRS_STRING_07_017: [STRING_copy shall return a nonzero value if any of the supplied parameters are NULL.] */
Azure.IoT Build 0:fa2de1b79154 366 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 367 }
Azure.IoT Build 0:fa2de1b79154 368 else
Azure.IoT Build 0:fa2de1b79154 369 {
Azure.IoT Build 0:fa2de1b79154 370 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 371 /* 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 372 if (s1->s != s2)
Azure.IoT Build 0:fa2de1b79154 373 {
Azure.IoT Build 0:fa2de1b79154 374 size_t s2Length = strlen(s2);
Azure.IoT Build 0:fa2de1b79154 375 char* temp = (char*)realloc(s1->s, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 376 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 377 {
Azure.IoT Build 0:fa2de1b79154 378 /* Codes_SRS_STRING_07_027: [STRING_copy shall return a nonzero value if any error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 379 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 380 }
Azure.IoT Build 0:fa2de1b79154 381 else
Azure.IoT Build 0:fa2de1b79154 382 {
Azure.IoT Build 0:fa2de1b79154 383 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 384 memmove(s1->s, s2, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 385 result = 0;
Azure.IoT Build 0:fa2de1b79154 386 }
Azure.IoT Build 0:fa2de1b79154 387 }
Azure.IoT Build 0:fa2de1b79154 388 else
Azure.IoT Build 0:fa2de1b79154 389 {
Azure.IoT Build 0:fa2de1b79154 390 /* Codes_SRS_STRING_07_033: [If overlapping pointer address is given to STRING_copy the behavior is undefined.] */
Azure.IoT Build 0:fa2de1b79154 391 result = 0;
Azure.IoT Build 0:fa2de1b79154 392 }
Azure.IoT Build 0:fa2de1b79154 393 }
Azure.IoT Build 0:fa2de1b79154 394 return result;
Azure.IoT Build 0:fa2de1b79154 395 }
Azure.IoT Build 0:fa2de1b79154 396
Azure.IoT Build 0:fa2de1b79154 397 /*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 398 /*returns 0 if success*/
Azure.IoT Build 0:fa2de1b79154 399 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 400 /* 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 401 int STRING_copy_n(STRING_HANDLE handle, const char* s2, size_t n)
Azure.IoT Build 0:fa2de1b79154 402 {
Azure.IoT Build 0:fa2de1b79154 403 int result;
Azure.IoT Build 0:fa2de1b79154 404 if ((handle == NULL) || (s2 == NULL))
Azure.IoT Build 0:fa2de1b79154 405 {
Azure.IoT Build 0:fa2de1b79154 406 /* Codes_SRS_STRING_07_019: [STRING_copy_n shall return a nonzero value if STRING_HANDLE or const char* is NULL.] */
Azure.IoT Build 0:fa2de1b79154 407 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 408 }
Azure.IoT Build 0:fa2de1b79154 409 else
Azure.IoT Build 0:fa2de1b79154 410 {
Azure.IoT Build 0:fa2de1b79154 411 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 412 size_t s2Length = strlen(s2);
Azure.IoT Build 0:fa2de1b79154 413 char* temp;
Azure.IoT Build 0:fa2de1b79154 414 if (s2Length > n)
Azure.IoT Build 0:fa2de1b79154 415 {
Azure.IoT Build 0:fa2de1b79154 416 s2Length = n;
Azure.IoT Build 0:fa2de1b79154 417 }
Azure.IoT Build 0:fa2de1b79154 418
Azure.IoT Build 0:fa2de1b79154 419 temp = (char*)realloc(s1->s, s2Length + 1);
Azure.IoT Build 0:fa2de1b79154 420 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 421 {
Azure.IoT Build 0:fa2de1b79154 422 /* Codes_SRS_STRING_07_028: [STRING_copy_n shall return a nonzero value if any error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 423 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 424 }
Azure.IoT Build 0:fa2de1b79154 425 else
Azure.IoT Build 0:fa2de1b79154 426 {
Azure.IoT Build 0:fa2de1b79154 427 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 428 memcpy(s1->s, s2, s2Length);
Azure.IoT Build 0:fa2de1b79154 429 s1->s[s2Length] = 0;
Azure.IoT Build 0:fa2de1b79154 430 result = 0;
Azure.IoT Build 0:fa2de1b79154 431 }
Azure.IoT Build 0:fa2de1b79154 432
Azure.IoT Build 0:fa2de1b79154 433 }
Azure.IoT Build 0:fa2de1b79154 434 return result;
Azure.IoT Build 0:fa2de1b79154 435 }
Azure.IoT Build 0:fa2de1b79154 436
Azure.IoT Build 0:fa2de1b79154 437 /*this function will quote the string passed as argument string =>"string"*/
Azure.IoT Build 0:fa2de1b79154 438 /*returns 0 if success*/ /*doesn't change the string otherwise*/
Azure.IoT Build 0:fa2de1b79154 439 /*any other error code is failure*/
Azure.IoT Build 0:fa2de1b79154 440 /* Codes_SRS_STRING_07_014: [STRING_quote shall "quote" the supplied STRING_HANDLE and return 0 on success.] */
Azure.IoT Build 0:fa2de1b79154 441 int STRING_quote(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 442 {
Azure.IoT Build 0:fa2de1b79154 443 int result;
Azure.IoT Build 0:fa2de1b79154 444 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 445 {
Azure.IoT Build 0:fa2de1b79154 446 /* Codes_SRS_STRING_07_015: [STRING_quote shall return a nonzero value if any of the supplied parameters are NULL.] */
Azure.IoT Build 0:fa2de1b79154 447 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 448 }
Azure.IoT Build 0:fa2de1b79154 449 else
Azure.IoT Build 0:fa2de1b79154 450 {
Azure.IoT Build 0:fa2de1b79154 451 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 452 size_t s1Length = strlen(s1->s);
Azure.IoT Build 0:fa2de1b79154 453 char* temp = (char*)realloc(s1->s, s1Length + 2 + 1);/*2 because 2 quotes, 1 because '\0'*/
Azure.IoT Build 0:fa2de1b79154 454 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 455 {
Azure.IoT Build 0:fa2de1b79154 456 /* Codes_SRS_STRING_07_029: [STRING_quote shall return a nonzero value if any error is encountered.] */
Azure.IoT Build 0:fa2de1b79154 457 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 458 }
Azure.IoT Build 0:fa2de1b79154 459 else
Azure.IoT Build 0:fa2de1b79154 460 {
Azure.IoT Build 0:fa2de1b79154 461 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 462 memmove(s1->s + 1, s1->s, s1Length);
Azure.IoT Build 0:fa2de1b79154 463 s1->s[0] = '"';
Azure.IoT Build 0:fa2de1b79154 464 s1->s[s1Length + 1] = '"';
Azure.IoT Build 0:fa2de1b79154 465 s1->s[s1Length + 2] = '\0';
Azure.IoT Build 0:fa2de1b79154 466 result = 0;
Azure.IoT Build 0:fa2de1b79154 467 }
Azure.IoT Build 0:fa2de1b79154 468 }
Azure.IoT Build 0:fa2de1b79154 469 return result;
Azure.IoT Build 0:fa2de1b79154 470 }
Azure.IoT Build 0:fa2de1b79154 471 /*this function will revert a string to an empty state*/
Azure.IoT Build 0:fa2de1b79154 472 /*Returns 0 if the revert was succesful*/
Azure.IoT Build 0:fa2de1b79154 473 /* Codes_SRS_STRING_07_022: [STRING_empty shall revert the STRING_HANDLE to an empty state.] */
Azure.IoT Build 0:fa2de1b79154 474 int STRING_empty(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 475 {
Azure.IoT Build 0:fa2de1b79154 476 int result;
Azure.IoT Build 0:fa2de1b79154 477 if (handle == NULL)
Azure.IoT Build 0:fa2de1b79154 478 {
Azure.IoT Build 0:fa2de1b79154 479 /* Codes_SRS_STRING_07_023: [STRING_empty shall return a nonzero value if the STRING_HANDLE is NULL.] */
Azure.IoT Build 0:fa2de1b79154 480 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 481 }
Azure.IoT Build 0:fa2de1b79154 482 else
Azure.IoT Build 0:fa2de1b79154 483 {
Azure.IoT Build 0:fa2de1b79154 484 STRING* s1 = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 485 char* temp = (char*)realloc(s1->s, 1);
Azure.IoT Build 0:fa2de1b79154 486 if (temp == NULL)
Azure.IoT Build 0:fa2de1b79154 487 {
Azure.IoT Build 0:fa2de1b79154 488 /* Codes_SRS_STRING_07_030: [STRING_empty shall return a nonzero value if the STRING_HANDLE is NULL.] */
Azure.IoT Build 0:fa2de1b79154 489 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 490 }
Azure.IoT Build 0:fa2de1b79154 491 else
Azure.IoT Build 0:fa2de1b79154 492 {
Azure.IoT Build 0:fa2de1b79154 493 s1->s = temp;
Azure.IoT Build 0:fa2de1b79154 494 s1->s[0] = '\0';
Azure.IoT Build 0:fa2de1b79154 495 result = 0;
Azure.IoT Build 0:fa2de1b79154 496 }
Azure.IoT Build 0:fa2de1b79154 497 }
Azure.IoT Build 0:fa2de1b79154 498 return result;
Azure.IoT Build 0:fa2de1b79154 499 }
Azure.IoT Build 0:fa2de1b79154 500
Azure.IoT Build 0:fa2de1b79154 501 /*this function will deallocate a string constructed by str_new*/
Azure.IoT Build 0:fa2de1b79154 502 /* Codes_SRS_STRING_07_010: [STRING_delete will free the memory allocated by the STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 503 void STRING_delete(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 504 {
Azure.IoT Build 0:fa2de1b79154 505 /* Codes_SRS_STRING_07_011: [STRING_delete will not attempt to free anything with a NULL STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 506 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 507 {
Azure.IoT Build 0:fa2de1b79154 508 STRING* value = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 509 free(value->s);
Azure.IoT Build 0:fa2de1b79154 510 value->s = NULL;
Azure.IoT Build 0:fa2de1b79154 511 free(value);
Azure.IoT Build 0:fa2de1b79154 512 }
Azure.IoT Build 0:fa2de1b79154 513 }
Azure.IoT Build 0:fa2de1b79154 514
Azure.IoT Build 0:fa2de1b79154 515 /* Codes_SRS_STRING_07_020: [STRING_c_str shall return the const char* associated with the given STRING_HANDLE.] */
Azure.IoT Build 0:fa2de1b79154 516 const char* STRING_c_str(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 517 {
Azure.IoT Build 0:fa2de1b79154 518 const char* result;
Azure.IoT Build 0:fa2de1b79154 519 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 520 {
Azure.IoT Build 0:fa2de1b79154 521 result = ((STRING*)handle)->s;
Azure.IoT Build 0:fa2de1b79154 522 }
Azure.IoT Build 0:fa2de1b79154 523 else
Azure.IoT Build 0:fa2de1b79154 524 {
Azure.IoT Build 0:fa2de1b79154 525 /* Codes_SRS_STRING_07_021: [STRING_c_str shall return NULL if the STRING_HANDLE is NULL.] */
Azure.IoT Build 0:fa2de1b79154 526 result = NULL;
Azure.IoT Build 0:fa2de1b79154 527 }
Azure.IoT Build 0:fa2de1b79154 528 return result;
Azure.IoT Build 0:fa2de1b79154 529 }
Azure.IoT Build 0:fa2de1b79154 530
Azure.IoT Build 0:fa2de1b79154 531 /* Codes_SRS_STRING_07_024: [STRING_length shall return the length of the underlying char* for the given handle] */
Azure.IoT Build 0:fa2de1b79154 532 size_t STRING_length(STRING_HANDLE handle)
Azure.IoT Build 0:fa2de1b79154 533 {
Azure.IoT Build 0:fa2de1b79154 534 size_t result = 0;
Azure.IoT Build 0:fa2de1b79154 535 /* Codes_SRS_STRING_07_025: [STRING_length shall return zero if the given handle is NULL.] */
Azure.IoT Build 0:fa2de1b79154 536 if (handle != NULL)
Azure.IoT Build 0:fa2de1b79154 537 {
Azure.IoT Build 0:fa2de1b79154 538 STRING* value = (STRING*)handle;
Azure.IoT Build 0:fa2de1b79154 539 result = strlen(value->s);
Azure.IoT Build 0:fa2de1b79154 540 }
Azure.IoT Build 0:fa2de1b79154 541 return result;
Azure.IoT Build 0:fa2de1b79154 542 }
Azure.IoT Build 0:fa2de1b79154 543
Azure.IoT Build 0:fa2de1b79154 544 /*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 545 STRING_HANDLE STRING_construct_n(const char* psz, size_t n)
Azure.IoT Build 0:fa2de1b79154 546 {
Azure.IoT Build 0:fa2de1b79154 547 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 548 /*Codes_SRS_STRING_02_008: [If psz is NULL then STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 549 if (psz == NULL)
Azure.IoT Build 0:fa2de1b79154 550 {
Azure.IoT Build 0:fa2de1b79154 551 result = NULL;
Azure.IoT Build 0:fa2de1b79154 552 LogError("invalid arg (NULL)\r\n");
Azure.IoT Build 0:fa2de1b79154 553 }
Azure.IoT Build 0:fa2de1b79154 554 else
Azure.IoT Build 0:fa2de1b79154 555 {
Azure.IoT Build 0:fa2de1b79154 556 size_t len = strlen(psz);
Azure.IoT Build 0:fa2de1b79154 557 /*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 558 if (n > len)
Azure.IoT Build 0:fa2de1b79154 559 {
Azure.IoT Build 0:fa2de1b79154 560 result = NULL;
Azure.IoT Build 0:fa2de1b79154 561 LogError("invalig arg (n is bigger than the size of the string)\r\n");
Azure.IoT Build 0:fa2de1b79154 562 }
Azure.IoT Build 0:fa2de1b79154 563 else
Azure.IoT Build 0:fa2de1b79154 564 {
Azure.IoT Build 0:fa2de1b79154 565 STRING* str;
Azure.IoT Build 0:fa2de1b79154 566 if ((str = (STRING*)malloc(sizeof(STRING))) != NULL)
Azure.IoT Build 0:fa2de1b79154 567 {
Azure.IoT Build 0:fa2de1b79154 568 if ((str->s = (char*)malloc(len + 1)) != NULL)
Azure.IoT Build 0:fa2de1b79154 569 {
Azure.IoT Build 0:fa2de1b79154 570 memcpy(str->s, psz, n);
Azure.IoT Build 0:fa2de1b79154 571 str->s[n] = '\0';
Azure.IoT Build 0:fa2de1b79154 572 result = (STRING_HANDLE)str;
Azure.IoT Build 0:fa2de1b79154 573 }
Azure.IoT Build 0:fa2de1b79154 574 /* Codes_SRS_STRING_02_010: [In all other error cases, STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 575 else
Azure.IoT Build 0:fa2de1b79154 576 {
Azure.IoT Build 0:fa2de1b79154 577 free(str);
Azure.IoT Build 0:fa2de1b79154 578 result = NULL;
Azure.IoT Build 0:fa2de1b79154 579 }
Azure.IoT Build 0:fa2de1b79154 580 }
Azure.IoT Build 0:fa2de1b79154 581 else
Azure.IoT Build 0:fa2de1b79154 582 {
Azure.IoT Build 0:fa2de1b79154 583 /* Codes_SRS_STRING_02_010: [In all other error cases, STRING_construct_n shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 584 result = NULL;
Azure.IoT Build 0:fa2de1b79154 585 }
Azure.IoT Build 0:fa2de1b79154 586 }
Azure.IoT Build 0:fa2de1b79154 587 }
Azure.IoT Build 0:fa2de1b79154 588 return result;
Azure.IoT Build 0:fa2de1b79154 589 }
Azure.IoT Build 0:fa2de1b79154 590
Azure.IoT Build 0:fa2de1b79154 591 /* 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 592 int STRING_compare(STRING_HANDLE s1, STRING_HANDLE s2)
Azure.IoT Build 0:fa2de1b79154 593 {
Azure.IoT Build 0:fa2de1b79154 594 int result;
Azure.IoT Build 0:fa2de1b79154 595 if (s1 == NULL && s2 == NULL)
Azure.IoT Build 0:fa2de1b79154 596 {
Azure.IoT Build 0:fa2de1b79154 597 /* Codes_SRS_STRING_07_035: [If h1 and h2 are both NULL then STRING_compare shall return 0.]*/
Azure.IoT Build 0:fa2de1b79154 598 result = 0;
Azure.IoT Build 0:fa2de1b79154 599 }
Azure.IoT Build 0:fa2de1b79154 600 else if (s1 == NULL)
Azure.IoT Build 0:fa2de1b79154 601 {
Azure.IoT Build 0:fa2de1b79154 602 /* Codes_SRS_STRING_07_036: [If h1 is NULL and h2 is nonNULL then STRING_compare shall return 1.]*/
Azure.IoT Build 0:fa2de1b79154 603 result = 1;
Azure.IoT Build 0:fa2de1b79154 604 }
Azure.IoT Build 0:fa2de1b79154 605 else if (s2 == NULL)
Azure.IoT Build 0:fa2de1b79154 606 {
Azure.IoT Build 0:fa2de1b79154 607 /* Codes_SRS_STRING_07_037: [If h2 is NULL and h1 is nonNULL then STRING_compare shall return -1.] */
Azure.IoT Build 0:fa2de1b79154 608 result = -1;
Azure.IoT Build 0:fa2de1b79154 609 }
Azure.IoT Build 0:fa2de1b79154 610 else
Azure.IoT Build 0:fa2de1b79154 611 {
Azure.IoT Build 0:fa2de1b79154 612 /* Codes_SRS_STRING_07_038: [STRING_compare shall compare the char s variable using the strcmp function.] */
Azure.IoT Build 0:fa2de1b79154 613 STRING* value1 = (STRING*)s1;
Azure.IoT Build 0:fa2de1b79154 614 STRING* value2 = (STRING*)s2;
Azure.IoT Build 0:fa2de1b79154 615 result = strcmp(value1->s, value2->s);
Azure.IoT Build 0:fa2de1b79154 616 }
Azure.IoT Build 0:fa2de1b79154 617 return result;
Azure.IoT Build 0:fa2de1b79154 618 }