SList.cpp
上传用户:woshihumen
上传日期:2013-07-18
资源大小:484k
文件大小:3k
源码类别:

Email服务器

开发平台:

Visual C++

  1. /*
  2.  *  XMail by Davide Libenzi ( Intranet and Internet mail server )
  3.  *  Copyright (C) 1999,..,2004  Davide Libenzi
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  *  Davide Libenzi <davidel@xmailserver.org>
  20.  *
  21.  */
  22. #include "SysInclude.h"
  23. #include "SysDep.h"
  24. #include "SvrDefines.h"
  25. #include "SList.h"
  26. void ListInit(HSLIST & hList)
  27. {
  28. hList = INVALID_SLIST_PTR;
  29. }
  30. void ListAddHead(HSLIST & hList, PLISTLINK pLLink)
  31. {
  32. pLLink->pNext = hList;
  33. hList = pLLink;
  34. }
  35. void ListAddTail(HSLIST & hList, PLISTLINK pLLink)
  36. {
  37. PLISTLINK lpPrev = INVALID_SLIST_PTR, lpCurr = hList;
  38. while (lpCurr != INVALID_SLIST_PTR) {
  39. lpPrev = lpCurr;
  40. lpCurr = lpCurr->pNext;
  41. }
  42. pLLink->pNext = INVALID_SLIST_PTR;
  43. if (lpPrev == INVALID_SLIST_PTR)
  44. hList = pLLink;
  45. else
  46. lpPrev->pNext = pLLink;
  47. }
  48. PLISTLINK ListFirst(HSLIST & hList)
  49. {
  50. return (hList);
  51. }
  52. PLISTLINK ListNext(HSLIST & hList, PLISTLINK pLLink)
  53. {
  54. return (pLLink->pNext);
  55. }
  56. PLISTLINK ListRemovePtr(HSLIST & hList, PLISTLINK pLLink)
  57. {
  58. PLISTLINK lpPrev = INVALID_SLIST_PTR, lpCurr = hList;
  59. while (lpCurr != INVALID_SLIST_PTR) {
  60. if (lpCurr == pLLink)
  61. break;
  62. lpPrev = lpCurr;
  63. lpCurr = lpCurr->pNext;
  64. }
  65. if (lpCurr == INVALID_SLIST_PTR)
  66. return (INVALID_SLIST_PTR);
  67. if (lpPrev == INVALID_SLIST_PTR)
  68. hList = lpCurr->pNext;
  69. else
  70. lpPrev->pNext = lpCurr->pNext;
  71. lpCurr->pNext = INVALID_SLIST_PTR;
  72. return (lpCurr);
  73. }
  74. PLISTLINK ListRemove(HSLIST & hList)
  75. {
  76. PLISTLINK lpCurr = hList;
  77. if (lpCurr != INVALID_SLIST_PTR)
  78. hList = lpCurr->pNext, lpCurr->pNext = INVALID_SLIST_PTR;
  79. return (lpCurr);
  80. }
  81. void ListPurgeFree(HSLIST & hList)
  82. {
  83. PLISTLINK lpCurr;
  84. while ((lpCurr = ListRemove(hList)) != INVALID_SLIST_PTR)
  85. SysFree(lpCurr);
  86. }
  87. void ListPurge(HSLIST & hList)
  88. {
  89. PLISTLINK lpCurr;
  90. while ((lpCurr = ListRemove(hList)) != INVALID_SLIST_PTR);
  91. }
  92. bool ListIsEmpty(HSLIST & hList)
  93. {
  94. return (hList == INVALID_SLIST_PTR);
  95. }
  96. int ListGetCount(HSLIST & hList)
  97. {
  98. int iListCount;
  99. PLISTLINK lpCurr = ListFirst(hList);
  100. for (iListCount = 0; lpCurr != INVALID_SLIST_PTR;
  101.      lpCurr = ListNext(hList, lpCurr), iListCount++);
  102. return (iListCount);
  103. }
  104. PLISTLINK *ListGetPointers(HSLIST & hList, int &iListCount)
  105. {
  106. iListCount = ListGetCount(hList);
  107. PLISTLINK *pPointers = (PLISTLINK *) SysAlloc((iListCount + 1) * sizeof(PLISTLINK));
  108. if (pPointers != NULL) {
  109. int ii;
  110. PLISTLINK lpCurr = ListFirst(hList);
  111. for (ii = 0; lpCurr != INVALID_SLIST_PTR; lpCurr = ListNext(hList, lpCurr), ii++)
  112. pPointers[ii] = lpCurr;
  113. pPointers[ii] = INVALID_SLIST_PTR;
  114. }
  115. return (pPointers);
  116. }
  117. void ListReleasePointers(PLISTLINK * pPointers)
  118. {
  119. SysFree(pPointers);
  120. }