// default_debug.h - a real-world example of some debugging stuff

#ifndef __default_debug_h__
#define __default_debug_h__

#ifdef DEBUG_ON
extern unsigned __defined_debug_mask__;
extern unsigned __active_debug_mask__;

#define DEBUG_ERROR -127

//------------------------------------------------------------
#define DEFINE_DEBUG_MASK(mask) \
{ \
  if (__defined_debug_mask__ & (mask)) \
  { \
    fprintf(stderr, \
            "Error: duplicate debug flag definition: 0x%x - ", \
            (mask)); \
    fprintf(stderr, \
            "mask was: 0x%x\n", __defined_debug_mask__); \
    exit(DEBUG_ERROR); \
  } \
  __defined_debug_mask__ |= (mask); \
}

//------------------------------------------------------------
#define UNDEFINE_DEBUG_MASK(mask) \
__defined_debug_mask__ &= ~(mask);

//------------------------------------------------------------
#define SET_ACTIVE_DEBUG_MASK(mask) \
{ \
  if (((mask) | __defined_debug_mask__) ^ \
      __defined_debug_mask__) \
  { \
    fprintf(stderr, \
            "Error: setting debug mask with undef flags: 0x%x - ", \
            (mask)); \
    fprintf(stderr, \
            "defined mask: 0x%x\n", __defined_debug_mask__); \
    exit(DEBUG_ERROR); \
  } \
  __active_debug_mask__ = (mask); \
}

//------------------------------------------------------------
#define ADD_ACTIVE_DEBUG_MASK(mask) \
{ \
  if (((mask) | __defined_debug_mask__) ^ \
      __defined_debug_mask__) \
  { \
    fprintf(stderr, \
            "Error: adding debug mask with undef flags: %x - ", \
            (mask)); \
    fprintf(stderr, \
            "defined mask: 0x%x\n", __defined_debug_mask__); \
    exit(DEBUG_ERROR); \
  } \
  __active_debug_mask__ |= (mask); \
}


//------------------------------------------------------------
#define REMOVE_ACTIVE_DEBUG_MASK(mask) \
__active_debug_mask__ &= ~(mask);

//------------------------------------------------------------
#define DEBUG(flag,output) \
{ \
  if (flag & __active_debug_mask__) \
  fprintf(stderr,"%s\n",output); \
}

#else
#define DEBUG(mask,output) ;
#define DEFINE_DEBUG_MASK(mask) ;
#define SET_ACTIVE_DEBUG_MASK(mask) ;
#define ADD_ACTIVE_DEBUG_MASK(mask) ;
#define REMOVE_ACTIVE_DEBUG_MASK(mask) ;
#endif // DEBUG_ON


#endif // __default_debug_h__

