LINKLIST.H 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. Copyright (C) 1994-1995 Apogee Software, Ltd.
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. See the GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. #ifndef __linklist_h
  16. #define __linklist_h
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. #define NewNode(type) ((type*)SafeMalloc(sizeof(type)))
  21. #define LL_CreateNewLinkedList(rootnode,type,next,prev) \
  22. { \
  23. (rootnode) = NewNode(type); \
  24. (rootnode)->prev = (rootnode); \
  25. (rootnode)->next = (rootnode); \
  26. }
  27. #define LL_AddNode(rootnode, newnode, next, prev) \
  28. { \
  29. (newnode)->next = (rootnode); \
  30. (newnode)->prev = (rootnode)->prev; \
  31. (rootnode)->prev->next = (newnode); \
  32. (rootnode)->prev = (newnode); \
  33. }
  34. #define LL_TransferList(oldroot,newroot,next,prev) \
  35. { \
  36. if ((oldroot)->prev != (oldroot)) \
  37. { \
  38. (oldroot)->prev->next = (newroot); \
  39. (oldroot)->next->prev = (newroot)->prev; \
  40. (newroot)->prev->next = (oldroot)->next; \
  41. (newroot)->prev = (oldroot)->prev; \
  42. (oldroot)->next = (oldroot); \
  43. (oldroot)->prev = (oldroot); \
  44. } \
  45. }
  46. #define LL_ReverseList(root,type,next,prev) \
  47. { \
  48. type *newend,*trav,*tprev; \
  49. \
  50. newend = (root)->next; \
  51. for(trav = (root)->prev; trav != newend; trav = tprev) \
  52. { \
  53. tprev = trav->prev; \
  54. LL_MoveNode(trav,newend,next,prev); \
  55. } \
  56. }
  57. #define LL_RemoveNode(node,next,prev) \
  58. { \
  59. (node)->prev->next = (node)->next; \
  60. (node)->next->prev = (node)->prev; \
  61. (node)->next = (node); \
  62. (node)->prev = (node); \
  63. }
  64. #define LL_SortedInsertion(rootnode,insertnode,next,prev,type,sortparm) \
  65. { \
  66. type *hoya; \
  67. \
  68. hoya = (rootnode)->next; \
  69. while((hoya != (rootnode)) && ((insertnode)->sortparm > hoya->sortparm)) \
  70. { \
  71. hoya = hoya->next; \
  72. } \
  73. LL_AddNode(hoya,(insertnode),next,prev); \
  74. }
  75. #define LL_MoveNode(node,newroot,next,prev) \
  76. { \
  77. LL_RemoveNode((node),next,prev); \
  78. LL_AddNode((newroot),(node),next,prev); \
  79. }
  80. #define LL_ListEmpty(list,next,prev) \
  81. ( \
  82. ((list)->next == (list)) && \
  83. ((list)->prev == (list)) \
  84. )
  85. #define LL_Free(list) SafeFree(list)
  86. #define LL_Reset(list,next,prev) (list)->next = (list)->prev = (list)
  87. #define LL_New LL_CreateNewLinkedList
  88. #define LL_Remove LL_RemoveNode
  89. #define LL_Add LL_AddNode
  90. #define LL_Empty LL_ListEmpty
  91. #define LL_Move LL_MoveNode
  92. #ifdef __cplusplus
  93. };
  94. #endif
  95. #endif