X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gamelist.c;h=876305529ffdde2f13148f553ab7a2e73dc7235b;hb=e70077aab0199817f37aef9ed0bdba1bbca93b45;hp=4e57cb34bee4fc65eaf1338644e2899050956b19;hpb=ca63c52d91e298f2b7d70535b8e5a923e4f956ac;p=xboard.git diff --git a/gamelist.c b/gamelist.c index 4e57cb3..8763055 100644 --- a/gamelist.c +++ b/gamelist.c @@ -1,7 +1,7 @@ /* * gamelist.c -- Functions to manage a gamelist * - * Copyright 1995, 2009, 2010, 2011 Free Software Foundation, Inc. + * Copyright 1995, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * @@ -42,12 +42,24 @@ #include "frontend.h" #include "backend.h" #include "parser.h" +#include "moves.h" +#include "gettext.h" + +#ifdef ENABLE_NLS +# define _(s) gettext (s) +# define N_(s) gettext_noop (s) +#else +# define _(s) (s) +# define N_(s) s +#endif /* Variables */ List gameList; - +extern Board initialPosition; +extern int quickFlag; +extern int movePtr; /* Local function prototypes */ @@ -212,19 +224,23 @@ int GameListBuild(f) ChessMove cm, lastStart; int gameNumber; ListGame *currentListGame = NULL; - int error; + int error, scratch=100, plyNr=0, fromX, fromY, toX, toY; int offset; - char lastComment[MSG_SIZ]; + char lastComment[MSG_SIZ], buf[MSG_SIZ]; + TimeMark t, t2; + GetTimeMark(&t); GameListFree(&gameList); yynewfile(f); gameNumber = 0; + movePtr = 0; lastStart = (ChessMove) 0; yyskipmoves = FALSE; do { - yyboardindex = 0; + yyboardindex = scratch; offset = yyoffset(); + quickFlag = plyNr + 1; cm = (ChessMove) Myylex(); switch (cm) { case GNUChessGame: @@ -235,6 +251,7 @@ int GameListBuild(f) } 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); } @@ -261,6 +278,7 @@ int GameListBuild(f) } currentListGame->number = ++gameNumber; currentListGame->offset = offset; + if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = cm; break; default: @@ -285,10 +303,19 @@ int GameListBuild(f) ParsePGNTag(yy_text, ¤tListGame->gameInfo); } } while (cm == PGNTag || cm == Comment); - break; + 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; case NormalMove: /* Allow the first game to start with an unnumbered move */ - yyskipmoves = TRUE; + yyskipmoves = FALSE; if (lastStart == (ChessMove) 0) { if ((error = GameListNewGame(¤tListGame))) { rewind(f); @@ -297,28 +324,62 @@ int GameListBuild(f) } currentListGame->number = ++gameNumber; currentListGame->offset = offset; + if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = MoveNumberOne; } + case WhiteCapturesEnPassant: + case BlackCapturesEnPassant: + case WhitePromotion: + case BlackPromotion: + case WhiteNonPromotion: + case BlackNonPromotion: + case WhiteKingSideCastle: + case WhiteQueenSideCastle: + case BlackKingSideCastle: + case BlackQueenSideCastle: + case WhiteKingSideCastleWild: + case WhiteQueenSideCastleWild: + case BlackKingSideCastleWild: + case BlackQueenSideCastleWild: + case WhiteHSideCastleFR: + case WhiteASideCastleFR: + case BlackHSideCastleFR: + case BlackASideCastleFR: + fromX = currentMoveString[0] - AAA; + fromY = currentMoveString[1] - ONE; + toX = currentMoveString[2] - AAA; + toY = currentMoveString[3] - ONE; + plyNr++; + 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: case GameIsDrawn: case GameUnfinished: + if(!currentListGame) break; if (currentListGame->gameInfo.resultDetails != NULL) { free(currentListGame->gameInfo.resultDetails); } - if(yy_text[0] == '{') { char *p; - safeStrCpy(lastComment, yy_text+1, sizeof(lastComment)/sizeof(lastComment[0])); - if(p = strchr(lastComment, '}')) *p = 0; - currentListGame->gameInfo.resultDetails = StrSave(lastComment); + if(yy_text[0] == '{') { + char *p; + safeStrCpy(lastComment, yy_text+1, sizeof(lastComment)/sizeof(lastComment[0])); + if((p = strchr(lastComment, '}'))) *p = 0; + currentListGame->gameInfo.resultDetails = StrSave(lastComment); } break; default: break; } + if(gameNumber % 1000 == 0) { + snprintf(buf, MSG_SIZ, _("Reading game file (%d)"), gameNumber); + DisplayTitle(buf); + } } 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; @@ -330,7 +391,11 @@ int GameListBuild(f) PrintPGNTags(debugFP, ¤tListGame->gameInfo); } } - + } +GetTimeMark(&t2);printf("GameListBuild %ld msec\n", SubtractTimeMarks(&t2,&t)); + quickFlag = 0; + PackGame(boards[scratch]); // for appending end-of-game marker. + DisplayTitle("WinBoard"); rewind(f); yyskipmoves = FALSE; return 0;