Skip to content

Commit

Permalink
Added English comments in nullpo.h (#1556)
Browse files Browse the repository at this point in the history
* Added English comments in nullpo.h
* Updated comment formatting
* Added _f functions for Visual Studio
  • Loading branch information
secretdataz authored and Lemongrass3110 committed Sep 23, 2016
1 parent 79b39e5 commit 90539f4
Showing 1 changed file with 110 additions and 124 deletions.
234 changes: 110 additions & 124 deletions src/common/nullpo.h
Expand Up @@ -14,212 +14,198 @@
#define NULLPO_CHECK
#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)

/**
* 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) \
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) \
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) \
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) \
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, ...) \
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, ...) \
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, ...) \
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, ...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}

#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...) \
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...) \
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...) \
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...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}

#else

/* その他の場合・・・ orz */

/* Otherwise... */
#endif

#else /* NULLPO_CHECK */

/* No Nullpo check */

// if((t)){;}
// 良い方法が思いつかなかったので・・・苦肉の策です。
// 一応ワーニングは出ないはず
// Do nothing if Nullpo check is disabled

#define nullpo_ret(t) (void)(t)
#define nullpo_retv(t) (void)(t)
#define nullpo_retr(ret, 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_retv_f(t, fmt, ...) (void)(t)
#define nullpo_retr_f(ret, t, fmt, ...) (void)(t)
#define nullpo_retb_f(t, fmt, ...) (void)(t)

#elif __GNUC__ >= 2
/* GCC用 */
/* For GCC */
#define nullpo_ret_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_retb_f(t, fmt, args...) (void)(t)

#else
/* その他の場合・・・ orz */
/* Otherwise... orz */
#endif

#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);


/*======================================
* 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,
const char *fmt, ...)
__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);


/*======================================
* 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,
const char *fmt, ...)
__attribute__((format(printf,4,5)));


#endif /* _NULLPO_H_ */

2 comments on commit 90539f4

@anacondaq

This comment was marked as abuse.

@secretdataz
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it check if pointer NULL or not?
Yes, it also outputs the line of code which call this macro, for example,

nullpo_retv(sd);

it is equivalent to

if (nullpo_chk(NLP_MARK, (void *)(sd))) {return;}

Please sign in to comment.