/* general macros for C programming */

#define MAX(a,b) 	 ((a)>(b)?(a):(b))
#define MIN(a,b) 	 	((a)<(b)?(a):(b))
#define ABS(x) 		 	((x<0)?(-(x)):(x))
#define CLAMP(a,b,c) 	((b)<(a)?(a): ((b)>(c)?(c):(b)) )
#define MAKE_EVEN(n) 	(((n) + 1) & ~1L)
#define BETWEEN(a,b,c)	(a <= b && b < c)

#define NEXT_ADDRESS(ptr) (void *)(ptr + 1)
#define	FIELD_OFFSET(type,field) (LONG)&(((type *)0)->field)

#ifndef offsetof
#define offsetof(type,memb) ((unsigned long)&((type *)0)->memb)
#endif

#ifndef elementsof
#define elementsof(x)	(sizeof x / sizeof x[0])
#endif

#define unless(x)		if (!(x))

#define LEAVE			goto exitit

#define RelMove(rp,dx,dy)	Move((rp),(rp)->cp_x + dx, (rp)->cp_y + dy)
#define RelDraw(rp,dx,dy)	Draw((rp),(rp)->cp_x + dx, (rp)->cp_y + dy)
#define HLine(rp,x)			Draw((rp),x,               (rp)->cp_y)
#define VLine(rp,y)			Draw((rp),(rp)->cp_x,      y)
#define RelHLine(rp,dx)		Draw((rp),(rp)->cp_x + dx, (rp)->cp_y)
#define RelVLine(rp,dy)		Draw((rp),(rp)->cp_x,      (rp)->cp_y + dy)

/* ============================== unused stuff ============================ */

#define	MakeStruct(x)          (x = AllocMem(sizeof *x,0) )
#define	MakeClearStruct(x)     (x = AllocMem(sizeof *x,MEMF_CLEAR) )
#define	MakeChip(x)            (x = AllocMem(sizeof *x,MEMF_CHIP) )
#define	MakePublic(x)          (x = AllocMem(sizeof *x,MEMF_PUBLIC) )
#define	MakeObject(x,f)        (x = AllocMem(sizeof *x,f) )
#define	MakeStructArray(x,n)   (x = AllocMem(n * (sizeof *x),0) )
#define	MakeChipArray(x,n)     (x = AllocMem(n * (sizeof *x),MEMF_CHIP) )
#define	MakeClearArray(x,n)    (x = AllocMem(n * (sizeof *x),MEMF_CLEAR) )
#define	MakePublicArray(x,n)   (x = AllocMem(n * (sizeof *x),MEMF_PUBLIC) )

#define	UnMakeStruct(x)        if (x) FreeMem(x,sizeof *x)
#define	UnMakeStructArray(x,n) if (x) FreeMem(x,n * (sizeof *x))
#define	DeleteStruct(x)        if (x) { FreeMem(x,sizeof *x); x = NULL; }
#define	DeleteStructArray(x,n) if (x) { FreeMem(x,n * (sizeof *x)); x = NULL; }

#if 0
#define new(type)		(MemAlloc(sizeof (type),MEMF_CLEAR))
#define newp(p)			(p = MemAlloc(sizeof *p,MEMF_CLEAR))
#define free(p) 		{ MemFree(p); p=NULL; }
#endif

	/* REM: No needed anymore with GadTools */

#define	STD_MENU_TEXT(h,string) { 0,1,JAM1,h,1,&topaz_9,(UBYTE *)string, NULL, }
