// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef _NULLPO_H_
#define _NULLPO_H_
#include "../common/cbasetypes.h"
#define NLP_MARK __FILE__, __LINE__, __func__
// enabled by default on debug builds
#if defined(DEBUG) && !defined(NULLPO_CHECK)
#define NULLPO_CHECK
#endif
/*----------------------------------------------------------------------------
* Macros
*----------------------------------------------------------------------------
*/
/*======================================
* Null�`�F�b�N �y�� ���o�͌� return
*�E�W�J�����if�Ƃ�return�����o��̂�
* ��s�P�̂Ŏg���Ă��������B
*�Enullpo_ret(x = func());
* �̂悤�Ȏg�p�@���z�肵�Ă��܂��B
*--------------------------------------
* nullpo_ret(t)
* �߂�l 0�Œ�
* [����]
* t �`�F�b�N�Ώ�
*--------------------------------------
* nullpo_retv(t)
* �߂�l �Ȃ�
* [����]
* t �`�F�b�N�Ώ�
*--------------------------------------
* nullpo_retr(ret, t)
* �߂�l �w��
* [����]
* ret return(ret);
* t �`�F�b�N�Ώ�
*--------------------------------------
* nullpo_ret_f(t, fmt, ...)
* �ڍ��o�͗p
* �߂�l 0
* [����]
* t �`�F�b�N�Ώ�
* fmt ... vprintf�ɓn�����
* ���l��W�ϐ��̏����o���Ȃǂ�
*--------------------------------------
* nullpo_retv_f(t, fmt, ...)
* �ڍ��o�͗p
* �߂�l �Ȃ�
* [����]
* t �`�F�b�N�Ώ�
* fmt ... vprintf�ɓn�����
* ���l��W�ϐ��̏����o���Ȃǂ�
*--------------------------------------
* nullpo_retr_f(ret, t, fmt, ...)
* �ڍ��o�͗p
* �߂�l �w��
* [����]
* ret return(ret);
* t �`�F�b�N�Ώ�
* fmt ... vprintf�ɓn�����
* ���l��W�ϐ��̏����o���Ȃǂ�
*--------------------------------------
*/
#if defined(NULLPO_CHECK)
#define nullpo_ret(t) \
if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
#define nullpo_retv(t) \
if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
#define nullpo_retr(ret, t) \
if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
#define nullpo_retb(t) \
if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
// �ψ����}�N���Ɋւ�������R���p�C��
#if __STDC_VERSION__ >= 199901L
/* C99�ɑΉ� */
#define nullpo_ret_f(t, fmt, ...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
#define nullpo_retv_f(t, fmt, ...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
#define nullpo_retr_f(ret, t, fmt, ...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
#define nullpo_retb_f(t, fmt, ...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
#elif __GNUC__ >= 2
/* GCC�p */
#define nullpo_ret_f(t, fmt, args...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
#define nullpo_retv_f(t, fmt, args...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
#define nullpo_retr_f(ret, t, fmt, args...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
#define nullpo_retb_f(t, fmt, args...) \
if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
#else
/* ���̑��̏ꍇ�E�E�E orz */
#endif
#else /* NULLPO_CHECK */
/* No Nullpo check */
// if((t)){;}
// �ǂ����@���v�����Ȃ������̂ŁE�E�E����̍�ł��B
// �ꉞ���[�j���O�͏o�Ȃ��͂�
#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)
// �ψ����}�N���Ɋւ�������R���p�C��
#if __STDC_VERSION__ >= 199901L
/* C99�ɑΉ� */
#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�p */
#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
/* ���̑��̏ꍇ�E�E�E orz */
#endif
#endif /* NULLPO_CHECK */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------
*/
/*======================================
* nullpo_chk
* Null�`�F�b�N �y�� ���o��
* [����]
* file __FILE__
* line __LINE__
* func __func__ (����)
* �����ɂ� NLP_MARK ���g���Ƃ悢
* target �`�F�b�N�Ώ�
* [�Ԃ�l]
* 0 OK
* 1 NULL
*--------------------------------------
*/
int nullpo_chk(const char *file, int line, const char *func, const void *target);
/*======================================
* nullpo_chk_f
* Null�`�F�b�N �y�� �ڍׂȏ��o��
* [����]
* file __FILE__
* line __LINE__
* func __func__ (����)
* �����ɂ� NLP_MARK ���g���Ƃ悢
* target �`�F�b�N�Ώ�
* fmt ... vprintf�ɓn�����
* ���l��W�ϐ��̏����o���Ȃǂ�
* [�Ԃ�l]
* 0 OK
* 1 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���o��
* [����]
* file __FILE__
* line __LINE__
* func __func__ (����)
* �����ɂ� NLP_MARK ���g���Ƃ悢
*--------------------------------------
*/
void nullpo_info(const char *file, int line, const char *func);
/*======================================
* nullpo_info_f
* nullpo�ڍ��o��
* [����]
* file __FILE__
* line __LINE__
* func __func__ (����)
* �����ɂ� NLP_MARK ���g���Ƃ悢
* fmt ... vprintf�ɓn�����
* ���l��W�ϐ��̏����o���Ȃǂ�
*--------------------------------------
*/
void nullpo_info_f(const char *file, int line, const char *func,
const char *fmt, ...)
__attribute__((format(printf,4,5)));
#endif /* _NULLPO_H_ */