list.inc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. {
  2. Free Pascal port of the Hermes C library.
  3. Copyright (C) 2001-2003 Nikolay Nikolov ([email protected])
  4. Original C version by Christian Nentwich ([email protected])
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public
  7. License as published by the Free Software Foundation; either
  8. version 2.1 of the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with this library; if not, write to the Free Software
  15. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. }
  17. Type
  18. TListFreeCallback = Procedure(p : Pointer);
  19. PHermesListElementStruct = ^THermesListElementStruct;
  20. THermesListElementStruct = Record
  21. handle : THermesHandle;
  22. data : Pointer;
  23. next : PHermesListElementStruct;
  24. End;
  25. PHermesListElement = ^THermesListElement;
  26. THermesListElement = THermesListElementStruct;
  27. PHermesList = ^THermesList;
  28. THermesList = Record
  29. first, last : PHermesListElement;
  30. End;
  31. {Function Hermes_ListNew : PHermesList;
  32. Procedure Hermes_ListDestroy(list : PHermesList);
  33. Function Hermes_ListElementNew(handle : THermesHandle) : PHermesListElement;
  34. Procedure Hermes_ListAdd(list : PHermesList; element : PHermesListElement);
  35. Procedure Hermes_ListAddFront(list : PHermesList; element : PHermesListElement);
  36. Function Hermes_ListDeleteElement(list : PHermesList; handle : THermesHandle) : Boolean;
  37. Function Hermes_ListLookup(list : PHermesList;
  38. handle : THermesHandle) : PHermesListElement;}
  39. Function Hermes_ListNew : PHermesList;
  40. Var
  41. tmp : PHermesList;
  42. Begin
  43. { New(tmp);}
  44. tmp := malloc(SizeOf(THermesList));
  45. If tmp = Nil Then
  46. Begin
  47. Hermes_ListNew := Nil;
  48. Exit;
  49. End;
  50. tmp^.first := Nil;
  51. tmp^.last := Nil;
  52. Hermes_ListNew := tmp;
  53. End;
  54. Procedure Hermes_ListDestroy(list : PHermesList);
  55. Var
  56. tmp, run : PHermesListElement;
  57. Begin
  58. If list = Nil Then
  59. Exit;
  60. run := list^.first;
  61. While run <> Nil Do
  62. Begin
  63. tmp := run;
  64. run := run^.next;
  65. If tmp^.data <> Nil Then
  66. Begin
  67. {to do: free(tmp->data)}
  68. free(tmp^.data);
  69. End;
  70. free(tmp);
  71. End;
  72. free(list);
  73. list := Nil;
  74. End;
  75. Function Hermes_ListElementNew(handle : THermesHandle) : PHermesListElement;
  76. Var
  77. tmp : PHermesListElement;
  78. Begin
  79. tmp := malloc(SizeOf(THermesListElement));
  80. If tmp = Nil Then
  81. Begin
  82. Hermes_ListElementNew := Nil;
  83. Exit;
  84. End;
  85. tmp^.handle := handle;
  86. tmp^.next := Nil;
  87. tmp^.data := Nil;
  88. Hermes_ListElementNew := tmp;
  89. End;
  90. Procedure Hermes_ListAdd(list : PHermesList; element : PHermesListElement);
  91. Begin
  92. If (list = Nil) Or (element = Nil) Then
  93. Exit;
  94. If list^.first = Nil Then
  95. Begin
  96. list^.first := element;
  97. list^.last := element;
  98. element^.next := Nil;
  99. Exit;
  100. End;
  101. list^.last^.next := element;
  102. list^.last := element;
  103. element^.next := Nil;
  104. End;
  105. Procedure Hermes_ListAddFront(list : PHermesList; element : PHermesListElement);
  106. Begin
  107. If (list = Nil) Or (element = Nil) Then
  108. Exit;
  109. If list^.first = Nil Then
  110. Begin
  111. list^.first := element;
  112. list^.last := element;
  113. element^.next := Nil;
  114. Exit;
  115. End;
  116. element^.next := list^.first;
  117. list^.first := element;
  118. End;
  119. Function Hermes_ListDeleteElement(list : PHermesList; handle : THermesHandle; user_free : TListFreeCallback) : Boolean;
  120. Var
  121. run, previous : PHermesListElement;
  122. Begin
  123. If list = Nil Then
  124. Begin
  125. Hermes_ListDeleteElement := False;
  126. Exit;
  127. End;
  128. previous := Nil;
  129. run := list^.first;
  130. While run <> Nil Do
  131. Begin
  132. If run^.handle = handle Then
  133. Begin
  134. If run = list^.first Then
  135. list^.first := run^.next
  136. Else
  137. previous^.next := run^.next;
  138. If run = list^.last Then
  139. Begin
  140. list^.last := previous;
  141. If list^.last <> Nil Then
  142. list^.last^.next := Nil;
  143. End;
  144. If run^.data <> Nil Then
  145. Begin
  146. If user_free <> Nil Then
  147. Begin
  148. user_free(run^.data);
  149. End;
  150. free(run^.data);
  151. End;
  152. free(run);
  153. Hermes_ListDeleteElement := True;
  154. Exit;
  155. End;
  156. previous := run;
  157. run := run^.next;
  158. End;
  159. Hermes_ListDeleteElement := False;
  160. End;
  161. Function Hermes_ListDeleteElement(list : PHermesList; handle : THermesHandle) : Boolean;
  162. Begin
  163. Hermes_ListDeleteElement := Hermes_ListDeleteElement(list, handle, Nil);
  164. End;
  165. Function Hermes_ListLookup(list : PHermesList;
  166. handle : THermesHandle) : PHermesListElement;
  167. Var
  168. run : PHermesListElement;
  169. Begin
  170. If list = Nil Then
  171. Begin
  172. Hermes_ListLookup := Nil;
  173. Exit;
  174. End;
  175. run := list^.first;
  176. While run <> Nil Do
  177. Begin
  178. If run^.handle = handle Then
  179. Begin
  180. Hermes_ListLookup := run;
  181. Exit;
  182. End;
  183. run := run^.next;
  184. End;
  185. Hermes_ListLookup := Nil;
  186. End;