| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #include "fifo.h"
- #include "rtthread.h"
- #include "stdlib.h"
- #include "string.h"
- GenericNode* generic_node_create(const void *data, size_t data_size) {
- GenericNode *new_node = (GenericNode*)malloc(sizeof(GenericNode));
- if (!new_node) return NULL;
-
- new_node->data = malloc(data_size);
- if (!new_node->data) {
- free(new_node);
- return NULL;
- }
-
- memcpy(new_node->data, data, data_size);
- new_node->data_size = data_size;
- new_node->next = NULL;
- return new_node;
- }
- GenericFixedList* generic_list_create(int max_size) {
- GenericFixedList *list = (GenericFixedList*)malloc(sizeof(GenericFixedList));
- if (!list) return NULL;
-
- list->head = NULL;
- list->tail = NULL;
- list->max_size = max_size;
- list->current_size = 0;
- return list;
- }
- bool generic_list_append(GenericFixedList *list, const void *data, size_t data_size) {
- if (list->max_size == 0) return false;
-
- if (list->current_size == 0) {
- GenericNode *new_node = generic_node_create(data, data_size);
- if (!new_node) return false;
-
- new_node->next = new_node;
- list->head = new_node;
- list->tail = new_node;
- list->current_size = 1;
- return true;
- }
- else if (list->current_size >= list->max_size) {
- if (list->head->data_size != data_size) {
- free(list->head->data);
- list->head->data = malloc(data_size);
- if (!list->head->data) return false;
- list->head->data_size = data_size;
- }
-
- memcpy(list->head->data, data, data_size);
-
- list->tail = list->head;
- list->head = list->head->next;
- return true;
- }
- else {
- GenericNode *new_node = generic_node_create(data, data_size);
- if (!new_node) return false;
-
- new_node->next = list->head;
- list->tail->next = new_node;
- list->tail = new_node;
- list->current_size++;
- return true;
- }
- }
- void * generic_list_get_index(GenericFixedList *list,uint8_t index)
- {
- void *data = NULL;
- GenericNode *p_node = list->head;
-
- if(index < list->current_size)
- {
- int i = 0;
- for(;p_node != list->tail;p_node=p_node->next)
- {
- if(i>= index)
- {
- data = p_node->data;
- break;
- }
- i++;
- }
- if(index == list->current_size-1)
- data = list->tail->data;
- }
- return data;
- }
- void generic_list_get(GenericFixedList *list,void * data,uint8_t lenth)
- {
- if(lenth >= list->current_size)
- lenth = list->current_size;
- if(lenth == 0)
- return;
-
- GenericNode *p_node = list->head;
- int i = 0;
- int p_start = 0;
- for(;;p_node = p_node->next,i++)
- {
- memcpy(data+p_start,p_node->data,p_node->data_size);
- p_start += p_node->data_size;
- if(p_node == list->tail)
- {
- break;
- }
- }
- }
- void generic_list_destroy(GenericFixedList *list) {
- if (list->current_size > 0) {
- GenericNode *current = list->head;
- GenericNode *next_node = NULL;
-
- for (int i = 0; i < list->current_size; i++) {
- next_node = current->next;
- free(current->data);
- free(current);
- current = next_node;
- }
- }
- free(list);
- }
- int generic_list_get_count(GenericFixedList *list)
- {
- return list->current_size;
- }
|