]> git.sesse.net Git - pgn-extract/blobdiff - output.c
Store a hash of the previous board, to be able to disambigutate transpositions. ...
[pgn-extract] / output.c
index a17d5b1653cc54c86cc19728560130676478f222..2792bd807fbb043fed42aa7c9fdd68dc941f5442 100644 (file)
--- a/output.c
+++ b/output.c
@@ -36,6 +36,7 @@
 #include "output.h"
 #include "mymalloc.h"
 #include "eco.h"
+#include "farmhash-c.h"
 
 
             /* Functions for outputting games in the required format. */
@@ -1196,15 +1197,18 @@ output_sesse_bin_game(Game current_game,FILE *outputfile,
         return;
     }
 
-    // Find Black and White Elos. Skip games with no Elo.
+    // Find Black and White Elos.
     const char *white_elo_tag = current_game.tags[WHITE_ELO_TAG];
     const char *black_elo_tag = current_game.tags[BLACK_ELO_TAG];
-    if (white_elo_tag == NULL || black_elo_tag == NULL) {
-        return;
+    int white_elo = 0, black_elo = 0;
+    if (white_elo_tag) {
+        white_elo = atoi(white_elo_tag);
     }
-
-    int white_elo = atoi(white_elo_tag);
-    int black_elo = atoi(black_elo_tag);
+    if (black_elo_tag) {
+        black_elo = atoi(black_elo_tag);
+    }
+    int file_num = current_game.file_number;
+    long start_position = current_game.start_position;
 
     // Parse date and time, if it exists. Set invalid dates to year 3000.
     const char *date_tag = current_game.tags[DATE_TAG];
@@ -1228,12 +1232,15 @@ output_sesse_bin_game(Game current_game,FILE *outputfile,
         timestamp = 32503680000;
     }
 
+    uint16_t prev_board_hash = 0;
+
     for (move = current_game.moves; move != NULL; move = move->next) {
         unsigned int opening = move->eco ? move->eco->cumulative_hash_value : 0;  // Truncate to 32 bits.
 
         // key
-        putc(move->bpfen_len, outputfile);
+        putc(move->bpfen_len + sizeof(prev_board_hash), outputfile);
         fwrite(move->bpfen, move->bpfen_len, 1, outputfile);
+        fwrite(&prev_board_hash, sizeof(prev_board_hash), 1, outputfile);
 
         // value
         putc(result_int, outputfile);
@@ -1241,8 +1248,12 @@ output_sesse_bin_game(Game current_game,FILE *outputfile,
         fwrite(&black_elo, sizeof(black_elo), 1, outputfile);
         fwrite(&opening, sizeof(opening), 1, outputfile);
         fwrite(&timestamp, sizeof(timestamp), 1, outputfile);
+        fwrite(&file_num, sizeof(file_num), 1, outputfile);
+        fwrite(&start_position, sizeof(start_position), 1, outputfile);
         putc(strlen((char *)move->move), outputfile);
         fwrite(move->move, strlen((char *)move->move), 1, outputfile);
+
+        prev_board_hash = farmhash_32(move->bpfen, move->bpfen_len);
     }
 }