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|