X-Git-Url: http://winboard.nl/cgi-bin?p=capablanca.git;a=blobdiff_plain;f=lasker-2.2.3%2Fsrc%2Feco.c;h=5d1373899349ee22e7ec7d4402ceb120ae945fc4;hp=bc3a1155c74c6ffecc5cc0bc0eaa98b49bc08c75;hb=fc8a38817986f2ad7a034db0d413762e509a7cac;hpb=76f1e81b3426b94e1d80c9daa309f78045e5335b diff --git a/lasker-2.2.3/src/eco.c b/lasker-2.2.3/src/eco.c old mode 100644 new mode 100755 index bc3a115..5d13738 --- a/lasker-2.2.3/src/eco.c +++ b/lasker-2.2.3/src/eco.c @@ -48,63 +48,66 @@ static int ECO_entries, NIC_entries, LONG_entries; void FEN_to_board(char* FENpos, struct game_state_t* gs) { - int f,r; - char next; - - - for (r=7; r >=0; r--) { - f=0; - while (f<8) { - next = *(FENpos++); - if (isalpha(next)) - gs->board[f++][r] = CharToPiece(next); - else if (next != '/') { - int t = (next - '0'); - do - gs->board[f++][r] = NOPIECE; - while (--t); - } - } - } - if (*(FENpos + 1) == 'w') /* the char after the space */ - gs->onMove = WHITE; - else - gs->onMove = BLACK; + int f,r; + char next; +printf("FEN, var='%s'\n", gs->variant); + for (r=gs->ranks-1; r >=0; r--) { + f=0; + while (ffiles) { + next = *(FENpos++); + if (isalpha(next)) + gs->board[f++][r] = CharToPiece(next, gs->variant); + else if (next != '/') { + int t = (next - '0'); + if(*FENpos >= '0' && *FENpos <= '9') // [HGM] can be double-digit + t = 10*t + *(FENpos++) - '0'; + do + gs->board[f++][r] = NOPIECE; + while (--t && f < gs->files); + } + } + } + if (*(FENpos + 1) == 'w') /* the char after the space */ + gs->onMove = WHITE; + else + gs->onMove = BLACK; } /* converts a board to a FEN pos */ static void board_to_FEN(char* FENpos, struct game_state_t* gs) { - int f,r,count; - char piece; - - for (r=7; r>=0; r--) { - count = 0; - for (f=0; f<8; f++) { - if ((piece = PieceToChar(gs->board[f][r])) != ' ') { - if (count) { - *(FENpos++) = count + '0'; - count = 0; - } - *(FENpos++) = piece; - } else { - if (f == 7) - *(FENpos++) = count + '0' + 1; - else - count++; - } - } - *(FENpos++) = '/'; - } - - *(--FENpos) = ' '; - - if (gs->onMove == WHITE) - *(++FENpos) = 'w'; - else - *(++FENpos) = 'b'; - *(++FENpos) = '\0'; + int f,r,count; + char piece; + + for (r=gs->ranks-1; r>=0; r--) { + count = 0; + for (f=0; ffiles; f++) { + if ((piece = PieceToChar(gs->board[f][r])) != ' ') { + if (count) { + if(count > 9) { count -= 10; *(FENpos++) = '1'; } + *(FENpos++) = count + '0'; + count = 0; + } + *(FENpos++) = piece; + } else { + if (f == gs->files-1) { + if(count > 8) { count -= 10; *(FENpos++) = '1'; } + *(FENpos++) = count + '0' + 1; + } else + count++; + } + } + *(FENpos++) = '/'; + } + + *(--FENpos) = ' '; + + if (gs->onMove == WHITE) + *(++FENpos) = 'w'; + else + *(++FENpos) = 'b'; + *(++FENpos) = '\0'; } char *boardToFEN(int g)