queue.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright(C) 2021 Alibaba Communications Inc.
  4. * Author: David Li <liyong.li@alibaba-inc.com>
  5. */
  6. /*
  7. * queue management
  8. *
  9. */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <malloc.h>
  13. #include "queue.h"
  14. /**
  15. * queue init
  16. * parameter:
  17. * queueIncreasedEvent:event
  18. * ret:queue_ptr to be successful,NULL to be failed
  19. */
  20. Queue* Queue_Init(QueueIncreased queueIncreasedEvent)
  21. {
  22. Queue* queue = NULL;
  23. queue = (Queue*)malloc(sizeof(Queue));
  24. if(queue == NULL)
  25. {
  26. return NULL;
  27. }
  28. queue->length = 0;
  29. queue->head = NULL;
  30. queue->tail = NULL;
  31. queue->onQueueIncreased = queueIncreasedEvent;
  32. return queue;
  33. }
  34. /**
  35. * insert data to head
  36. * parameter:
  37. * queue:queue ptr
  38. * data:data to be inserted
  39. * ret:0 to be successful,-1 to be failed
  40. */
  41. int Queue_AddToHead(Queue* queue, char data)
  42. {
  43. QueueNode* node = NULL;
  44. if(queue == NULL)
  45. return -1;
  46. // create node
  47. node = (QueueNode*)malloc(sizeof(QueueNode));
  48. if(node == NULL)
  49. return -1;
  50. node->data = data;
  51. // in first time
  52. if(queue->tail == NULL && queue->head == NULL)
  53. {
  54. queue->tail = node;
  55. queue->head = node;
  56. node->next = NULL;
  57. node->prior = NULL;
  58. }
  59. else
  60. {
  61. // add to head
  62. queue->head->prior = node;
  63. node->next = queue->head;
  64. node->prior = NULL;
  65. queue->head = node;
  66. }
  67. queue->length++;
  68. //callback event
  69. if(queue->onQueueIncreased != NULL)
  70. return queue->onQueueIncreased(queue,data);
  71. return 0;
  72. }
  73. /**
  74. * insert data to taol
  75. * parameter:
  76. * queue:queue ptr
  77. * data:data to be inserted
  78. * ret:0 to be successful,-1 to be failed
  79. */
  80. int Queue_AddToTail(Queue* queue, char data)
  81. {
  82. QueueNode* node = NULL;
  83. if(queue == NULL)
  84. return -1;
  85. // create node
  86. node = (QueueNode*)malloc(sizeof(QueueNode));
  87. if(node == NULL)
  88. return -1;
  89. node->data = data;
  90. // in first time
  91. if(queue->tail == NULL && queue->head == NULL)
  92. {
  93. queue->tail = node;
  94. queue->head = node;
  95. node->next = NULL;
  96. node->prior = NULL;
  97. }
  98. else
  99. {
  100. //add to tail
  101. queue->tail->next = node;
  102. node->prior = queue->tail;
  103. node->next = NULL;
  104. queue->tail = node;
  105. }
  106. queue->length++;
  107. // callback event
  108. if(queue->onQueueIncreased != NULL)
  109. return queue->onQueueIncreased(queue,data);
  110. return 0;
  111. }
  112. /**
  113. * get data from queue head
  114. * parameter:
  115. * queue:queue ptr
  116. * ret:valid data to be successful,-1 to be failed
  117. */
  118. char Queue_GetFromHead(Queue* queue)
  119. {
  120. char data = -1;
  121. QueueNode* node = NULL;
  122. if(queue == NULL || queue->head == NULL)
  123. {
  124. return -1;
  125. }
  126. node = queue->head;
  127. queue->head = node->next;
  128. if(queue->head != NULL)
  129. {
  130. queue->head->prior = NULL;
  131. }
  132. else
  133. {
  134. //empty queue
  135. queue->tail = NULL;
  136. queue->head = NULL;
  137. }
  138. data = node->data;
  139. free(node);
  140. queue->length--;
  141. return data;
  142. }
  143. /**
  144. * get data from queue tail
  145. * parameter:
  146. * queue:queue ptr
  147. * ret:valid data to be successful,-1 to be failed
  148. */
  149. char Queue_GetFromTail(Queue* queue)
  150. {
  151. char data = -1;
  152. QueueNode* node = NULL;
  153. if(queue == NULL || queue->tail == NULL)
  154. {
  155. return -1;
  156. }
  157. node = queue->tail;
  158. queue->tail = node->prior;
  159. if(queue->tail != NULL)
  160. {
  161. queue->tail->next = NULL;
  162. }
  163. else
  164. {
  165. // empty queue
  166. queue->tail = NULL;
  167. queue->head = NULL;
  168. }
  169. data = node->data;
  170. free(node);
  171. queue->length--;
  172. return data;
  173. }
  174. char Queue_QueryAt(Queue* queue, unsigned long index)
  175. {
  176. QueueNode* node = NULL;
  177. if(queue == NULL || queue->head == NULL)
  178. {
  179. return -1;
  180. }
  181. node = queue->head;
  182. while (index > 0) {
  183. if (node == queue->tail) {
  184. printf("Queue QueryAt is out of range");
  185. return -1;
  186. }
  187. node = node->next;
  188. index--;
  189. };
  190. return node->data;
  191. }
  192. /**
  193. * free queue
  194. * parameter:
  195. * queue:queue ptr
  196. * isFreeData: flag to indicator free data automatically
  197. */
  198. void Queue_Free(Queue* queue, bool isFreeData)
  199. {
  200. if(isFreeData) {
  201. while (queue->tail != NULL)
  202. Queue_GetFromTail(queue);
  203. }
  204. free(queue);
  205. }
  206. // new event
  207. int OnQueueIncreasedEvent(void* queue, char data)
  208. {
  209. Queue* q = (Queue*)queue;
  210. char p = data;
  211. return 0;
  212. }