/*****************************************************************************

NAME:
   debug.h -- prototypes and definitions for debug.c

******************************************************************************/

#ifndef _DEBUG_H
#define _DEBUG_H

/* define FILE type */
#include <stdio.h>
/* define other types */
#include "bftypes.h"

#define	DEBUG_NONE	0

#define	MASK_BIT(uc)	( 1 << (uc - 'A'))

#define BIT_NAMES	"abcdghilmrstuwyz"
#define BIT_ALGORITHM	MASK_BIT('A')
#define BIT_READER	MASK_BIT('B')
#define BIT_CONFIG	MASK_BIT('C')
#define BIT_DATABASE	MASK_BIT('D')
#define BIT_GENERAL	MASK_BIT('G')
#define BIT_HTML	MASK_BIT('H')
#define BIT_ICONV	MASK_BIT('I')
#define BIT_LEXER	MASK_BIT('L')
#define BIT_MIME	MASK_BIT('M')
#define BIT_MULTI	MASK_BIT('U')
#define BIT_REGISTER	MASK_BIT('R')
#define BIT_SPAMICITY	MASK_BIT('S')
#define BIT_TEXT	MASK_BIT('T')
#define BIT_WORDLIST	MASK_BIT('W')
#define BIT_MEMORY	MASK_BIT('Y')
#define BIT_TEST	MASK_BIT('Z')

extern FILE	 *dbgout;
extern u_int32_t  debug_mask;

#ifdef	NODEBUG
#define	DEBUG_GENERAL(level)	0
#define DEBUG_CONFIG(level)	0
#define DEBUG_DATABASE(level)	0
#define DEBUG_ALGORITHM(level)	0
#define DEBUG_HTML(level)	0
#define DEBUG_ICONV(level)	0
#define DEBUG_LEXER(level)	0
#define DEBUG_MEMORY(level)	0
#define DEBUG_MIME(level)	0
#define DEBUG_MULTI(level)	0
#define DEBUG_READER(level)	0
#define DEBUG_REGISTER(level)	0
#define DEBUG_SPAMICITY(level)	0
#define DEBUG_TEXT(level)	0
#define DEBUG_WORDLIST(level)	0
#define DEBUG_TEST(level)	0
#else
#define	DEBUG_GENERAL(level)	((debug_mask & BIT_GENERAL)   && (verbose > level))
#define DEBUG_CONFIG(level)	((debug_mask & BIT_CONFIG)    && (verbose > level))
#define DEBUG_DATABASE(level)	((debug_mask & BIT_DATABASE)  && (verbose > level))
#define DEBUG_ALGORITHM(level)	((debug_mask & BIT_ALGORITHM) && (verbose > level))
#define DEBUG_HTML(level)	((debug_mask & BIT_HTML)      && (verbose > level))
#define DEBUG_ICONV(level)	((debug_mask & BIT_ICONV)     && (verbose > level))
#define DEBUG_LEXER(level)	((debug_mask & BIT_LEXER)     && (verbose > level))
#define DEBUG_MEMORY(level)	((debug_mask & BIT_MEMORY)    && (verbose > level))
#define DEBUG_MIME(level)	((debug_mask & BIT_MIME)      && (verbose > level))
#define DEBUG_MULTI(level)	((debug_mask & BIT_MULTI)     && (verbose > level))
#define DEBUG_READER(level)	((debug_mask & BIT_READER)    && (verbose > level))
#define DEBUG_REGISTER(level)	((debug_mask & BIT_REGISTER)  && (verbose > level))
#define DEBUG_SPAMICITY(level)	((debug_mask & BIT_SPAMICITY) && (verbose > level))
#define DEBUG_TEXT(level)	((debug_mask & BIT_TEXT)      && (verbose > level))
#define DEBUG_WORDLIST(level)	((debug_mask & BIT_WORDLIST)  && (verbose > level))
#define DEBUG_TEST(level)	((debug_mask & BIT_TEST)      && (verbose > level))
#endif

#define	BOGOTEST(uc)		((bogotest & MASK_BIT(uc)) != 0)

void set_debug_mask(const char *mask);
void set_bogotest(const char *mask);

#endif
