root/src/common/nullpo.h @ 6

Revision 1, 6.1 kB (checked in by jinshiro, 17 years ago)
Line 
1// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
2// For more information, see LICENCE in the main folder
3
4#ifndef _NULLPO_H_
5#define _NULLPO_H_
6
7
8#include "../common/cbasetypes.h"
9
10#define NLP_MARK __FILE__, __LINE__, __func__
11
12// enabled by default on debug builds
13#if defined(DEBUG) && !defined(NULLPO_CHECK)
14#define NULLPO_CHECK
15#endif
16
17/*----------------------------------------------------------------------------
18 * Macros
19 *----------------------------------------------------------------------------
20 */
21/*======================================
22 * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—ÍŒã return
23 *E“WŠJ‚·‚邯if‚Æ‚©return“™‚ªo‚é‚Ì‚Å
24 *  ˆês’P‘̂Ŏg‚Á‚Ä‚­‚Ÿ‚³‚¢B
25 *Enullpo_ret(x = func());
26 *  ‚̂悀‚ÈŽg—p–@‚à‘z’肵‚Ä‚¢‚Ü‚·B
27 *--------------------------------------
28 * nullpo_ret(t)
29 *   –ß‚è’l 0ŒÅ’è
30 * [ˆø”]
31 *  t       ƒ`ƒFƒbƒN‘ΏÛ
32 *--------------------------------------
33 * nullpo_retv(t)
34 *   –ß‚è’l ‚È‚µ
35 * [ˆø”]
36 *  t       ƒ`ƒFƒbƒN‘ΏÛ
37 *--------------------------------------
38 * nullpo_retr(ret, t)
39 *   –ß‚è’l Žw’è
40 * [ˆø”]
41 *  ret     return(ret);
42 *  t       ƒ`ƒFƒbƒN‘ΏÛ
43 *--------------------------------------
44 * nullpo_ret_f(t, fmt, ...)
45 *   Ú×î•ño—Í—p
46 *   –ß‚è’l 0
47 * [ˆø”]
48 *  t       ƒ`ƒFƒbƒN‘ΏÛ
49 *  fmt ... vprintf‚É“n‚³‚ê‚é
50 *    ”õl‚âŠÖŒW•ϐ”‚̏‘‚«o‚µ‚ȂǂÉ
51 *--------------------------------------
52 * nullpo_retv_f(t, fmt, ...)
53 *   Ú×î•ño—Í—p
54 *   –ß‚è’l ‚È‚µ
55 * [ˆø”]
56 *  t       ƒ`ƒFƒbƒN‘ΏÛ
57 *  fmt ... vprintf‚É“n‚³‚ê‚é
58 *    ”õl‚âŠÖŒW•ϐ”‚̏‘‚«o‚µ‚ȂǂÉ
59 *--------------------------------------
60 * nullpo_retr_f(ret, t, fmt, ...)
61 *   Ú×î•ño—Í—p
62 *   –ß‚è’l Žw’è
63 * [ˆø”]
64 *  ret     return(ret);
65 *  t       ƒ`ƒFƒbƒN‘ΏÛ
66 *  fmt ... vprintf‚É“n‚³‚ê‚é
67 *    ”õl‚âŠÖŒW•ϐ”‚̏‘‚«o‚µ‚ȂǂÉ
68 *--------------------------------------
69 */
70
71#if defined(NULLPO_CHECK)
72
73#define nullpo_ret(t) \
74        if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
75
76#define nullpo_retv(t) \
77        if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
78
79#define nullpo_retr(ret, t) \
80        if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
81
82#define nullpo_retb(t) \
83        if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
84
85// ‰Â•ψø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
86#if __STDC_VERSION__ >= 199901L
87/* C99‚ɑΉž */
88#define nullpo_ret_f(t, fmt, ...) \
89        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
90
91#define nullpo_retv_f(t, fmt, ...) \
92        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
93
94#define nullpo_retr_f(ret, t, fmt, ...) \
95        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
96
97#define nullpo_retb_f(t, fmt, ...) \
98        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
99
100#elif __GNUC__ >= 2
101/* GCC—p */
102#define nullpo_ret_f(t, fmt, args...) \
103        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
104
105#define nullpo_retv_f(t, fmt, args...) \
106        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
107
108#define nullpo_retr_f(ret, t, fmt, args...) \
109        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
110
111#define nullpo_retb_f(t, fmt, args...) \
112        if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
113
114#else
115
116/* ‚»‚Ì‘Œ‚̏ꍇEEE orz */
117
118#endif
119
120#else /* NULLPO_CHECK */
121/* No Nullpo check */
122
123// if((t)){;}
124// —Ç‚¢•û–@‚ªŽv‚¢‚‚©‚È‚©‚Á‚œ‚̂ŁEEE‹ê“÷‚̍ô‚Å‚·B
125// ˆê‰žƒ[ƒjƒ“ƒO‚͏o‚È‚¢‚Í‚ž
126
127#define nullpo_ret(t) (void)(t)
128#define nullpo_retv(t) (void)(t)
129#define nullpo_retr(ret, t) (void)(t)
130#define nullpo_retb(t) (void)(t)
131
132// ‰Â•ψø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
133#if __STDC_VERSION__ >= 199901L
134/* C99‚ɑΉž */
135#define nullpo_ret_f(t, fmt, ...) (void)(t)
136#define nullpo_retv_f(t, fmt, ...) (void)(t)
137#define nullpo_retr_f(ret, t, fmt, ...) (void)(t)
138#define nullpo_retb_f(t, fmt, ...) (void)(t)
139
140#elif __GNUC__ >= 2
141/* GCC—p */
142#define nullpo_ret_f(t, fmt, args...) (void)(t)
143#define nullpo_retv_f(t, fmt, args...) (void)(t)
144#define nullpo_retr_f(ret, t, fmt, args...) (void)(t)
145#define nullpo_retb_f(t, fmt, args...) (void)(t)
146
147#else
148/* ‚»‚Ì‘Œ‚̏ꍇEEE orz */
149#endif
150
151#endif /* NULLPO_CHECK */
152
153/*----------------------------------------------------------------------------
154 * Functions
155 *----------------------------------------------------------------------------
156 */
157/*======================================
158 * nullpo_chk
159 *   Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
160 * [ˆø”]
161 *  file    __FILE__
162 *  line    __LINE__
163 *  func    __func__ (ŠÖ”–Œ)
164 *    ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚€‚Ƃ悢
165 *  target  ƒ`ƒFƒbƒN‘ΏÛ
166 * [•Ô‚è’l]
167 *  0 OK
168 *  1 NULL
169 *--------------------------------------
170 */
171int nullpo_chk(const char *file, int line, const char *func, const void *target);
172
173
174/*======================================
175 * nullpo_chk_f
176 *   Nullƒ`ƒFƒbƒN ‹y‚Ñ Ú×‚ȏî•ño—Í
177 * [ˆø”]
178 *  file    __FILE__
179 *  line    __LINE__
180 *  func    __func__ (ŠÖ”–Œ)
181 *    ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚€‚Ƃ悢
182 *  target  ƒ`ƒFƒbƒN‘ΏÛ
183 *  fmt ... vprintf‚É“n‚³‚ê‚é
184 *    ”õl‚âŠÖŒW•ϐ”‚̏‘‚«o‚µ‚ȂǂÉ
185 * [•Ô‚è’l]
186 *  0 OK
187 *  1 NULL
188 *--------------------------------------
189 */
190int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
191                 const char *fmt, ...)
192                 __attribute__((format(printf,5,6)));
193
194
195/*======================================
196 * nullpo_info
197 *   nullpoî•ño—Í
198 * [ˆø”]
199 *  file    __FILE__
200 *  line    __LINE__
201 *  func    __func__ (ŠÖ”–Œ)
202 *    ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚€‚Ƃ悢
203 *--------------------------------------
204 */
205void nullpo_info(const char *file, int line, const char *func);
206
207
208/*======================================
209 * nullpo_info_f
210 *   nullpoÚ×î•ño—Í
211 * [ˆø”]
212 *  file    __FILE__
213 *  line    __LINE__
214 *  func    __func__ (ŠÖ”–Œ)
215 *    ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚€‚Ƃ悢
216 *  fmt ... vprintf‚É“n‚³‚ê‚é
217 *    ”õl‚âŠÖŒW•ϐ”‚̏‘‚«o‚µ‚ȂǂÉ
218 *--------------------------------------
219 */
220void nullpo_info_f(const char *file, int line, const char *func, 
221                   const char *fmt, ...)
222                   __attribute__((format(printf,4,5)));
223
224
225#endif /* _NULLPO_H_ */
Note: See TracBrowser for help on using the browser.