X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gamelist.c;h=188fdf6c95a87f65e4187f51663347eab49895b2;hb=c4545166b97f99043e21f352e1439af355da5d32;hp=712d9b9593cc40ac678cdc101753d6c15526fc73;hpb=f214727e064bfa242138148a3993177f0aa7b5e7;p=xboard.git diff --git a/gamelist.c b/gamelist.c index 712d9b9..188fdf6 100644 --- a/gamelist.c +++ b/gamelist.c @@ -224,13 +224,14 @@ struct { GameListFree(&gameList); yynewfile(f); gameNumber = 0; - quickFlag = 1; + movePtr = 0; lastStart = (ChessMove) 0; yyskipmoves = FALSE; do { - yyboardindex = scratch + (plyNr & 1); + yyboardindex = scratch; offset = yyoffset(); + quickFlag = plyNr + 1; cm = (ChessMove) Myylex(); switch (cm) { case GNUChessGame: @@ -241,6 +242,7 @@ struct { } currentListGame->number = ++gameNumber; currentListGame->offset = offset; + if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } if (currentListGame->gameInfo.event != NULL) { free(currentListGame->gameInfo.event); } @@ -267,6 +269,7 @@ struct { } currentListGame->number = ++gameNumber; currentListGame->offset = offset; + if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = cm; break; default: @@ -291,7 +294,13 @@ struct { ParsePGNTag(yy_text, ¤tListGame->gameInfo); } } while (cm == PGNTag || cm == Comment); - if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } + if(1) { + int btm=0; + if(currentListGame->gameInfo.fen) ParseFEN(boards[scratch], &btm, currentListGame->gameInfo.fen); + else CopyBoard(boards[scratch], initialPosition); + plyNr = (btm != 0); + currentListGame->moves = PackGame(boards[scratch]); + } if(cm != NormalMove) break; case IllegalMove: if(appData.testLegality) break; @@ -306,6 +315,7 @@ struct { } currentListGame->number = ++gameNumber; currentListGame->offset = offset; + if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = MoveNumberOne; } case WhiteCapturesEnPassant: @@ -330,10 +340,9 @@ struct { fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; - CopyBoard(boards[scratch + (plyNr+1&1)], boards[scratch + (plyNr&1)]); plyNr++; - ApplyMove(fromX, fromY, toX, toY, currentMoveString[4], boards[scratch + (plyNr&1)]); - PackMove(fromX, fromY, toX, toY, currentMoveString[4]); + ApplyMove(fromX, fromY, toX, toY, currentMoveString[4], boards[scratch]); + if(currentListGame && currentListGame->moves) PackMove(fromX, fromY, toX, toY, boards[scratch][toY][toX]); break; case WhiteWins: // [HGM] rescom: save last comment as result details case BlackWins: @@ -359,6 +368,9 @@ struct { } while (cm != (ChessMove) 0); + if(currentListGame) { + if(!currentListGame->moves) DisplayError("Game cache overflowed\nPosition-searching might not work properly", 0); + if (appData.debugMode) { for (currentListGame = (ListGame *) gameList.head; currentListGame->node.succ; @@ -369,8 +381,10 @@ struct { PrintPGNTags(debugFP, ¤tListGame->gameInfo); } } + } GetTimeMark(&t2);printf("GameListBuild %d msec\n", SubtractTimeMarks(&t2,&t)); quickFlag = 0; + PackGame(boards[scratch]); // for appending end-of-game marker. DisplayTitle("WinBoard"); rewind(f); yyskipmoves = FALSE;