Esempio n. 1
0
BitMap Storage::BuildBitmap(UINT maxLength) const
{
	LIVE_ASSERT(maxLength > 0);
	if (IsEmpty())
		return BitMap();
	UINT minIndex = GetMinIndex();
	UINT maxIndex = GetMaxIndex();
	if ((minIndex == 0) && (maxIndex == 0))
		return BitMap();
	LIVE_ASSERT(minIndex > 0);
	LIVE_ASSERT(minIndex <= maxIndex);
	UINT length = maxIndex - minIndex + 1;
	LIMIT_MAX(length, maxLength);
	maxIndex = minIndex + length - 1;
	const PieceInfoCollection& pieceColl = m_dataPieces;
	PieceInfoCollection::const_iterator BeginItr = pieceColl.find(minIndex);
	PieceInfoCollection::const_iterator EndItr   = pieceColl.upper_bound(maxIndex);

	BitMap bitmap(minIndex, length);
	//2.生成Bitmap
	for (PieceInfoCollection::const_iterator itr = BeginItr; itr != EndItr; itr++ )
	{
		LIVE_ASSERT(bitmap.IsInRange(itr->first));
		bitmap.SetBit(itr->first);
	}
	return bitmap;
}
Esempio n. 2
0
BitMap Storage::BuildBitmap() const
{
	if (m_dataPieces.empty())
		return BitMap();
	UINT minIndex = GetMinIndex();
	UINT maxIndex = GetMaxIndex();
	if ((minIndex == 0) && (maxIndex == 0))
		return BitMap();
	LIVE_ASSERT(minIndex > 0);
	LIVE_ASSERT(minIndex <= maxIndex);
	UINT length = maxIndex - minIndex + 1;
	const PieceInfoCollection& pieceColl = m_dataPieces;
	PieceInfoCollection::const_iterator BeginItr = pieceColl.find(minIndex);
	PieceInfoCollection::const_iterator EndItr   = pieceColl.find(maxIndex);

	BitMap bitmap(minIndex, length);
// 	for(int i = 0; i < length; i ++ )
// 	{
// 		bitmap.SetBit(minIndex + i);
// 	}
	
	//2.生成Bitmap
	for (PieceInfoCollection::const_iterator itr = BeginItr; itr != EndItr; itr++ )
	{
		LIVE_ASSERT(bitmap.IsInRange(itr->first));
		bitmap.SetBit(itr->first);
	}

	return bitmap;
}
Esempio n. 3
0
BitMap BitMap::get_part(size_t begin, size_t end) const{
    if (begin >= end){
        return BitMap();    
    }
    std::vector<uint32_t> new_array((end - begin - 1) / block_size + 1, 0);
    size_t block_shift = begin % block_size;
    size_t vector_shift = begin / block_size;
    for (size_t i = 0 ; i < new_array.size() ; ++ i){
        new_array[i] |= ( array[i + vector_shift] >> block_shift);
        if (i + vector_shift + 1 < array.size() && block_shift){
            new_array[i] |= ( array[i + vector_shift + 1] << (block_size - block_shift));
        }
    }
    return BitMap(new_array, end - begin);
}
Esempio n. 4
0
BitMap BitMap::get_compact(size_t new_size){
    if (new_size == bitset_size){
        return BitMap(*this);
    }
    BitMap result = this->get_part(0, new_size);
    for (size_t i = new_size ; i < bitset_size ;  i += new_size){
        result |= this->get_part(i, std::min(i+new_size, bitset_size));
    }
    return result;
}
Esempio n. 5
0
void HttpProtocolData::initTask(HttpTask *task)
{
    LOG(0, "enter initTask, task = %p\n", task);

    HttpSession *ses = task->sessions[0];
    TaskInfo *info = task->info;
    CURL *ehandle = ses->handle;

    char logBuffer[64] = {0};

    info->mimeType = getMimeType(ehandle, info->uri);
    snprintf(logBuffer, 63, "mime type: %s", info->mimeType.c_str());
    info->taskLog(info, logBuffer);

    // get file information.
    double length;
    if (info->outputName.length() == 0)
        info->outputName = getFileName(ehandle, info->uri);

    std::string output = info->outputPath;
    output.append(info->outputName);

    if (info->totalSize == 0)
    {
        File::remove(output.c_str());
    }

    task->file.open(output.c_str(), OF_Create | OF_Write);
    if (!task->file.isOpen())
        throw DOWNLOADEXCEPTION(FAIL_OPEN_FILE, "HTTP", strerror(FAIL_OPEN_FILE));
    snprintf(logBuffer, 63, "File path: %s", output.c_str());
    info->taskLog(info, logBuffer);

    if (info->totalSize == 0)
    {
        CURLcode rete = curl_easy_getinfo(ehandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &length);
        CHECK_CURLE(rete);
        if (length > 0)
        {
            info->totalSize = static_cast<size_t>(length);
            info->downloadMap = BitMap(size_t(length), task->conf.bytesPerBlock);
            info->downloadMap.setAll(false);
            info->validMap = BitMap(size_t(length), task->conf.bytesPerBlock);
            info->validMap.setAll(true);
            snprintf(logBuffer, 63, "File length: %lu", info->totalSize);
            info->taskLog(info, logBuffer);

            task->file.resize(info->totalSize);
        }
        else if (length < 0)
            info->totalSize = 0;
        else // length == 0, zero length file
            return;
    }

    info->totalSource = info->validSource = 1;

    if (info->totalSize > 0) // may equal 0 mean unknow length.
    {
        LOG(0, "make download sessions\n");
        // seperate download part in 2 steps:
        // 1 give each non-download part a session;
        // 2 find a biggest part and divide, repeat till enough session.
        unsigned int begin     = ses->pos / info->downloadMap.bytesPerBit();
        unsigned int end       = info->downloadMap.find(true, begin);
        unsigned int nextBegin = info->downloadMap.find(false, end);

        ses->length = (end - begin) * info->downloadMap.bytesPerBit();

        int i = 1;
        begin = nextBegin;

        while ( (i < task->conf.sessionNumber) && (begin < info->downloadMap.size()) )
        {
            end = info->downloadMap.find(true, begin);
            nextBegin = info->downloadMap.find(false, end);

            // make [begin, end) a seesion.
            makeSession(task, begin * info->downloadMap.bytesPerBit(), (end - begin) * info->downloadMap.bytesPerBit());

            ++i;
            begin = nextBegin;
        }

        while (i < task->conf.sessionNumber)
        {
            if (!splitMaxSession(task))
            {
                break;
            }

            ++i;
        }
    }
    task->state = HT_DOWNLOAD;
}
Esempio n. 6
0
void dataInit()
{
//     ===========================================================================
//	   Initialization of global data at program startup.
//	   This function should be called only once (or else the mirrored data will be 
//	   mirrored back again!!)
//     ===========================================================================
       unsigned char CHARBITSET[8];
       int i, square, rank, file, arank, afile, state, slide, diaga1h8, diaga8h1, attackbit;
       unsigned char state6Bit, state8Bit, attack8Bit;
       Move move;

	   board.searchDepth = 16; // default for startup
	   board.maxTime = 2000; // default for startup, milliseconds

//     ===========================================================================
//     BITSET has only one bit set:
//     ===========================================================================
       BITSET[0] = 0x1;
       for (i = 1; i < 64 ; i++)
       {
			BITSET[i] = BITSET[i-1] << 1;
       }
 
//     ===========================================================================
//     BOARDINDEX is used to translate [file][rank] to [square],
//     Note that file is from 1..8 and rank from 1..8 (not starting from 0)
//     ===========================================================================
       for (rank = 0 ; rank < 9; rank++)
       {
              for (file = 0 ; file < 9; file++)
              {
                     BOARDINDEX[file][rank] = (rank-1) * 8 + file - 1;
              }
       }
 
//     ===========================================================================
//     PIECEVALUES are used in quiesence move ordering only:
//     ===========================================================================
       for (i = 0; i < 16 ; i++) PIECEVALUES[i] = 0;
       PIECEVALUES[WHITE_PAWN] = PAWN_VALUE;
       PIECEVALUES[WHITE_KNIGHT] = KNIGHT_VALUE;
       PIECEVALUES[WHITE_BISHOP] = BISHOP_VALUE;
       PIECEVALUES[WHITE_ROOK] = ROOK_VALUE;
       PIECEVALUES[WHITE_QUEEN] = QUEEN_VALUE;
       PIECEVALUES[WHITE_KING] = KING_VALUE;  
       PIECEVALUES[BLACK_PAWN] = PAWN_VALUE;
       PIECEVALUES[BLACK_KNIGHT] = KNIGHT_VALUE;
       PIECEVALUES[BLACK_BISHOP] = BISHOP_VALUE;
       PIECEVALUES[BLACK_ROOK] = ROOK_VALUE;
       PIECEVALUES[BLACK_QUEEN] = QUEEN_VALUE;
       PIECEVALUES[BLACK_KING] = KING_VALUE;

//     ===========================================================================
//     Initialize MS1BTABLE, used in lastOne (see bitops.cpp)
//     ===========================================================================
    for (i = 0; i < 256; i++)
    {
        MS1BTABLE[i] = (
            (i > 127) ? 7 :
            (i >  63) ? 6 :
            (i >  31) ? 5 :
            (i >  15) ? 4 :
            (i >   7) ? 3 :
            (i >   3) ? 2 :
            (i >   1) ? 1 : 0 );
    }
 
//     ===========================================================================
//     Initialize rank, file and diagonal 6-bit masking bitmaps, to get the
//     occupancy state, used in the movegenerator (see movegen.ccp)
//     ===========================================================================
 
       for (square = 0; square < 64; square++)
       {
              RANKMASK[square] = 0x0;
              FILEMASK[square] = 0x0;
              DIAGA8H1MASK[square] = 0x0;
              DIAGA1H8MASK[square] = 0x0;
              FILEMAGIC[square] = 0x0;
              DIAGA8H1MAGIC[square] = 0x0;
              DIAGA1H8MAGIC[square] = 0x0;
       }
 
       for (file = 1; file < 9; file++)
       {
              for (rank = 1; rank < 9; rank++)
              {
//             ===========================================================================
//             initialize 6-bit rank mask, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
 
                     RANKMASK[BOARDINDEX[file][rank]]  = BITSET[BOARDINDEX[2][rank]] | BITSET[BOARDINDEX[3][rank]] | BITSET[BOARDINDEX[4][rank]] ;
                     RANKMASK[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[5][rank]] | BITSET[BOARDINDEX[6][rank]] | BITSET[BOARDINDEX[7][rank]] ;
 
//             ===========================================================================
//             initialize 6-bit file mask, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
                     FILEMASK[BOARDINDEX[file][rank]]  = BITSET[BOARDINDEX[file][2]] | BITSET[BOARDINDEX[file][3]] | BITSET[BOARDINDEX[file][4]] ;
                     FILEMASK[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[file][5]] | BITSET[BOARDINDEX[file][6]] | BITSET[BOARDINDEX[file][7]] ;
 
//             ===========================================================================
//             Initialize diagonal magic multiplication numbers, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
                     diaga8h1 = file + rank; // from 2 to 16, longest diagonal = 9
                     DIAGA8H1MAGIC[BOARDINDEX[file][rank]] = _DIAGA8H1MAGICS[diaga8h1 - 2];
 
//             ===========================================================================
//             Initialize 6-bit diagonal mask, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
                     DIAGA8H1MASK[BOARDINDEX[file][rank]] = 0x0;
                     if (diaga8h1 < 10)  // lower half, diagonals 2 to 9
                     {
                           for (square = 2 ; square < diaga8h1-1 ; square ++)
                           {
                                  DIAGA8H1MASK[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[square][diaga8h1-square]];
                           }
                     }
                     else  // upper half, diagonals 10 to 16
                     {
                           for (square = 2 ; square < 17 - diaga8h1 ; square ++)
                           {
                                  DIAGA8H1MASK[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[diaga8h1+square-9][9-square]];
                           }
                     }
      
//             ===========================================================================
//             Initialize diagonal magic multiplication numbers, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
                     diaga1h8 = file - rank; // from -7 to +7, longest diagonal = 0
                     DIAGA1H8MAGIC[BOARDINDEX[file][rank]] = _DIAGA1H8MAGICS[diaga1h8+7];
 
//             ===========================================================================
//             Initialize 6-bit diagonal mask, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
                     DIAGA1H8MASK[BOARDINDEX[file][rank]] = 0x0;
                     if (diaga1h8 > -1)  // lower half, diagonals 0 to 7
                     {
                           for (square = 2 ; square < 8 - diaga1h8 ; square ++)
                           {
                                  DIAGA1H8MASK[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[diaga1h8 + square][square]];
                           }
                     }
                     else
                     {
                           for (square = 2 ; square < 8 + diaga1h8 ; square ++)
                           {
                                  DIAGA1H8MASK[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[square][square - diaga1h8]];
                           }
                     }
 
//             ===========================================================================
//             Initialize file magic multiplication numbers, used in the movegenerator (see movegen.ccp)
//             ===========================================================================
                     FILEMAGIC[BOARDINDEX[file][rank]] = _FILEMAGICS[file-1];
 
              }
       }
 
//     ===========================================================================
//     Now initialize the GEN_SLIDING_ATTACKS array, used to generate the sliding
//     attack bitboards.
//     unsigned char GEN_SLIDING_ATTACKS[8 squares][64 states] holds the attacks
//     for any file, rank or diagonal - it is going to be usefull when generating the
//     RANK_ATTACKS[64][64], FILE_ATTACKS[64][64], DIAGA8H1_ATTACKS[64][64] and
//     DIAGA1H8_ATTACKS[64][64] arrays
//     ===========================================================================
 
       // initialize CHARBITSET, this array is equivalant to BITSET for bitboards:
       // 8 chars, each with only 1 bit set.
       CHARBITSET[0] = 1;
       for (square = 1; square <= 7; square++) 
       {
              CHARBITSET[square] = CHARBITSET[square-1] << 1;
       }
 
       // loop over rank, file or diagonal squares:
       for (square = 0; square <= 7; square++)
       {
              // loop of occupancy states
              // state6Bit represents the 64 possible occupancy states of a rank,
              // except the 2 end-bits, because they don't matter for calculating attacks
              for (state6Bit = 0; state6Bit < 64; state6Bit++)      
              {
                     state8Bit = state6Bit << 1; // create an 8-bit occupancy state
                     attack8Bit = 0;
                     if (square < 7)
                     {
                           attack8Bit |= CHARBITSET[square + 1];
                     }
                     slide = square + 2;
                     while (slide <= 7) // slide in '+' direction
                     {
                           if ((~state8Bit) & (CHARBITSET[slide - 1]))
                           {
                                  attack8Bit |= CHARBITSET[slide];
                           }
                           else break;
                           slide++;
                     }
                     if (square > 0)
                     {
                           attack8Bit |= CHARBITSET[square - 1];
                     }
                     slide = square - 2;
                     while (slide >= 0) // slide in '-' direction
                     {
                           if ((~state8Bit) & (CHARBITSET[slide + 1]))
                           {
                                  attack8Bit |= CHARBITSET[slide];
                           }
                           else break;
                           slide--;
                     }
                     GEN_SLIDING_ATTACKS[square][state6Bit] = attack8Bit;
              }
       }
 
//     ===========================================================================
//     Initialize all attack bitmaps, used in the movegenerator (see movegen.ccp)
//     ===========================================================================
 
       for (square = 0; square < 64; square++)
       {
              KNIGHT_ATTACKS[square] = 0x0;
              KING_ATTACKS[square] = 0x0;
              WHITE_PAWN_ATTACKS[square] = 0x0;
              WHITE_PAWN_MOVES[square] = 0x0;
              WHITE_PAWN_DOUBLE_MOVES[square] = 0x0;
              BLACK_PAWN_ATTACKS[square] = 0x0;
              BLACK_PAWN_MOVES[square] = 0x0;
              BLACK_PAWN_DOUBLE_MOVES[square] = 0x0;   
              for (state = 0; state < 64; state++)
              {
                     RANK_ATTACKS[square][state] = 0x0;
                     FILE_ATTACKS[square][state] = 0x0;
                     DIAGA8H1_ATTACKS[square][state] = 0x0;
                     DIAGA1H8_ATTACKS[square][state] = 0x0;
              }
       }
 
       // WHITE_PAWN_ATTACKS
       for (square = 0; square < 64; square++)
       {
              file = FILES[square]; rank = RANKS[square];
              afile = file - 1; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     WHITE_PAWN_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     WHITE_PAWN_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
       }
 
       // WHITE_PAWN_MOVES
       for (square = 0; square <64; square++)
       {
              file = FILES[square]; rank = RANKS[square];
              afile = file; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     WHITE_PAWN_MOVES[square] |= BITSET[BOARDINDEX[afile][arank]];       
              if (rank == 2)
              {
                     afile = file; arank = rank + 2;
                     if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                           WHITE_PAWN_DOUBLE_MOVES[square] |= BITSET[BOARDINDEX[afile][arank]];
              }
       }
 
       // BLACK_PAWN_ATTACKS
       for (square = 0; square < 64; square++)
       {
              file = FILES[square]; rank = RANKS[square];
              afile = file - 1; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     BLACK_PAWN_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     BLACK_PAWN_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
       }
 
       // BLACK_PAWN_MOVES
       for (square = 0; square < 64; square++)
       {
              file = FILES[square]; rank = RANKS[square];
              afile = file; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     BLACK_PAWN_MOVES[square] |= BITSET[BOARDINDEX[afile][arank]];
              if (rank == 7)
              {
                     afile = file; arank = rank - 2;
                     if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                           BLACK_PAWN_DOUBLE_MOVES[square] |= BITSET[BOARDINDEX[afile][arank]];
              }
       }
 
       // KNIGHT attacks;
       for (square = 0; square < 64; square++)
       {
              file = FILES[square];
              rank = RANKS[square];
              afile = file - 2; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file - 1; arank = rank + 2;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank + 2;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 2; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 2; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank - 2;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file - 1; arank = rank - 2;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file - 2; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KNIGHT_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
       }
 
       // KING attacks;
       for (square = 0; square < 64; square++)
       {
              file = FILES[square]; rank = RANKS[square];
              afile = file - 1; arank = rank;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file - 1; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank + 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file + 1; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
              afile = file - 1; arank = rank - 1;
              if ((afile >= 1) & (afile <= 8) & (arank >= 1) & (arank <= 8))
                     KING_ATTACKS[square] |= BITSET[BOARDINDEX[afile][arank]];
       }
 
       //  RANK attacks (ROOKS and QUEENS):
       //  use           unsigned char GEN_SLIDING_ATTACKS[8 squares] [64 states]
       //  to initialize BitMap        RANK_ATTACKS       [64 squares][64 states]
       //
       for (square = 0; square < 64; square++)
       {
              for (state6Bit = 0; state6Bit < 64; state6Bit++)
              {
                     RANK_ATTACKS[square][state6Bit] = 0;
                     RANK_ATTACKS[square][state6Bit] |=
                           BitMap(GEN_SLIDING_ATTACKS[FILES[square]-1][state6Bit]) << (RANKSHIFT[square] - 1);
              }
       }
 
       //  FILE attacks (ROOKS and QUEENS):
       //  use           unsigned char GEN_SLIDING_ATTACKS[8 squares] [64 states]
       //  to initialize BitMap        FILE_ATTACKS       [64 squares][64 states]
       //
       //  Occupancy transformation is as follows:
       //
       //   occupancy state bits of the file:               occupancy state bits in GEN_SLIDING_ATTACKS:
       //
       //        . . . . . . . . MSB                           LSB         MSB
       //        . . . . . A . .                    =>         A B C D E F . .                            
       //        . . . . . B . .
       //        . . . . . C . .
       //        . . . . . D . .
       //        . . . . . E . .
       //        . . . . . F . .
       //    LSB . . . . . . . .
       //
       //  The reverse transformation is as follows:
       //
       //   attack bits in GEN_SLIDING_ATTACKS:             attack bits in the file:
       //
       //        LSB         MSB                               . . . . . m . . MSB
       //        m n o p q r s t                    =>         . . . . . n . .
       //                                                      . . . . . o . .
       //                                                      . . . . . p . .
       //                                                      . . . . . q . .
       //                                                      . . . . . r . .
       //                                                      . . . . . s . .
       //                                                 LSB  . . . . . t . .
       //
       for (square = 0; square < 64; square++)
       {
              for (state6Bit = 0; state6Bit < 64; state6Bit++)
              {
                     FILE_ATTACKS[square][state6Bit] = 0x0;
 
                     // check to see if attackbit'-th  bit is set in GEN_SLIDING_ATTACKS, for this combination of square/occupancy state
                     for (attackbit = 0; attackbit < 8; attackbit++) // from LSB to MSB
                     {
                           //  conversion from 64 board squares to the 8 corresponding positions in the GEN_SLIDING_ATTACKS array: "8-RANKS[square]"
                           if (GEN_SLIDING_ATTACKS[8-RANKS[square]][state6Bit] & CHARBITSET[attackbit])
                           {
                                  // the bit is set, so we need to update FILE_ATTACKS accordingly:
                                  // conversion of square/attackbit to the corresponding 64 board FILE: FILES[square]
                                  // conversion of square/attackbit to the corresponding 64 board RANK: 8-attackbit
                                  file = FILES[square];
                                  rank = 8 - attackbit;
                                  FILE_ATTACKS[square][state6Bit] |=  BITSET[BOARDINDEX[file][rank]];
                           }
                     }
              }
       }
 
       //  DIAGA8H1_ATTACKS attacks (BISHOPS and QUEENS):
       for (square = 0; square < 64; square++)
       {
              for (state6Bit = 0; state6Bit < 64; state6Bit++)
              {
                     DIAGA8H1_ATTACKS[square][state6Bit] = 0x0;
                     for (attackbit = 0; attackbit < 8; attackbit++) // from LSB to MSB
                     {
                           //  conversion from 64 board squares to the 8 corresponding positions in the GEN_SLIDING_ATTACKS array: MIN((8-RANKS[square]),(FILES[square]-1))
                           if (GEN_SLIDING_ATTACKS[(8-RANKS[square]) < (FILES[square]-1) ? (8-RANKS[square]) : (FILES[square]-1)][state6Bit] & CHARBITSET[attackbit])
                           {
                                  // the bit is set, so we need to update FILE_ATTACKS accordingly:
                                  // conversion of square/attackbit to the corresponding 64 board file and rank:
                                  diaga8h1 = FILES[square] + RANKS[square]; // from 2 to 16, longest diagonal = 9
                                  if (diaga8h1 < 10)
                                  {
                                    file = attackbit + 1;
                                    rank = diaga8h1 - file;
                                  }
                                  else
                                  {
                                    rank = 8 - attackbit;
                                    file = diaga8h1 - rank;
                                  }
                                  if ((file > 0) && (file < 9) && (rank > 0) && (rank < 9))
                                  {
                                         DIAGA8H1_ATTACKS[square][state6Bit] |=  BITSET[BOARDINDEX[file][rank]];
                                  }
                           }
                     }
              }
       }
 
       //  DIAGA1H8_ATTACKS attacks (BISHOPS and QUEENS):
       for (square = 0; square < 64; square++)
       {
              for (state6Bit = 0; state6Bit < 64; state6Bit++)
              {
                     DIAGA1H8_ATTACKS[square][state6Bit] = 0x0;
                     for (attackbit = 0; attackbit < 8; attackbit++) // from LSB to MSB
                     {
                           //  conversion from 64 board squares to the 8 corresponding positions in the GEN_SLIDING_ATTACKS array: MIN((8-RANKS[square]),(FILES[square]-1))
                           if (GEN_SLIDING_ATTACKS[(RANKS[square]-1) < (FILES[square]-1) ? (RANKS[square]-1) : (FILES[square]-1)][state6Bit] & CHARBITSET[attackbit])
                           {
                                  // the bit is set, so we need to update FILE_ATTACKS accordingly:
                                  // conversion of square/attackbit to the corresponding 64 board file and rank:
                                  diaga1h8 = FILES[square] - RANKS[square]; // from -7 to 7, longest diagonal = 0
                                  if (diaga1h8 < 0)
                                  {
                                    file = attackbit + 1;
                                    rank = file - diaga1h8;
                                  }
                                  else
                                  {
                                    rank = attackbit + 1;
                                    file = diaga1h8 + rank;
                                  }
                                  if ((file > 0) && (file < 9) && (rank > 0) && (rank < 9))
                                  {
                                         DIAGA1H8_ATTACKS[square][state6Bit] |=  BITSET[BOARDINDEX[file][rank]];
                                  }
                           }
                     }
              }
       }
 
 
//     ===========================================================================
//     Masks for castling, index 0 is for white, 1 is for black
//     ===========================================================================
 
       maskEG[0] = BITSET[E1] | BITSET[F1] | BITSET[G1];
       maskEG[1] = BITSET[E8] | BITSET[F8] | BITSET[G8];
 
       maskFG[0] = BITSET[F1] | BITSET[G1];
       maskFG[1] = BITSET[F8] | BITSET[G8];
 
       maskBD[0] = BITSET[B1] | BITSET[C1] | BITSET[D1];
       maskBD[1] = BITSET[B8] | BITSET[C8] | BITSET[D8];
 
       maskCE[0] = BITSET[C1] | BITSET[D1] | BITSET[E1];
       maskCE[1] = BITSET[C8] | BITSET[D8] | BITSET[E8];
 
//     ===========================================================================
//     The 4 castling moves can be predefined:
//     ===========================================================================
 
       move.clear();
       move.setCapt(EMPTY);
       move.setPiec(WHITE_KING);
       move.setProm(WHITE_KING);
       move.setFrom(E1);
       move.setTosq(G1);
       WHITE_OO_CASTL = move.moveInt;
       move.setTosq(C1);
       WHITE_OOO_CASTL = move.moveInt;
 
       move.setPiec(BLACK_KING);
       move.setProm(BLACK_KING);
       move.setFrom(E8);
       move.setTosq(G8);
       BLACK_OO_CASTL = move.moveInt;
       move.setTosq(C8);
       BLACK_OOO_CASTL = move.moveInt;
 
//     ===========================================================================
//     Initialize evaluation data & bitmaps
//     ===========================================================================
 
       BLACK_SQUARES = 0;
       for (i = 0; i < 64; i++)
       {
              if ((i + RANKS[i]) % 2) BLACK_SQUARES ^= BITSET[i];
       }
       WHITE_SQUARES = ~BLACK_SQUARES;
 
       // Clear bitmaps:
       for (i = 0; i < 64; i++)
       {
              PASSED_WHITE[i] = 0;
              PASSED_BLACK[i] = 0;
              ISOLATED_WHITE[i] = 0;
              ISOLATED_BLACK[i] = 0;
              BACKWARD_WHITE[i] = 0;
              BACKWARD_BLACK[i] = 0;
              KINGSHIELD_STRONG_W[i] = 0;
              KINGSHIELD_STRONG_B[i] = 0;
              KINGSHIELD_WEAK_W[i] = 0;
              KINGSHIELD_WEAK_B[i] = 0;
       }
 
       for (i = 0; i < 64; i++)
       {
        //  PASSED_WHITE:
              for (rank = RANKS[i] + 1; rank < 8; rank++)
              {
                     // 3 files:
                     if (FILES[i] - 1 > 0) PASSED_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i] - 1][rank]];
                     PASSED_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i]][rank]];
                     if (FILES[i] + 1 < 9 ) PASSED_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i] + 1][rank]];
              }
 
              // ISOLATED_WHITE:
              for (rank = 2; rank < 8; rank++)
              {
                     // 2 files:
                     if (FILES[i] - 1 > 0) ISOLATED_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i] - 1][rank]];
                     if (FILES[i] + 1 < 9 ) ISOLATED_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i] + 1][rank]];
              }
 
              //  BACKWARD_WHITE:
              for (rank = 2; rank <= RANKS[i]; rank++)
              {
                     // 2 files:
                     if (FILES[i] - 1 > 0) BACKWARD_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i] - 1][rank]];
                     if (FILES[i] + 1 < 9 ) BACKWARD_WHITE[i] ^= BITSET[BOARDINDEX[FILES[i] + 1][rank]];
              }
       }
 
       // Pawn shield bitmaps for king safety, only if the king is on the first 3 ranks:
       for (i = 0; i < 24; i++)
       {
        //  KINGSHIELD_STRONG_W & KINGSHIELD_WEAK_W:
              KINGSHIELD_STRONG_W[i] ^= BITSET[i + 8];
              KINGSHIELD_WEAK_W[i] ^= BITSET[i + 16];
              if (FILES[i] > 1)
              {
                     KINGSHIELD_STRONG_W[i] ^= BITSET[i + 7];
                     KINGSHIELD_WEAK_W[i] ^= BITSET[i + 15];
              }
              if (FILES[i] < 8)
              {
                     KINGSHIELD_STRONG_W[i] ^= BITSET[i + 9];
                     KINGSHIELD_WEAK_W[i] ^= BITSET[i + 17];
              }
              if (FILES[i]== 1)
              {
                     KINGSHIELD_STRONG_W[i] ^= BITSET[i + 10];
                     KINGSHIELD_WEAK_W[i] ^= BITSET[i + 18];
              }
              if (FILES[i]== 8)
              {
                     KINGSHIELD_STRONG_W[i] ^= BITSET[i + 6];
                     KINGSHIELD_WEAK_W[i] ^= BITSET[i + 14];
              }
       }
 
//     ===========================================================================
//     DISTANCE array, distance is measured as max of (rank,file)-difference
//     ===========================================================================
       for (i = 0 ; i < 64; i++)
       {
              for (square = 0 ; square < 64; square++)
              {
                     if (abs(RANKS[i] - RANKS[square]) > abs(FILES[i] - FILES[square]))
                           DISTANCE[i][square] = abs(RANKS[i] - RANKS[square]);
                     else
                           DISTANCE[i][square] = abs(FILES[i] - FILES[square]);
              }
       }
 
//     ===========================================================================
//     Initialize MIRRORed data:
//     ===========================================================================
       // Data is supplied as mirrored for WHITE, so it's ready for BLACK to use:
       for (square = 0; square < 64; square++)
       {
              PAWNPOS_B[square] = PAWNPOS_W[square];
              KNIGHTPOS_B[square] = KNIGHTPOS_W[square];
              BISHOPPOS_B[square] = BISHOPPOS_W[square];
              ROOKPOS_B[square] = ROOKPOS_W[square];
              QUEENPOS_B[square] = QUEENPOS_W[square];
              KINGPOS_B[square] = KINGPOS_W[square];
              KINGPOS_ENDGAME_B[square] = KINGPOS_ENDGAME_W[square];
       }
 
       // Complete missing mirrored data:
       for (i = 0; i < 64; i++)
       {
              PAWNPOS_W[i] = PAWNPOS_B[MIRROR[i]];
              KNIGHTPOS_W[i] = KNIGHTPOS_B[MIRROR[i]];
              BISHOPPOS_W[i] = BISHOPPOS_B[MIRROR[i]];
              ROOKPOS_W[i] = ROOKPOS_B[MIRROR[i]];
              QUEENPOS_W[i] = QUEENPOS_B[MIRROR[i]];
              KINGPOS_W[i] = KINGPOS_B[MIRROR[i]];
              KINGPOS_ENDGAME_W[i] = KINGPOS_ENDGAME_B[MIRROR[i]];
 
              for (square = 0; square < 64; square ++)
              {
                     //  PASSED_BLACK bitmaps (mirror of PASSED_WHITE bitmaps):
                     if (PASSED_WHITE[i] & BITSET[square]) PASSED_BLACK[MIRROR[i]] |= BITSET[MIRROR[square]];
 
                     //  ISOLATED_BLACK bitmaps (mirror of ISOLATED_WHITE bitmaps):
                     if (ISOLATED_WHITE[i] & BITSET[square]) ISOLATED_BLACK[MIRROR[i]] |= BITSET[MIRROR[square]];
 
                     //  BACKWARD_BLACK bitmaps (mirror of BACKWARD_WHITE bitmaps):
                     if (BACKWARD_WHITE[i] & BITSET[square]) BACKWARD_BLACK[MIRROR[i]] |= BITSET[MIRROR[square]];
 
                     //  KINGSHIELD_STRONG_B bitmaps (mirror of KINGSHIELD_STRONG_W bitmaps):
                     if (KINGSHIELD_STRONG_W[i] & BITSET[square]) KINGSHIELD_STRONG_B[MIRROR[i]] |= BITSET[MIRROR[square]];
 
                     //  KINGSHIELD_WEAK_B bitmaps (mirror of KINGSHIELD_WEAK_W bitmaps):
                     if (KINGSHIELD_WEAK_W[i] & BITSET[square]) KINGSHIELD_WEAK_B[MIRROR[i]] |= BITSET[MIRROR[square]];
              }
       }

	NOMOVE.moveInt = 0;
	KEY.init();

//	===========================================================================
//	HEADINGS and RAYS, used in SEE:
//	===========================================================================
	for (i = 0 ; i < 64; i++)
	{
		RAY_W[i]  = 0;
		RAY_NW[i] = 0;
		RAY_N[i]  = 0;
		RAY_NE[i] = 0;
		RAY_E[i]  = 0;
		RAY_SE[i] = 0;
		RAY_S[i]  = 0;
		RAY_SW[i] = 0;
		for (square = 0 ; square < 64; square ++)
		{
			HEADINGS[i][square] = 0;
		}
	}
	
	for (rank = 1 ; rank < 9; rank++)
		for (file = 1 ; file < 9; file++)
		{
			i = BOARDINDEX[file][rank];			
			// WEST:
			for (afile = file - 1 ; afile > 0; afile--)
			{
				HEADINGS[i][BOARDINDEX[afile][rank]] = WEST;
				RAY_W[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[afile][rank]];
			}
			// NORTHWEST:
			for (afile = file - 1, arank = rank + 1 ; (afile > 0) && (arank < 9); afile--,  arank++) 
			{
				HEADINGS[i][BOARDINDEX[afile][arank]] = NORTHWEST;
				RAY_NW[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[afile][arank]];
			}
			// NORTH:
			for (arank = rank + 1 ; arank < 9; arank++) 
			{
				HEADINGS[i][BOARDINDEX[file][arank]] = NORTH;
				RAY_N[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[file][arank]];
			}
			// NORTHEAST:
			for (afile = file + 1, arank = rank + 1 ; (afile < 9) && (arank < 9); afile++,  arank++) 
			{
				HEADINGS[i][BOARDINDEX[afile][arank]] = NORTHEAST;
				RAY_NE[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[afile][arank]];
			}
			// EAST:
			for (afile = file + 1 ; afile < 9; afile++) 
			{
				HEADINGS[i][BOARDINDEX[afile][rank]] = EAST;
				RAY_E[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[afile][rank]];
			}
			// SOUTHEAST:
			for (afile = file + 1, arank = rank - 1 ; (afile < 9) && (arank > 0); afile++,  arank--) 
			{
				HEADINGS[i][BOARDINDEX[afile][arank]] = SOUTHEAST;
				RAY_SE[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[afile][arank]];
			}
			// SOUTH:
			for (arank = rank - 1 ; arank > 0; arank--) 
			{
				HEADINGS[i][BOARDINDEX[file][arank]] = SOUTH;
				RAY_S[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[file][arank]];
			}
			// SOUTHWEST:
			for (afile = file - 1, arank = rank - 1 ; (afile > 0) && (arank > 0); afile--,  arank--) 
			{
				HEADINGS[i][BOARDINDEX[afile][arank]] = SOUTHWEST;
				RAY_SW[BOARDINDEX[file][rank]] |= BITSET[BOARDINDEX[afile][arank]];
			}
		}

	// required for running test suites, to prevent 
	// writing escape characters to a file
	TO_CONSOLE = 1;

	// Winboard parameters:
	XB_NONE = 2;  // not 0 or 1
	XB_ANALYZE = 3;   // not 0, 1, or 2
	XB_MODE = false;
	XB_POST = true;
	XB_PONDER = false;
	XB_DO_PENDING = false;
	XB_NO_TIME_LIMIT = false;
    return;
}