# Definitions for use of splitindex package: Arrange to use the splitindex
# program instead of makeindex when needed, otherwise to do standard run of
# makeindex.

# John Collins and Ernst Reissner, 2024-09-27.


# Specify extra files that need to be cleaned up when splitindex is in use:
$clean_ext .= " %R-*.ind %R-*.idx %R-*.ilg %R-*.ind";

# Use an internal subroutine to do the processing.  **Important**: Pass the
# name of the source file, etc as arguments obtained by place-holder
# substitution instead of having the subroutine use variables like
# $$Psource.  This is because by default latexmk temporarily changes
# directory to the aux directory before the invoking the command (or
# whatever) specified by $makeindex.  The change of directory is to avoid
# some deficiencies in the standard makeindex program.  See the latexmk
# documentation for further information. After the change of directory, the
# value of $$Psource will typically be wrong. Instead we use placeholders
# for the relevant quantities, since after doing the change of directory,
# latexmk's internal processing adjusts the substitutions for %S, %D etc
# appropriately.  Also, include the string for aux_dir in the arguments, as
# needed for the treatment of dependencies.

$makeindex = 'internal splitindex3 %S %D %Y %R %B %O';

#-------------

sub HaveMultiIdx {
  # Subroutine to test whether (.idx) file has entries of the form given by
  # splitindex package with multiple indexes.
  use strict;
  my $fileName = $_[0];

  # Use a precompiled RE:
  my $patternMultiIndex = qr/^\\indexentry\[[^\]]*\]\{/;

  my $info;
  if (! open $info, '<', $fileName ) {
      die "In splitindex processing, the file '$fileName' was supposed to\n",
          "exist, but I could not read it:\n$!";
      return 0;
  }
  while (my $line = <$info>) {
    if ( $line =~ $patternMultiIndex ) {
      #  We have a multi-index 
      close $info;
      return 1;
    }
  }
  close $info;
  # There was no multi-index:
  return 0;
}

#-------------

sub splitindex3 {
   use strict;
   my ($source, $dest, $auxdir, $root, $base, @opts) = @_;

   if (! HaveMultiIdx($source)) {
      print "Running standard makeindex program:\n";
      return system( "makeindex", @opts, '-o', $dest, $source );
   }
   # Else:
   print "Running splitindex program:\n";
   
   # Ensure dummy file for standard destination file exists, so that
   # latexmk is satisfied that its expectation for the main generated file
   # is satisfied.
   open( my $ind_fh, '>>', $dest );
   close $ind_fh;

   # Arrange to obtain dependency information from splitindex by invoking
   # it in a verbose mode, and redirecting its output to the standard .ilg
   # file, and later parsing it for the relevant lines.
   my $ilg = $dest;
   $ilg =~ s/\.[^\.]+$/\.ilg/;
   my $ret2 = system "splitindex -v -v \"$source\" >> \"$ilg\"";
   if ($ret2) { return $ret2;}

  
   my $ilg_fh;
   if (! open( $ilg_fh, '<', $ilg ) ) {
       warn "In sub splitindex, could not read '$ilg'\n";
       return 1;
   }
   while (<$ilg_fh>) {
       if ( /^New index file (.*)\s*$/ ) {
            # .idx file generated by splitindex
          my $idx = $1;
            # Ensure path to idx file is correct if we've done the change of
            # directory caused by the setting of $makeindex_fudge:
          if ($makeindex_fudge) { $idx = $auxdir.$idx; }
            # In addition to the .idx files that the splitindex program
            # reports that it generates, there are corresponding .ind files
            # generated by the instances of makeindex that are invoked by
            # splitindex.  These are important to latexmk's knowledge of
            # the network of dependencies because they are read in by the
            # next run of *latex.
          my $ind = $idx;
          $ind =~ s/\.idx$/\.ind/;
          print  "splitindex generated files '$idx' '$ind'\n";
          rdb_add_generated( $ind, $idx );
       }
   }
   close $ilg_fh;
   return $ret2;
}

#-------------