/* 
 * $RCSfile: xk_debug.h,v $
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1993,1991,1990,1996  Arizona Board of Regents
 *
 * $Log: xk_debug.h,v $
 * Revision 1.3  1996/06/06 22:37:38  slm
 * Added definition for xIfTraceS for non-debug mode.
 *
 * Revision 1.2  1996/01/29  20:25:55  slm
 * Updated copyright and version.
 *
 * Revision 1.1  1995/07/28  21:29:10  slm
 * Initial revision
 *
 * Revision 1.31.1.1.1.1  1994/10/27  20:48:23  hkaram
 * New branch
 *
 * Revision 1.31.1.1  1994/03/21  16:44:28  menze
 * Size of errBuf is now a manifest constant
 *
 * Revision 1.31  1993/12/11  00:23:28  menze
 * fixed #endif comments
 *
 * Revision 1.30  1993/12/11  00:07:02  menze
 * Added traceendpoint and tracemaccommon for Irix
 */

#ifndef xk_debug_h
#define xk_debug_h

#include "platform.h"
#include "x_stdio.h"
#include "trace.h"

extern int tracebuserror,
	   tracecustom,
           traceendpoint,
  	   traceethdrv,
#ifdef XKMACHKERNEL
 	   tracelance,
#endif /* XKMACHKERNEL */
 	   traceether,
	   traceevent,
	   tracefixme,
	   traceidle,
  	   traceidmap,
	   traceie,
	   traceinit,  
           tracemaccommon,
	   tracememoryinit,
	   tracemsg,  
	   tracenetmask,
	   traceprocesscreation,
	   traceprocessswitch,
	   traceprotocol,
	   traceptbl,
  	   traceprottest,
	   tracetick,
	   tracetrap,
  	   tracelock,
  	   tracespl,
	   tracesessngc,
	   traceuser;

#define GLOBAL_ERRBUF_SIZE 250
extern char errBuf[GLOBAL_ERRBUF_SIZE];

#if ! defined(XK_DEBUG)
#define NDEBUG
#endif

#ifdef __STDC__

void xTraceLock(void);
void xTraceUnlock(void);
void xTraceInit(void);

#else

void xTraceLock();
void xTraceUnlock();
void xTraceInit();

#endif

#if defined(XK_DEBUG) || defined(lint)

#define PRETRACE(_l) { int __i=_l; xTraceLock(); while(__i--) putchar(' '); }
#define POSTTRACE { putchar('\n'); xTraceUnlock(); }

#ifdef __STDC__

/* Both PASTE and XPASTE are required for concatination to work correctly!! */
#define XPASTE(X,Y) X##Y
#define PASTE(X,Y) XPASTE(X,Y)

#define xIfTrace(_var, _lev) if (PASTE(trace,_var) >= _lev)

/*
 * Note: the do { ... } while (0)", without a `;', eliminates problems with
 * else statements following an if with only a trace statement and no braces.
 */
#define xTrace0(_var, _lev, _fmt)    \
do {                                 \
    if (PASTE(trace,_var) >= _lev) { \
	PRETRACE(_lev);              \
	printf(_fmt);                \
	POSTTRACE;                   \
    }                                \
} while (0)

#define xTrace1(_var, _lev, _fmt, _arg1) \
do {                                     \
    if (PASTE(trace,_var) >= _lev) {     \
	PRETRACE(_lev);                  \
	printf(_fmt, _arg1);             \
	POSTTRACE;                       \
    }                                    \
} while (0)

#define xTrace2(_var, _lev, _fmt, _arg1, _arg2) \
do {                                            \
    if (PASTE(trace,_var) >= _lev) {            \
	PRETRACE(_lev);                         \
	printf(_fmt, _arg1, _arg2);             \
	POSTTRACE;                              \
    }                                           \
} while (0)

#define xTrace3(_var, _lev, _fmt, _arg1, _arg2, _arg3) \
do {                                                   \
    if (PASTE(trace,_var) >= _lev) {                   \
	PRETRACE(_lev);                                \
	printf(_fmt, _arg1, _arg2, _arg3);             \
	POSTTRACE;                                     \
    }                                                  \
} while (0)

#define xTrace4(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4) \
do {                                                          \
    if (PASTE(trace,_var) >= _lev) {                          \
	PRETRACE(_lev);                                       \
	printf(_fmt, _arg1, _arg2, _arg3, _arg4);             \
	POSTTRACE;                                            \
    }                                                         \
} while (0)

#define xTrace5(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \
do {                                                                 \
    if (PASTE(trace,_var) >= _lev) {                                 \
	PRETRACE(_lev);                                              \
	printf(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5);             \
	POSTTRACE;                                                   \
    }                                                                \
} while (0)

#define xTrace6(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \
do {                                                                        \
    if (PASTE(trace,_var) >= _lev) {                                        \
	PRETRACE(_lev);                                                     \
	printf(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6);             \
	POSTTRACE;                                                          \
    }                                                                       \
} while (0)

#else

#define D___I(X) X

#define xIfTrace(_var, _lev) if (D___I(trace)_var >= _lev)

#define xTrace0(_var, _lev, _fmt)   \
do {                                \
    if (D___I(trace)_var >= _lev) { \
	PRETRACE(_lev);             \
	printf(_fmt);               \
	POSTTRACE;                  \
    }                               \
} while (0)

#define xTrace1(_var, _lev, _fmt, _arg1) \
do {                                     \
    if (D___I(trace)_var >= _lev) {      \
	PRETRACE(_lev);                  \
	printf(_fmt, _arg1);             \
	POSTTRACE;                       \
    }                                    \
} while (0)

#define xTrace2(_var, _lev, _fmt, _arg1, _arg2) \
do {                                            \
    if (D___I(trace)_var >= _lev) {             \
	PRETRACE(_lev);                         \
	printf(_fmt, _arg1, _arg2);             \
	POSTTRACE;                              \
    }                                           \
} while (0)

#define xTrace3(_var, _lev, _fmt, _arg1, _arg2, _arg3) \
do {                                                   \
    if (D___I(trace)_var >= _lev) {                    \
	PRETRACE(_lev);                                \
	printf(_fmt, _arg1, _arg2, _arg3);             \
	POSTTRACE;                                     \
    }                                                  \
} while (0)

#define xTrace4(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4) \
do {                                                          \
    if (D___I(trace)_var >= _lev) {                           \
	PRETRACE(_lev);                                       \
	printf(_fmt, _arg1, _arg2, _arg3, _arg4);             \
	POSTTRACE;                                            \
    }                                                         \
} while (0)

#define xTrace5(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \
do {                                                                 \
    if (D___I(trace)_var >= _lev) {                                  \
	PRETRACE(_lev);                                              \
	printf(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5);             \
	POSTTRACE;                                                   \
    }                                                                \
} while (0)

#define xTrace6(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \
do {                                                                        \
    if (D___I(trace)_var >= _lev) {                                         \
	PRETRACE(_lev);                                                     \
	printf(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6);             \
	POSTTRACE;                                                          \
    }                                                                       \
} while (0)

#endif /* __STDC__ */

#define xIfTraceP(_obj, _lev) if (*(_obj)->traceVar >= (_lev))

#define xTraceP0(_obj, _lev, _fmt)                             \
do {                                                           \
    xAssert((_obj)->traceVar);                                 \
    if (*(_obj)->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt)); \
    	PRETRACE(_lev);                                        \
	printf(errBuf);                                        \
	POSTTRACE;                                             \
    }                                                          \
} while (0)

#define xTraceP1(_obj, _lev, _fmt, _arg1)                      \
do {                                                           \
    xAssert((_obj)->traceVar);                                 \
    if (*(_obj)->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt)); \
    	PRETRACE(_lev);                                        \
	printf(errBuf, _arg1);                                 \
	POSTTRACE;                                             \
    }                                                          \
} while (0)

#define xTraceP2(_obj, _lev, _fmt, _arg1, _arg2)               \
do {                                                           \
    xAssert((_obj)->traceVar);                                 \
    if (*(_obj)->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt)); \
    	PRETRACE(_lev);                                        \
	printf(errBuf, _arg1, _arg2);                          \
	POSTTRACE;                                             \
    }                                                          \
} while (0)

#define xTraceP3(_obj, _lev, _fmt, _arg1, _arg2, _arg3)        \
do {                                                           \
    xAssert((_obj)->traceVar);                                 \
    if (*(_obj)->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt)); \
    	PRETRACE(_lev);                                        \
	printf(errBuf, _arg1, _arg2, _arg3);                   \
	POSTTRACE;                                             \
    }                                                          \
} while (0)

#define xTraceP4(_obj, _lev, _fmt, _arg1, _arg2, _arg3, _arg4) \
do {                                                           \
    xAssert((_obj)->traceVar);                                 \
    if (*(_obj)->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt)); \
    	PRETRACE(_lev);                                        \
	printf(errBuf, _arg1, _arg2, _arg3, _arg4);            \
	POSTTRACE;                                             \
    }                                                          \
} while (0)

#define xTraceP5(_obj, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \
do {                                                                  \
    xAssert((_obj)->traceVar);                                        \
    if (*(_obj)->traceVar >= (_lev)) {                                \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt));        \
    	PRETRACE(_lev);                                               \
	printf(errBuf, _arg1, _arg2, _arg3, _arg4, _arg5);            \
	POSTTRACE;                                                    \
    }                                                                 \
} while (0)

#define xTraceP6(_obj, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \
do {                                                                         \
    xAssert((_obj)->traceVar);                                               \
    if (*(_obj)->traceVar >= (_lev)) {                                       \
	sprintf(errBuf, "[%s]: %s", (_obj)->fullName, (_fmt));               \
    	PRETRACE(_lev);                                                      \
	printf(errBuf, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6);            \
	POSTTRACE;                                                           \
    }                                                                        \
} while (0)

#define xIfTraceS(_obj, _lev) if (*(_obj)->myprotl->traceVar >= (_lev))

#define xTraceS0(_obj, _lev, _fmt)                                      \
do {                                                                    \
    xAssert((_obj)->myprotl->traceVar);                                 \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt)); \
    	PRETRACE(_lev);                                                 \
	printf(errBuf);                                                 \
	POSTTRACE;                                                      \
    }                                                                   \
} while (0)

#define xTraceS1(_obj, _lev, _fmt, _arg1)                               \
do {                                                                    \
    xAssert((_obj)->myprotl->traceVar);                                 \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt)); \
    	PRETRACE(_lev);                                                 \
	printf(errBuf, _arg1);                                          \
	POSTTRACE;                                                      \
    }                                                                   \
} while (0)

#define xTraceS2(_obj, _lev, _fmt, _arg1, _arg2)                        \
do {                                                                    \
    xAssert((_obj)->myprotl->traceVar);                                 \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt)); \
    	PRETRACE(_lev);                                                 \
	printf(errBuf, _arg1, _arg2);                                   \
	POSTTRACE;                                                      \
    }                                                                   \
} while (0)

#define xTraceS3(_obj, _lev, _fmt, _arg1, _arg2, _arg3)                 \
do {                                                                    \
    xAssert((_obj)->myprotl->traceVar);                                 \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt)); \
    	PRETRACE(_lev);                                                 \
	printf(errBuf, _arg1, _arg2, _arg3);                            \
	POSTTRACE;                                                      \
    }                                                                   \
} while (0)

#define xTraceS4(_obj, _lev, _fmt, _arg1, _arg2, _arg3, _arg4)          \
do {                                                                    \
    xAssert((_obj)->myprotl->traceVar);                                 \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt)); \
    	PRETRACE(_lev);                                                 \
	printf(errBuf, _arg1, _arg2, _arg3, _arg4);                     \
	POSTTRACE;                                                      \
    }                                                                   \
} while (0)

#define xTraceS5(_obj, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5)   \
do {                                                                    \
    xAssert((_obj)->myprotl->traceVar);                                 \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                         \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt)); \
    	PRETRACE(_lev);                                                 \
	printf(errBuf, _arg1, _arg2, _arg3, _arg4, _arg5);              \
	POSTTRACE;                                                      \
    }                                                                   \
} while (0)

#define xTraceS6(_obj, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \
do {                                                                         \
    xAssert((_obj)->myprotl->traceVar);                                      \
    if (*(_obj)->myprotl->traceVar >= (_lev)) {                              \
	sprintf(errBuf, "[%s]: %s", (_obj)->myprotl->fullName, (_fmt));      \
    	PRETRACE(_lev);                                                      \
	printf(errBuf, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6);            \
	POSTTRACE;                                                           \
    }                                                                        \
} while (0)

#else

#define xIfTrace(_var, _lev) if (0)
#define xIfTraceP(_var, _lev) if (0)
#define xIfTraceS(_var, _lev) if (0)
#define xTrace0(_var, _lev, _fmt)
#define xTrace1(_var, _lev, _fmt, _arg1)
#define xTrace2(_var, _lev, _fmt, _arg1, _arg2)
#define xTrace3(_var, _lev, _fmt, _arg1, _arg2, _arg3)
#define xTrace4(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4)
#define xTrace5(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5)
#define xTrace6(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6)
#define xTraceP0(_var, _lev, _fmt)
#define xTraceP1(_var, _lev, _fmt, _arg1)
#define xTraceP2(_var, _lev, _fmt, _arg1, _arg2)
#define xTraceP3(_var, _lev, _fmt, _arg1, _arg2, _arg3)
#define xTraceP4(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4)
#define xTraceP5(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5)
#define xTraceP6(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6)
#define xTraceS0(_var, _lev, _fmt)
#define xTraceS1(_var, _lev, _fmt, _arg1)
#define xTraceS2(_var, _lev, _fmt, _arg1, _arg2)
#define xTraceS3(_var, _lev, _fmt, _arg1, _arg2, _arg3)
#define xTraceS4(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4)
#define xTraceS5(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5)
#define xTraceS6(_var, _lev, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6)

#endif	/* XK_DEBUG */

#ifdef __STDC__
extern void xError(char *);
#else
extern void xError();
#endif

#endif	/* xk_debug_h */
