freeswitch/src/mod/endpoints/mod_rtmp/libamf/src/amf_list.c

131 lines
3.4 KiB
C

/* function common to all array types */
static void amf_list_init(amf_list * list) {
if (list != NULL) {
list->size = 0;
list->first_element = NULL;
list->last_element = NULL;
}
}
static amf_data * amf_list_push(amf_list * list, amf_data * data) {
amf_node * node = (amf_node*)malloc(sizeof(amf_node));
if (node != NULL) {
node->data = data;
node->next = NULL;
node->prev = NULL;
if (list->size == 0) {
list->first_element = node;
list->last_element = node;
}
else {
list->last_element->next = node;
node->prev = list->last_element;
list->last_element = node;
}
++(list->size);
return data;
}
return NULL;
}
static amf_data * amf_list_insert_before(amf_list * list, amf_node * node, amf_data * data) {
if (node != NULL) {
amf_node * new_node = (amf_node*)malloc(sizeof(amf_node));
if (new_node != NULL) {
new_node->next = node;
new_node->prev = node->prev;
if (node->prev != NULL) {
node->prev->next = new_node;
node->prev = new_node;
}
if (node == list->first_element) {
list->first_element = new_node;
}
++(list->size);
new_node->data = data;
return data;
}
}
return NULL;
}
static amf_data * amf_list_insert_after(amf_list * list, amf_node * node, amf_data * data) {
if (node != NULL) {
amf_node * new_node = (amf_node*)malloc(sizeof(amf_node));
if (new_node != NULL) {
new_node->next = node->next;
new_node->prev = node;
if (node->next != NULL) {
node->next->prev = new_node;
node->next = new_node;
}
if (node == list->last_element) {
list->last_element = new_node;
}
++(list->size);
new_node->data = data;
return data;
}
}
return NULL;
}
static amf_data * amf_list_delete(amf_list * list, amf_node * node) {
amf_data * data = NULL;
if (node != NULL) {
if (node->next != NULL) {
node->next->prev = node->prev;
}
if (node->prev != NULL) {
node->prev->next = node->next;
}
if (node == list->first_element) {
list->first_element = node->next;
}
if (node == list->last_element) {
list->last_element = node->prev;
}
data = node->data;
free(node);
--(list->size);
}
return data;
}
static amf_data * amf_list_get_at(amf_list * list, uint32 n) {
if (n < list->size) {
uint32 i;
amf_node * node = list->first_element;
for (i = 0; i < n; ++i) {
node = node->next;
}
return node->data;
}
return NULL;
}
static amf_data * amf_list_pop(amf_list * list) {
return amf_list_delete(list, list->last_element);
}
static amf_node * amf_list_first(amf_list * list) {
return list->first_element;
}
static amf_node * amf_list_last(amf_list * list) {
return list->last_element;
}
static void amf_list_clear(amf_list * list) {
amf_node * node = list->first_element;
while (node != NULL) {
amf_data_free(node->data);
amf_node * tmp = node;
node = node->next;
free(tmp);
}
list->size = 0;
}