#!/usr/bin/perl -w
use strict;

my $VERSION="0.6";
my $DATE="04.09.2007";
print "Guard $VERSION ($DATE) for latex files by Georg Martius\n";

my $Dateiname=$ARGV[0];
$Dateiname or die "Dateinamen angeben!";
if($Dateiname=~/(.*)\./){ #Endung abschneiden
    $Dateiname=$1 if (!($1 =~//));
}
$Dateiname or die "Dateinamen angeben!";


my ($i,$temp);

################################################
#default einstellungen laden
# aus $HOME/.guardrc oder /etc/guardrc
my $cfgfile= $ENV{"HOME"} . "/.guardrc";

if(!open(F,"< $cfgfile")){
    if(open(F,"< /etc/guardrc")){
	$cfgfile="/etc/guardrc";

    }else{
    ################### DUMP personal file
  	  system("echo -e \"editor=nedit\\ntime=1\\ngv=gv\\ngvsize=720x800\\ngvpos=500+0\" > $cfgfile");
	  
    }
}
close(F);

#############################################
# load settings
open(F,"< $cfgfile") or die "cannot load $cfgfile";
my @cfgdate=<F>;
my %Settings;
close(F);
foreach $temp (@cfgdate)  {
    if($temp=~/(.*)=(.*)/){
	if (!($1=~//)){
	    $Settings{"$1"}="$2";
	}
    }
}


#Pruefen ob Tex-File da ist, ansonsten anlegen
if(!(open(F,"< $Dateiname.tex"))){
    if(open(F,"< template.tex")){
      system("cat 'template.tex'>$Dateiname.tex");
  }else{
      system("touch $Dateiname.tex");
  }
}else{
    close(F);
}

my $IsGV=1;

my @DependFiles=&GetRecDependendies($Dateiname . ".tex");
my $DepAnzahl=$#DependFiles;

my @FileData; # enthaelt jeweils letzte Daten der Datei
my $MomData;  # enthaelt  Daten der momentanen Datei
my $test=0;

&printDepFiles(@DependFiles);

system($Settings{"editor"} ." $Dateiname.tex & ");
my $counter=0;
while (1){
    $counter++;
    
    for($i=0;$i<=$DepAnzahl;$i++){
	$MomData= &getfiledata($DependFiles[$i]);
	if(!$FileData[$i] || ($MomData cmp $FileData[$i])!=0){
	    print("\nFile $DependFiles[$i] was modified ($MomData)");
	    $FileData[$i]=$MomData;      
	    $test=1;      
	}    
    }
    #aller 120 Sekunden mal schauen, 
    # ob denn nicht eine neue Datei included wurde.
    if ($counter>120){
	@DependFiles=&GetRecDependendies($Dateiname . ".tex");
	if($DepAnzahl != $#DependFiles){
	    &printDepFiles(@DependFiles);
	};
	$DepAnzahl = $#DependFiles;
	$counter=0;
    }
    
    if ($test){#Texlauf starten
		   $test=0;
		   system("echo -e '\nlatex now\n**********************************************************************\n**********************************************************************'");
		   $temp="echo \"q\" | latex -interaction=errorstopmode $Dateiname.tex &&  dvips -D 600 -o $Dateiname.ps $Dateiname.dvi && echo -e \"\a\" && cp $Dateiname.ps $Dateiname.gv.ps";
		   system($temp);

	       }
    #pruefen ob GV schon offen und PS-File da
    if($IsGV && open(F,"< $Dateiname.gv.ps")){
	system($Settings{"gv"} . " -geometry " .  $Settings{"gvsize"} . "+" . $Settings{"gvpos"} . " $Dateiname.gv.ps & ");
	$IsGV=0;
    }
    sleep($Settings{"time"});
}




################################################################################
#gibt rekursiv alle Dependendies einer Datei zurueck (Parameter: Dateiname)
sub GetRecDependendies{
    my $fileName=$_[0]; 
    my @depFiles=&GetRecDepHelper($fileName);
    return ($fileName,@depFiles);
}
sub GetRecDepHelper{
    my $fileName=$_[0]; 
    my @depFiles=&GetDependendies($fileName);
    my @collected=@depFiles;
    my $f;
    foreach $f (@depFiles) {
	@collected=(@collected,&GetRecDepHelper($f));
    }
    return @collected;
}


################################################################################
#gibt Dependendies einer Datei zurueck (Parameter: Dateiname)
sub GetDependendies{
    my $fileName=$_[0];
    my @DependFiles;
    # check whether it is a tex-file or not
    if($fileName =~ /.*\.tex$/) {
	my $OpenString="< ". $fileName; 
	
	open(TEXFILE,$OpenString);
	my @datei=<TEXFILE>;
	my $line;  
	
	
	foreach $line (@datei){
	    if ($line =~ /^[^%].*input{(.*?)}/){ #\input ohne Kommentar 
		$DependFiles[$#DependFiles+1]=$1 ;
	    }
	    if ($line =~ /^[^%].*include{(.*?)}/){ #\include ohne Kommentar 
		$DependFiles[$#DependFiles+1]=$1;
	    }
	    if ($line =~ /^[^%].*includegraphics{(.*?)}/){ #\includegraphics ohne Kommentar
		$DependFiles[$#DependFiles+1]=$1;
	    }
	    if ($line =~ /^%.*GUARD{(.*?)}/){ #\expliciter Guard im Kommentar 
		$DependFiles[$#DependFiles+1]=$1 ;
	    }
	    
	}
	
	close(TEXFILE);
    }
    # in @DependFiles stehen jetzt alle zu ueberwachenden Dateien drin
    return @DependFiles; #Rueckgabe
}


sub getfiledata {
    my $file;
    my @data;
    $file = $_[0];
    if (!$file) { return "no file";}
    @data =  stat("$file");
    my $ending;
    if($data[9]){
	return "$data[9],$data[12]";
    }else{ # no file -> maybe with .tex,.eps or .png
	foreach $ending (".tex", ".eps",".png") {
	    @data =  stat($file . $ending);
	    if($data[9]){		
		return "$data[9],$data[12]";
	    }
	}
    }
    return "no file";
}

sub printDepFiles {
    print("\nI will looking for following files:\n");
    my $f;
    foreach $f (@_){
	print "#$f#\n";
    }
}
