#ifndef _DEBUG_H_
#define _DEBUG_H_
extern void yarrowPanic(const char *errStr);
#define ERROR_LOG_ENABLE 0
#define LOG_VIA_PRINTF 1
#if DEBUG || ERROR_LOG_ENABLE
#include <stdio.h>
#if !LOG_VIA_PRINTF
#include <string.h>
#include <Types.h>
#include <TextUtils.h>
#if defined(__cplusplus)
extern "C" {
#endif
extern void dblog0(char *str);
extern void dblog1(char *str, void * arg1);
extern void dblog2(char *str, void * arg1, void * arg2);
extern void dblog3(char *str, void * arg1, void * arg2, void * arg3);
extern void dblog4(char *str, void * arg1, void * arg2, void * arg3, void * arg4);
#if defined(__cplusplus)
}
#endif
#else
#define dblog0(str) printf(str)
#define dblog1(str, arg1) printf(str, arg1)
#define dblog2(str, arg1, arg2) printf(str, arg1, arg2)
#define dblog3(str, arg1, arg2, arg3) printf(str, arg1, arg2, arg3)
#define dblog4(str, arg1, arg2, arg3, arg4) printf(str, arg1, arg2, arg3, arg4)
#endif
#else
#define dblog0(str)
#define dblog1(str, arg1)
#define dblog2(str, arg1, arg2)
#define dblog3(str, arg1, arg2, arg3)
#define dblog4(str, arg1, arg2, arg3, arg4)
#endif
#if DEBUG
#define dprintf0(str) dblog0(str)
#define dprintf1(str, arg1) dblog1(str, (void *)arg1)
#define dprintf2(str, arg1, arg2) dblog2(str, (void *)arg1, (void *)arg2)
#define dprintf3(str, arg1, arg2, arg3) dblog3(str, (void *)arg1, (void *)arg2, (void *)arg3)
#define dprintf4(str, arg1, arg2, arg3, arg4) dblog4(str, (void *)arg1, (void *)arg2, (void *)arg3, (void *) arg4)
#define CASSERT(expression) \
((expression) ? (void)0 : \
(dprintf1 ("Assertion failed: " #expression \
", file " __FILE__ ", line %d.\n", __LINE__), \
yarrowPanic("Assertion Failure")))
#else
#define dprintf0(str)
#define dprintf1(str, arg1)
#define dprintf2(str, arg1, arg2)
#define dprintf3(str, arg1, arg2, arg3)
#define dprintf4(str, arg1, arg2, arg3, arg4)
#define CASSERT(expression)
#endif
#if ERROR_LOG_ENABLE
#define errorLog0(str) dblog0(str);
#define errorLog1(str, arg1) dblog1(str, (void *)arg1)
#define errorLog2(str, arg1, arg2) dblog2(str, (void *)arg1, (void *)arg2)
#define errorLog3(str, arg1, arg2, arg3) dblog3(str, (void *)arg1, (void *)arg2, (void *)arg3)
#define errorLog4(str, arg1, arg2, arg3, arg4) dblog4(str, (void *)arg1, (void *)arg2, (void *)arg3, (void *)arg4)
#else
#define errorLog0(str)
#define errorLog1(str, arg1)
#define errorLog2(str, arg1, arg2)
#define errorLog3(str, arg1, arg2, arg3)
#define errorLog4(str, arg1, arg2, arg3, arg4)
#endif
#endif