SysLists.h
上传用户: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. #ifndef _SYSLISTS_H
  23. #define _SYSLISTS_H
  24. #define SYS_LIST_HEAD_INIT(name)        { &(name), &(name) }
  25. #define SYS_LIST_HEAD(name)             struct SysListHead name = SYS_LIST_HEAD_INIT(name)
  26. #define SYS_INIT_LIST_HEAD(ptr) 
  27. do { 
  28.     (ptr)->pNext = (ptr); (ptr)->pPrev = (ptr); 
  29. } while (0)
  30. #define SYS_INIT_LIST_LINK(ptr) 
  31. do { 
  32.     (ptr)->pNext = NULL; (ptr)->pPrev = NULL; 
  33. } while (0)
  34. #define SYS_LIST_ADD(new, prev, next) 
  35. do { 
  36.     struct SysListHead *    pPrev = prev; 
  37.     struct SysListHead *    pNext = next; 
  38.     pNext->pPrev = new; 
  39. (new)->pNext = pNext; 
  40. (new)->pPrev = pPrev; 
  41. pPrev->pNext = new; 
  42. } while (0)
  43. #define SYS_LIST_ADDH(new, head)        SYS_LIST_ADD(new, head, (head)->pNext)
  44. #define SYS_LIST_ADDT(new, head)        SYS_LIST_ADD(new, (head)->pPrev, head)
  45. #define SYS_LIST_UNLINK(prev, next) 
  46. do { 
  47.     (next)->pPrev = prev; 
  48.     (prev)->pNext = next; 
  49. } while (0)
  50. #define SYS_LIST_DEL(entry) 
  51. do { 
  52.     SYS_LIST_UNLINK((entry)->pPrev, (entry)->pNext); 
  53.     (entry)->pPrev = NULL; 
  54.     (entry)->pNext = NULL; 
  55. } while (0)
  56. #define SYS_LIST_EMTPY(head)            ((head)->pNext == head)
  57. #define SYS_LIST_SPLICE(list, head) 
  58. do { 
  59.     struct SysListHead *    first = (list)->pNext; 
  60.     if (first != list) { 
  61.         struct SysListHead *    last = (list)->pPrev; 
  62.         struct SysListHead *    at = (head)->pNext; 
  63.         (first)->pPrev = head; 
  64.         (head)->pNext = first; 
  65.         (last)->pNext = at; 
  66.         (at)->pPrev = last; 
  67.     } 
  68. } while (0)
  69. #define SYS_LIST_ENTRY(ptr, type, member)   ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
  70. #define SYS_LIST_FOR_EACH(pos, head)        for (pos = (head)->pNext; pos != (head); pos = (pos)->pNext)
  71. #define SYS_LIST_FIRST(head)                (((head)->pNext != (head)) ? (head)->pNext: NULL)
  72. #define SYS_LIST_LAST(head)                 (((head)->pPrev != (head)) ? (head)->pPrev: NULL)
  73. #define SYS_LIST_LINKED(ptr)                (((ptr)->pPrev != NULL) && ((ptr)->pNext != NULL))
  74. #define SYS_COPY_HEAD(dsth, srch) 
  75. do { 
  76.     (dsth)->pPrev = (srch)->pPrev; 
  77.     (dsth)->pNext = (srch)->pNext; 
  78.     if ((srch)->pNext != NULL) (srch)->pNext->pPrev = dsth; 
  79.     if ((srch)->pPrev != NULL) (srch)->pPrev->pNext = dsth; 
  80. } while (0)
  81. struct SysListHead {
  82. struct SysListHead *pNext;
  83. struct SysListHead *pPrev;
  84. };
  85. #endif