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|