nullpo.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // Copyright (c) Athena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #ifndef _NULLPO_H_
  4. #define _NULLPO_H_
  5. #define NULLPO_CHECK 1
  6. // 全体のスイッチを宣言しているヘッダがあれば
  7. // そこに移動していただけると
  8. #ifndef __NETBSD__
  9. #if __STDC_VERSION__ < 199901L
  10. # if __GNUC__ >= 2
  11. # define __func__ __FUNCTION__
  12. # else
  13. # define __func__ ""
  14. # endif
  15. #endif
  16. #endif
  17. #ifdef _WIN32
  18. #define __attribute__(x) /* nothing */
  19. #endif
  20. #define NLP_MARK __FILE__, __LINE__, __func__
  21. /*----------------------------------------------------------------------------
  22. * Macros
  23. *----------------------------------------------------------------------------
  24. */
  25. /*======================================
  26. * Nullチェック 及び 情報出力後 return
  27. *・展開するとifとかreturn等が出るので
  28. * 一行単体で使ってください。
  29. *・nullpo_ret(x = func());
  30. * のような使用法も想定しています。
  31. *--------------------------------------
  32. * nullpo_ret(t)
  33. * 戻り値 0固定
  34. * [引数]
  35. * t チェック対象
  36. *--------------------------------------
  37. * nullpo_retv(t)
  38. * 戻り値 なし
  39. * [引数]
  40. * t チェック対象
  41. *--------------------------------------
  42. * nullpo_retr(ret, t)
  43. * 戻り値 指定
  44. * [引数]
  45. * ret return(ret);
  46. * t チェック対象
  47. *--------------------------------------
  48. * nullpo_ret_f(t, fmt, ...)
  49. * 詳細情報出力用
  50. * 戻り値 0
  51. * [引数]
  52. * t チェック対象
  53. * fmt ... vprintfに渡される
  54. * 備考や関係変数の書き出しなどに
  55. *--------------------------------------
  56. * nullpo_retv_f(t, fmt, ...)
  57. * 詳細情報出力用
  58. * 戻り値 なし
  59. * [引数]
  60. * t チェック対象
  61. * fmt ... vprintfに渡される
  62. * 備考や関係変数の書き出しなどに
  63. *--------------------------------------
  64. * nullpo_retr_f(ret, t, fmt, ...)
  65. * 詳細情報出力用
  66. * 戻り値 指定
  67. * [引数]
  68. * ret return(ret);
  69. * t チェック対象
  70. * fmt ... vprintfに渡される
  71. * 備考や関係変数の書き出しなどに
  72. *--------------------------------------
  73. */
  74. #if NULLPO_CHECK
  75. #define nullpo_ret(t) \
  76. if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
  77. #define nullpo_retv(t) \
  78. if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
  79. #define nullpo_retr(ret, t) \
  80. if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
  81. #define nullpo_retb(t) \
  82. if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
  83. // 可変引数マクロに関する条件コンパイル
  84. #if __STDC_VERSION__ >= 199901L
  85. /* C99に対応 */
  86. #define nullpo_ret_f(t, fmt, ...) \
  87. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
  88. #define nullpo_retv_f(t, fmt, ...) \
  89. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
  90. #define nullpo_retr_f(ret, t, fmt, ...) \
  91. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
  92. #define nullpo_retb_f(t, fmt, ...) \
  93. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
  94. #elif __GNUC__ >= 2
  95. /* GCC用 */
  96. #define nullpo_ret_f(t, fmt, args...) \
  97. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
  98. #define nullpo_retv_f(t, fmt, args...) \
  99. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
  100. #define nullpo_retr_f(ret, t, fmt, args...) \
  101. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
  102. #define nullpo_retb_f(t, fmt, args...) \
  103. if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
  104. #else
  105. /* その他の場合・・・ orz */
  106. #endif
  107. #else /* NULLPO_CHECK */
  108. /* No Nullpo check */
  109. // if((t)){;}
  110. // 良い方法が思いつかなかったので・・・苦肉の策です。
  111. // 一応ワーニングは出ないはず
  112. #define nullpo_ret(t) if((t)){;}
  113. #define nullpo_retv(t) if((t)){;}
  114. #define nullpo_retr(ret, t) if((t)){;}
  115. #define nullpo_retb(t) if((t)){;}
  116. // 可変引数マクロに関する条件コンパイル
  117. #if __STDC_VERSION__ >= 199901L
  118. /* C99に対応 */
  119. #define nullpo_ret_f(t, fmt, ...) if((t)){;}
  120. #define nullpo_retv_f(t, fmt, ...) if((t)){;}
  121. #define nullpo_retr_f(ret, t, fmt, ...) if((t)){;}
  122. #define nullpo_retb_f(t, fmt, ...) if((t)){;}
  123. #elif __GNUC__ >= 2
  124. /* GCC用 */
  125. #define nullpo_ret_f(t, fmt, args...) if((t)){;}
  126. #define nullpo_retv_f(t, fmt, args...) if((t)){;}
  127. #define nullpo_retr_f(ret, t, fmt, args...) if((t)){;}
  128. #define nullpo_retb_f(t, fmt, args...) if((t)){;}
  129. #else
  130. /* その他の場合・・・ orz */
  131. #endif
  132. #endif /* NULLPO_CHECK */
  133. /*----------------------------------------------------------------------------
  134. * Functions
  135. *----------------------------------------------------------------------------
  136. */
  137. /*======================================
  138. * nullpo_chk
  139. * Nullチェック 及び 情報出力
  140. * [引数]
  141. * file __FILE__
  142. * line __LINE__
  143. * func __func__ (関数名)
  144. * これらには NLP_MARK を使うとよい
  145. * target チェック対象
  146. * [返り値]
  147. * 0 OK
  148. * 1 NULL
  149. *--------------------------------------
  150. */
  151. int nullpo_chk(const char *file, int line, const char *func, const void *target);
  152. /*======================================
  153. * nullpo_chk_f
  154. * Nullチェック 及び 詳細な情報出力
  155. * [引数]
  156. * file __FILE__
  157. * line __LINE__
  158. * func __func__ (関数名)
  159. * これらには NLP_MARK を使うとよい
  160. * target チェック対象
  161. * fmt ... vprintfに渡される
  162. * 備考や関係変数の書き出しなどに
  163. * [返り値]
  164. * 0 OK
  165. * 1 NULL
  166. *--------------------------------------
  167. */
  168. int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
  169. const char *fmt, ...)
  170. __attribute__((format(printf,5,6)));
  171. /*======================================
  172. * nullpo_info
  173. * nullpo情報出力
  174. * [引数]
  175. * file __FILE__
  176. * line __LINE__
  177. * func __func__ (関数名)
  178. * これらには NLP_MARK を使うとよい
  179. *--------------------------------------
  180. */
  181. void nullpo_info(const char *file, int line, const char *func);
  182. /*======================================
  183. * nullpo_info_f
  184. * nullpo詳細情報出力
  185. * [引数]
  186. * file __FILE__
  187. * line __LINE__
  188. * func __func__ (関数名)
  189. * これらには NLP_MARK を使うとよい
  190. * fmt ... vprintfに渡される
  191. * 備考や関係変数の書き出しなどに
  192. *--------------------------------------
  193. */
  194. void nullpo_info_f(const char *file, int line, const char *func,
  195. const char *fmt, ...)
  196. __attribute__((format(printf,4,5)));
  197. #endif /* _NULLPO_H_ */