C:\home\SVGCats_src\src\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_print] デバッグ表示 >>> 111|*【引数】 112|* ・Offset_Key* m; キー(の型) 113|* ・char* title; 行頭に表示する文字列 114|***************************************************************************/ 115|#ifndef ERRORS_CUT_DEBUG_TOOL 116|#ifdef USES_ARRX 117|void Offset_Key_print( Offset_Key* m, const char* title ) 118|{ 119| static char* type_str[] = { 120| "Offset_Int", "Offset_Double", "Offset_CString", "Offset_CStringP", 121| "Offset_CStringPI", "Offset_CStringPW", "Offset_StrV" 122| }; 123| static char* direc_str[] = { 124| "Offset_Up" /*-1*/, "Offset_NoDirec", "Offset_Down" 125| }; 126| 127| if ( m->type >= 0 && m->type < ArrX_C_getN( type_str, char* ) && 128| m->direc >= -1 && m->direc <= 1 ) { 129| Errors_printf( "%sKey(%p): offset=%d(0x%X), type=%d(%s), direc=%d(%s)", 130| title, m, m->offset, m->offset, 131| m->type, type_str[m->type], m->direc, direc_str[m->direc+1] ); 132| } 133| else { 134| Errors_printf( "%sKey(%p): offset=%d(0x%X), type=%d, direc=%d", 135| title, m, m->offset, m->offset, 136| m->type, m->direc ); 137| } 138|} 139|#endif 140|#endif 141| 142| 143| 144|/************************************************************************** 145|* 7. <<< [Offset_Key_printData] 対象データのキーの値のデバッグ表示 >>> 146|*【引数】 147|* ・Offset_Key* m; キー(の型) 148|* ・void* data; キーを含むデータの先頭アドレス 149|* ・char* title; 行頭に表示する文字列 150|***************************************************************************/ 151|#ifndef ERRORS_CUT_DEBUG_TOOL 152|void Offset_Key_printData( Offset_Key* m, void* data, const char* title ) 153|{ 154| switch ( m->type ) { 155| case Offset_Int: 156| Errors_printf( "%sData of Key (%p) = %d", title, data, 157| Offset_ref( m->offset, data, int ) ); 158| break; 159| case Offset_Double: 160| Errors_printf( "%sData of Key (%p) = %f", title, data, 161| Offset_ref( m->offset, data, double ) ); 162| break; 163| case Offset_CString: 164| Errors_printf( "%sData of Key (%p) = %s", title, data, 165| &Offset_ref( m->offset, data, char ) ); 166| break; 167| case Offset_CStringP: 168| case Offset_CStringPI: 169| case Offset_CStringPW: 170| Errors_printf( "%sData of Key (%p) = %s", title, data, 171| Offset_ref( m->offset, data, char* ) ); 172| break; 173| /* default was ignore */ 174| } 175|} 176|#endif 177| 178| 179| 180|#endif /* USES_MORI_STDLIB */ 181|#endif /* USES_STDLIBS */ 182| 183| 184|