fifo.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "fifo.h"
  2. #include "rtthread.h"
  3. #include "stdlib.h"
  4. #include "string.h"
  5. GenericNode* generic_node_create(const void *data, size_t data_size) {
  6. GenericNode *new_node = (GenericNode*)malloc(sizeof(GenericNode));
  7. if (!new_node) return NULL;
  8. new_node->data = malloc(data_size);
  9. if (!new_node->data) {
  10. free(new_node);
  11. return NULL;
  12. }
  13. memcpy(new_node->data, data, data_size);
  14. new_node->data_size = data_size;
  15. new_node->next = NULL;
  16. return new_node;
  17. }
  18. GenericFixedList* generic_list_create(int max_size) {
  19. GenericFixedList *list = (GenericFixedList*)malloc(sizeof(GenericFixedList));
  20. if (!list) return NULL;
  21. list->head = NULL;
  22. list->tail = NULL;
  23. list->max_size = max_size;
  24. list->current_size = 0;
  25. return list;
  26. }
  27. bool generic_list_append(GenericFixedList *list, const void *data, size_t data_size) {
  28. if (list->max_size == 0) return false;
  29. if (list->current_size == 0) {
  30. GenericNode *new_node = generic_node_create(data, data_size);
  31. if (!new_node) return false;
  32. new_node->next = new_node;
  33. list->head = new_node;
  34. list->tail = new_node;
  35. list->current_size = 1;
  36. return true;
  37. }
  38. else if (list->current_size >= list->max_size) {
  39. if (list->head->data_size != data_size) {
  40. free(list->head->data);
  41. list->head->data = malloc(data_size);
  42. if (!list->head->data) return false;
  43. list->head->data_size = data_size;
  44. }
  45. memcpy(list->head->data, data, data_size);
  46. list->tail = list->head;
  47. list->head = list->head->next;
  48. return true;
  49. }
  50. else {
  51. GenericNode *new_node = generic_node_create(data, data_size);
  52. if (!new_node) return false;
  53. new_node->next = list->head;
  54. list->tail->next = new_node;
  55. list->tail = new_node;
  56. list->current_size++;
  57. return true;
  58. }
  59. }
  60. void * generic_list_get_index(GenericFixedList *list,uint8_t index)
  61. {
  62. void *data = NULL;
  63. GenericNode *p_node = list->head;
  64. if(index < list->current_size)
  65. {
  66. int i = 0;
  67. for(;p_node != list->tail;p_node=p_node->next)
  68. {
  69. if(i>= index)
  70. {
  71. data = p_node->data;
  72. break;
  73. }
  74. i++;
  75. }
  76. if(index == list->current_size-1)
  77. data = list->tail->data;
  78. }
  79. return data;
  80. }
  81. void generic_list_get(GenericFixedList *list,void * data,uint8_t lenth)
  82. {
  83. if(lenth >= list->current_size)
  84. lenth = list->current_size;
  85. if(lenth == 0)
  86. return;
  87. GenericNode *p_node = list->head;
  88. int i = 0;
  89. int p_start = 0;
  90. for(;;p_node = p_node->next,i++)
  91. {
  92. memcpy(data+p_start,p_node->data,p_node->data_size);
  93. p_start += p_node->data_size;
  94. if(p_node == list->tail)
  95. {
  96. break;
  97. }
  98. }
  99. }
  100. void generic_list_destroy(GenericFixedList *list) {
  101. if (list->current_size > 0) {
  102. GenericNode *current = list->head;
  103. GenericNode *next_node = NULL;
  104. for (int i = 0; i < list->current_size; i++) {
  105. next_node = current->next;
  106. free(current->data);
  107. free(current);
  108. current = next_node;
  109. }
  110. }
  111. free(list);
  112. }
  113. int generic_list_get_count(GenericFixedList *list)
  114. {
  115. return list->current_size;
  116. }