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|