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_printErrno(void);
  83|
  84|void*  StdPlus_malloc( int size );
  85|/* type*  StdPlus_malloc2( type, int m ); */
  86|void  StdPlus_free( void* p );
  87|/* type*  StdPlus_new( type*, type_name ); */
  88|/* void  StdPlus_delete( type*, type_finish ); */
  89|int   StdPlus_chkMalloc( void* p1, ... );
  90|void  StdPlus_chkFree(void);
  91|
  92|extern  void* StdPlus_End;
  93|
  94|char*  StdPlus_itoa( int value, char* string, int radix );
  95|char*  StdPlus_utoa( unsigned value, char* string, int radix );
  96|int    StdPlus_xtoi( char* hex );
  97|
  98|#ifdef  USES_SDVEX
  99|void  StdPlus_inputS( const char* msg, char* out, int out_size,
 100|  const char* def );
 101|int  StdPlus_inputX( const char* msg, int def );
 102|#endif
 103|
 104|/* 内部用 */
 105|void*  StdPlus_malloc_imp( int size, char* file, int line );
 106|void   StdPlus_free_imp( void* p, char* file, int line );
 107| 
 108|/*************************************************************************
 109|*  7. <<< [StdPlus_FreeChk] free のし忘れを追跡するツール >>> 
 110|*  8. <<< [StdPlus_FreeChkE] 記録(内部用) >>>
 111|*【補足】
 112|*・結果は ERRORS_FINISH_CHK の結果報告と一緒に報告されます。
 113|*・StdPlus_chkFree を呼び出しても報告します。
 114|*・malloc するたびに malloc したアドレスとそのソース位置をエラー表示するので、
 115|*  結果報告より分かる free をしていないアドレスから追跡できます。
 116|*・free していないデータ領域を malloc した瞬間に止めたいときは、
 117|*  結果報告で得られた id 番号を StdPlus_FreeChk_breakID に設定してください。
 118|**************************************************************************/
 119|#ifndef  ERRORS_CUT_DEBUT_TOOL
 120|#ifdef  STDPLUS_PRINT_NOT_FREE
 121|
 122|struct _StdPlus_FreeChkE {
 123|  int    id;
 124|  void*  adr;   /* NULL=構造体全体が無効 */
 125|  char*  file;
 126|  int    line;
 127|};
 128|
 129|struct _StdPlus_FreeChk {
 130|  int  count;
 131|  StdPlus_FreeChkE  rec[StdPlus_FreeChk_Depth];
 132|};
 133|
 134|StdPlus_FreeChk*  StdPlus_FreeChk_getGlobl(void);
 135|void  StdPlus_FreeChk_init( StdPlus_FreeChk* );
 136|
 137|/* 以下は内部用です */
 138|extern  StdPlus_FreeChk   StdPlus_FreeChk_globl;
 139|void  StdPlus_FreeChk_setMalloc( StdPlus_FreeChk*, void* adr, char* file, int line );
 140|void  StdPlus_FreeChk_setFree( StdPlus_FreeChk*, void* adr, char* file, int line );
 141|void  StdPlus_FreeChk_printNotFree( StdPlus_FreeChk* );
 142|
 143|#endif
 144|#endif
 145| 
 146|#ifdef __cplusplus
 147|}
 148|#endif
 149|
 150|/*-----------------------------------------------------------------*/
 151|/* 9. <<< Mapping Area ------------------------------------------ >>> */ 
 152|/*-----------------------------------------------------------------*/
 153|
 154|
 155| 
 156|/***********************************************************************
 157|*  10. <<< 省略形を本モジュールにリンクする >>> 
 158|************************************************************************/
 159|#ifdef  STDPLUS_USES_STDNAME
 160|  #define  _itoa    StdPlus_itoa
 161|  #define  _utoa    StdPlus_utoa
 162|  #define  _xtoi    StdPlus_xtoi
 163|#endif
 164|
 165| 
 166|/***********************************************************************
 167|*  11. <<< [malloc, free] malloc, free を本モジュールにリンクする >>> 
 168|*【補足】
 169|*・使用しているライブラリの関係で malloc free の回数が合わなくても
 170|*  正しいときは、その前後に以下のようなプリプロセッサを記述すると、
 171|*  malloc free のカウントしないようになります。
 172|*    s = _tempnam( defTmpDir, "x" );   // 内部で malloc している
 173|*    #ifdef  STDPLUS_USES_STDLIB
 174|*     #undef  free
 175|*    #endif
 176|*      free( p );  // 対応する malloc は無いが正しい
 177|*    #ifdef  STDPLUS_USES_STDLIB
 178|*     #define  free  StdPlus_free
 179|*    #endif
 180|************************************************************************/
 181|#ifdef  STDPLUS_USES_STDNAME
 182|
 183|#ifdef  STDPLUS_USES_STDLIB
 184|
 185|#define  malloc(x)  StdPlus_malloc(x)
 186|#define  free(x)    StdPlus_free(x)
 187|
 188|#else
 189|
 190|#define  malloc  need_StandardLib_or_STDPLUS_USES_STDLIB  /* エラー */
 191|#define  free    need_StandardLib_or_STDPLUS_USES_STDLIB  /* エラー */
 192|
 193|#endif
 194|
 195|#endif
 196|
 197| 
 198|/***********************************************************************
 199|*  12. <<< StdPlus_malloc, StdPlus_free >>> 
 200|************************************************************************/
 201|#ifdef  STDPLUS_PRINT_NOT_FREE
 202|  #define  StdPlus_malloc( size )  StdPlus_malloc_imp( size, __FILE__, __LINE__ )
 203|  #define  StdPlus_free( p )       StdPlus_free_imp( p, __FILE__, __LINE__ )
 204|#endif
 205| 
 206|/***********************************************************************
 207|*  13. <<< [StdPlus_malloc2] malloc 拡張版(型指定版)>>> 
 208|*【引数】
 209|*  ・type;           確保する領域の型
 210|*  ・int  m;         type 型の要素数
 211|*  ・type*  返り値;  確保したメモリ領域の先頭アドレス
 212|************************************************************************/
 213|#define  StdPlus_malloc2( type, m ) \
 214|  (type*)malloc( sizeof(type) * (m) )
 215|
 216|
 217|
 218| 
 219|/***********************************************************************
 220|*  14. <<< [StdPlus_new] 初期化関数を用いて生成操作を行う >>> 
 221|*  15. <<< [StdPlus_delete] 後始末関数を用いて削除操作を行う >>>
 222|*【引数】
 223|*  ・Type;           型
 224|*  ・Type*  ptr;     オブジェクトのアドレスを格納するポインタ
 225|*  ・Type_init       初期化関数
 226|*  ・Type_finish     後始末関数
 227|*【補足】
 228|*・ヒープを使った生成操作と削除操作は、本マクロを使うことにより
 229|*  特に作成しなくてもよくなります。初期化関数内でメンバ変数とコンテナの
 230|*  初期化関数を呼び出し、後始末関数内でメンバ変数の後始末関数と、
 231|*  コンテナのリセット関数(ListX_toEmptyFinishFree 関数など)を呼び出します。
 232|*・メモリ領域を確保できなかった場合、エラーになります。
 233|*・StdPlus_chkFree 関数で呼出し回数をチェックすることができるようになります。
 234|*【例】
 235|*  Type_init( StdPlus_new( &ptr, Type ), param1, param2 );
 236|*  StdPlus_delete( ptr, Type_finish );
 237|************************************************************************/
 238|#define  StdPlus_new( pp, type ) \
 239|  ( *(pp) = (type*)malloc( sizeof(type) ) )
 240|
 241|#define  StdPlus_delete( ptr, _finish ) \
 242|  ( _finish( ptr ), free( ptr ) )
 243| 
 244|/***********************************************************************
 245|*  16. <<< [StdPlus_End] ポインタの区切り >>> 
 246|*【補足】
 247|*・StdPlus_chkMalloc 関数で使われます。
 248|************************************************************************/
 249|#define  StdPlus_End  ((void*)StdPlus_chkMalloc)
 250|
 251|
 252| 
 253|/***********************************************************************
 254|*  17. <<< [StdPlus_FreeChk_getGlobl] グローバル変数の取得 >>> 
 255|************************************************************************/
 256|#define  StdPlus_FreeChk_getGlobl()   &StdPlus_FreeChk_globl
 257|
 258| 
 259|#endif /* __STDPLUS_H */ 
 260| 
 261|