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

my $Dateiname=$ARGV[0];
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);
}
system($Settings{"editor"} ." $Dateiname.tex & ");

my $IsGV=1;

my @DependFiles=&GetDependendies($Dateiname);
my $DepAnzahl=$#DependFiles;

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

print("\nI will looking for following files:");
for($i=0;$i<$DepAnzahl+1;$i++){
  print "\n$i $DependFiles[$i]";
  $FileData[$i]='';
}


my $counter=0;
while (1){
    $counter++;
    
    for($i=0;$i<=$DepAnzahl;$i++){
	$MomData=&getfiledata($DependFiles[$i]);
	if(($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=&GetDependendies($Dateiname);
	$DepAnzahl=$#DependFiles;
	$counter=0;
    }
    
    if ($test){#Texlauf starten
		   $test=0;
		   system("echo 'latex now ***********************************************************************************************************'");
		   $temp="echo \"q\" | pdflatex -interaction=errorstopmode $Dateiname.tex && pdf2ps $Dateiname.pdf $Dateiname.ps && echo -e \"\a\"";
		   system($temp);
	       }
    #pruefen ob GV schon offen und PS-File da
    if($IsGV && open(F,"< $Dateiname.ps")){
	system($Settings{"gv"} . " -geometry " .  $Settings{"gvsize"} . "+" . $Settings{"gvpos"} . " $Dateiname.ps & ");
	$IsGV=0;
    }
    sleep($Settings{"time"});
}


##########################################################################################################
#gibt Dependendies zurueck (als Parameter Dateiname)
sub GetDependendies{
    
    my $OpenString="< ". $_[0] .".tex"; 
    my @DependFiles;
    $DependFiles[0]=$_[0].".tex";

    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;
	}
	
    }
    
    close(TEXFILE);
    # in @DependFiles stehen jetzt alle zu ueberwachenden Dateien drin
    return @DependFiles; #Rueckgabe
}


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

