Azure IoT common library
Dependents: STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more
map.c@19:2e0811512ceb, 2017-01-28 (annotated)
- Committer:
- AzureIoTClient
- Date:
- Sat Jan 28 09:35:22 2017 -0800
- Revision:
- 19:2e0811512ceb
- Parent:
- 6:c55b013dfc2a
- Child:
- 21:b92006c5b9ff
1.1.6
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 | #include <stdlib.h> |
Azure.IoT Build | 0:fa2de1b79154 | 5 | #include "azure_c_shared_utility/gballoc.h" |
Azure.IoT Build | 0:fa2de1b79154 | 6 | #include "azure_c_shared_utility/map.h" |
Azure.IoT Build | 6:c55b013dfc2a | 7 | #include "azure_c_shared_utility/xlogging.h" |
Azure.IoT Build | 0:fa2de1b79154 | 8 | #include "azure_c_shared_utility/strings.h" |
Azure.IoT Build | 0:fa2de1b79154 | 9 | |
Azure.IoT Build | 0:fa2de1b79154 | 10 | DEFINE_ENUM_STRINGS(MAP_RESULT, MAP_RESULT_VALUES); |
Azure.IoT Build | 0:fa2de1b79154 | 11 | |
Azure.IoT Build | 0:fa2de1b79154 | 12 | typedef struct MAP_HANDLE_DATA_TAG |
Azure.IoT Build | 0:fa2de1b79154 | 13 | { |
Azure.IoT Build | 0:fa2de1b79154 | 14 | char** keys; |
Azure.IoT Build | 0:fa2de1b79154 | 15 | char** values; |
Azure.IoT Build | 0:fa2de1b79154 | 16 | size_t count; |
Azure.IoT Build | 0:fa2de1b79154 | 17 | MAP_FILTER_CALLBACK mapFilterCallback; |
Azure.IoT Build | 0:fa2de1b79154 | 18 | }MAP_HANDLE_DATA; |
Azure.IoT Build | 0:fa2de1b79154 | 19 | |
AzureIoTClient | 1:9190c0f4d23a | 20 | #define LOG_MAP_ERROR LogError("result = %s", ENUM_TO_STRING(MAP_RESULT, result)); |
Azure.IoT Build | 0:fa2de1b79154 | 21 | |
Azure.IoT Build | 0:fa2de1b79154 | 22 | MAP_HANDLE Map_Create(MAP_FILTER_CALLBACK mapFilterFunc) |
Azure.IoT Build | 0:fa2de1b79154 | 23 | { |
Azure.IoT Build | 0:fa2de1b79154 | 24 | /*Codes_SRS_MAP_02_001: [Map_Create shall create a new, empty map.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 25 | MAP_HANDLE_DATA* result = (MAP_HANDLE_DATA*)malloc(sizeof(MAP_HANDLE_DATA)); |
Azure.IoT Build | 0:fa2de1b79154 | 26 | /*Codes_SRS_MAP_02_002: [If during creation there are any error, then Map_Create shall return NULL.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 27 | if (result != NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 28 | { |
Azure.IoT Build | 0:fa2de1b79154 | 29 | /*Codes_SRS_MAP_02_003: [Otherwise, it shall return a non-NULL handle that can be used in subsequent calls.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 30 | result->keys = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 31 | result->values = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 32 | result->count = 0; |
Azure.IoT Build | 0:fa2de1b79154 | 33 | result->mapFilterCallback = mapFilterFunc; |
Azure.IoT Build | 0:fa2de1b79154 | 34 | } |
Azure.IoT Build | 0:fa2de1b79154 | 35 | return (MAP_HANDLE)result; |
Azure.IoT Build | 0:fa2de1b79154 | 36 | } |
Azure.IoT Build | 0:fa2de1b79154 | 37 | |
Azure.IoT Build | 0:fa2de1b79154 | 38 | void Map_Destroy(MAP_HANDLE handle) |
Azure.IoT Build | 0:fa2de1b79154 | 39 | { |
Azure.IoT Build | 0:fa2de1b79154 | 40 | /*Codes_SRS_MAP_02_005: [If parameter handle is NULL then Map_Destroy shall take no action.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 41 | if (handle != NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 42 | { |
Azure.IoT Build | 0:fa2de1b79154 | 43 | /*Codes_SRS_MAP_02_004: [Map_Destroy shall release all resources associated with the map.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 44 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 45 | size_t i; |
Azure.IoT Build | 0:fa2de1b79154 | 46 | |
Azure.IoT Build | 0:fa2de1b79154 | 47 | for (i = 0; i < handleData->count; i++) |
Azure.IoT Build | 0:fa2de1b79154 | 48 | { |
Azure.IoT Build | 0:fa2de1b79154 | 49 | free(handleData->keys[i]); |
Azure.IoT Build | 0:fa2de1b79154 | 50 | free(handleData->values[i]); |
Azure.IoT Build | 0:fa2de1b79154 | 51 | } |
Azure.IoT Build | 0:fa2de1b79154 | 52 | free(handleData->keys); |
Azure.IoT Build | 0:fa2de1b79154 | 53 | free(handleData->values); |
Azure.IoT Build | 0:fa2de1b79154 | 54 | free(handleData); |
Azure.IoT Build | 0:fa2de1b79154 | 55 | } |
Azure.IoT Build | 0:fa2de1b79154 | 56 | } |
Azure.IoT Build | 0:fa2de1b79154 | 57 | |
Azure.IoT Build | 0:fa2de1b79154 | 58 | /*makes a copy of a vector of const char*, having size "size". source cannot be NULL*/ |
Azure.IoT Build | 0:fa2de1b79154 | 59 | /*returns NULL if it fails*/ |
Azure.IoT Build | 0:fa2de1b79154 | 60 | static char** Map_CloneVector(const char*const * source, size_t count) |
Azure.IoT Build | 0:fa2de1b79154 | 61 | { |
Azure.IoT Build | 0:fa2de1b79154 | 62 | char** result; |
Azure.IoT Build | 0:fa2de1b79154 | 63 | result = (char**)malloc(count *sizeof(char*)); |
Azure.IoT Build | 0:fa2de1b79154 | 64 | if (result == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 65 | { |
Azure.IoT Build | 0:fa2de1b79154 | 66 | /*do nothing, just return it (NULL)*/ |
Azure.IoT Build | 0:fa2de1b79154 | 67 | } |
Azure.IoT Build | 0:fa2de1b79154 | 68 | else |
Azure.IoT Build | 0:fa2de1b79154 | 69 | { |
Azure.IoT Build | 0:fa2de1b79154 | 70 | size_t i; |
Azure.IoT Build | 0:fa2de1b79154 | 71 | for (i = 0; i < count; i++) |
Azure.IoT Build | 0:fa2de1b79154 | 72 | { |
Azure.IoT Build | 0:fa2de1b79154 | 73 | if (mallocAndStrcpy_s(result + i, source[i]) != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 74 | { |
Azure.IoT Build | 0:fa2de1b79154 | 75 | break; |
Azure.IoT Build | 0:fa2de1b79154 | 76 | } |
Azure.IoT Build | 0:fa2de1b79154 | 77 | } |
Azure.IoT Build | 0:fa2de1b79154 | 78 | |
Azure.IoT Build | 0:fa2de1b79154 | 79 | if (i == count) |
Azure.IoT Build | 0:fa2de1b79154 | 80 | { |
Azure.IoT Build | 0:fa2de1b79154 | 81 | /*it is all good, proceed to return result*/ |
Azure.IoT Build | 0:fa2de1b79154 | 82 | } |
Azure.IoT Build | 0:fa2de1b79154 | 83 | else |
Azure.IoT Build | 0:fa2de1b79154 | 84 | { |
Azure.IoT Build | 0:fa2de1b79154 | 85 | size_t j; |
Azure.IoT Build | 0:fa2de1b79154 | 86 | for (j = 0; j < i; j++) |
Azure.IoT Build | 0:fa2de1b79154 | 87 | { |
Azure.IoT Build | 0:fa2de1b79154 | 88 | free(result[j]); |
Azure.IoT Build | 0:fa2de1b79154 | 89 | } |
Azure.IoT Build | 0:fa2de1b79154 | 90 | free(result); |
Azure.IoT Build | 0:fa2de1b79154 | 91 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 92 | } |
Azure.IoT Build | 0:fa2de1b79154 | 93 | } |
Azure.IoT Build | 0:fa2de1b79154 | 94 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 95 | } |
Azure.IoT Build | 0:fa2de1b79154 | 96 | |
Azure.IoT Build | 0:fa2de1b79154 | 97 | /*Codes_SRS_MAP_02_039: [Map_Clone shall make a copy of the map indicated by parameter handle and return a non-NULL handle to it.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 98 | MAP_HANDLE Map_Clone(MAP_HANDLE handle) |
Azure.IoT Build | 0:fa2de1b79154 | 99 | { |
Azure.IoT Build | 0:fa2de1b79154 | 100 | MAP_HANDLE_DATA* result; |
Azure.IoT Build | 0:fa2de1b79154 | 101 | if (handle == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 102 | { |
Azure.IoT Build | 0:fa2de1b79154 | 103 | /*Codes_SRS_MAP_02_038: [Map_Clone returns NULL if parameter handle is NULL.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 104 | result = NULL; |
AzureIoTClient | 1:9190c0f4d23a | 105 | LogError("invalid arg to Map_Clone (NULL)"); |
Azure.IoT Build | 0:fa2de1b79154 | 106 | } |
Azure.IoT Build | 0:fa2de1b79154 | 107 | else |
Azure.IoT Build | 0:fa2de1b79154 | 108 | { |
Azure.IoT Build | 0:fa2de1b79154 | 109 | MAP_HANDLE_DATA * handleData = (MAP_HANDLE_DATA *)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 110 | result = (MAP_HANDLE_DATA*)malloc(sizeof(MAP_HANDLE_DATA)); |
Azure.IoT Build | 0:fa2de1b79154 | 111 | if (result == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 112 | { |
Azure.IoT Build | 0:fa2de1b79154 | 113 | /*Codes_SRS_MAP_02_047: [If during cloning, any operation fails, then Map_Clone shall return NULL.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 114 | /*do nothing, proceed to return it, this is an error case*/ |
AzureIoTClient | 1:9190c0f4d23a | 115 | LogError("unable to malloc"); |
Azure.IoT Build | 0:fa2de1b79154 | 116 | } |
Azure.IoT Build | 0:fa2de1b79154 | 117 | else |
Azure.IoT Build | 0:fa2de1b79154 | 118 | { |
Azure.IoT Build | 0:fa2de1b79154 | 119 | if (handleData->count == 0) |
Azure.IoT Build | 0:fa2de1b79154 | 120 | { |
Azure.IoT Build | 0:fa2de1b79154 | 121 | result->count = 0; |
Azure.IoT Build | 0:fa2de1b79154 | 122 | result->keys = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 123 | result->values = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 124 | result->mapFilterCallback = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 125 | } |
Azure.IoT Build | 0:fa2de1b79154 | 126 | else |
Azure.IoT Build | 0:fa2de1b79154 | 127 | { |
Azure.IoT Build | 0:fa2de1b79154 | 128 | result->mapFilterCallback = handleData->mapFilterCallback; |
Azure.IoT Build | 0:fa2de1b79154 | 129 | result->count = handleData->count; |
Azure.IoT Build | 0:fa2de1b79154 | 130 | if( (result->keys = Map_CloneVector((const char* const*)handleData->keys, handleData->count))==NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 131 | { |
Azure.IoT Build | 0:fa2de1b79154 | 132 | /*Codes_SRS_MAP_02_047: [If during cloning, any operation fails, then Map_Clone shall return NULL.] */ |
AzureIoTClient | 1:9190c0f4d23a | 133 | LogError("unable to clone keys"); |
Azure.IoT Build | 0:fa2de1b79154 | 134 | free(result); |
Azure.IoT Build | 0:fa2de1b79154 | 135 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 136 | } |
Azure.IoT Build | 0:fa2de1b79154 | 137 | else if ((result->values = Map_CloneVector((const char* const*)handleData->values, handleData->count)) == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 138 | { |
Azure.IoT Build | 0:fa2de1b79154 | 139 | /*Codes_SRS_MAP_02_047: [If during cloning, any operation fails, then Map_Clone shall return NULL.] */ |
AzureIoTClient | 1:9190c0f4d23a | 140 | LogError("unable to clone values"); |
Azure.IoT Build | 0:fa2de1b79154 | 141 | size_t i; |
Azure.IoT Build | 0:fa2de1b79154 | 142 | for (i = 0; i < result->count; i++) |
Azure.IoT Build | 0:fa2de1b79154 | 143 | { |
Azure.IoT Build | 0:fa2de1b79154 | 144 | free(result->keys[i]); |
Azure.IoT Build | 0:fa2de1b79154 | 145 | } |
Azure.IoT Build | 0:fa2de1b79154 | 146 | free(result->keys); |
Azure.IoT Build | 0:fa2de1b79154 | 147 | free(result); |
Azure.IoT Build | 0:fa2de1b79154 | 148 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 149 | } |
Azure.IoT Build | 0:fa2de1b79154 | 150 | else |
Azure.IoT Build | 0:fa2de1b79154 | 151 | { |
Azure.IoT Build | 0:fa2de1b79154 | 152 | /*all fine, return it*/ |
Azure.IoT Build | 0:fa2de1b79154 | 153 | } |
Azure.IoT Build | 0:fa2de1b79154 | 154 | } |
Azure.IoT Build | 0:fa2de1b79154 | 155 | } |
Azure.IoT Build | 0:fa2de1b79154 | 156 | } |
Azure.IoT Build | 0:fa2de1b79154 | 157 | return (MAP_HANDLE)result; |
Azure.IoT Build | 0:fa2de1b79154 | 158 | } |
Azure.IoT Build | 0:fa2de1b79154 | 159 | |
Azure.IoT Build | 0:fa2de1b79154 | 160 | static int Map_IncreaseStorageKeysValues(MAP_HANDLE_DATA* handleData) |
Azure.IoT Build | 0:fa2de1b79154 | 161 | { |
Azure.IoT Build | 0:fa2de1b79154 | 162 | int result; |
Azure.IoT Build | 0:fa2de1b79154 | 163 | char** newKeys = (char**)realloc(handleData->keys, (handleData->count + 1) * sizeof(char*)); |
Azure.IoT Build | 0:fa2de1b79154 | 164 | if (newKeys == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 165 | { |
AzureIoTClient | 1:9190c0f4d23a | 166 | LogError("realloc error"); |
Azure.IoT Build | 0:fa2de1b79154 | 167 | result = __LINE__; |
Azure.IoT Build | 0:fa2de1b79154 | 168 | } |
Azure.IoT Build | 0:fa2de1b79154 | 169 | else |
Azure.IoT Build | 0:fa2de1b79154 | 170 | { |
Azure.IoT Build | 0:fa2de1b79154 | 171 | char** newValues; |
Azure.IoT Build | 0:fa2de1b79154 | 172 | handleData->keys = newKeys; |
Azure.IoT Build | 0:fa2de1b79154 | 173 | handleData->keys[handleData->count] = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 174 | newValues = (char**)realloc(handleData->values, (handleData->count + 1) * sizeof(char*)); |
Azure.IoT Build | 0:fa2de1b79154 | 175 | if (newValues == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 176 | { |
AzureIoTClient | 1:9190c0f4d23a | 177 | LogError("realloc error"); |
Azure.IoT Build | 0:fa2de1b79154 | 178 | if (handleData->count == 0) /*avoiding an implementation defined behavior */ |
Azure.IoT Build | 0:fa2de1b79154 | 179 | { |
Azure.IoT Build | 0:fa2de1b79154 | 180 | free(handleData->keys); |
Azure.IoT Build | 0:fa2de1b79154 | 181 | handleData->keys = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 182 | } |
Azure.IoT Build | 0:fa2de1b79154 | 183 | else |
Azure.IoT Build | 0:fa2de1b79154 | 184 | { |
Azure.IoT Build | 0:fa2de1b79154 | 185 | char** undoneKeys = (char**)realloc(handleData->keys, (handleData->count) * sizeof(char*)); |
Azure.IoT Build | 0:fa2de1b79154 | 186 | if (undoneKeys == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 187 | { |
AzureIoTClient | 1:9190c0f4d23a | 188 | LogError("CATASTROPHIC error, unable to undo through realloc to a smaller size"); |
Azure.IoT Build | 0:fa2de1b79154 | 189 | } |
Azure.IoT Build | 0:fa2de1b79154 | 190 | else |
Azure.IoT Build | 0:fa2de1b79154 | 191 | { |
Azure.IoT Build | 0:fa2de1b79154 | 192 | handleData->keys = undoneKeys; |
Azure.IoT Build | 0:fa2de1b79154 | 193 | } |
Azure.IoT Build | 0:fa2de1b79154 | 194 | } |
Azure.IoT Build | 0:fa2de1b79154 | 195 | result = __LINE__; |
Azure.IoT Build | 0:fa2de1b79154 | 196 | } |
Azure.IoT Build | 0:fa2de1b79154 | 197 | else |
Azure.IoT Build | 0:fa2de1b79154 | 198 | { |
Azure.IoT Build | 0:fa2de1b79154 | 199 | handleData->values = newValues; |
Azure.IoT Build | 0:fa2de1b79154 | 200 | handleData->values[handleData->count] = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 201 | handleData->count++; |
Azure.IoT Build | 0:fa2de1b79154 | 202 | result = 0; |
Azure.IoT Build | 0:fa2de1b79154 | 203 | } |
Azure.IoT Build | 0:fa2de1b79154 | 204 | } |
Azure.IoT Build | 0:fa2de1b79154 | 205 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 206 | } |
Azure.IoT Build | 0:fa2de1b79154 | 207 | |
Azure.IoT Build | 0:fa2de1b79154 | 208 | static void Map_DecreaseStorageKeysValues(MAP_HANDLE_DATA* handleData) |
Azure.IoT Build | 0:fa2de1b79154 | 209 | { |
Azure.IoT Build | 0:fa2de1b79154 | 210 | if (handleData->count == 1) |
Azure.IoT Build | 0:fa2de1b79154 | 211 | { |
Azure.IoT Build | 0:fa2de1b79154 | 212 | free(handleData->keys); |
Azure.IoT Build | 0:fa2de1b79154 | 213 | handleData->keys = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 214 | free(handleData->values); |
Azure.IoT Build | 0:fa2de1b79154 | 215 | handleData->values = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 216 | handleData->count = 0; |
Azure.IoT Build | 0:fa2de1b79154 | 217 | handleData->mapFilterCallback = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 218 | } |
Azure.IoT Build | 0:fa2de1b79154 | 219 | else |
Azure.IoT Build | 0:fa2de1b79154 | 220 | { |
Azure.IoT Build | 0:fa2de1b79154 | 221 | /*certainly > 1...*/ |
Azure.IoT Build | 0:fa2de1b79154 | 222 | char** undoneValues; |
Azure.IoT Build | 0:fa2de1b79154 | 223 | char** undoneKeys = (char**)realloc(handleData->keys, sizeof(char*)* (handleData->count - 1)); |
Azure.IoT Build | 0:fa2de1b79154 | 224 | if (undoneKeys == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 225 | { |
AzureIoTClient | 1:9190c0f4d23a | 226 | LogError("CATASTROPHIC error, unable to undo through realloc to a smaller size"); |
Azure.IoT Build | 0:fa2de1b79154 | 227 | } |
Azure.IoT Build | 0:fa2de1b79154 | 228 | else |
Azure.IoT Build | 0:fa2de1b79154 | 229 | { |
Azure.IoT Build | 0:fa2de1b79154 | 230 | handleData->keys = undoneKeys; |
Azure.IoT Build | 0:fa2de1b79154 | 231 | } |
Azure.IoT Build | 0:fa2de1b79154 | 232 | |
Azure.IoT Build | 0:fa2de1b79154 | 233 | undoneValues = (char**)realloc(handleData->values, sizeof(char*)* (handleData->count - 1)); |
Azure.IoT Build | 0:fa2de1b79154 | 234 | if (undoneValues == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 235 | { |
AzureIoTClient | 1:9190c0f4d23a | 236 | LogError("CATASTROPHIC error, unable to undo through realloc to a smaller size"); |
Azure.IoT Build | 0:fa2de1b79154 | 237 | } |
Azure.IoT Build | 0:fa2de1b79154 | 238 | else |
Azure.IoT Build | 0:fa2de1b79154 | 239 | { |
Azure.IoT Build | 0:fa2de1b79154 | 240 | handleData->values = undoneValues; |
Azure.IoT Build | 0:fa2de1b79154 | 241 | } |
Azure.IoT Build | 0:fa2de1b79154 | 242 | |
Azure.IoT Build | 0:fa2de1b79154 | 243 | handleData->count--; |
Azure.IoT Build | 0:fa2de1b79154 | 244 | } |
Azure.IoT Build | 0:fa2de1b79154 | 245 | } |
Azure.IoT Build | 0:fa2de1b79154 | 246 | |
Azure.IoT Build | 0:fa2de1b79154 | 247 | static char** findKey(MAP_HANDLE_DATA* handleData, const char* key) |
Azure.IoT Build | 0:fa2de1b79154 | 248 | { |
Azure.IoT Build | 0:fa2de1b79154 | 249 | char** result; |
Azure.IoT Build | 0:fa2de1b79154 | 250 | if (handleData->keys == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 251 | { |
Azure.IoT Build | 0:fa2de1b79154 | 252 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 253 | } |
Azure.IoT Build | 0:fa2de1b79154 | 254 | else |
Azure.IoT Build | 0:fa2de1b79154 | 255 | { |
Azure.IoT Build | 0:fa2de1b79154 | 256 | size_t i; |
Azure.IoT Build | 0:fa2de1b79154 | 257 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 258 | for (i = 0; i < handleData->count; i++) |
Azure.IoT Build | 0:fa2de1b79154 | 259 | { |
Azure.IoT Build | 0:fa2de1b79154 | 260 | if (strcmp(handleData->keys[i], key) == 0) |
Azure.IoT Build | 0:fa2de1b79154 | 261 | { |
Azure.IoT Build | 0:fa2de1b79154 | 262 | result = handleData->keys + i; |
Azure.IoT Build | 0:fa2de1b79154 | 263 | break; |
Azure.IoT Build | 0:fa2de1b79154 | 264 | } |
Azure.IoT Build | 0:fa2de1b79154 | 265 | } |
Azure.IoT Build | 0:fa2de1b79154 | 266 | } |
Azure.IoT Build | 0:fa2de1b79154 | 267 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 268 | } |
Azure.IoT Build | 0:fa2de1b79154 | 269 | |
Azure.IoT Build | 0:fa2de1b79154 | 270 | static char** findValue(MAP_HANDLE_DATA* handleData, const char* value) |
Azure.IoT Build | 0:fa2de1b79154 | 271 | { |
Azure.IoT Build | 0:fa2de1b79154 | 272 | char** result; |
Azure.IoT Build | 0:fa2de1b79154 | 273 | if (handleData->values == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 274 | { |
Azure.IoT Build | 0:fa2de1b79154 | 275 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 276 | } |
Azure.IoT Build | 0:fa2de1b79154 | 277 | else |
Azure.IoT Build | 0:fa2de1b79154 | 278 | { |
Azure.IoT Build | 0:fa2de1b79154 | 279 | size_t i; |
Azure.IoT Build | 0:fa2de1b79154 | 280 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 281 | for (i = 0; i < handleData->count; i++) |
Azure.IoT Build | 0:fa2de1b79154 | 282 | { |
Azure.IoT Build | 0:fa2de1b79154 | 283 | if (strcmp(handleData->values[i], value) == 0) |
Azure.IoT Build | 0:fa2de1b79154 | 284 | { |
Azure.IoT Build | 0:fa2de1b79154 | 285 | result = handleData->values + i; |
Azure.IoT Build | 0:fa2de1b79154 | 286 | break; |
Azure.IoT Build | 0:fa2de1b79154 | 287 | } |
Azure.IoT Build | 0:fa2de1b79154 | 288 | } |
Azure.IoT Build | 0:fa2de1b79154 | 289 | } |
Azure.IoT Build | 0:fa2de1b79154 | 290 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 291 | } |
Azure.IoT Build | 0:fa2de1b79154 | 292 | |
Azure.IoT Build | 0:fa2de1b79154 | 293 | static int insertNewKeyValue(MAP_HANDLE_DATA* handleData, const char* key, const char* value) |
Azure.IoT Build | 0:fa2de1b79154 | 294 | { |
Azure.IoT Build | 0:fa2de1b79154 | 295 | int result; |
Azure.IoT Build | 0:fa2de1b79154 | 296 | if (Map_IncreaseStorageKeysValues(handleData) != 0) /*this increases handleData->count*/ |
Azure.IoT Build | 0:fa2de1b79154 | 297 | { |
Azure.IoT Build | 0:fa2de1b79154 | 298 | result = __LINE__; |
Azure.IoT Build | 0:fa2de1b79154 | 299 | } |
Azure.IoT Build | 0:fa2de1b79154 | 300 | else |
Azure.IoT Build | 0:fa2de1b79154 | 301 | { |
Azure.IoT Build | 0:fa2de1b79154 | 302 | if (mallocAndStrcpy_s(&(handleData->keys[handleData->count - 1]), key) != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 303 | { |
Azure.IoT Build | 0:fa2de1b79154 | 304 | Map_DecreaseStorageKeysValues(handleData); |
AzureIoTClient | 1:9190c0f4d23a | 305 | LogError("unable to mallocAndStrcpy_s"); |
Azure.IoT Build | 0:fa2de1b79154 | 306 | result = __LINE__; |
Azure.IoT Build | 0:fa2de1b79154 | 307 | } |
Azure.IoT Build | 0:fa2de1b79154 | 308 | else |
Azure.IoT Build | 0:fa2de1b79154 | 309 | { |
Azure.IoT Build | 0:fa2de1b79154 | 310 | if (mallocAndStrcpy_s(&(handleData->values[handleData->count - 1]), value) != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 311 | { |
Azure.IoT Build | 0:fa2de1b79154 | 312 | free(handleData->keys[handleData->count - 1]); |
Azure.IoT Build | 0:fa2de1b79154 | 313 | Map_DecreaseStorageKeysValues(handleData); |
AzureIoTClient | 1:9190c0f4d23a | 314 | LogError("unable to mallocAndStrcpy_s"); |
Azure.IoT Build | 0:fa2de1b79154 | 315 | result = __LINE__; |
Azure.IoT Build | 0:fa2de1b79154 | 316 | } |
Azure.IoT Build | 0:fa2de1b79154 | 317 | else |
Azure.IoT Build | 0:fa2de1b79154 | 318 | { |
Azure.IoT Build | 0:fa2de1b79154 | 319 | result = 0; |
Azure.IoT Build | 0:fa2de1b79154 | 320 | } |
Azure.IoT Build | 0:fa2de1b79154 | 321 | } |
Azure.IoT Build | 0:fa2de1b79154 | 322 | } |
Azure.IoT Build | 0:fa2de1b79154 | 323 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 324 | } |
Azure.IoT Build | 0:fa2de1b79154 | 325 | |
Azure.IoT Build | 0:fa2de1b79154 | 326 | MAP_RESULT Map_Add(MAP_HANDLE handle, const char* key, const char* value) |
Azure.IoT Build | 0:fa2de1b79154 | 327 | { |
Azure.IoT Build | 0:fa2de1b79154 | 328 | MAP_RESULT result; |
Azure.IoT Build | 0:fa2de1b79154 | 329 | /*Codes_SRS_MAP_02_006: [If parameter handle is NULL then Map_Add shall return MAP_INVALID_ARG.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 330 | /*Codes_SRS_MAP_02_007: [If parameter key is NULL then Map_Add shall return MAP_INVALID_ARG.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 331 | /*Codes_SRS_MAP_02_008: [If parameter value is NULL then Map_Add shall return MAP_INVALID_ARG.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 332 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 333 | (handle == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 334 | (key == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 335 | (value == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 336 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 337 | { |
Azure.IoT Build | 0:fa2de1b79154 | 338 | result = MAP_INVALIDARG; |
Azure.IoT Build | 0:fa2de1b79154 | 339 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 340 | } |
Azure.IoT Build | 0:fa2de1b79154 | 341 | else |
Azure.IoT Build | 0:fa2de1b79154 | 342 | { |
Azure.IoT Build | 0:fa2de1b79154 | 343 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 344 | /*Codes_SRS_MAP_02_009: [If the key already exists, then Map_Add shall return MAP_KEYEXISTS.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 345 | if (findKey(handleData, key) != NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 346 | { |
Azure.IoT Build | 0:fa2de1b79154 | 347 | result = MAP_KEYEXISTS; |
Azure.IoT Build | 0:fa2de1b79154 | 348 | } |
Azure.IoT Build | 0:fa2de1b79154 | 349 | else |
Azure.IoT Build | 0:fa2de1b79154 | 350 | { |
Azure.IoT Build | 0:fa2de1b79154 | 351 | /* Codes_SRS_MAP_07_009: [If the mapFilterCallback function is not NULL, then the return value will be check and if it is not zero then Map_Add shall return MAP_FILTER_REJECT.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 352 | if ( (handleData->mapFilterCallback != NULL) && (handleData->mapFilterCallback(key, value) != 0) ) |
Azure.IoT Build | 0:fa2de1b79154 | 353 | { |
Azure.IoT Build | 0:fa2de1b79154 | 354 | result = MAP_FILTER_REJECT; |
Azure.IoT Build | 0:fa2de1b79154 | 355 | } |
Azure.IoT Build | 0:fa2de1b79154 | 356 | else |
Azure.IoT Build | 0:fa2de1b79154 | 357 | { |
Azure.IoT Build | 0:fa2de1b79154 | 358 | /*Codes_SRS_MAP_02_010: [Otherwise, Map_Add shall add the pair <key,value> to the map.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 359 | if (insertNewKeyValue(handleData, key, value) != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 360 | { |
Azure.IoT Build | 0:fa2de1b79154 | 361 | /*Codes_SRS_MAP_02_011: [If adding the pair <key,value> fails then Map_Add shall return MAP_ERROR.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 362 | result = MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 363 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 364 | } |
Azure.IoT Build | 0:fa2de1b79154 | 365 | else |
Azure.IoT Build | 0:fa2de1b79154 | 366 | { |
Azure.IoT Build | 0:fa2de1b79154 | 367 | /*Codes_SRS_MAP_02_012: [Otherwise, Map_Add shall return MAP_OK.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 368 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 369 | } |
Azure.IoT Build | 0:fa2de1b79154 | 370 | } |
Azure.IoT Build | 0:fa2de1b79154 | 371 | } |
Azure.IoT Build | 0:fa2de1b79154 | 372 | } |
Azure.IoT Build | 0:fa2de1b79154 | 373 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 374 | } |
Azure.IoT Build | 0:fa2de1b79154 | 375 | |
Azure.IoT Build | 0:fa2de1b79154 | 376 | MAP_RESULT Map_AddOrUpdate(MAP_HANDLE handle, const char* key, const char* value) |
Azure.IoT Build | 0:fa2de1b79154 | 377 | { |
Azure.IoT Build | 0:fa2de1b79154 | 378 | MAP_RESULT result; |
Azure.IoT Build | 0:fa2de1b79154 | 379 | /*Codes_SRS_MAP_02_013: [If parameter handle is NULL then Map_AddOrUpdate shall return MAP_INVALID_ARG.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 380 | /*Codes_SRS_MAP_02_014: [If parameter key is NULL then Map_AddOrUpdate shall return MAP_INVALID_ARG.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 381 | /*Codes_SRS_MAP_02_015: [If parameter value is NULL then Map_AddOrUpdate shall return MAP_INVALID_ARG.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 382 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 383 | (handle == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 384 | (key == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 385 | (value == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 386 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 387 | { |
Azure.IoT Build | 0:fa2de1b79154 | 388 | result = MAP_INVALIDARG; |
Azure.IoT Build | 0:fa2de1b79154 | 389 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 390 | } |
Azure.IoT Build | 0:fa2de1b79154 | 391 | else |
Azure.IoT Build | 0:fa2de1b79154 | 392 | { |
Azure.IoT Build | 0:fa2de1b79154 | 393 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 394 | |
Azure.IoT Build | 0:fa2de1b79154 | 395 | /* Codes_SRS_MAP_07_008: [If the mapFilterCallback function is not NULL, then the return value will be check and if it is not zero then Map_AddOrUpdate shall return MAP_FILTER_REJECT.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 396 | if (handleData->mapFilterCallback != NULL && handleData->mapFilterCallback(key, value) != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 397 | { |
Azure.IoT Build | 0:fa2de1b79154 | 398 | result = MAP_FILTER_REJECT; |
Azure.IoT Build | 0:fa2de1b79154 | 399 | } |
Azure.IoT Build | 0:fa2de1b79154 | 400 | else |
Azure.IoT Build | 0:fa2de1b79154 | 401 | { |
Azure.IoT Build | 0:fa2de1b79154 | 402 | char** whereIsIt = findKey(handleData, key); |
Azure.IoT Build | 0:fa2de1b79154 | 403 | if (whereIsIt == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 404 | { |
Azure.IoT Build | 0:fa2de1b79154 | 405 | /*Codes_SRS_MAP_02_017: [Otherwise, Map_AddOrUpdate shall add the pair <key,value> to the map.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 406 | if (insertNewKeyValue(handleData, key, value) != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 407 | { |
Azure.IoT Build | 0:fa2de1b79154 | 408 | result = MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 409 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 410 | } |
Azure.IoT Build | 0:fa2de1b79154 | 411 | else |
Azure.IoT Build | 0:fa2de1b79154 | 412 | { |
Azure.IoT Build | 0:fa2de1b79154 | 413 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 414 | } |
Azure.IoT Build | 0:fa2de1b79154 | 415 | } |
Azure.IoT Build | 0:fa2de1b79154 | 416 | else |
Azure.IoT Build | 0:fa2de1b79154 | 417 | { |
Azure.IoT Build | 0:fa2de1b79154 | 418 | /*Codes_SRS_MAP_02_016: [If the key already exists, then Map_AddOrUpdate shall overwrite the value of the existing key with parameter value.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 419 | size_t index = whereIsIt - handleData->keys; |
Azure.IoT Build | 0:fa2de1b79154 | 420 | size_t valueLength = strlen(value); |
Azure.IoT Build | 0:fa2de1b79154 | 421 | /*try to realloc value of this key*/ |
Azure.IoT Build | 0:fa2de1b79154 | 422 | char* newValue = (char*)realloc(handleData->values[index],valueLength + 1); |
Azure.IoT Build | 0:fa2de1b79154 | 423 | if (newValue == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 424 | { |
Azure.IoT Build | 0:fa2de1b79154 | 425 | result = MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 426 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 427 | } |
Azure.IoT Build | 0:fa2de1b79154 | 428 | else |
Azure.IoT Build | 0:fa2de1b79154 | 429 | { |
AzureIoTClient | 19:2e0811512ceb | 430 | (void)memcpy(newValue, value, valueLength + 1); |
Azure.IoT Build | 0:fa2de1b79154 | 431 | handleData->values[index] = newValue; |
Azure.IoT Build | 0:fa2de1b79154 | 432 | /*Codes_SRS_MAP_02_019: [Otherwise, Map_AddOrUpdate shall return MAP_OK.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 433 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 434 | } |
Azure.IoT Build | 0:fa2de1b79154 | 435 | } |
Azure.IoT Build | 0:fa2de1b79154 | 436 | } |
Azure.IoT Build | 0:fa2de1b79154 | 437 | } |
Azure.IoT Build | 0:fa2de1b79154 | 438 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 439 | } |
Azure.IoT Build | 0:fa2de1b79154 | 440 | |
Azure.IoT Build | 0:fa2de1b79154 | 441 | MAP_RESULT Map_Delete(MAP_HANDLE handle, const char* key) |
Azure.IoT Build | 0:fa2de1b79154 | 442 | { |
Azure.IoT Build | 0:fa2de1b79154 | 443 | MAP_RESULT result; |
Azure.IoT Build | 0:fa2de1b79154 | 444 | /*Codes_SRS_MAP_02_020: [If parameter handle is NULL then Map_Delete shall return MAP_INVALIDARG.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 445 | /*Codes_SRS_MAP_02_021: [If parameter key is NULL then Map_Delete shall return MAP_INVALIDARG.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 446 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 447 | (handle == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 448 | (key == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 449 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 450 | { |
Azure.IoT Build | 0:fa2de1b79154 | 451 | result = MAP_INVALIDARG; |
Azure.IoT Build | 0:fa2de1b79154 | 452 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 453 | } |
Azure.IoT Build | 0:fa2de1b79154 | 454 | else |
Azure.IoT Build | 0:fa2de1b79154 | 455 | { |
Azure.IoT Build | 0:fa2de1b79154 | 456 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 457 | char** whereIsIt = findKey(handleData,key); |
Azure.IoT Build | 0:fa2de1b79154 | 458 | if (whereIsIt == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 459 | { |
Azure.IoT Build | 0:fa2de1b79154 | 460 | /*Codes_SRS_MAP_02_022: [If key does not exist then Map_Delete shall return MAP_KEYNOTFOUND.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 461 | result = MAP_KEYNOTFOUND; |
Azure.IoT Build | 0:fa2de1b79154 | 462 | } |
Azure.IoT Build | 0:fa2de1b79154 | 463 | else |
Azure.IoT Build | 0:fa2de1b79154 | 464 | { |
Azure.IoT Build | 0:fa2de1b79154 | 465 | /*Codes_SRS_MAP_02_023: [Otherwise, Map_Delete shall remove the key and its associated value from the map and return MAP_OK.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 466 | size_t index = whereIsIt - handleData->keys; |
Azure.IoT Build | 0:fa2de1b79154 | 467 | free(handleData->keys[index]); |
Azure.IoT Build | 0:fa2de1b79154 | 468 | free(handleData->values[index]); |
Azure.IoT Build | 0:fa2de1b79154 | 469 | memmove(handleData->keys + index, handleData->keys + index + 1, (handleData->count - index - 1)*sizeof(char*)); /*if order doesn't matter... then this can be optimized*/ |
Azure.IoT Build | 0:fa2de1b79154 | 470 | memmove(handleData->values + index, handleData->values + index + 1, (handleData->count - index - 1)*sizeof(char*)); |
Azure.IoT Build | 0:fa2de1b79154 | 471 | Map_DecreaseStorageKeysValues(handleData); |
Azure.IoT Build | 0:fa2de1b79154 | 472 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 473 | } |
Azure.IoT Build | 0:fa2de1b79154 | 474 | |
Azure.IoT Build | 0:fa2de1b79154 | 475 | } |
Azure.IoT Build | 0:fa2de1b79154 | 476 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 477 | } |
Azure.IoT Build | 0:fa2de1b79154 | 478 | |
Azure.IoT Build | 0:fa2de1b79154 | 479 | MAP_RESULT Map_ContainsKey(MAP_HANDLE handle, const char* key, bool* keyExists) |
Azure.IoT Build | 0:fa2de1b79154 | 480 | { |
Azure.IoT Build | 0:fa2de1b79154 | 481 | MAP_RESULT result; |
Azure.IoT Build | 0:fa2de1b79154 | 482 | /*Codes_SRS_MAP_02_024: [If parameter handle, key or keyExists are NULL then Map_ContainsKey shall return MAP_INVALIDARG.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 483 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 484 | (handle ==NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 485 | (key == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 486 | (keyExists == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 487 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 488 | { |
Azure.IoT Build | 0:fa2de1b79154 | 489 | result = MAP_INVALIDARG; |
Azure.IoT Build | 0:fa2de1b79154 | 490 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 491 | } |
Azure.IoT Build | 0:fa2de1b79154 | 492 | else |
Azure.IoT Build | 0:fa2de1b79154 | 493 | { |
Azure.IoT Build | 0:fa2de1b79154 | 494 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 495 | /*Codes_SRS_MAP_02_025: [Otherwise if a key exists then Map_ContainsKey shall return MAP_OK and shall write in keyExists "true".]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 496 | /*Codes_SRS_MAP_02_026: [If a key doesn't exist, then Map_ContainsKey shall return MAP_OK and write in keyExists "false".] */ |
Azure.IoT Build | 0:fa2de1b79154 | 497 | *keyExists = (findKey(handleData, key) != NULL) ? true: false; |
Azure.IoT Build | 0:fa2de1b79154 | 498 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 499 | } |
Azure.IoT Build | 0:fa2de1b79154 | 500 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 501 | } |
Azure.IoT Build | 0:fa2de1b79154 | 502 | |
Azure.IoT Build | 0:fa2de1b79154 | 503 | MAP_RESULT Map_ContainsValue(MAP_HANDLE handle, const char* value, bool* valueExists) |
Azure.IoT Build | 0:fa2de1b79154 | 504 | { |
Azure.IoT Build | 0:fa2de1b79154 | 505 | MAP_RESULT result; |
Azure.IoT Build | 0:fa2de1b79154 | 506 | /*Codes_SRS_MAP_02_027: [If parameter handle, value or valueExists is NULL then Map_ContainsValue shall return MAP_INVALIDARG.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 507 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 508 | (handle == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 509 | (value == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 510 | (valueExists == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 511 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 512 | { |
Azure.IoT Build | 0:fa2de1b79154 | 513 | result = MAP_INVALIDARG; |
Azure.IoT Build | 0:fa2de1b79154 | 514 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 515 | } |
Azure.IoT Build | 0:fa2de1b79154 | 516 | else |
Azure.IoT Build | 0:fa2de1b79154 | 517 | { |
Azure.IoT Build | 0:fa2de1b79154 | 518 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA*)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 519 | /*Codes_SRS_MAP_02_028: [Otherwise, if a pair <key, value> has its value equal to the parameter value, the Map_ContainsValue shall return MAP_OK and shall write in valueExists "true".]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 520 | /*Codes_SRS_MAP_02_029: [Otherwise, if such a <key, value> does not exist, then Map_ContainsValue shall return MAP_OK and shall write in valueExists "false".] */ |
Azure.IoT Build | 0:fa2de1b79154 | 521 | *valueExists = (findValue(handleData, value) != NULL) ? true : false; |
Azure.IoT Build | 0:fa2de1b79154 | 522 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 523 | } |
Azure.IoT Build | 0:fa2de1b79154 | 524 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 525 | } |
Azure.IoT Build | 0:fa2de1b79154 | 526 | |
Azure.IoT Build | 0:fa2de1b79154 | 527 | const char* Map_GetValueFromKey(MAP_HANDLE handle, const char* key) |
Azure.IoT Build | 0:fa2de1b79154 | 528 | { |
Azure.IoT Build | 0:fa2de1b79154 | 529 | const char* result; |
Azure.IoT Build | 0:fa2de1b79154 | 530 | /*Codes_SRS_MAP_02_040: [If parameter handle or key is NULL then Map_GetValueFromKey returns NULL.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 531 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 532 | (handle == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 533 | (key == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 534 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 535 | { |
Azure.IoT Build | 0:fa2de1b79154 | 536 | result = NULL; |
AzureIoTClient | 1:9190c0f4d23a | 537 | LogError("invalid parameter to Map_GetValueFromKey"); |
Azure.IoT Build | 0:fa2de1b79154 | 538 | } |
Azure.IoT Build | 0:fa2de1b79154 | 539 | else |
Azure.IoT Build | 0:fa2de1b79154 | 540 | { |
Azure.IoT Build | 0:fa2de1b79154 | 541 | MAP_HANDLE_DATA * handleData = (MAP_HANDLE_DATA *)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 542 | char** whereIsIt = findKey(handleData, key); |
Azure.IoT Build | 0:fa2de1b79154 | 543 | if(whereIsIt == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 544 | { |
Azure.IoT Build | 0:fa2de1b79154 | 545 | /*Codes_SRS_MAP_02_041: [If the key is not found, then Map_GetValueFromKey returns NULL.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 546 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 547 | } |
Azure.IoT Build | 0:fa2de1b79154 | 548 | else |
Azure.IoT Build | 0:fa2de1b79154 | 549 | { |
Azure.IoT Build | 0:fa2de1b79154 | 550 | /*Codes_SRS_MAP_02_042: [Otherwise, Map_GetValueFromKey returns the key's value.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 551 | size_t index = whereIsIt - handleData->keys; |
Azure.IoT Build | 0:fa2de1b79154 | 552 | result = handleData->values[index]; |
Azure.IoT Build | 0:fa2de1b79154 | 553 | } |
Azure.IoT Build | 0:fa2de1b79154 | 554 | } |
Azure.IoT Build | 0:fa2de1b79154 | 555 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 556 | } |
Azure.IoT Build | 0:fa2de1b79154 | 557 | |
Azure.IoT Build | 0:fa2de1b79154 | 558 | MAP_RESULT Map_GetInternals(MAP_HANDLE handle, const char*const** keys, const char*const** values, size_t* count) |
Azure.IoT Build | 0:fa2de1b79154 | 559 | { |
Azure.IoT Build | 0:fa2de1b79154 | 560 | MAP_RESULT result; |
Azure.IoT Build | 0:fa2de1b79154 | 561 | /*Codes_SRS_MAP_02_046: [If parameter handle, keys, values or count is NULL then Map_GetInternals shall return MAP_INVALIDARG.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 562 | if ( |
Azure.IoT Build | 0:fa2de1b79154 | 563 | (handle == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 564 | (keys == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 565 | (values == NULL) || |
Azure.IoT Build | 0:fa2de1b79154 | 566 | (count == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 567 | ) |
Azure.IoT Build | 0:fa2de1b79154 | 568 | { |
Azure.IoT Build | 0:fa2de1b79154 | 569 | result = MAP_INVALIDARG; |
Azure.IoT Build | 0:fa2de1b79154 | 570 | LOG_MAP_ERROR; |
Azure.IoT Build | 0:fa2de1b79154 | 571 | } |
Azure.IoT Build | 0:fa2de1b79154 | 572 | else |
Azure.IoT Build | 0:fa2de1b79154 | 573 | { |
Azure.IoT Build | 0:fa2de1b79154 | 574 | /*Codes_SRS_MAP_02_043: [Map_GetInternals shall produce in *keys an pointer to an array of const char* having all the keys stored so far by the map.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 575 | /*Codes_SRS_MAP_02_044: [Map_GetInternals shall produce in *values a pointer to an array of const char* having all the values stored so far by the map.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 576 | /*Codes_SRS_MAP_02_045: [ Map_GetInternals shall produce in *count the number of stored keys and values.]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 577 | MAP_HANDLE_DATA * handleData = (MAP_HANDLE_DATA *)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 578 | *keys =(const char* const*)(handleData->keys); |
Azure.IoT Build | 0:fa2de1b79154 | 579 | *values = (const char* const*)(handleData->values); |
Azure.IoT Build | 0:fa2de1b79154 | 580 | *count = handleData->count; |
Azure.IoT Build | 0:fa2de1b79154 | 581 | result = MAP_OK; |
Azure.IoT Build | 0:fa2de1b79154 | 582 | } |
Azure.IoT Build | 0:fa2de1b79154 | 583 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 584 | } |
Azure.IoT Build | 0:fa2de1b79154 | 585 | |
Azure.IoT Build | 0:fa2de1b79154 | 586 | STRING_HANDLE Map_ToJSON(MAP_HANDLE handle) |
Azure.IoT Build | 0:fa2de1b79154 | 587 | { |
Azure.IoT Build | 0:fa2de1b79154 | 588 | STRING_HANDLE result; |
Azure.IoT Build | 0:fa2de1b79154 | 589 | /*Codes_SRS_MAP_02_052: [If parameter handle is NULL then Map_ToJSON shall return NULL.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 590 | if (handle == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 591 | { |
Azure.IoT Build | 0:fa2de1b79154 | 592 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 593 | LogError("invalid arg (NULL)"); |
Azure.IoT Build | 0:fa2de1b79154 | 594 | } |
Azure.IoT Build | 0:fa2de1b79154 | 595 | else |
Azure.IoT Build | 0:fa2de1b79154 | 596 | { |
Azure.IoT Build | 0:fa2de1b79154 | 597 | /*Codes_SRS_MAP_02_048: [Map_ToJSON shall produce a STRING_HANDLE representing the content of the MAP.] */ |
Azure.IoT Build | 0:fa2de1b79154 | 598 | result = STRING_construct("{"); |
Azure.IoT Build | 0:fa2de1b79154 | 599 | if (result == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 600 | { |
Azure.IoT Build | 0:fa2de1b79154 | 601 | LogError("STRING_construct failed"); |
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 | size_t i; |
Azure.IoT Build | 0:fa2de1b79154 | 606 | MAP_HANDLE_DATA* handleData = (MAP_HANDLE_DATA *)handle; |
Azure.IoT Build | 0:fa2de1b79154 | 607 | /*Codes_SRS_MAP_02_049: [If the MAP is empty, then Map_ToJSON shall produce the string "{}".*/ |
Azure.IoT Build | 0:fa2de1b79154 | 608 | bool breakFor = false; /*used to break out of for*/ |
Azure.IoT Build | 0:fa2de1b79154 | 609 | for (i = 0; (i < handleData->count) && (!breakFor); i++) |
Azure.IoT Build | 0:fa2de1b79154 | 610 | { |
Azure.IoT Build | 0:fa2de1b79154 | 611 | /*add one entry to the JSON*/ |
Azure.IoT Build | 0:fa2de1b79154 | 612 | /*Codes_SRS_MAP_02_050: [If the map has properties then Map_ToJSON shall produce the following string:{"name1":"value1", "name2":"value2" ...}]*/ |
Azure.IoT Build | 0:fa2de1b79154 | 613 | STRING_HANDLE key = STRING_new_JSON(handleData->keys[i]); |
Azure.IoT Build | 0:fa2de1b79154 | 614 | if (key == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 615 | { |
Azure.IoT Build | 0:fa2de1b79154 | 616 | LogError("STRING_new_JSON failed"); |
Azure.IoT Build | 0:fa2de1b79154 | 617 | STRING_delete(result); |
Azure.IoT Build | 0:fa2de1b79154 | 618 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 619 | breakFor = true; |
Azure.IoT Build | 0:fa2de1b79154 | 620 | } |
Azure.IoT Build | 0:fa2de1b79154 | 621 | else |
Azure.IoT Build | 0:fa2de1b79154 | 622 | { |
Azure.IoT Build | 0:fa2de1b79154 | 623 | STRING_HANDLE value = STRING_new_JSON(handleData->values[i]); |
Azure.IoT Build | 0:fa2de1b79154 | 624 | if (value == NULL) |
Azure.IoT Build | 0:fa2de1b79154 | 625 | { |
Azure.IoT Build | 0:fa2de1b79154 | 626 | LogError("STRING_new_JSON failed"); |
Azure.IoT Build | 0:fa2de1b79154 | 627 | STRING_delete(result); |
Azure.IoT Build | 0:fa2de1b79154 | 628 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 629 | breakFor = true; |
Azure.IoT Build | 0:fa2de1b79154 | 630 | } |
Azure.IoT Build | 0:fa2de1b79154 | 631 | else |
Azure.IoT Build | 0:fa2de1b79154 | 632 | { |
Azure.IoT Build | 0:fa2de1b79154 | 633 | if (!( |
Azure.IoT Build | 0:fa2de1b79154 | 634 | ((i>0) ? (STRING_concat(result, ",") == 0) : 1) && |
Azure.IoT Build | 0:fa2de1b79154 | 635 | (STRING_concat_with_STRING(result, key) == 0) && |
Azure.IoT Build | 0:fa2de1b79154 | 636 | (STRING_concat(result, ":") == 0) && |
Azure.IoT Build | 0:fa2de1b79154 | 637 | (STRING_concat_with_STRING(result, value) == 0) |
Azure.IoT Build | 0:fa2de1b79154 | 638 | )) |
Azure.IoT Build | 0:fa2de1b79154 | 639 | { |
Azure.IoT Build | 0:fa2de1b79154 | 640 | LogError("failed to build the JSON"); |
Azure.IoT Build | 0:fa2de1b79154 | 641 | STRING_delete(result); |
Azure.IoT Build | 0:fa2de1b79154 | 642 | result = NULL; |
Azure.IoT Build | 0:fa2de1b79154 | 643 | breakFor = true; |
Azure.IoT Build | 0:fa2de1b79154 | 644 | } |
Azure.IoT Build | 0:fa2de1b79154 | 645 | else |
Azure.IoT Build | 0:fa2de1b79154 | 646 | { |
Azure.IoT Build | 0:fa2de1b79154 | 647 | /*all nice, go to the next element in the map*/ |
Azure.IoT Build | 0:fa2de1b79154 | 648 | } |
Azure.IoT Build | 0:fa2de1b79154 | 649 | STRING_delete(value); |
Azure.IoT Build | 0:fa2de1b79154 | 650 | } |
Azure.IoT Build | 0:fa2de1b79154 | 651 | STRING_delete(key); |
Azure.IoT Build | 0:fa2de1b79154 | 652 | } |
Azure.IoT Build | 0:fa2de1b79154 | 653 | } |
Azure.IoT Build | 0:fa2de1b79154 | 654 | |
Azure.IoT Build | 0:fa2de1b79154 | 655 | if (breakFor) |
Azure.IoT Build | 0:fa2de1b79154 | 656 | { |
Azure.IoT Build | 0:fa2de1b79154 | 657 | LogError("error happened during JSON string builder"); |
Azure.IoT Build | 0:fa2de1b79154 | 658 | } |
Azure.IoT Build | 0:fa2de1b79154 | 659 | else |
Azure.IoT Build | 0:fa2de1b79154 | 660 | { |
Azure.IoT Build | 0:fa2de1b79154 | 661 | if (STRING_concat(result, "}") != 0) |
Azure.IoT Build | 0:fa2de1b79154 | 662 | { |
Azure.IoT Build | 0:fa2de1b79154 | 663 | LogError("failed to build the JSON"); |
Azure.IoT Build | 0:fa2de1b79154 | 664 | STRING_delete(result); |
Azure.IoT Build | 0:fa2de1b79154 | 665 | result = NULL; |
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 | /*return as is, JSON has been build*/ |
Azure.IoT Build | 0:fa2de1b79154 | 670 | } |
Azure.IoT Build | 0:fa2de1b79154 | 671 | } |
Azure.IoT Build | 0:fa2de1b79154 | 672 | } |
Azure.IoT Build | 0:fa2de1b79154 | 673 | } |
Azure.IoT Build | 0:fa2de1b79154 | 674 | return result; |
Azure.IoT Build | 0:fa2de1b79154 | 675 | |
Azure.IoT Build | 0:fa2de1b79154 | 676 | } |