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|