#!/bin/sh
#!perl -w # --*- Perl -*--
eval 'exec perl -x $0 ${1+"$@"}'
    if 0;
#------------------------------------------------------------------------------
#$Author: andrius $
#$Date: 2019-11-06 09:47:27 -0500 (Wed, 06 Nov 2019) $ 
#$Revision: 38 $
#$URL: svn://saulius-grazulis.lt/mkdepend/trunk/mktexdepend $
#------------------------------------------------------------------------------
#*
#  Create dependencies for TeX files
#**

use strict;
use File::Basename qw(basename);

sub find_file($)
{
    my ($file_base) = @_;

    my @inputs = map { -d $_ ? $_ : () }
                 split( ":", (exists $ENV{TEXINPUTS}
                                   ? $ENV{TEXINPUTS} : "" ) );
    my $inputs = join( " ", @inputs );
    $inputs = "." unless $inputs;

    my $include_file;
    if( $file_base !~ m,/,) {
        $include_file = `find ${inputs} -name "$file_base" | sort | head -n1`;
    } else {
        $include_file = $file_base;
    }

    if( !defined $include_file || $include_file eq "" ) {
        $include_file = $file_base;
    } else {
        chomp( $include_file );
    }
    return $include_file;
}

my @files = @ARGV;
@files = (undef) if !@files;

foreach( @files ) {
    my $main_file = (defined $_ ? $_ : "-");
    my $filename = $_;
    my $basename = basename( $main_file, ".tex", ".ltx" );
    my %dependencies = map { $_->{target} . ": " . $_->{source} => 1 }
                           recursive_depend( $main_file,
                                             "${basename}.dvi",
                                             $filename );
    print map {"$_\n"} sort keys %dependencies;
}

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

sub recursive_depend
{
    my( $main_file, $target, $filename ) = @_;

    my @recursive = ();
    my @dependencies = ();

    my $fh;
    my $basename;

    if( $filename ) {
        open( $fh, $filename ) or do {
            warn( "$0: could not open file '$filename'\n" .
                      "(included from '$main_file') " .
                      "for input:\n$!" );
                return ();
        };
        $basename = basename( $filename, ".tex" );
    } else {
        $fh = *STDIN;
        $basename = "-";
    }

    while( <$fh> ) {
        next if /^\s*%|^\s*$/;
        if( /\\(input|include)\{([^\}\#]*)\.(tex|pstex_t)\}/ ) {
            my $file = find_file( "$2.$3" );
            push( @dependencies, { target => $target,
                                   source => $file } );
            push( @recursive, "${file}" ); 
        }
        elsif( /\\(input|include)\{([^\}\#]*)\}/ ) {
            my $file = find_file( $2 . ".tex" );
            push( @dependencies, { target => $target,
                                   source => $file } );
            push( @recursive, "${file}" );
        }
        elsif( /\\(verbatiminput)\{([^\}\#]*)\}/ ) {
            my $file = find_file( "$2" );
            push( @dependencies, { target => $target,
                                   source => $file } );
        }
        elsif( /\\lstinputlisting(\[[^\]]*\])?\{([^\}\#]*)\}/ ) {
            push( @dependencies, { target => $target,
                                   source => find_file( $2 ) } );
        }
        if( /\\(bibliography)\{([^\}\#]*)\}|
             \\(referencelist)\[([^\]\#]*)\]/x ) {
            my @files = map { find_file( "$_.bib" ) }
                        split( ',', defined $2 ? $2 : $4 );
            push( @dependencies, { target => $target,
                                   source => "${basename}.bbl" } );
            foreach( @files ) {
                push( @dependencies, { target => "${basename}.bbl",
                                       source => $_ } );
            }
        }
        if( /figure=([^\}\#,]*)[\},]/ ) {
            my $file = find_file( $1 );
            push( @dependencies, { target => $target,
                                   source => $file } );
        }
        if( /( (\\includegraphics.*\{)|
               (fill\ *overzoom\ *image=) )
                    ([^\}\#,\]]*)[\]\},]/x ) {
            my $file = find_file( $4 );
            push( @dependencies, { target => $target,
                                   source => $file } );
            if( $file =~ /(.*)\.gz$/ ) {
                my $bb_file = $1 . ".bb";
                push( @dependencies, { target => $target,
                                       source => $bb_file } );
            }
        }
    }
    close($fh);
    for (@recursive) {
        @dependencies = ( @dependencies,
                          recursive_depend( $filename, $target, $_ ) );
    }
    return @dependencies;
}
