Azure IoT common library

Fork of azure_c_shared_utility by Azure IoT

Committer:
AzureIoTClient
Date:
Fri Aug 12 13:49:58 2016 -0700
Revision:
9:079c39803432
Parent:
8:3db46d1e5471
Child:
16:18e7ebd42bb2
1.0.10

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