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