/* WARNING: THIS IS NOT THE ORIGINAL FILE               */
/*          ANY MODIFICATIONS TO THIS FILE WILL BE LOST */
/* WARNING: THIS IS NOT THE ORIGINAL FILE               */
/*          ANY MODIFICATIONS TO THIS FILE WILL BE LOST */
/* WARNING: THIS IS NOT THE ORIGINAL FILE               */
/*          ANY MODIFICATIONS TO THIS FILE WILL BE LOST */
#ifndef _IJET_CODING_H_
#define _IJET_CODING_H_

/*--------------------------------------------------------------------------* 
 * macros for debug messages
 *--------------------------------------------------------------------------*/

#if IJETD

#define DEBUG_PREFIX

/* #define debug_printf(FMT,ARGS...) \
 (sprintf(ijet_debugLogString, FMT , ##ARGS) , ijet_PutLogString()) */

#define debugmask(MASK,FMT_ARGS) \
 if (!(ijet_debugmask & (MASK)))  \
 else printf FMT_ARGS

#define ifdebug(CONDITION) if(ijet_debugmask && (CONDITION))

#else

/* #define debug_printf(FMT,ARGS...) 0 */
#define debugmask(MASK,FMT_ARGS) 0
#define ifdebug(CONDITION) if(0)

#endif

#define debug debug2 /* for backward compatibility, for now */

#define debug0(FMT_ARGS) debugmask(1<< 0, FMT_ARGS)
#define debug1(FMT_ARGS) debugmask(1<< 1, FMT_ARGS)
#define debug2(FMT_ARGS) debugmask(1<< 2, FMT_ARGS)
#define debug3(FMT_ARGS) debugmask(1<< 3, FMT_ARGS)
#define debug4(FMT_ARGS) debugmask(1<< 4, FMT_ARGS)
#define debug5(FMT_ARGS) debugmask(1<< 5, FMT_ARGS)

#define debuga(FMT_ARGS) debugmask(1<< 6, FMT_ARGS)
#define debugb(FMT_ARGS) debugmask(1<< 7, FMT_ARGS)
#define debugc(FMT_ARGS) debugmask(1<< 8, FMT_ARGS)
#define debugd(FMT_ARGS) debugmask(1 << 9, FMT_ARGS)
#define debuge(FMT_ARGS) debugmask(1 << 10, FMT_ARGS)
#define debugf(FMT_ARGS) debugmask(1 << 11, FMT_ARGS)
#define debugg(FMT_ARGS) debugmask(1 << 12, FMT_ARGS)
#define debugh(FMT_ARGS) debugmask(1 << 13, FMT_ARGS)
#define debugi(FMT_ARGS) debugmask(1 << 14, FMT_ARGS)
#define debugj(FMT_ARGS) debugmask(1 << 15, FMT_ARGS)
#define debugk(FMT_ARGS) debugmask(1<<16, FMT_ARGS)
#define debugl(FMT_ARGS) debugmask(1<<17, FMT_ARGS)
#define debugm(FMT_ARGS) debugmask(1<<18, FMT_ARGS)
#define debugn(FMT_ARGS) debugmask(1<<19, FMT_ARGS)
#define debugo(FMT_ARGS) debugmask(1<<20, FMT_ARGS)
#define debugp(FMT_ARGS) debugmask(1<<21, FMT_ARGS)
#define debugq(FMT_ARGS) debugmask(1<<22, FMT_ARGS)
#define debugr(FMT_ARGS) debugmask(1<<23, FMT_ARGS)
#define debugs(FMT_ARGS) debugmask(1<<24, FMT_ARGS)
#define debugt(FMT_ARGS) debugmask(1<<25, FMT_ARGS)
#define debugu(FMT_ARGS) debugmask(1<<26, FMT_ARGS)
#define debugv(FMT_ARGS) debugmask(1<<27, FMT_ARGS)
#define debugw(FMT_ARGS) debugmask(1<<28, FMT_ARGS)
#define debugx(FMT_ARGS) debugmask(1<<29, FMT_ARGS)
#define debugy(FMT_ARGS) debugmask(1<<30, FMT_ARGS)
#define debugz(FMT_ARGS) debugmask(1<<31, FMT_ARGS)

#define warn \
 if (0)
 else printf

/* #define pwarn(FMT,ARGS...) \
  (printf(FMT , ## ARGS),debug_printf(FMT , ##ARGS)) */

/*--------------------------------------------------------------------------* 
 * Routine entry/exit
 *--------------------------------------------------------------------------*/

#if IJETD

/* #include <arch/i386/include/psl.h> */

extern int ijet_debug_indentLevel;

#define begin(ROUTINE_NAME) {		\
 int ijet_debug_inside_begin_end=0;		\
 (void)ijet_debug_inside_begin_end;		\
/*  if (ijet_debugmask & (1<<3))			\
     debug_DumpToScreen ('E',__FUNCTION__);*/	\
 debug1(("%s ENTRY\n", __FUNCTION__)); \
 ijet_debug_indentLevel++
                                                 
				
#define end(ROUTINE_NAME)			\
/*  if (ijet_debugmask & (1<<3))			\
   debug_DumpToScreen ('X',__FUNCTION__); */	\
 debug1("EXIT\n"); \
 ijet_debug_indentLevel--; \
 } extern int main ()

#define ret return 

#define mega_cow_return_stuff() ({		\
/*  if (ijet_debugmask & (1<<3))			\
    debug_DumpToScreen('R',__FUNCTION__); */	\
  debug1(("%s RETURN\n", ROUTINE_NAME));				\
  ijet_debug_indentLevel--; \
  0; })

#define return switch (sizeof(ijet_debug_inside_begin_end)>1 ? \
                       (mega_cow_return_stuff()) : 0) \
               default: return

#else

#define begin(ROUTINE_NAME...) { extern int main ()
#define end(ROUTINE_NAME...) } extern int main ()
#define ret return

#endif

/*--------------------------------------------------------------------------* 
 * Assert, etc.
 *--------------------------------------------------------------------------*/
/*
#if IJETD  

#define assert(CONDITION) \ 
 ((CONDITION) ? 0 : \ 
  (printf("assertion failed: \"%s\", file: %s, line: %d\n", \ 
   #CONDITION, __FILE__, __LINE__),panic ("(assertion failed)\n"),0)) 

#else 

#define assert(CONDITION) (0) 

#endif 
*/
/*--------------------------------------------------------------------------*
 * other "extensions" to C
 *--------------------------------------------------------------------------*/

#define notreached assert (FALSE)

#define public
#define internal
#define private static

#define in
#define out
#define in_out

#undef NULL
#define NULL ((void *) 0)

#undef FALSE
#undef TRUE
typedef enum {FALSE, TRUE} bool;

/*--------------------------------------------------------------------------*
 * some #define functions
 *--------------------------------------------------------------------------*/

#define arsize(A) (sizeof(A) / sizeof(A[0]))  /* # of elements in an array */

/*--------------------------------------------------------------------------*
 * types for NetBSD
 *--------------------------------------------------------------------------*/

typedef signed char         int8;
typedef signed short        int16;
typedef signed int          int32;

typedef unsigned char       uint8;
typedef unsigned short      uint16;
typedef unsigned int        uint32;

/*------------------------------------------------------------------------
 * global variables for debug
 *------------------------------------------------------------------------*/

#if IJETD

#define IJET_DEBUG_LOG_SIZE 1000000

extern bool        debug_directTextScreenMapDone;
extern uint16     *debug_directTextScreenp;
extern void       *debug_bigBufp;

extern char  ijet_debug_inside_begin_end;
extern int   ijet_debugmask;
extern char  ijet_debugLogString[];
extern int   ijet_debugLogIndex;
extern char *ijet_debugLogBuffer;

extern int ijet_PutLogString (void);
extern void debug_DumpToScreen (char ch, char *s);

#endif

#endif /* _IJET_CODING_H_ */


