Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  17.  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  18.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  19.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  20.  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  21.  *
  22.  * The above copyright notice and this permission notice (including the
  23.  * next paragraph) shall be included in all copies or substantial portions
  24.  * of the Software.
  25.  */
  26.  
  27. /*
  28.  * List macros heavily inspired by the Linux kernel
  29.  * list handling. No list looping yet.
  30.  */
  31.  
  32. #include <stddef.h>
  33.  
  34. typedef struct _drmMMListHead
  35. {
  36.     struct _drmMMListHead *prev;
  37.     struct _drmMMListHead *next;
  38. } drmMMListHead;
  39.  
  40. #define DRMINITLISTHEAD(__item)                \
  41.   do{                                          \
  42.     (__item)->prev = (__item);                 \
  43.     (__item)->next = (__item);                 \
  44.   } while (0)
  45.  
  46. #define DRMLISTADD(__item, __list)              \
  47.   do {                                          \
  48.     (__item)->prev = (__list);                  \
  49.     (__item)->next = (__list)->next;            \
  50.     (__list)->next->prev = (__item);            \
  51.     (__list)->next = (__item);                  \
  52.   } while (0)
  53.  
  54. #define DRMLISTADDTAIL(__item, __list)          \
  55.   do {                                          \
  56.     (__item)->next = (__list);                  \
  57.     (__item)->prev = (__list)->prev;            \
  58.     (__list)->prev->next = (__item);            \
  59.     (__list)->prev = (__item);                  \
  60.   } while(0)
  61.  
  62. #define DRMLISTDEL(__item)                      \
  63.   do {                                          \
  64.     (__item)->prev->next = (__item)->next;      \
  65.     (__item)->next->prev = (__item)->prev;      \
  66.   } while(0)
  67.  
  68. #define DRMLISTDELINIT(__item)                  \
  69.   do {                                          \
  70.     (__item)->prev->next = (__item)->next;      \
  71.     (__item)->next->prev = (__item)->prev;      \
  72.     (__item)->next = (__item);                  \
  73.     (__item)->prev = (__item);                  \
  74.   } while(0)
  75.  
  76. #define DRMLISTENTRY(__type, __item, __field)   \
  77.     ((__type *)(((char *) (__item)) - offsetof(__type, __field)))
  78.  
  79. #define DRMLISTEMPTY(__item) ((__item)->next == (__item))
  80.  
  81. #define DRMLISTSINGLE(__list) \
  82.         (!DRMLISTEMPTY(__list) && ((__list)->next == (__list)->prev))
  83.  
  84. #define DRMLISTFOREACH(__item, __list)                                  \
  85.         for ((__item) = (__list)->next;                                 \
  86.              (__item) != (__list); (__item) = (__item)->next)
  87.  
  88. #define DRMLISTFOREACHSAFE(__item, __temp, __list)                      \
  89.         for ((__item) = (__list)->next, (__temp) = (__item)->next;      \
  90.              (__item) != (__list);                                      \
  91.              (__item) = (__temp), (__temp) = (__item)->next)
  92.  
  93. #define DRMLISTFOREACHSAFEREVERSE(__item, __temp, __list)               \
  94.         for ((__item) = (__list)->prev, (__temp) = (__item)->prev;      \
  95.              (__item) != (__list);                                      \
  96.              (__item) = (__temp), (__temp) = (__item)->prev)
  97.  
  98. #define DRMLISTFOREACHENTRY(__item, __list, __head)                            \
  99.         for ((__item) = DRMLISTENTRY(typeof(*__item), (__list)->next, __head); \
  100.              &(__item)->__head != (__list);                                    \
  101.              (__item) = DRMLISTENTRY(typeof(*__item),                          \
  102.                                      (__item)->__head.next, __head))
  103.  
  104. #define DRMLISTFOREACHENTRYSAFE(__item, __temp, __list, __head)                \
  105.         for ((__item) = DRMLISTENTRY(typeof(*__item), (__list)->next, __head), \
  106.              (__temp) = DRMLISTENTRY(typeof(*__item),                          \
  107.                                      (__item)->__head.next, __head);           \
  108.              &(__item)->__head != (__list);                                    \
  109.              (__item) = (__temp),                                              \
  110.              (__temp) = DRMLISTENTRY(typeof(*__item),                          \
  111.                                      (__temp)->__head.next, __head))
  112.  
  113. #define DRMLISTJOIN(__list, __join) if (!DRMLISTEMPTY(__list)) {        \
  114.         (__list)->next->prev = (__join);                                \
  115.         (__list)->prev->next = (__join)->next;                          \
  116.         (__join)->next->prev = (__list)->prev;                          \
  117.         (__join)->next = (__list)->next;                                \
  118. }
  119.