OFFSET.C
[目次 | 関数]
1|/**************************************************************************
2|* 1. <<< メンバ変数のオフセット (Offset) >>>
3|***************************************************************************/
4|
5|#include "mixer_precomp.h" /* Auto precompiled header, Look at mixer-... folder */
6|// #pragma hdrstop ("mixer_precomp")
7|
8|#if defined(USES_MXP_AUTOINC)
9| #include "offset.ah" /* Auto include header, Look at mixer-... folder */
10|#endif
11|
12|/*-------------------------------------------------------------------------*/
13|/* 2. <<< ◆(Offset_Key) キー情報 >>> */
14|/*-------------------------------------------------------------------------*/
15|
16|
17|#ifdef USES_STDLIBS
18|#ifndef USES_MORI_STDLIB
19|
20|/**************************************************************************
21|* 3. <<< [Offset_Key_chk] 正規チェック >>>
22|***************************************************************************/
23|int Offset_Key_chk( Offset_Key* m )
24|{
25| return Offset_chk( m->offset ) &&
26| ( m->type == Offset_Int ||
27| m->type == Offset_Double ||
28| m->type == Offset_CString ||
29| m->type == Offset_CStringP ||
30| m->type == Offset_CStringPI ||
31| m->type == Offset_CStringPW ||
32| m->type == Offset_StrV ) &&
33| ( m->direc == Offset_Up ||
34| m->direc == Offset_Down ||
35| m->direc == Offset_NoDirec );
36|}
37|
38|/*************************************************************************
39|* 4. <<< [Offset_Key_isHit] キーがヒットするか判定する >>>
40|*【引数】
41|* ・void* elem; ヒットするか判定する要素
42|* ・void* key; 判定に用いるキーの値が格納されているアドレス
43|* ・bool 返り値; ヒットしたかどうか(true=ヒット)
44|**************************************************************************/
45|#ifdef __STRING_H
46|#if !defined(FOR_GHS) && !defined(FOR_CA) && !defined(FOR_WINCE)
47|bool Offset_Key_isHit( Offset_Key* m, const void* elem, const void* key )
48|{
49| ASSERT( elem != NULL );
50|
51| switch ( m->type ) {
52| case Offset_CString:
53| return strcmp( &Offset_ref( m->offset, elem, char ), key ) == 0;
54| case Offset_CStringP:
55| ASSERT( Offset_ref( m->offset, elem, char* ) != NULL );
56| return strcmp( Offset_ref( m->offset, elem, char* ), key ) == 0;
57| case Offset_CStringPI:
58| ASSERT( Offset_ref( m->offset, elem, char* ) != NULL );
59| return stricmp( Offset_ref( m->offset, elem, char* ), key ) == 0;
60| #ifdef USES_STRX
61| case Offset_CStringPW:
62| ASSERT( Offset_ref( m->offset, elem, char* ) != NULL );
63| return StrX_cmpWild( Offset_ref( m->offset, elem, char* ), key ) == 0;
64| #endif
65| #ifdef USES_STRV
66| case Offset_StrV:
67| return strcmp( Offset_ref( m->offset, elem, StrV ).p, key ) == 0;
68| #endif
69| default:
70| error();
71| return false; /* dummy */
72| }
73|}
74|#endif
75|#endif
76|
77|/**************************************************************************
78|* 5. <<< [Offset_Key_cmp] キーを比較する >>>
79|*【引数】
80|* ・void* data1, data2; キーを含むデータのアドレス
81|* ・int 返り値; 比較の結果、正=data1 が優先、負=data2 が優先
82|*【補足】
83|*・キーが int 型の場合、昇順なら、返り値は正です(data1.key < data2.key)。
84|***************************************************************************/
85|int Offset_Key_cmp( Offset_Key* m, void* data1, void* data2 )
86|{
87| int flag;
88|
89| switch ( m->type ) {
90| case Offset_Int:
91| flag = Offset_ref( m->offset, data1, int )
92| - Offset_ref( m->offset, data2, int );
93| break;
94| case Offset_Double:
95| flag = (int)( Offset_ref( m->offset, data1, double )
96| - Offset_ref( m->offset, data2, double ) );
97| break;
98| default:
99| #ifdef _CHECKER
100| error();
101| #endif
102| break;
103| }
104|
105| return flag * m->direc;
106|}
107|
108|
109|/**************************************************************************
110|* 6. <<< [Offset_Key_getCharPtr] キー文字列を参照する >>>
111|*【引数】
112|* ・void* data; キーを含むデータのアドレス
113|* ・char* 返り値; 文字列, NULL=文字列でない
114|*【補足】
115|*・Offset_CString, Offset_CStringP, Offset_CStringPI, Offset_CStringPW,
116|* Offset_StrV のどの型でも参照できます。
117|*・文字列型以外のときは NULL が返ります。
118|***************************************************************************/
119|char* Offset_Key_getCharPtr( Offset_Key* m, void* data )
120|{
121| switch ( m->type ) {
122| case Offset_CString:
123| return &Offset_ref( m->offset, data, char );
124| case Offset_CStringP:
125| case Offset_CStringPI:
126| case Offset_CStringPW:
127| return Offset_ref( m->offset, data, char* );
128| #ifdef USES_STRV
129| case Offset_StrV:
130| return Offset_ref( m->offset, data, StrV ).p;
131| #endif
132| default:
133| return NULL;
134| }
135|}
136|
137|
138|/**************************************************************************
139|* 7. <<< [Offset_Key_print] デバッグ表示 >>>
140|*【引数】
141|* ・Offset_Key* m; キー(の型)
142|* ・char* title; 行頭に表示する文字列
143|***************************************************************************/
144|#ifndef ERRORS_CUT_DEBUG_TOOL
145|#ifdef USES_ARRX
146|void Offset_Key_print( Offset_Key* m, const char* title )
147|{
148| static char* type_str[] = {
149| "Offset_Int", "Offset_Double", "Offset_CString", "Offset_CStringP",
150| "Offset_CStringPI", "Offset_CStringPW", "Offset_StrV"
151| };
152| static char* direc_str[] = {
153| "Offset_Up" /*-1*/, "Offset_NoDirec", "Offset_Down"
154| };
155|
156| if ( m->type >= 0 && m->type < ArrX_C_getN( type_str, char* ) &&
157| m->direc >= -1 && m->direc <= 1 ) {
158| Errors_printf( "%sKey(%p): offset=%d(0x%X), type=%d(%s), direc=%d(%s)",
159| title, m, m->offset, m->offset,
160| m->type, type_str[m->type], m->direc, direc_str[m->direc+1] );
161| }
162| else {
163| Errors_printf( "%sKey(%p): offset=%d(0x%X), type=%d, direc=%d",
164| title, m, m->offset, m->offset,
165| m->type, m->direc );
166| }
167|}
168|#endif
169|#endif
170|
171|
172|
173|/**************************************************************************
174|* 8. <<< [Offset_Key_printData] 対象データのキーの値のデバッグ表示 >>>
175|*【引数】
176|* ・Offset_Key* m; キー(の型)
177|* ・void* data; キーを含むデータの先頭アドレス
178|* ・char* title; 行頭に表示する文字列
179|***************************************************************************/
180|#ifndef ERRORS_CUT_DEBUG_TOOL
181|void Offset_Key_printData( Offset_Key* m, void* data, const char* title )
182|{
183| switch ( m->type ) {
184| case Offset_Int:
185| Errors_printf( "%sData of Key (%p) = %d", title, data,
186| Offset_ref( m->offset, data, int ) );
187| break;
188| case Offset_Double:
189| Errors_printf( "%sData of Key (%p) = %f", title, data,
190| Offset_ref( m->offset, data, double ) );
191| break;
192| case Offset_CString:
193| Errors_printf( "%sData of Key (%p) = %s", title, data,
194| &Offset_ref( m->offset, data, char ) );
195| break;
196| case Offset_CStringP:
197| case Offset_CStringPI:
198| case Offset_CStringPW:
199| Errors_printf( "%sData of Key (%p) = %s", title, data,
200| Offset_ref( m->offset, data, char* ) );
201| break;
202| /* default was ignore */
203| }
204|}
205|#endif
206|
207|
208|
209|#endif /* USES_MORI_STDLIB */
210|#endif /* USES_STDLIBS */
211|
212|
213|