PageRenderTime 59ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/tux-target/chat/src/list.c

http://tux-target.googlecode.com/
C | 214 lines | 128 code | 53 blank | 33 comment | 47 complexity | d44e1dff36eaa959b3328427be29c0d6 MD5 | raw file
Possible License(s): GPL-2.0
  1. /* Copyright, 2001 MELTING POT.
  2. *
  3. * This file is part of MTP CHAT.
  4. * MTP CHAT is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2, or (at your option)
  7. * any later version.
  8. * MTP CHAT is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. * You should have received a copy of the GNU General Public License
  13. * along with MTP CHAT; see the file COPYING. If not, write to the
  14. * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  15. * MA 02111-1307, USA.
  16. */
  17. /* List.C */
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include "list.h"
  23. #include "types.h"
  24. #include "object.h"
  25. #include "mtp.h"
  26. #include "server.h"
  27. #include "token.h"
  28. #include "variable.h"
  29. /* Variables */
  30. list Lists[1];
  31. /* Prototypes */
  32. static void RemNode(list *List, node *Node);
  33. /* Functions */
  34. /* InitList() */
  35. void InitList(list *List, const char *ListName) {
  36. List->Type = LIST;
  37. List->Id = NewString(ListName);
  38. List->Head = NULL;
  39. List->Tail = NULL;
  40. }
  41. /* ClearList() */
  42. void ClearList(list *List) {
  43. node *Node, *NodeNext;
  44. for (Node = List->Head; Node != NULL; Node = NodeNext) {
  45. NodeNext = Node->Next;
  46. free(Node);
  47. }
  48. List->Head = NULL;
  49. List->Tail = NULL;
  50. }
  51. /* AddHead() */
  52. void AddHead(list *List, void *Object) {
  53. node *Node;
  54. Node = malloc(sizeof(node));
  55. if (Node == NULL) FatalError("Not enough memory for Node in AddHead()");
  56. Node->Prev = NULL;
  57. Node->Next = List->Head;
  58. Node->Object = Object;
  59. if (List->Head != NULL) {
  60. List->Head->Prev = Node;
  61. } else {
  62. List->Tail = Node;
  63. }
  64. List->Head = Node;
  65. }
  66. /* AddTail() */
  67. void AddTail(list *List, void *Object) {
  68. node *Node;
  69. Node = malloc(sizeof(node));
  70. if (Node == NULL) FatalError("Not enough memory for Node in AddTail()");
  71. Node->Prev = List->Tail;
  72. Node->Next = NULL;
  73. Node->Object = Object;
  74. if (List->Tail != NULL) {
  75. List->Tail->Next = Node;
  76. } else {
  77. List->Head = Node;
  78. }
  79. List->Tail = Node;
  80. }
  81. /* RemObject() */
  82. void RemObject(list *List, void *Object) {
  83. node *Node;
  84. for (Node = List->Head; Node != NULL; Node = Node->Next) {
  85. if (Node->Object == Object) {
  86. RemNode(List,Node);
  87. return;
  88. }
  89. }
  90. }
  91. /* RemNode() */
  92. static void RemNode(list *List, node *Node) {
  93. if (Node->Prev != NULL) {
  94. Node->Prev->Next = Node->Next;
  95. } else {
  96. List->Head = Node->Next;
  97. }
  98. if (Node->Next != NULL) {
  99. Node->Next->Prev = Node->Prev;
  100. } else {
  101. List->Tail = Node->Prev;
  102. }
  103. free(Node);
  104. }
  105. /* SearchObject() */
  106. void *SearchObject(list *List, const char *Name, int Type) {
  107. node *Node;
  108. object *Object;
  109. for (Node = List->Head; Node != NULL; Node = Node->Next) {
  110. Object = Node->Object;
  111. if (SameString(Object->Id,Name) && (Object->Type & Type) != 0) return Object;
  112. if (Object->Type == LIST) {
  113. Object = SearchObject((list*)Object,Name,Type);
  114. if (Object != NULL) return Object;
  115. }
  116. }
  117. return NULL;
  118. }
  119. /* SortList() */
  120. void SortList(list *List, CMP_FCT NodeCmp) {
  121. list NewList[1];
  122. node *Greatest, *Ptr;
  123. InitList(NewList,List->Id);
  124. if (List->Head != List->Tail) {
  125. while (List->Head != NULL) {
  126. Greatest = List->Head;
  127. for (Ptr = Greatest->Next; Ptr != NULL; Ptr = Ptr->Next) {
  128. if ((*NodeCmp)(Ptr->Object,Greatest->Object) > 0) Greatest = Ptr;
  129. }
  130. AddHead(NewList,Greatest->Object);
  131. RemNode(List,Greatest);
  132. }
  133. *List = *NewList;
  134. }
  135. }
  136. /* SortList2() */
  137. list *SortList2(list *List, CMP_FCT NodeCmp) {
  138. static list NewList[1], SortList[1];
  139. node *Node, *Greatest, *Ptr;
  140. InitList(NewList,"SortPointerList");
  141. /* fait une liste de pointeur sur la liste */
  142. InitList(NewList,"PointerList");
  143. for (Node = List->Head; Node != NULL; Node = Node->Next) {
  144. AddHead(NewList, Node->Object);
  145. }
  146. if (NewList->Head != NewList->Tail) {
  147. while (NewList->Head != NULL) {
  148. Greatest = NewList->Head;
  149. for (Ptr = Greatest->Next; Ptr != NULL; Ptr = Ptr->Next) {
  150. if ((*NodeCmp)(Ptr->Object,Greatest->Object) > 0) Greatest = Ptr;
  151. }
  152. AddHead(SortList,Greatest->Object);
  153. RemNode(NewList,Greatest);
  154. }
  155. return SortList;
  156. }
  157. return NewList;
  158. }
  159. /* End of List.C */