Azure IoT common library

Fork of azure_c_shared_utility by Azure IoT

Committer:
AzureIoTClient
Date:
Sat Jan 28 09:35:22 2017 -0800
Revision:
19:2e0811512ceb
Parent:
16:18e7ebd42bb2
Child:
21:b92006c5b9ff
1.1.6

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