fifo.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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(GenericFixedList *list,void * data,uint8_t lenth)
  61. {
  62. if(lenth >= list->current_size)
  63. lenth = list->current_size;
  64. if(lenth == 0)
  65. return;
  66. GenericNode *p_node = list->head;
  67. int i = 0;
  68. int p_start = 0;
  69. for(;;p_node = p_node->next,i++)
  70. {
  71. memcpy(data+p_start,p_node->data,p_node->data_size);
  72. p_start += p_node->data_size;
  73. if(p_node == list->tail)
  74. {
  75. break;
  76. }
  77. }
  78. }
  79. void generic_list_destroy(GenericFixedList *list) {
  80. if (list->current_size > 0) {
  81. GenericNode *current = list->head;
  82. GenericNode *next_node = NULL;
  83. for (int i = 0; i < list->current_size; i++) {
  84. next_node = current->next;
  85. free(current->data);
  86. free(current);
  87. current = next_node;
  88. }
  89. }
  90. free(list);
  91. }
  92. int generic_list_get_count(GenericFixedList *list)
  93. {
  94. return list->current_size;
  95. }