]> git.sesse.net Git - pgn-extract/blobdiff - grammar.c
Push through a computer/human flag to the binary output.
[pgn-extract] / grammar.c
index 85540c17f7a065c338dc574a8cf239c56eff844f..73bad6b563dd58cc4ca09b8649c89ba9ccf01884 100644 (file)
--- a/grammar.c
+++ b/grammar.c
@@ -48,6 +48,9 @@ static TokenType current_symbol = NO_TOKEN;
  */
 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.
@@ -80,7 +83,7 @@ static void check_result(char **Tags,const char *terminating_result);
 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.
@@ -233,17 +236,18 @@ select_output_file(StateInfo *GameState,const char *eco)
    * 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);
         }
@@ -655,6 +659,7 @@ setup_for_new_game(void)
 {
     restart_lex_for_new_game();
     RAV_level = 0;
+    game_start_position = get_position();
 }
 
         /* Discard any data held in the GameHeader.Tags structure. */
@@ -822,6 +827,8 @@ DealWithGame(Move *move_list)
     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.
@@ -992,6 +999,11 @@ DealWithEcoLine(Move *move_list)
 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);
@@ -999,7 +1011,7 @@ yyparse(SourceFileType file_type)
         /* Ok -- EOF. */
         return 0;
     }
-    else if(finished_processing()) {
+    else if(finished_processing(file_type)) {
         /* Ok -- done all we need to. */
        return 0;
     }