/*
 *	Assertion - use liberally for debugging. Defining NDEBUG
 *	turns assertions off.
 *	assert(exp) where exp is non-zero does nothing, while
 *	assert(exp) where exp evaluates to zero aborts the program
 *	with a message.
 *
 */


#ifdef __cplusplus
extern "C" {
#endif

#ifndef NDEBUG
#ifndef __mkstr__
#define __mkstr__(exp)  #exp
#endif

#ifdef __C30__

#include <stdio.h>
#include <stdlib.h>
#define assert(exp)     if(!(exp)) {fprintf(stderr, \
  "%s:%i %s -- assertion failed\n", \
  __FILE__, __LINE__, __mkstr__(exp)); \
  abort();}

#else

extern void     _fassert(int, const char *, const char *);
#define __assert(expression, file, line)  \
  _fassert(line,file,expression)
#define assert(expr)     \
  ((void)((expr) ? 0 : (__assert (#expr, __FILE__, __LINE__), 0)))

#endif /* C30 */

#else /* NDEBUG */
#define assert(exp) ((void)0)
#endif

#ifdef __cplusplus
}
#endif

