+
+sub read_openings {
+ open my $fh, "../openings.txt"
+ or die "../openings.txt: $!";
+ for my $line (<$fh>) {
+ chomp $line;
+ my ($hash, $eco, $opening, $variation, $subvariation) = split /\t/, $line;
+ if ($variation eq '') {
+ $openings{$hash} = $eco . ": " . $opening;
+ } else {
+ $openings{$hash} = $eco . ": " . $opening . ": " . $variation;
+ }
+ }
+ close $fh;
+}
+
+sub read_root_pgn {
+ my @pgnnames;
+ open my $pgnnamesfh, "<", "../pgnnames.txt"
+ or die "../pgnnames.txt: $!";
+ while (<$pgnnamesfh>) {
+ chomp;
+ push @pgnnames, $_;
+ }
+ close $pgnnamesfh;
+
+ if ($pgn_file_number > $#pgnnames) {
+ die "Unknown PGN file number $pgn_file_number";
+ }
+
+ my $root_pgn;
+ open my $pgnfh, "<", "../" . $pgnnames[$pgn_file_number]
+ or die $pgnnames[$pgn_file_number] . ": $!";
+ sysseek($pgnfh, $pgn_start_position, 0)
+ or die "Could not seek to $pgn_start_position: $!";
+ sysread($pgnfh, $root_pgn, 32768)
+ or die "Could not read PGN from $pgn_start_position at $pgnnames[$pgn_file_number]: $!";
+ close $pgnfh;
+ $root_pgn =~ s/^.*?(\[Event )/$1/s;
+ $root_pgn =~ s/^(.+?)\[Event .*/$1/s;
+
+ return $root_pgn;
+}