DLIST2.C

[目次 | 関数]

目次

関数一覧


   1|/************************************************************************** 
   2|*  1. <<< 双方向リスト・バッファ (DList2) >>>
   3|***************************************************************************/
   4|
   5|#include "mixer_precomp.h"
   6|// #pragma hdrstop ("mixer_precomp")
   7|
   8|#ifdef  USES_MXP_AUTOINC
   9| #include  <DList2.ah>  /* Auto include header, Look at mixer-... folder */
  10|#endif
  11|
  12|#ifdef _STDLIB
  13|#include <stdio.h>
  14|#endif
  15|
  16|/**************************************************************************
  17|*  2. <<< 双方向リストの移動をする [DList2_move()] >>>
  18|*【引数】
  19|*  ・DList2*  m;    移動する要素
  20|*  ・DList2*  to;      移動先の要素(to の直前に m が入る)
  21|*  ・DList2*  返り値;  m
  22|***************************************************************************/
  23|DList2*  DList2_move( DList2* m, DList2* to )
  24|{
  25|  /* 切り離す */
  26|  m->next->prev = m->prev;
  27|  m->prev->next = m->next;
  28|
  29|  /* 入れる */
  30|  m->next = to;
  31|  m->prev = to->prev;
  32|  to->prev->next = m;
  33|  to->prev = m;
  34|
  35|  return  m;
  36|}
  37|
  38|
  39|/**************************************************************************
  40|*  3. <<< 配列から双方向リストを張る [DList2_linkArr()] >>>
  41|*【引数】
  42|*  ・DList2* arr;          双方向リストを張る配列(補足)
  43|*  ・size_t  arr_sizeof;   arr のメモリサイズ
  44|*  ・size_t  elem_sizeof;  arr の要素のメモリサイズ
  45|*  ・void*   返り値;       末尾の次の要素のアドレス
  46|*【補足】
  47|*・arr に指定する配列要素の型は、メンバ変数が DList2 から始まる構造体で
  48|*  あること。
  49|*・最初の要素の prev と最後の要素の next は、配列のすぐ隣の無効領域を
  50|*  ポイントします。
  51|***************************************************************************/
  52|void*  DList2_linkArr( DList2* arr, size_t arr_sizeof, size_t elem_sizeof )
  53|{
  54|  char*  p = (char*)arr;
  55|  char*  p_over = p + arr_sizeof;
  56|
  57|  for ( ; p < p_over; p += elem_sizeof ) {
  58|    ((DList2*)p)->next = (DList2*)(p + elem_sizeof);
  59|    ((DList2*)p)->prev = (DList2*)(p - elem_sizeof);
  60|  }
  61|
  62|  return  (void*)p;
  63|}
  64|
  65|
  66|/**************************************************************************
  67|*  4. <<< バッファを初期化する [DList2_Buf_init()] >>>
  68|*【機能】
  69|*・バッファを空にして、未使用リストを作成します。
  70|*【補足】
  71|*・arr に指定する配列要素の型は、メンバ変数が DList2 から始まる構造体で
  72|*  あること。
  73|***************************************************************************/
  74|void  DList2_Buf_init( DList2_Buf* m, DList2* arr, size_t arr_sizeof,
  75|   size_t elem_sizeof )
  76|{
  77|  char*  last;
  78|
  79|  /* use のリストを作成 */
  80|  m->use.next = (DList2*)&m->use;
  81|  m->use.prev = (DList2*)&m->use;
  82|
  83|  /* nouse のリストを作成 */
  84|  last = (char*)DList2_linkArr(arr, arr_sizeof, elem_sizeof) - elem_sizeof;
  85|  m->nouse.next = (DList2*)arr;
  86|  m->nouse.prev = (DList2*)last;
  87|  ((DList2*)arr)->prev = (DList2*)&m->nouse;
  88|  ((DList2*)last)->next = (DList2*)&m->nouse;
  89|}
  90|
  91|
  92|#ifdef _STDLIB
  93|/**************************************************************************
  94|*  5. <<< デバッグ表示 [DList2_Buf_print()] >>>
  95|***************************************************************************/
  96|void  DList2_Buf_print( DList2_Buf* m )
  97|{
  98|  DList2*  p;
  99|  DList2*  p_over;
 100|
 101|  /* 使用状態の要素のアドレスを一覧 */
 102|  printf( "use: (first= %p, last= %p)\n", m->use.next, m->use.prev );
 103|  p = DList2_Buf_getFirst( m );
 104|  p_over = DList2_Buf_getOver( m );
 105|  for ( ; p != p_over; p = p->next )
 106|    printf( "%p, ", p );
 107|  printf( "\n" );
 108|
 109|  /* 未使用状態の要素のアドレスを一覧 */
 110|  printf( "nouse: (first= %p, last= %p)\n", m->nouse.next, m->nouse.prev );
 111|  p = m->nouse.next;
 112|  p_over = &m->nouse;
 113|  for ( ; p != p_over; p = p->next )
 114|    printf( "%p, ", p );
 115|  printf( "\n" );
 116|
 117|  /* 使用状態の要素のアドレスを*逆から*一覧 */
 118|  printf( "use(reverse):\n" );
 119|  p = m->use.prev;
 120|  p_over = &m->use;
 121|  for ( ; p != p_over; p = p->prev )
 122|    printf( "%p, ", p );
 123|  printf( "\n" );
 124|
 125|  /* 未使用状態の要素のアドレスを*逆から*一覧 */
 126|  printf( "nouse(reverse):\n" );
 127|  p = m->nouse.prev;
 128|  p_over = &m->nouse;
 129|  for ( ; p != p_over; p = p->prev )
 130|    printf( "%p, ", p );
 131|  printf( "\n" );
 132|}
 133|#endif /* _STDLIB */
 134| 
 135|