|
@@ -14,212 +14,198 @@
|
|
#define NULLPO_CHECK
|
|
#define NULLPO_CHECK
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-/*----------------------------------------------------------------------------
|
|
|
|
- * Macros
|
|
|
|
- *----------------------------------------------------------------------------
|
|
|
|
- */
|
|
|
|
-/*======================================
|
|
|
|
- * Nullチェック 及び 情報出力後 return
|
|
|
|
- *・展開するとifとかreturn等が出るので
|
|
|
|
- * 一行単体で使ってください。
|
|
|
|
- *・nullpo_ret(x = func());
|
|
|
|
- * のような使用法も想定しています。
|
|
|
|
- *--------------------------------------
|
|
|
|
- * nullpo_ret(t)
|
|
|
|
- * 戻り値 0固定
|
|
|
|
- * [引数]
|
|
|
|
- * t チェック対象
|
|
|
|
- *--------------------------------------
|
|
|
|
- * nullpo_retv(t)
|
|
|
|
- * 戻り値 なし
|
|
|
|
- * [引数]
|
|
|
|
- * t チェック対象
|
|
|
|
- *--------------------------------------
|
|
|
|
- * nullpo_retr(ret, t)
|
|
|
|
- * 戻り値 指定
|
|
|
|
- * [引数]
|
|
|
|
- * ret return(ret);
|
|
|
|
- * t チェック対象
|
|
|
|
- *--------------------------------------
|
|
|
|
- * nullpo_ret_f(t, fmt, ...)
|
|
|
|
- * 詳細情報出力用
|
|
|
|
- * 戻り値 0
|
|
|
|
- * [引数]
|
|
|
|
- * t チェック対象
|
|
|
|
- * fmt ... vprintfに渡される
|
|
|
|
- * 備考や関係変数の書き出しなどに
|
|
|
|
- *--------------------------------------
|
|
|
|
- * nullpo_retv_f(t, fmt, ...)
|
|
|
|
- * 詳細情報出力用
|
|
|
|
- * 戻り値 なし
|
|
|
|
- * [引数]
|
|
|
|
- * t チェック対象
|
|
|
|
- * fmt ... vprintfに渡される
|
|
|
|
- * 備考や関係変数の書き出しなどに
|
|
|
|
- *--------------------------------------
|
|
|
|
- * nullpo_retr_f(ret, t, fmt, ...)
|
|
|
|
- * 詳細情報出力用
|
|
|
|
- * 戻り値 指定
|
|
|
|
- * [引数]
|
|
|
|
- * ret return(ret);
|
|
|
|
- * t チェック対象
|
|
|
|
- * fmt ... vprintfに渡される
|
|
|
|
- * 備考や関係変数の書き出しなどに
|
|
|
|
- *--------------------------------------
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
#if defined(NULLPO_CHECK)
|
|
#if defined(NULLPO_CHECK)
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Macros used to check for NULL pointer and output that information.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Return 0 if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @return 0 if t is NULL
|
|
|
|
+ */
|
|
#define nullpo_ret(t) \
|
|
#define nullpo_ret(t) \
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Return void if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @return void if t is NULL
|
|
|
|
+ */
|
|
#define nullpo_retv(t) \
|
|
#define nullpo_retv(t) \
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Return the given value if pointer is not found.
|
|
|
|
+ * @param ret: Value to return
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @return ret value
|
|
|
|
+ */
|
|
#define nullpo_retr(ret, t) \
|
|
#define nullpo_retr(ret, t) \
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Break out of the loop/switch if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ */
|
|
#define nullpo_retb(t) \
|
|
#define nullpo_retb(t) \
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
|
|
if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
|
|
|
|
|
|
-// 可変引数マクロに関する条件コンパイル
|
|
|
|
-#if __STDC_VERSION__ >= 199901L
|
|
|
|
-/* C99に対応 */
|
|
|
|
|
|
+// Different C compilers uses different argument formats
|
|
|
|
+#if __STDC_VERSION__ >= 199901L || defined(_MSC_VER)
|
|
|
|
+/* C99 standard */
|
|
|
|
+/**
|
|
|
|
+ * Return 0 and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ * @return 0 if t is NULL
|
|
|
|
+ */
|
|
#define nullpo_ret_f(t, fmt, ...) \
|
|
#define nullpo_ret_f(t, fmt, ...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Return void and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ * @return void if t is NULL
|
|
|
|
+ */
|
|
#define nullpo_retv_f(t, fmt, ...) \
|
|
#define nullpo_retv_f(t, fmt, ...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Return the given value and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ * @return ret value
|
|
|
|
+ */
|
|
#define nullpo_retr_f(ret, t, fmt, ...) \
|
|
#define nullpo_retr_f(ret, t, fmt, ...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Break out of the loop/switch and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ */
|
|
#define nullpo_retb_f(t, fmt, ...) \
|
|
#define nullpo_retb_f(t, fmt, ...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
|
|
|
|
|
|
#elif __GNUC__ >= 2
|
|
#elif __GNUC__ >= 2
|
|
-/* GCC用 */
|
|
|
|
|
|
+/* For GCC */
|
|
|
|
+/**
|
|
|
|
+ * Return 0 and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ * @return 0 if t is NULL
|
|
|
|
+ */
|
|
#define nullpo_ret_f(t, fmt, args...) \
|
|
#define nullpo_ret_f(t, fmt, args...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Return void and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ * @return void if t is NULL
|
|
|
|
+ */
|
|
#define nullpo_retv_f(t, fmt, args...) \
|
|
#define nullpo_retv_f(t, fmt, args...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Return the given value and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ * @return ret value
|
|
|
|
+ */
|
|
#define nullpo_retr_f(ret, t, fmt, args...) \
|
|
#define nullpo_retr_f(ret, t, fmt, args...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Break out of the loop/switch and display additional information if pointer is not found.
|
|
|
|
+ * @param t: Pointer to check
|
|
|
|
+ * @param fmt: Pass to vprintf, Format and arguments such as description
|
|
|
|
+ */
|
|
#define nullpo_retb_f(t, fmt, args...) \
|
|
#define nullpo_retb_f(t, fmt, args...) \
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
|
|
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
|
|
|
|
|
|
#else
|
|
#else
|
|
-
|
|
|
|
-/* その他の場合・・・ orz */
|
|
|
|
-
|
|
|
|
|
|
+/* Otherwise... */
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#else /* NULLPO_CHECK */
|
|
#else /* NULLPO_CHECK */
|
|
|
|
+
|
|
/* No Nullpo check */
|
|
/* No Nullpo check */
|
|
|
|
|
|
// if((t)){;}
|
|
// if((t)){;}
|
|
-// 良い方法が思いつかなかったので・・・苦肉の策です。
|
|
|
|
-// 一応ワーニングは出ないはず
|
|
|
|
|
|
+// Do nothing if Nullpo check is disabled
|
|
|
|
|
|
#define nullpo_ret(t) (void)(t)
|
|
#define nullpo_ret(t) (void)(t)
|
|
#define nullpo_retv(t) (void)(t)
|
|
#define nullpo_retv(t) (void)(t)
|
|
#define nullpo_retr(ret, t) (void)(t)
|
|
#define nullpo_retr(ret, t) (void)(t)
|
|
#define nullpo_retb(t) (void)(t)
|
|
#define nullpo_retb(t) (void)(t)
|
|
|
|
|
|
-// 可変引数マクロに関する条件コンパイル
|
|
|
|
-#if __STDC_VERSION__ >= 199901L
|
|
|
|
-/* C99に対応 */
|
|
|
|
|
|
+// Different C compilers uses different argument formats
|
|
|
|
+#if __STDC_VERSION__ >= 199901L || defined(_MSC_VER)
|
|
|
|
+/* C99 standard */
|
|
#define nullpo_ret_f(t, fmt, ...) (void)(t)
|
|
#define nullpo_ret_f(t, fmt, ...) (void)(t)
|
|
#define nullpo_retv_f(t, fmt, ...) (void)(t)
|
|
#define nullpo_retv_f(t, fmt, ...) (void)(t)
|
|
#define nullpo_retr_f(ret, t, fmt, ...) (void)(t)
|
|
#define nullpo_retr_f(ret, t, fmt, ...) (void)(t)
|
|
#define nullpo_retb_f(t, fmt, ...) (void)(t)
|
|
#define nullpo_retb_f(t, fmt, ...) (void)(t)
|
|
|
|
|
|
#elif __GNUC__ >= 2
|
|
#elif __GNUC__ >= 2
|
|
-/* GCC用 */
|
|
|
|
|
|
+/* For GCC */
|
|
#define nullpo_ret_f(t, fmt, args...) (void)(t)
|
|
#define nullpo_ret_f(t, fmt, args...) (void)(t)
|
|
#define nullpo_retv_f(t, fmt, args...) (void)(t)
|
|
#define nullpo_retv_f(t, fmt, args...) (void)(t)
|
|
#define nullpo_retr_f(ret, t, fmt, args...) (void)(t)
|
|
#define nullpo_retr_f(ret, t, fmt, args...) (void)(t)
|
|
#define nullpo_retb_f(t, fmt, args...) (void)(t)
|
|
#define nullpo_retb_f(t, fmt, args...) (void)(t)
|
|
|
|
|
|
#else
|
|
#else
|
|
-/* その他の場合・・・ orz */
|
|
|
|
|
|
+/* Otherwise... orz */
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#endif /* NULLPO_CHECK */
|
|
#endif /* NULLPO_CHECK */
|
|
|
|
|
|
-/*----------------------------------------------------------------------------
|
|
|
|
- * Functions
|
|
|
|
- *----------------------------------------------------------------------------
|
|
|
|
- */
|
|
|
|
-/*======================================
|
|
|
|
- * nullpo_chk
|
|
|
|
- * Nullチェック 及び 情報出力
|
|
|
|
- * [引数]
|
|
|
|
- * file __FILE__
|
|
|
|
- * line __LINE__
|
|
|
|
- * func __func__ (関数名)
|
|
|
|
- * これらには NLP_MARK を使うとよい
|
|
|
|
- * target チェック対象
|
|
|
|
- * [返り値]
|
|
|
|
- * 0 OK
|
|
|
|
- * 1 NULL
|
|
|
|
- *--------------------------------------
|
|
|
|
|
|
+/**
|
|
|
|
+ * Check for NULL pointer and output information.
|
|
|
|
+ * @param file: __FILE__
|
|
|
|
+ * @param line: __LINE__
|
|
|
|
+ * @param func: __func__ (name of the function) [NLP_MARK]
|
|
|
|
+ * @param target: Target to check
|
|
|
|
+ * @return 0 on success or 1 on NULL
|
|
*/
|
|
*/
|
|
int nullpo_chk(const char *file, int line, const char *func, const void *target);
|
|
int nullpo_chk(const char *file, int line, const char *func, const void *target);
|
|
|
|
|
|
-
|
|
|
|
-/*======================================
|
|
|
|
- * nullpo_chk_f
|
|
|
|
- * Nullチェック 及び 詳細な情報出力
|
|
|
|
- * [引数]
|
|
|
|
- * file __FILE__
|
|
|
|
- * line __LINE__
|
|
|
|
- * func __func__ (関数名)
|
|
|
|
- * これらには NLP_MARK を使うとよい
|
|
|
|
- * target チェック対象
|
|
|
|
- * fmt ... vprintfに渡される
|
|
|
|
- * 備考や関係変数の書き出しなどに
|
|
|
|
- * [返り値]
|
|
|
|
- * 0 OK
|
|
|
|
- * 1 NULL
|
|
|
|
- *--------------------------------------
|
|
|
|
|
|
+/**
|
|
|
|
+ * Check for NULL pointer and output detailed information.
|
|
|
|
+ * @param file: __FILE__
|
|
|
|
+ * @param line: __LINE__
|
|
|
|
+ * @param func: __func__ (name of the function) [NLP_MARK]
|
|
|
|
+ * @param target: Target to check
|
|
|
|
+ * @param fmt: Passed to vprintf
|
|
|
|
+ * @return 0 on success or 1 on NULL
|
|
*/
|
|
*/
|
|
int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
|
|
int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
|
|
const char *fmt, ...)
|
|
const char *fmt, ...)
|
|
__attribute__((format(printf,5,6)));
|
|
__attribute__((format(printf,5,6)));
|
|
|
|
|
|
-
|
|
|
|
-/*======================================
|
|
|
|
- * nullpo_info
|
|
|
|
- * nullpo情報出力
|
|
|
|
- * [引数]
|
|
|
|
- * file __FILE__
|
|
|
|
- * line __LINE__
|
|
|
|
- * func __func__ (関数名)
|
|
|
|
- * これらには NLP_MARK を使うとよい
|
|
|
|
- *--------------------------------------
|
|
|
|
|
|
+/**
|
|
|
|
+ * Display information of the code that cause this function to trigger.
|
|
|
|
+ * @param file: __FILE__
|
|
|
|
+ * @param line: __LINE__
|
|
|
|
+ * @param func: __func__ (name of the function) [NLP_MARK]
|
|
|
|
+ * @param target: Target to check
|
|
*/
|
|
*/
|
|
void nullpo_info(const char *file, int line, const char *func);
|
|
void nullpo_info(const char *file, int line, const char *func);
|
|
|
|
|
|
-
|
|
|
|
-/*======================================
|
|
|
|
- * nullpo_info_f
|
|
|
|
- * nullpo詳細情報出力
|
|
|
|
- * [引数]
|
|
|
|
- * file __FILE__
|
|
|
|
- * line __LINE__
|
|
|
|
- * func __func__ (関数名)
|
|
|
|
- * これらには NLP_MARK を使うとよい
|
|
|
|
- * fmt ... vprintfに渡される
|
|
|
|
- * 備考や関係変数の書き出しなどに
|
|
|
|
- *--------------------------------------
|
|
|
|
|
|
+/**
|
|
|
|
+ * Check for NULL pointer and output detailed information.
|
|
|
|
+ * @param file: __FILE__
|
|
|
|
+ * @param line: __LINE__
|
|
|
|
+ * @param func: __func__ (name of the function) [NLP_MARK]
|
|
|
|
+ * @param target: Target to check
|
|
|
|
+ * @param fmt: Passed to vprintf
|
|
*/
|
|
*/
|
|
void nullpo_info_f(const char *file, int line, const char *func,
|
|
void nullpo_info_f(const char *file, int line, const char *func,
|
|
const char *fmt, ...)
|
|
const char *fmt, ...)
|
|
__attribute__((format(printf,4,5)));
|
|
__attribute__((format(printf,4,5)));
|
|
|
|
|
|
-
|
|
|
|
#endif /* _NULLPO_H_ */
|
|
#endif /* _NULLPO_H_ */
|