UA_list.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include "UA_config.h"
  2. #include "UA_list.h"
  3. void UA_list_defaultFreer(void* payload){
  4. if(payload){
  5. opcua_free(payload);
  6. }
  7. }
  8. Int32 UA_list_initElement(UA_list_Element* const element){
  9. if(element==NULL)return UA_ERROR;
  10. element->next=NULL;
  11. element->prev=NULL;
  12. element->father=NULL;
  13. element->payload=NULL;
  14. return UA_NO_ERROR;
  15. }
  16. Int32 UA_list_init(UA_list_List* const list){
  17. if(list==NULL)return UA_ERROR;
  18. list->first = NULL;
  19. list->last = NULL;
  20. list->size = 0;
  21. return UA_NO_ERROR;
  22. }
  23. Int32 UA_list_addElementToFront(UA_list_List* const list, UA_list_Element* const element){
  24. if(list==NULL || element==NULL)return UA_ERROR;
  25. UA_list_Element* second = NULL;
  26. second = list->first;
  27. list->first = element;
  28. element->prev = NULL;
  29. element->next = second;
  30. element->father = list;
  31. if(second){
  32. second->prev=element;
  33. }
  34. list->size++;
  35. if(list->size==1){
  36. list->last=element;
  37. }
  38. return UA_NO_ERROR;
  39. }
  40. Int32 UA_list_addPayloadToFront(UA_list_List* const list, void* const payload){
  41. if(list==NULL)return UA_ERROR;
  42. UA_list_Element* elem = (UA_list_Element*)opcua_malloc(sizeof(*elem));
  43. UA_list_initElement(elem);
  44. elem->payload = payload;
  45. UA_list_addElementToFront(list, elem);
  46. return UA_NO_ERROR;
  47. }
  48. Int32 UA_list_addElementToBack(UA_list_List* const list, UA_list_Element* const element){
  49. if(list==NULL || element == NULL)return UA_ERROR;
  50. UA_list_Element* secondLast = NULL;
  51. secondLast = list->last;
  52. list->last = element;
  53. element->prev = secondLast;
  54. element->next = NULL;
  55. element->father = list;
  56. if(secondLast){
  57. secondLast->next = element;
  58. }
  59. list->size++;
  60. if(list->size==1){
  61. list->first=element;
  62. }
  63. return UA_NO_ERROR;
  64. }
  65. Int32 UA_list_addPayloadToBack(UA_list_List* const list, void* const payload){
  66. if(list==NULL)return UA_ERROR;
  67. UA_list_Element* elem = (UA_list_Element*)opcua_malloc(sizeof(*elem));
  68. UA_list_initElement(elem);
  69. elem->payload = payload;
  70. UA_list_addElementToBack(list, elem);
  71. return UA_NO_ERROR;
  72. }
  73. Int32 UA_list_removeFirst(UA_list_List* const list, UA_list_PayloadVisitor visitor){
  74. if(list==NULL)return UA_ERROR;
  75. UA_list_Element* temp = NULL;
  76. if(list->first){
  77. temp = list->first->next;
  78. if(visitor){
  79. (*visitor)(list->first->payload);
  80. }
  81. opcua_free(list->first);
  82. list->first = temp;
  83. list->size--;
  84. if(list->size == 1){
  85. list->last = temp;
  86. }else if(list->size==0){
  87. list->last = NULL;
  88. }
  89. }
  90. return UA_NO_ERROR;
  91. }
  92. Int32 UA_list_removeLast(UA_list_List* const list, UA_list_PayloadVisitor visitor){
  93. if(list==NULL)return UA_ERROR;
  94. UA_list_Element* temp = NULL;
  95. if(list->last){
  96. temp = list->last->prev;
  97. if(visitor){
  98. (*visitor)(list->last->payload);
  99. }
  100. opcua_free(list->last);
  101. list->last = temp;
  102. list->size--;
  103. if(list->size == 1){
  104. list->first = temp;
  105. }else if(list->size==0){
  106. list->first = NULL;
  107. }
  108. }
  109. return UA_NO_ERROR;
  110. }
  111. Int32 UA_list_removeElement(UA_list_Element* const elem, UA_list_PayloadVisitor visitor){
  112. if(elem==NULL)return UA_ERROR;
  113. if(elem==elem->father->first){
  114. return UA_list_removeFirst(elem->father, visitor);
  115. }else if(elem==elem->father->last){
  116. return UA_list_removeLast(elem->father, visitor);
  117. }else{
  118. UA_list_Element* prev = elem->prev;
  119. UA_list_Element* next = elem->next;
  120. prev->next = next;
  121. next->prev = prev;
  122. if(visitor){
  123. (*visitor)(elem->payload);
  124. }
  125. (elem->father)->size--;
  126. opcua_free(elem);
  127. }
  128. return UA_NO_ERROR;
  129. }
  130. Int32 UA_list_destroy(UA_list_List* const list, UA_list_PayloadVisitor visitor){
  131. if(list==NULL)return UA_ERROR;
  132. UA_list_Element* current = NULL;
  133. current=list->first;
  134. while(current){
  135. UA_list_Element* next = current->next;
  136. if(visitor){
  137. (*visitor)(current->payload);
  138. }
  139. opcua_free(current);
  140. current = next;
  141. }
  142. UA_list_init(list);
  143. return UA_NO_ERROR;
  144. }
  145. Int32 UA_list_iterateElement(UA_list_List* const list, UA_list_ElementVisitor visitor){
  146. if(list==NULL)return UA_ERROR;
  147. UA_list_Element* current = list->first;
  148. while(current){
  149. if(visitor){
  150. (*visitor)(current);
  151. }
  152. current=current->next;
  153. }
  154. return UA_NO_ERROR;
  155. }
  156. /*Int32 UA_list_iteratePayload(UA_list_list* const list, UA_payloadVisitor visitor){
  157. void visitorTemp(UA_list_element* element){
  158. if(visitor){
  159. (*visitor)(element->payload);
  160. }
  161. }
  162. if(list==NULL)return UA_ERROR;
  163. UA_list_iterateElement(list, visitorTemp);
  164. return UA_NO_ERROR;
  165. }*/
  166. /** ANSI C forbids function nesting - reworked ugly version **/
  167. Int32 UA_list_iteratePayload(UA_list_List* const list, UA_list_PayloadVisitor visitor){
  168. if(list==NULL)return UA_ERROR;
  169. UA_list_Element* current = list->first;
  170. while(current){
  171. if(visitor){
  172. (*visitor)(current->payload);
  173. }
  174. current=current->next;
  175. }
  176. return UA_NO_ERROR;
  177. }
  178. UA_list_Element* UA_list_find(UA_list_List* const list, UA_list_PayloadMatcher matcher){
  179. if(list==NULL)return NULL;
  180. if(matcher){
  181. UA_list_Element* current = list->first;
  182. while(current){
  183. if(matcher && (*matcher)(current->payload)==TRUE){
  184. return current;
  185. }
  186. current=current->next;
  187. }
  188. }
  189. /* nothing found */
  190. return NULL;
  191. }
  192. UA_list_Element* UA_list_getFirst(UA_list_List* const list){
  193. if(list==NULL)return NULL;
  194. return list->first;
  195. }
  196. UA_list_Element* UA_list_getLast(UA_list_List* const list){
  197. if(list==NULL)return NULL;
  198. return list->last;
  199. }