*/
static unsigned RAV_level = 0;
+/* At what file position the current game started. */
+static long game_start_position = -1;
+
/* Retain details of the header of a game.
* This comprises the Tags and any comment prefixing the
* moves of the game.
static void free_comment_list(CommentList *comment_list);
static void DealWithEcoLine(Move *move_list);
static void DealWithGame(Move *move_list);
-static Boolean finished_processing(void);
+static Boolean finished_processing(SourceFileType file_type);
/* Initialise the game header structure to contain
* space for the default number of tags.
* Conditions for finishing processing, other than all the input
* having been processed.
*/
-static Boolean finished_processing(void)
+static Boolean finished_processing(SourceFileType file_type)
{
- return (GlobalState.matching_game_number > 0 &&
- GlobalState.num_games_matched == GlobalState.matching_game_number);
+ return ((file_type != ECOFILE && at_end_of_input()) ||
+ (GlobalState.matching_game_number > 0 &&
+ GlobalState.num_games_matched == GlobalState.matching_game_number));
}
static void
ParseOptGameList(SourceFileType file_type)
{ Move *move_list = NULL;
- while(ParseGame(&move_list) && !finished_processing()){
+ while(ParseGame(&move_list) && !finished_processing(file_type)){
if(file_type == NORMALFILE){
DealWithGame(move_list);
}
{
restart_lex_for_new_game();
RAV_level = 0;
+ game_start_position = get_position();
}
/* Discard any data held in the GameHeader.Tags structure. */
current_game.moves_checked = FALSE;
current_game.moves_ok = FALSE;
current_game.error_ply = 0;
+ current_game.file_number = GlobalState.current_file_number;
+ current_game.start_position = game_start_position;
/* Determine whether or not this game is wanted, on the
* basis of the various selection criteria available.
int
yyparse(SourceFileType file_type)
{
+ if(file_type != ECOFILE) {
+ if(!seek_to_begin()) {
+ return 1;
+ }
+ }
setup_for_new_game();
current_symbol = skip_to_next_game(NO_TOKEN);
ParseOptGameList(file_type);
/* Ok -- EOF. */
return 0;
}
- else if(finished_processing()) {
+ else if(finished_processing(file_type)) {
/* Ok -- done all we need to. */
return 0;
}