Azure IoT / azure_c_shared_utility

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 5 #ifdef _CRTDBG_MAP_ALLOC
Azure.IoT Build 0:fa2de1b79154 6 #include <crtdbg.h>
Azure.IoT Build 0:fa2de1b79154 7 #endif
Azure.IoT Build 0:fa2de1b79154 8 #include <stdbool.h>
Azure.IoT Build 0:fa2de1b79154 9
Azure.IoT Build 0:fa2de1b79154 10 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 11 #include "azure_c_shared_utility/list.h"
Azure.IoT Build 0:fa2de1b79154 12
Azure.IoT Build 0:fa2de1b79154 13 typedef struct LIST_ITEM_INSTANCE_TAG
Azure.IoT Build 0:fa2de1b79154 14 {
Azure.IoT Build 0:fa2de1b79154 15 const void* item;
Azure.IoT Build 0:fa2de1b79154 16 void* next;
Azure.IoT Build 0:fa2de1b79154 17 } LIST_ITEM_INSTANCE;
Azure.IoT Build 0:fa2de1b79154 18
Azure.IoT Build 0:fa2de1b79154 19 typedef struct LIST_INSTANCE_TAG
Azure.IoT Build 0:fa2de1b79154 20 {
Azure.IoT Build 0:fa2de1b79154 21 LIST_ITEM_INSTANCE* head;
Azure.IoT Build 0:fa2de1b79154 22 } LIST_INSTANCE;
Azure.IoT Build 0:fa2de1b79154 23
Azure.IoT Build 0:fa2de1b79154 24 LIST_HANDLE list_create(void)
Azure.IoT Build 0:fa2de1b79154 25 {
Azure.IoT Build 0:fa2de1b79154 26 LIST_INSTANCE* result;
Azure.IoT Build 0:fa2de1b79154 27
Azure.IoT Build 0:fa2de1b79154 28 /* Codes_SRS_LIST_01_001: [list_create shall create a new list and return a non-NULL handle on success.] */
Azure.IoT Build 0:fa2de1b79154 29 result = (LIST_INSTANCE*)malloc(sizeof(LIST_INSTANCE));
Azure.IoT Build 0:fa2de1b79154 30 if (result != NULL)
Azure.IoT Build 0:fa2de1b79154 31 {
Azure.IoT Build 0:fa2de1b79154 32 /* Codes_SRS_LIST_01_002: [If any error occurs during the list creation, list_create shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 33 result->head = NULL;
Azure.IoT Build 0:fa2de1b79154 34 }
Azure.IoT Build 0:fa2de1b79154 35
Azure.IoT Build 0:fa2de1b79154 36 return result;
Azure.IoT Build 0:fa2de1b79154 37 }
Azure.IoT Build 0:fa2de1b79154 38
Azure.IoT Build 0:fa2de1b79154 39 void list_destroy(LIST_HANDLE list)
Azure.IoT Build 0:fa2de1b79154 40 {
Azure.IoT Build 0:fa2de1b79154 41 /* Codes_SRS_LIST_01_004: [If the list argument is NULL, no freeing of resources shall occur.] */
Azure.IoT Build 0:fa2de1b79154 42 if (list != NULL)
Azure.IoT Build 0:fa2de1b79154 43 {
Azure.IoT Build 0:fa2de1b79154 44 LIST_INSTANCE* list_instance = (LIST_INSTANCE*)list;
Azure.IoT Build 0:fa2de1b79154 45
Azure.IoT Build 0:fa2de1b79154 46 while (list_instance->head != NULL)
Azure.IoT Build 0:fa2de1b79154 47 {
Azure.IoT Build 0:fa2de1b79154 48 LIST_ITEM_INSTANCE* current_item = list_instance->head;
Azure.IoT Build 0:fa2de1b79154 49 list_instance->head = current_item->next;
Azure.IoT Build 0:fa2de1b79154 50 free(current_item);
Azure.IoT Build 0:fa2de1b79154 51 }
Azure.IoT Build 0:fa2de1b79154 52
Azure.IoT Build 0:fa2de1b79154 53 /* Codes_SRS_LIST_01_003: [list_destroy shall free all resources associated with the list identified by the handle argument.] */
Azure.IoT Build 0:fa2de1b79154 54 free(list_instance);
Azure.IoT Build 0:fa2de1b79154 55 }
Azure.IoT Build 0:fa2de1b79154 56 }
Azure.IoT Build 0:fa2de1b79154 57
Azure.IoT Build 0:fa2de1b79154 58 LIST_ITEM_HANDLE list_add(LIST_HANDLE list, const void* item)
Azure.IoT Build 0:fa2de1b79154 59 {
Azure.IoT Build 0:fa2de1b79154 60 LIST_ITEM_INSTANCE* result;
Azure.IoT Build 0:fa2de1b79154 61
Azure.IoT Build 0:fa2de1b79154 62 /* Codes_SRS_LIST_01_006: [If any of the arguments is NULL, list_add shall not add the item to the list and return NULL.] */
Azure.IoT Build 0:fa2de1b79154 63 if ((list == NULL) ||
Azure.IoT Build 0:fa2de1b79154 64 (item == NULL))
Azure.IoT Build 0:fa2de1b79154 65 {
Azure.IoT Build 0:fa2de1b79154 66 result = 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 LIST_INSTANCE* list_instance = (LIST_INSTANCE*)list;
Azure.IoT Build 0:fa2de1b79154 71 result = (LIST_ITEM_INSTANCE*)malloc(sizeof(LIST_ITEM_INSTANCE));
Azure.IoT Build 0:fa2de1b79154 72
Azure.IoT Build 0:fa2de1b79154 73 if (result == NULL)
Azure.IoT Build 0:fa2de1b79154 74 {
Azure.IoT Build 0:fa2de1b79154 75 /* Codes_SRS_LIST_01_007: [If allocating the new list node fails, list_add shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 76 result = NULL;
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 /* Codes_SRS_LIST_01_005: [list_add shall add one item to the tail of the list and on success it shall return a handle to the added item.] */
Azure.IoT Build 0:fa2de1b79154 81 result->next = NULL;
Azure.IoT Build 0:fa2de1b79154 82 result->item = item;
Azure.IoT Build 0:fa2de1b79154 83
Azure.IoT Build 0:fa2de1b79154 84 if (list_instance->head == NULL)
Azure.IoT Build 0:fa2de1b79154 85 {
Azure.IoT Build 0:fa2de1b79154 86 list_instance->head = result;
Azure.IoT Build 0:fa2de1b79154 87 }
Azure.IoT Build 0:fa2de1b79154 88 else
Azure.IoT Build 0:fa2de1b79154 89 {
Azure.IoT Build 0:fa2de1b79154 90 LIST_ITEM_INSTANCE* current = list_instance->head;
Azure.IoT Build 0:fa2de1b79154 91 while (current->next != NULL)
Azure.IoT Build 0:fa2de1b79154 92 {
Azure.IoT Build 0:fa2de1b79154 93 current = current->next;
Azure.IoT Build 0:fa2de1b79154 94 }
Azure.IoT Build 0:fa2de1b79154 95
Azure.IoT Build 0:fa2de1b79154 96 current->next = result;
Azure.IoT Build 0:fa2de1b79154 97 }
Azure.IoT Build 0:fa2de1b79154 98 }
Azure.IoT Build 0:fa2de1b79154 99 }
Azure.IoT Build 0:fa2de1b79154 100
Azure.IoT Build 0:fa2de1b79154 101 return result;
Azure.IoT Build 0:fa2de1b79154 102 }
Azure.IoT Build 0:fa2de1b79154 103
Azure.IoT Build 0:fa2de1b79154 104 int list_remove(LIST_HANDLE list, LIST_ITEM_HANDLE item)
Azure.IoT Build 0:fa2de1b79154 105 {
Azure.IoT Build 0:fa2de1b79154 106 int result;
Azure.IoT Build 0:fa2de1b79154 107
Azure.IoT Build 0:fa2de1b79154 108 /* Codes_SRS_LIST_01_024: [If any of the arguments list or item_handle is NULL, list_remove shall fail and return a non-zero value.] */
Azure.IoT Build 0:fa2de1b79154 109 if ((list == NULL) ||
Azure.IoT Build 0:fa2de1b79154 110 (item == NULL))
Azure.IoT Build 0:fa2de1b79154 111 {
Azure.IoT Build 0:fa2de1b79154 112 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 113 }
Azure.IoT Build 0:fa2de1b79154 114 else
Azure.IoT Build 0:fa2de1b79154 115 {
Azure.IoT Build 0:fa2de1b79154 116 LIST_INSTANCE* list_instance = (LIST_INSTANCE*)list;
Azure.IoT Build 0:fa2de1b79154 117 LIST_ITEM_INSTANCE* current_item = list_instance->head;
Azure.IoT Build 0:fa2de1b79154 118 LIST_ITEM_INSTANCE* previous_item = NULL;
Azure.IoT Build 0:fa2de1b79154 119
Azure.IoT Build 0:fa2de1b79154 120 while (current_item != NULL)
Azure.IoT Build 0:fa2de1b79154 121 {
Azure.IoT Build 0:fa2de1b79154 122 if (current_item == item)
Azure.IoT Build 0:fa2de1b79154 123 {
Azure.IoT Build 0:fa2de1b79154 124 if (previous_item != NULL)
Azure.IoT Build 0:fa2de1b79154 125 {
Azure.IoT Build 0:fa2de1b79154 126 previous_item->next = current_item->next;
Azure.IoT Build 0:fa2de1b79154 127 }
Azure.IoT Build 0:fa2de1b79154 128 else
Azure.IoT Build 0:fa2de1b79154 129 {
Azure.IoT Build 0:fa2de1b79154 130 list_instance->head = current_item->next;
Azure.IoT Build 0:fa2de1b79154 131 }
Azure.IoT Build 0:fa2de1b79154 132
Azure.IoT Build 0:fa2de1b79154 133 free(current_item);
Azure.IoT Build 0:fa2de1b79154 134
Azure.IoT Build 0:fa2de1b79154 135 break;
Azure.IoT Build 0:fa2de1b79154 136 }
Azure.IoT Build 0:fa2de1b79154 137 previous_item = current_item;
Azure.IoT Build 0:fa2de1b79154 138 current_item = current_item->next;
Azure.IoT Build 0:fa2de1b79154 139 }
Azure.IoT Build 0:fa2de1b79154 140
Azure.IoT Build 0:fa2de1b79154 141 if (current_item == NULL)
Azure.IoT Build 0:fa2de1b79154 142 {
Azure.IoT Build 0:fa2de1b79154 143 /* Codes_SRS_LIST_01_025: [If the item item_handle is not found in the list, then list_remove shall fail and return a non-zero value.] */
Azure.IoT Build 0:fa2de1b79154 144 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 145 }
Azure.IoT Build 0:fa2de1b79154 146 else
Azure.IoT Build 0:fa2de1b79154 147 {
Azure.IoT Build 0:fa2de1b79154 148 /* Codes_SRS_LIST_01_023: [list_remove shall remove a list item from the list and on success it shall return 0.] */
Azure.IoT Build 0:fa2de1b79154 149 result = 0;
Azure.IoT Build 0:fa2de1b79154 150 }
Azure.IoT Build 0:fa2de1b79154 151 }
Azure.IoT Build 0:fa2de1b79154 152
Azure.IoT Build 0:fa2de1b79154 153 return result;
Azure.IoT Build 0:fa2de1b79154 154 }
Azure.IoT Build 0:fa2de1b79154 155
Azure.IoT Build 0:fa2de1b79154 156 LIST_ITEM_HANDLE list_get_head_item(LIST_HANDLE list)
Azure.IoT Build 0:fa2de1b79154 157 {
Azure.IoT Build 0:fa2de1b79154 158 LIST_ITEM_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 159
Azure.IoT Build 0:fa2de1b79154 160 if (list == NULL)
Azure.IoT Build 0:fa2de1b79154 161 {
Azure.IoT Build 0:fa2de1b79154 162 /* Codes_SRS_LIST_01_009: [If the list argument is NULL, list_get_head_item shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 163 result = NULL;
Azure.IoT Build 0:fa2de1b79154 164 }
Azure.IoT Build 0:fa2de1b79154 165 else
Azure.IoT Build 0:fa2de1b79154 166 {
Azure.IoT Build 0:fa2de1b79154 167 LIST_INSTANCE* list_instance = (LIST_INSTANCE*)list;
Azure.IoT Build 0:fa2de1b79154 168
Azure.IoT Build 0:fa2de1b79154 169 /* Codes_SRS_LIST_01_008: [list_get_head_item shall return the head of the list.] */
Azure.IoT Build 0:fa2de1b79154 170 /* Codes_SRS_LIST_01_010: [If the list is empty, list_get_head_item_shall_return NULL.] */
Azure.IoT Build 0:fa2de1b79154 171 result = list_instance->head;
Azure.IoT Build 0:fa2de1b79154 172 }
Azure.IoT Build 0:fa2de1b79154 173
Azure.IoT Build 0:fa2de1b79154 174 return result;
Azure.IoT Build 0:fa2de1b79154 175 }
Azure.IoT Build 0:fa2de1b79154 176
Azure.IoT Build 0:fa2de1b79154 177 LIST_ITEM_HANDLE list_get_next_item(LIST_ITEM_HANDLE item_handle)
Azure.IoT Build 0:fa2de1b79154 178 {
Azure.IoT Build 0:fa2de1b79154 179 LIST_ITEM_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 180
Azure.IoT Build 0:fa2de1b79154 181 if (item_handle == NULL)
Azure.IoT Build 0:fa2de1b79154 182 {
Azure.IoT Build 0:fa2de1b79154 183 /* Codes_SRS_LIST_01_019: [If item_handle is NULL then list_get_next_item shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 184 result = NULL;
Azure.IoT Build 0:fa2de1b79154 185 }
Azure.IoT Build 0:fa2de1b79154 186 else
Azure.IoT Build 0:fa2de1b79154 187 {
Azure.IoT Build 0:fa2de1b79154 188 /* Codes_SRS_LIST_01_018: [list_get_next_item shall return the next item in the list following the item item_handle.] */
Azure.IoT Build 0:fa2de1b79154 189 result = ((LIST_ITEM_INSTANCE*)item_handle)->next;
Azure.IoT Build 0:fa2de1b79154 190 }
Azure.IoT Build 0:fa2de1b79154 191
Azure.IoT Build 0:fa2de1b79154 192 return result;
Azure.IoT Build 0:fa2de1b79154 193 }
Azure.IoT Build 0:fa2de1b79154 194
Azure.IoT Build 0:fa2de1b79154 195 const void* list_item_get_value(LIST_ITEM_HANDLE item_handle)
Azure.IoT Build 0:fa2de1b79154 196 {
Azure.IoT Build 0:fa2de1b79154 197 const void* result;
Azure.IoT Build 0:fa2de1b79154 198
Azure.IoT Build 0:fa2de1b79154 199 if (item_handle == NULL)
Azure.IoT Build 0:fa2de1b79154 200 {
Azure.IoT Build 0:fa2de1b79154 201 /* Codes_SRS_LIST_01_021: [If item_handle is NULL, list_item_get_value shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 202 result = NULL;
Azure.IoT Build 0:fa2de1b79154 203 }
Azure.IoT Build 0:fa2de1b79154 204 else
Azure.IoT Build 0:fa2de1b79154 205 {
Azure.IoT Build 0:fa2de1b79154 206 /* Codes_SRS_LIST_01_020: [list_item_get_value shall return the value associated with the list item identified by the item_handle argument.] */
Azure.IoT Build 0:fa2de1b79154 207 result = ((LIST_ITEM_INSTANCE*)item_handle)->item;
Azure.IoT Build 0:fa2de1b79154 208 }
Azure.IoT Build 0:fa2de1b79154 209
Azure.IoT Build 0:fa2de1b79154 210 return result;
Azure.IoT Build 0:fa2de1b79154 211 }
Azure.IoT Build 0:fa2de1b79154 212
Azure.IoT Build 0:fa2de1b79154 213 LIST_ITEM_HANDLE list_find(LIST_HANDLE list, LIST_MATCH_FUNCTION match_function, const void* match_context)
Azure.IoT Build 0:fa2de1b79154 214 {
Azure.IoT Build 0:fa2de1b79154 215 LIST_ITEM_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 216
Azure.IoT Build 0:fa2de1b79154 217 if ((list == NULL) ||
Azure.IoT Build 0:fa2de1b79154 218 (match_function == NULL))
Azure.IoT Build 0:fa2de1b79154 219 {
Azure.IoT Build 0:fa2de1b79154 220 /* Codes_SRS_LIST_01_012: [If the list or the match_function argument is NULL, list_find shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 221 result = NULL;
Azure.IoT Build 0:fa2de1b79154 222 }
Azure.IoT Build 0:fa2de1b79154 223 else
Azure.IoT Build 0:fa2de1b79154 224 {
Azure.IoT Build 0:fa2de1b79154 225 LIST_INSTANCE* list_instance = (LIST_INSTANCE*)list;
Azure.IoT Build 0:fa2de1b79154 226 LIST_ITEM_INSTANCE* current = list_instance->head;
Azure.IoT Build 0:fa2de1b79154 227
Azure.IoT Build 0:fa2de1b79154 228 /* Codes_SRS_LIST_01_011: [list_find shall iterate through all items in a list and return the first one that satisfies a certain match function.] */
Azure.IoT Build 0:fa2de1b79154 229 while (current != NULL)
Azure.IoT Build 0:fa2de1b79154 230 {
Azure.IoT Build 0:fa2de1b79154 231 /* Codes_SRS_LIST_01_014: [list find shall determine whether an item satisfies the match criteria by invoking the match function for each item in the list until a matching item is found.] */
Azure.IoT Build 0:fa2de1b79154 232 /* Codes_SRS_LIST_01_013: [The match_function shall get as arguments the list item being attempted to be matched and the match_context as is.] */
Azure.IoT Build 0:fa2de1b79154 233 if (match_function((LIST_ITEM_HANDLE)current, match_context) == true)
Azure.IoT Build 0:fa2de1b79154 234 {
Azure.IoT Build 0:fa2de1b79154 235 /* Codes_SRS_LIST_01_017: [If the match function returns true, list_find shall consider that item as matching.] */
Azure.IoT Build 0:fa2de1b79154 236 break;
Azure.IoT Build 0:fa2de1b79154 237 }
Azure.IoT Build 0:fa2de1b79154 238
Azure.IoT Build 0:fa2de1b79154 239 /* Codes_SRS_LIST_01_016: [If the match function returns false, list_find shall consider that item as not matching.] */
Azure.IoT Build 0:fa2de1b79154 240 current = current->next;
Azure.IoT Build 0:fa2de1b79154 241 }
Azure.IoT Build 0:fa2de1b79154 242
Azure.IoT Build 0:fa2de1b79154 243 if (current == NULL)
Azure.IoT Build 0:fa2de1b79154 244 {
Azure.IoT Build 0:fa2de1b79154 245 /* Codes_SRS_LIST_01_015: [If the list is empty, list_find shall return NULL.] */
Azure.IoT Build 0:fa2de1b79154 246 result = NULL;
Azure.IoT Build 0:fa2de1b79154 247 }
Azure.IoT Build 0:fa2de1b79154 248 else
Azure.IoT Build 0:fa2de1b79154 249 {
Azure.IoT Build 0:fa2de1b79154 250 result = current;
Azure.IoT Build 0:fa2de1b79154 251 }
Azure.IoT Build 0:fa2de1b79154 252 }
Azure.IoT Build 0:fa2de1b79154 253
Azure.IoT Build 0:fa2de1b79154 254 return result;
Azure.IoT Build 0:fa2de1b79154 255 }