/* Protector -- a UCI chess engine Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _pgn_h_ #define _pgn_h_ #include typedef struct { long *index; long indexSize; long numGames; FILE *file; } PGNFile; #define PGN_ROASTERLINE_SIZE 256 typedef struct { Square from, to; Piece newPiece; Position position; void *previousMove; void *nextMove; void *alternativeMove; char *comment, *glyphs; } Gamemove; typedef struct { char event[PGN_ROASTERLINE_SIZE]; char site[PGN_ROASTERLINE_SIZE]; char date[PGN_ROASTERLINE_SIZE]; char round[PGN_ROASTERLINE_SIZE]; char white[PGN_ROASTERLINE_SIZE]; char black[PGN_ROASTERLINE_SIZE]; char result[PGN_ROASTERLINE_SIZE]; char setup[PGN_ROASTERLINE_SIZE]; char fen[PGN_ROASTERLINE_SIZE]; char whiteTitle[PGN_ROASTERLINE_SIZE]; char blackTitle[PGN_ROASTERLINE_SIZE]; char whiteElo[PGN_ROASTERLINE_SIZE]; char blackElo[PGN_ROASTERLINE_SIZE]; char eco[PGN_ROASTERLINE_SIZE]; char nic[PGN_ROASTERLINE_SIZE]; char timeControl[PGN_ROASTERLINE_SIZE]; char termination[PGN_ROASTERLINE_SIZE]; char *moveText; Gamemove *firstMove, *lastMove; Gamemove moveHeap[1024]; int nextMoveFromHeap; } PGNGame; /** * Open the PGN file specified by 'filename'. * * @return 0 if the file could be opened without any error */ int openPGNFile(PGNFile * pgnfile, const char *filename); /** * Close the PGN file specified by 'pgnfile'. */ void closePGNFile(PGNFile * pgnfile); /** * Get the PGNGame specified by 'number'. * * @param number the number of the game to be loaded [1...pgnfile.numGames] * @param pgngame the struct supposed to contain the game data. It is * important to free the memory allocated for the game moves as * soon as the pgngame is no longer needed. * * @return 0 if no errors occured */ PGNGame *getGame(PGNFile * pgnfile, int number); /** * Initialize the specified PGNGame. */ void initializePGNGame(PGNGame * game); /** * Free all memory allocated for the specified pgn game. */ void resetPGNGame(PGNGame * game); /** * Free all memory allocated for the specified pgn game * (including the game itself). */ void freePgnGame(PGNGame * game); /** * Generate the SAN notation of the specified move. */ void generateMoveText(Variation * variation, const Move move, char *pgnMove); /** * Get the current principal variation of the specified variation. * * @return a newly allocated string */ char *getPrincipalVariation(const Variation * variation); /** * Generate the pgn text of the specified game. */ char *generatePgn(PGNGame * game); /** * Initialize a variation with the specified game. */ void initializeVariationFromGame(Variation * variation, PGNGame * game); /** * Initialize a game with the specified variation. */ void initializeGameFromVariation(const Variation * variation, PGNGame * game, bool copyPv); /** * Convert a gamemove to a move. */ Move gameMove2Move(const Gamemove * gamemove); /** * Interpret the given pgn move and return an appropriate Move. */ Move interpretPGNMove(const char *moveText, PGNGame * game); /** * Append the specified move to the specified game. If the move * is found to be illegal this call has no effect on the game and * a nonzero value will be returned. * * @return 0 if and only if the specified move was legal */ int appendMove(PGNGame * game, const Move move); /** * Take back the last move of the specified game. */ void takebackLastMove(PGNGame * game); /** * Initialize this module. * * @return 0 if no errors occurred. */ int initializeModulePgn(void); /** * Test this module. * * @return 0 if all tests succeed. */ int testModulePgn(void); #endif