#include <string.h>
#include <signal.h>
#include "common.h"

#ifdef NO_INLINE

unsigned char leadz(BitBoard b)
{
if(b>>48) return lzArray[b>>48];
if(b>>32) return lzArray[b>>32]+16;
if(b>>16) return lzArray[b>>16]+32;
return lzArray[b]+48;
}

unsigned char nbits(BitBoard b)
{
return BitCount[b>>48]+BitCount[(b>>32)&0xffff]+BitCount[(b>>16)&0xffff]+BitCount[b&0xffff];
}

#endif

void UpdateFriends()
{
BitBoard *w,*b;
w=board.b[white];
b=board.b[black];
board.friends[white]=w[pawn]|w[knight]|w[bishop]|w[rook]|w[queen]|w[king];
board.friends[black]=b[pawn]|b[knight]|b[bishop]|b[rook]|b[queen]|b[king];
board.blocker=board.friends[white]|board.friends[black];
}

void UpdateCBoard()
{
BitBoard b;
short piece,sq;
memset(cboard,0,sizeof(cboard));
for(piece=pawn;piece<=king;piece++)
	{
	b=board.b[white][piece]|board.b[black][piece];
	while(b)
		{
		sq=leadz(b);
		CLEARBIT(b,sq);
		cboard[sq]=piece;
		}
	}
}


static const short OrigCboard[64]= 
{
rook,knight,bishop,queen,king,bishop,knight,rook,
pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn,
empty,empty,empty,empty,empty,empty,empty,empty,
empty,empty,empty,empty,empty,empty,empty,empty,
empty,empty,empty,empty,empty,empty,empty,empty,
empty,empty,empty,empty,empty,empty,empty,empty,
pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn,
rook,knight,bishop,queen,king,bishop,knight,rook
};

void UpdateMvboard()
{
short sq;
for(sq=0;sq<64;sq++)
	{
	if(cboard[sq]==empty||cboard[sq]==OrigCboard[sq]) Mvboard[sq]=0;
	else Mvboard[sq]=1;
	} 
}


void EndSearch(int dummy)
{
SET(flags,TIMEOUT);
signal(SIGINT,EndSearch);
}

short ValidateBoard()
{
short side,xside,sq;
if(nbits(board.b[white][king])!=1) return false;
if(nbits(board.b[black][king])!=1) return false;
side=board.side; 
xside=1^side;
if(SqAtakd(board.king[xside],side)) return false;
if(board.ep>-1)
	{
	sq=board.ep+(xside==white?8:-8);
	if(!(BitPosArray[sq]&board.b[xside][pawn]))
	return false;
	}
if(board.flag&WKINGCASTLE)
	{
	if(!(BitPosArray[E1]&board.b[white][king])) return false;
	if(!(BitPosArray[H1]&board.b[white][rook])) return false;
	}
if(board.flag&WQUEENCASTLE)
	{
	if(!(BitPosArray[E1]&board.b[white][king])) return false;
	if(!(BitPosArray[A1]&board.b[white][rook])) return false;
	}
if(board.flag&BKINGCASTLE)
	{
	if(!(BitPosArray[E8]&board.b[black][king])) return false;
	if(!(BitPosArray[H8]&board.b[black][rook])) return false;
	}
if(board.flag&BQUEENCASTLE)
	{
	if(!(BitPosArray[E8]&board.b[black][king])) return false;
	if(!(BitPosArray[A8]&board.b[black][rook])) return false;
	}
return true;
}
