Stdplus.h

C:\home\SVGCats_src\src\Stdplus.h

[目次 | 型・クラス・構造体 | マクロ]

目次

型・クラス・構造体一覧

マクロ一覧


   1|/*************************************************************************
   2|*  1. <<< 標準ライブラリ拡張 (StdPlus) >>> 
   3|*【情報】
   4|*・作成者:M.Toda
   5|*・作成開始日時:Feb.15.1999
   6|**************************************************************************/
   7|
   8|#ifndef __STDPLUS_H
   9|#define __STDPLUS_H
  10|
  11| 
  12|/*************************************************************************
  13|*  2. <<< モジュール・プロパティ >>> 
  14|**************************************************************************/
  15|/*----------------------------------------------------------------------
  16|[Module Property]
  17|name = StdPlus
  18|title = 標準ライブラリ拡張
  19|category =
  20|src = StdPlus.c
  21|depend =
  22|priority = StdLibs
  23|accord =
  24|----------------------------------------------------------------------*/
  25|
  26|
  27| 
  28|/*************************************************************************
  29|*  3. <<< 優先ヘッダ >>> 
  30|**************************************************************************/
  31|#ifndef USES_PRIORITY_HEADER
  32|/*[START_OF_PRIORITY_HEADER]*/
  33|
  34|#ifndef  USES_STDPLUS
  35|#define  USES_STDPLUS
  36|
  37|typedef  struct _StdPlus_FreeChk   StdPlus_FreeChk;
  38|typedef  struct _StdPlus_FreeChkE  StdPlus_FreeChkE;
  39|
  40|#define  STDLIBS_INCLUDE_STDLIB_H
  41|
  42|
  43|#ifndef  STDPLUS_SETTING
  44|
  45|  #define  STDPLUS_USES_STDNAME   /* malloc, free を本モジュールに */
  46|  #define  STDPLUS_USES_STDLIB    /* 標準ライブラリ(またはその準拠)を利用するか */
  47|  /* #define  STDPLUS_PRINT_NOT_FREE */  /* free していないアドレスを表示する */
  48|  /* #define  STDPLUS_NOT_ERRNO */     /* errno 関係をサポートしない */
  49|  #define  StdPlus_FreeChk_Depth  1024
  50|
  51|#endif
  52|
  53|#endif
  54|
  55|/*[END_OF_PRIORITY_HEADER]*/
  56|#endif /* USES_PRIORITY_HEADER */
  57|
  58|
  59|
  60| 
  61|/*************************************************************************
  62|*  4. <<< エラーコード >>> 
  63|**************************************************************************/
  64|
  65|#define  StdPlus_Err_MallocFailure  (709)
  66|#define  StdPlus_Err_FewFree        (710)
  67|#define  StdPlus_Err_NullFree    1393
  68|#define  StdPlus_Err_CannotContinueCheck  711
  69| 
  70|/*-----------------------------------------------------------------*/
  71|/* 5. <<< Interface Area ---------------------------------------- >>> */ 
  72|/*-----------------------------------------------------------------*/
  73|
  74|#ifdef __cplusplus
  75|extern "C" {
  76|#endif
  77|
  78| 
  79|/*************************************************************************
  80|*  6. <<< [StdPlus] 標準ライブラリ拡張 >>> 
  81|**************************************************************************/
  82|void*  StdPlus_malloc( int size );
  83|/* type*  StdPlus_malloc2( type, int m ); */
  84|void  StdPlus_free( void* p );
  85|/* type*  StdPlus_new( type*, type_name ); */
  86|/* void  StdPlus_delete( type*, type_finish ); */
  87|void*  StdPlus_realloc( void* p, int size );
  88|int   StdPlus_chkMalloc( void* p1, ... );
  89|void  StdPlus_chkFree(void);
  90|
  91|void  StdPlus_onMalloc( void* p );
  92|void  StdPlus_onFree( void* p );
  93|
  94|void  StdPlus_printErrno(void);
  95|
  96|void  ON_CO_CREATE_INSTANCE( void* p, int hr );
  97|void  ON_IUNKNOWN_RELEASE( void* p, int hr );
  98|
  99|extern  void* StdPlus_End;
 100|
 101|char*  StdPlus_itoa( int value, char* string, int radix );
 102|char*  StdPlus_utoa( unsigned value, char* string, int radix );
 103|int    StdPlus_xtoi( char* hex );
 104|
 105|#ifdef  USES_SDVEX
 106|void  StdPlus_inputS( const char* msg, char* out, int out_size,
 107|  const char* def );
 108|int  StdPlus_inputX( const char* msg, int def );
 109|#endif
 110|
 111|/* 内部用 */
 112|void*  StdPlus_malloc_imp( int size, char* file, int line );
 113|void   StdPlus_free_imp( void* p, char* file, int line );
 114|void   StdPlus_onMalloc_imp( void* p, char* file, int line );
 115|void   StdPlus_onFree_imp( void* p, char* file, int line );
 116|void*  StdPlus_realloc_imp( void* p, int size, char* file, int line );
 117| 
 118|/*************************************************************************
 119|*  7. <<< [StdPlus_FreeChk] free のし忘れを追跡するツール >>> 
 120|*  8. <<< [StdPlus_FreeChkE] 記録(内部用) >>>
 121|*【補足】
 122|*・結果は ERRORS_FINISH_CHK の結果報告と一緒に報告されます。
 123|*・StdPlus_chkFree を呼び出しても報告します。
 124|*・malloc するたびに malloc したアドレスとそのソース位置をエラー表示するので、
 125|*  結果報告より分かる free をしていないアドレスから追跡できます。
 126|*・free していないデータ領域を malloc した瞬間に止めたいときは、
 127|*  結果報告で得られた id 番号を StdPlus_FreeChk_breakID に設定してください。
 128|**************************************************************************/
 129|#ifndef  ERRORS_CUT_DEBUT_TOOL
 130|#ifdef  STDPLUS_PRINT_NOT_FREE
 131|
 132|struct _StdPlus_FreeChkE {
 133|  int    id;
 134|  void*  adr;   /* NULL=構造体全体が無効 */
 135|  char*  file;
 136|  int    line;
 137|};
 138|
 139|struct _StdPlus_FreeChk {
 140|  int  count;
 141|  StdPlus_FreeChkE  rec[StdPlus_FreeChk_Depth];
 142|};
 143|
 144|StdPlus_FreeChk*  StdPlus_FreeChk_getGlobl(void);
 145|void  StdPlus_FreeChk_init( StdPlus_FreeChk* );
 146|
 147|/* 以下は内部用です */
 148|extern  StdPlus_FreeChk   StdPlus_FreeChk_globl;
 149|void  StdPlus_FreeChk_setMalloc( StdPlus_FreeChk*, void* adr, char* file, int line );
 150|void  StdPlus_FreeChk_setFree( StdPlus_FreeChk*, void* adr, char* file, int line );
 151|void  StdPlus_FreeChk_printNotFree( StdPlus_FreeChk* );
 152|
 153|#endif
 154|#endif
 155| 
 156|#ifdef __cplusplus
 157|}
 158|#endif
 159|
 160|/*-----------------------------------------------------------------*/
 161|/* 9. <<< Mapping Area ------------------------------------------ >>> */ 
 162|/*-----------------------------------------------------------------*/
 163|
 164|
 165| 
 166|/***********************************************************************
 167|*  10. <<< 省略形を本モジュールにリンクする >>> 
 168|************************************************************************/
 169|#ifdef  STDPLUS_USES_STDNAME
 170|  #define  _itoa    StdPlus_itoa
 171|  #define  _utoa    StdPlus_utoa
 172|  #define  _xtoi    StdPlus_xtoi
 173|#endif
 174|
 175| 
 176|/***********************************************************************
 177|*  11. <<< [malloc, free] malloc, free を本モジュールにリンクする >>> 
 178|*【補足】
 179|*・使用しているライブラリの関係で malloc free の回数が合わなくても
 180|*  正しいときは、その前後に以下のようなプリプロセッサを記述すると、
 181|*  malloc free のカウントしないようになります。
 182|*    s = _tempnam( defTmpDir, "x" );   // 内部で malloc している
 183|*    #ifdef  STDPLUS_USES_STDLIB
 184|*     #undef  free
 185|*    #endif
 186|*      free( p );  // 対応する malloc は無いが正しい
 187|*    #ifdef  STDPLUS_USES_STDLIB
 188|*     #define  free  StdPlus_free
 189|*    #endif
 190|************************************************************************/
 191|#ifdef  STDPLUS_USES_STDNAME
 192|
 193|#ifdef  STDPLUS_USES_STDLIB
 194|
 195|#define  malloc(x)  StdPlus_malloc(x)
 196|#define  free(x)    StdPlus_free(x)
 197|#define  realloc(x,y)    StdPlus_realloc(x,y)
 198|
 199|#else
 200|
 201|#define  malloc  need_StandardLib_or_STDPLUS_USES_STDLIB  /* エラー */
 202|#define  free    need_StandardLib_or_STDPLUS_USES_STDLIB  /* エラー */
 203|#define  realloc need_StandardLib_or_STDPLUS_USES_STDLIB  /* エラー */
 204|
 205|#endif
 206|
 207|#endif
 208|
 209| 
 210|/***********************************************************************
 211|*  12. <<< StdPlus_malloc, StdPlus_free >>> 
 212|************************************************************************/
 213|#ifdef  STDPLUS_PRINT_NOT_FREE
 214|  #define  StdPlus_malloc( size )  StdPlus_malloc_imp( size, __FILE__, __LINE__ )
 215|  #define  StdPlus_free( p )       StdPlus_free_imp( p, __FILE__, __LINE__ )
 216|  #define  StdPlus_realloc( p, size )  StdPlus_realloc_imp( p, size, __FILE__, __LINE__ )
 217|#endif
 218| 
 219|/***********************************************************************
 220|*  13. <<< [StdPlus_malloc2] malloc 拡張版(型指定版)>>> 
 221|*【引数】
 222|*  ・type;           確保する領域の型
 223|*  ・int  m;         type 型の要素数
 224|*  ・type*  返り値;  確保したメモリ領域の先頭アドレス
 225|************************************************************************/
 226|#define  StdPlus_malloc2( type, m ) \
 227|  (type*)malloc( sizeof(type) * (m) )
 228|
 229|
 230|
 231| 
 232|/***********************************************************************
 233|*  14. <<< [ON_CO_CREATE_INSTANCE] CoCreateInstance をしたときに呼び出す >>> 
 234|*【補足】
 235|*・デバッグ用です。以下のように使います。
 236|*  hr = CoCreateInstance( CLSID_InkTablets, NULL, CLSCTX_INPROC_SERVER,
 237|*                         IID_IInkTablets, (void**)&m_InkTablets );
 238|*  ON_CO_CREATE_INSTANCE( m_InkTablets, hr );
 239|************************************************************************/
 240|#define  ON_CO_CREATE_INSTANCE( p, hr ) \
 241|   StdPlus_onCoCreateInstance( p, hr, __FILE__, __LINE__ )
 242|
 243| 
 244|/***********************************************************************
 245|*  15. <<< [ON_IUNKNOWN_RELEASE] CoCreateInstance をしたときに呼び出す >>> 
 246|*【補足】
 247|*・デバッグ用です。以下のように使います。
 248|*  hr = m_InkTablets->Release();
 249|*  ON_IUNKNOWN_RELEASE( m_InkTablets, hr );
 250|*  m_InkTablets = NULL;
 251|************************************************************************/
 252|#define  ON_IUNKNOWN_RELEASE( p, hr ) \
 253|   StdPlus_onIUnknownRelease( p, hr, __FILE__, __LINE__ )
 254|
 255| 
 256|/***********************************************************************
 257|*  16. <<< [StdPlus_new] 初期化関数を用いて生成操作を行う >>> 
 258|*  17. <<< [StdPlus_delete] 後始末関数を用いて削除操作を行う >>>
 259|*【引数】
 260|*  ・Type;           型
 261|*  ・Type*  ptr;     オブジェクトのアドレスを格納するポインタ
 262|*  ・Type_init       初期化関数
 263|*  ・Type_finish     後始末関数
 264|*【補足】
 265|*・ヒープを使った生成操作と削除操作は、本マクロを使うことにより
 266|*  特に作成しなくてもよくなります。初期化関数内でメンバ変数とコンテナの
 267|*  初期化関数を呼び出し、後始末関数内でメンバ変数の後始末関数と、
 268|*  コンテナのリセット関数(ListX_toEmptyFinishFree 関数など)を呼び出します。
 269|*・メモリ領域を確保できなかった場合、エラーになります。
 270|*・StdPlus_chkFree 関数で呼出し回数をチェックすることができるようになります。
 271|*【例】
 272|*  Type_init( StdPlus_new( &ptr, Type ), param1, param2 );
 273|*  StdPlus_delete( ptr, Type_finish );
 274|************************************************************************/
 275|#define  StdPlus_new( pp, type ) \
 276|  ( *(pp) = (type*)malloc( sizeof(type) ) )
 277|
 278|#define  StdPlus_delete( ptr, _finish ) \
 279|  ( _finish( ptr ), free( ptr ) )
 280| 
 281|/***********************************************************************
 282|*  18. <<< [StdPlus_onMalloc] >>> 
 283|*  19. <<< [StdPlus_onFree] >>>
 284|************************************************************************/
 285|#define  StdPlus_onMalloc( p ) \
 286|  StdPlus_onMalloc_imp( p, __FILE__, __LINE__ )
 287|
 288|#define  StdPlus_onFree( p ) \
 289|  StdPlus_onFree_imp( p, __FILE__, __LINE__ )
 290| 
 291|/***********************************************************************
 292|*  20. <<< [StdPlus_End] ポインタの区切り >>> 
 293|*【補足】
 294|*・StdPlus_chkMalloc 関数で使われます。
 295|************************************************************************/
 296|#define  StdPlus_End  ((void*)StdPlus_chkMalloc)
 297|
 298|
 299| 
 300|/***********************************************************************
 301|*  21. <<< [StdPlus_FreeChk_getGlobl] グローバル変数の取得 >>> 
 302|************************************************************************/
 303|#define  StdPlus_FreeChk_getGlobl()   &StdPlus_FreeChk_globl
 304|
 305| 
 306|#endif /* __STDPLUS_H */ 
 307| 
 308|