#/usr/bin/perl -w
###############################################################################
# Perl-skripti harjoitustyon ottamiseksi WWW:sta tai laittamiseksi sinne
#
# Kutsun syntaksi:
#   lue.pl KOMENTO ohjetiedosto kone kayttaja kurssi [comps-hakemisto] [passwd]
#
#   Esim:
#
#   perl lue.pl GET files.txt www.jyu.fi vesal gko
#     - hakee ensin tiedoston http://www.jyu.fi/~vesal/gko/files.txt
#        ja sitten sen ohjeiden mukaan tekee paikalliselle levylle
#        tarvittavat alihakemistot ja hakee sitten tarvittavat tiedostot
#        Jos koneen nimen perässä on polku, niin mitään ei lisätä
#        Eli esim:
#   perl lue.pl GET files.txt www.it.jyu.fi/users/vesal/gko
#     - hakee ensin tiedoston
#        http://www.it.jyu.fi/users/vesal/gko/files.txt
#        ja sitten sen ohjeiden mukaan tekee paikalliselle levylle
#        tarvittavat alihakemistot ja hakee sitten tarvittavat tiedostot
#   perl lue.pl FTP files.txt www.jyu.fi vesal gko
#     - lukee paikallisen levyn oletushakemistosta tiedoston
#        files.txt ja sen ohjeiden mukaan kopioi paikalliselta levylta
#        ftp:lla tiedostoja www.jyu.fi-koneessa käyttäjän vesal kotihakemisto
#        ja sen alla www/gko hakemistoon luoden tarvittaessa uusia
#        hakemistoja
#        Tekee lisäksi saman kuin HTML
#   perl lue.pl HTML files.txt tukki vesal gko
#     - lukee paikallisen levyn oletushakemistosta tiedoston
#        files.txt ja tekee siitä tiedostot files.html ja index.html, jotka
#        kopioidaan ftp:lla tukki-koneeseen käyttäjän vesal kotihakemistoon
#        hakemistoon www/gko.
#   perl lue.pl HTML files.txt tukki vesal gko comps -
#     - lukee paikallisen levyn oletushakemistosta tiedoston
#        files.txt ja tekee siitä tiedostot files.html ja index.html, joita
#        ei kopioida mihinkään muualle, sillä salasanana on -
#
#   perl lue.pl PUREHTML files.txt tukki vesal gko srcreplacement
#     - lukee paikallisen levyn oletushakemistosta tiedoston
#        files.txt ja tekee siitä tiedostot files.html ja index.html, joita
#        ei kopioida mihinkään muualle
#       srcreplacement on hakemiston nimi, jolla java-tiedostoissa oleva src
#       merkkijono korvataan (jos src halutaa poistaa, on tämä tyhjä, jos säilyttää, niin src/)
#
#   perl lue.pl COPY files.txt w: vesal gko
#     - lukee paikallisen levyn oletushakemistosta tiedoston
#        files.txt ja tekee siitä tiedostot files.html ja index.html, ja
#        kopioi ne paikkaa w:\gko
#
#   perl lue.pl SVN files.txt
#     - lukee paikallisen levyn oletushakemistosta tiedoston
#        files.txt ja lisää sen mukaan kaikki siinä olevat tiedostot
#       oletushakemiston
#        kopioi ne paikkaa w:\gko
#
#   Javadoc tehdään javadoc -ohjelmalla ja sen on oltava polussa
#   jos files.txt:ssä on .java -tiedostoja
#   c# doc tehdään doxygen-ohjelmalla ja sen on oltava polussa
#   jos on .cs-tiedostoja.  doxyfile-tiedostossa on ohjeet dokumentin
#   tekoon.  doxyfile-tiedostoa etsitään oletushakemistosta ylöspäin.
#   Oletushakemistoa lähintä doxyfile-tiedostoa käytetään.
#   Jos doxyfile tiedostoa ei löydy, käytetään lue.pl:n hakemistosta
#   löytyvää versiota.
#   doxyfile-tiedostossa voidaan (ja kannattaa) ottaa mukaan
#   d.dox tiedosto joka generoidaan lue.pl ajossa.
#
#   Jos tiedoston nimi on muotoa (files.tx:n sijaan) nimiN.txt
#   (missä N on luku)
#   niin tulostiedostot ovat vastaavasti filesN.html, indexN.html
#   Esim. files2.txt => files2.html ja index2.html
#
# Tiedoston files.txt muoto on yksinkertaisimmillaan:
#    oma/tiedosto.c   = kommentti
#    oma/ali/ali.c    = kommentti 2
#
# Tahan voidaan lisata myos koristeita,
#  =--             => WWW-sivulle <hr>, eli viiva
#  = Otsikko => WWW-sivulle Pelkastaan teksti Otsikko
#
#    =------------------------------
#    = Otsikko
#    =------------------------------
#    oma/tiedosto.c   = kommentti
#    oma/ali/ali.c    = kommentti 2
#    =------------------------------
#
# Huom!  =-merkin jälkeen on oltava välilyönti tai - (jos piirretään hr)
#
# Jos tiedostoon halutaan linkki, se voidaan tehdä tyyliin:
#
#    @https://trac.cc.jyu.fi/projects/ohj2k11/wiki/suunnitelmat/vesal=Suunnitelma Wikissä
#
# tai yksi linkki tyyliin
#    !https://trac.cc.jyu.fi/projects/ohj2k11/wiki/suunnitelmat/vesal=Suunnitelma Wikissä
#
# jolloin tästä linkistä tulee framen oletuslinkki (näkyy framessa oletuksena).
# Muuten oletuslinkkinä on 1. löytynyt tiedosto
#
# Jos kommenttiosa on pelkkä linkki tyyliin:
#
#  = http://user.jyu.fi/~vesal
#
# niin se muutetaan linkiksi.  Jos rivillä on muuta, ei muuteta linkiksi.
#
# Jos projektiin tarvitaan esim. muiden tekemia komponentteja, niin
# nehan tietysti luetaan aivan jostakin muusta paikasta ja niita
# ei kirjoiteta FTP-komennossa takaisin (ei me pilata muiden tekemia).
# Talloin files.txt voisi olla esimerkiksi:
#
#    =--------------------
#    =Delphi työ
#    =--------------------
#    delphi/vespacad.dpr    = projektitiedosto VespaCadia varten
#    delphi/vespacadf.dfm   = päälomake
#    delphi/vespacadf.pas   = lähdekoodi
#    =--------------------
#    =Muut tarvittavat komponentit
#    =--------------------
#    $DESTINATION=$COMPS
#    $SOURCEPATH=http://www.mit.jyu.fi/~vesal/kurssit/winohj/winohj/delphi/comps/editpnl/
#    savepos.pas = komponentti paikan tallettamiseksi
#    SavePos.dcr = komponentin kuvake
#
# Selityksia files.txt -tiedostosta
#   tiedoston nimi= suhteellinen nimi nykyiseen $SOURCEPATH-muuttujaan
#                    ja paikallisen levyn hakemistoon verrattuna.
#                    Oletuksena $SOURCEPATH riippuu konetorivin parametreista.
#                    Eli esimerkissa luetaan
#                    (komento: GET, tiedosto: delphi/vespacadf.pas)
#                      http://www.jyu.fi/~vesal/gko/delphi/vespacadf.pas
#                    -tiedosto, luodaan paikalliselle levylle delphi
#                    niminen alihakemisto ja kopioidaan tiedosto sinne.
#                    Vastaavasti FTP-komennolla otetaan paikallisen levyn
#                    tiedosto delphi/vespacadf.pas ja kirjoitetaan se
#                    www.jyu.fi-koneessa kayttajan vesal kotihakemistosta
#                    alkaen tiedostoksi www/gko/delphi/vespacad.pas
#
#   $DESTINATION  = paikallisen levyn hakemisto, jonne tiedosto laitetaan
#                    Apumuuttuja $COMPS on komentorivilta annetun
#                    comps-hakemiston arvo (pitaa sisaltaa /-merkki lopussa).
#                    Oletuksena comps-hakemisto on ../comps/
#   $SOURCEPATH   = www-polku, joka lisataan seuraavien tiedostojen nimien
#                    eteen kun tiedostoa haetaan WWW:sta.
#                    Oletuksena tama on tyhja.  Ja jos kirjoitetaan
#                    $SOURCEPATH =, palataan kayttamaan alkuperaista hakemistoa
#                    joka maaraytyy komentorivin parametreista
#                    Ne tiedostot, joiden aikana $SOURCEPATH on epatyhja, ovat
#                    ReadOnly-tiedostoja, eli niita ei kopioda FTP-komennolla
#                    takaisin verkkoon.        $SOURCEPATH ja $DESTINATION voidaan
#                    muuttaa kuinka monta kertaa tahansa, ja ne vaikuttavat
#                    seuraavaan muutokseen saakka.
#
# Kayttovinkkeja:
# ================
#
# A. Aloitus ja tallettaminen
# ----------------------------
#  1) kirjoita paikalliselle levylle tiedosto files.txt
#  2a)anna komento:
#        perl lue.pl FTP files.txt www.jyu.fi vesal gko
#     (Tietenkin korvaten www.jyu.fi, vesal ja gko vastaavilla koneen nimella,
#     omalla tunnuksellasi ko. koneessa ja kurssin nimella).
#  2b)anna komento
#        perl lue.pl COPY files.txt w: vesal gko
#  3) Nain sinulle syntyy www.jyu.fi-koneeseen hakemisto www/gko ja sen alle
#     tarvittavat alihakemistot.  Hakemistoon gko tulee tiedostot
#     files.html ja index.html, joilla tiedostojasi voi selata kivasti.
#  4) Kun jatkossa lisaat uusia tiedostoja projektiisi tai paivitat
#     vanhoja, niin tarpeen mukaan muutat paikallisessa koneessa
#     (siis kayttamassasi mikrossa) tiedostoa files.txt tarpeen mukaan.
#     Sitten annat aina kohdassa 2) mainitun komennon
#
# B. Tyon jatkaminen toisessa koneessa
# ------------------------------------
#  1) siirry paikallisessa koneessa omaan hakemistoosi, esim
#        d:\omat\vesal\gko
#  2a)anna komentorivilta komento
#        perl lue.pl GET files.txt www.jyu.fi vesal gko
#     (Tietenkin taas korvaten nimet vastaavilla)
#  2b)anna komentorivilta komento
#        perl lue.pl GET files.txt www.infotec.jyu.fi/users/vesal/gko
#     (Tietenkin taas korvaten nimet vastaavilla)
#  3) Jatkat ohjelmointia ja lopettaessasi annat komennon kohdasta A.2)
#
# C. Helpottaminen
# ----------------
#  1) Jos osaat yhtaan kirjoittaa DOS-komentoja  .bat -tiedostoon, niin
#     kirjoitat itsellesi komento ht.bat:
#        lue.pl %1 files.txt www.jyu.fi vesal gko
#  2) Lukeminen:
#        ht GET
#  3) Tallettaminen:
#        ht FTP
#
# D. Harjoitustyon nayttaminen
# -----------------------------
#  1) Kun saavut nayttamaan harjoitustyotasi kerro ohjaajalle
#      a) tunnuksesi (esim. vesal)
#      b) koneen nimi (esim. www.jyu.fi)
#      c) kurssin tunnus (esim. gko)
#
# Vesa Lappalainen
#  26.5.1999
#   5.8.1999
# 26.10.1999
#  + luodaan kurssihakemisto www-koneeseenkin jos se puuttuu
# 30.10.1999
#  + vaihdettu käyttämään vlftplib.pl, koska alkup. ftplib.pl ei
#    osannut binääristä siirtoa :-(
# 27.12.1999
#  + salasana - katkaisee lopun skriptin suorituksen
# 19.11.2000
#  + COPY - komento
#  + PUREHTML -komento
#  + GET-komentoon / tulkinta estämään polun muokkaus
#  + Tuotettu HTML paremmin kelpaamaan validaattorille
#  + hakemisotn nimen pakkomuuttaminen pieneksi poistettu =>
#    PITÄÄ olla huolellinen hakemistojen nimiä kirjoitettaessa
#
# 27.12.2000
#  + COPY luo kaikki tarvittavat kohdepolussa olevat hakemistot
#
# 20.1.2001
#  + tulostetaan <br>:iä kommenttirivien perään
#  + tarkistetaan paremmin milloin lisätään http: ja milloin ei
#
# 27.1.2001
#  + muuttaa välilyönnilliset tiedoston nimet linkeissä muotoon %20
#    myös % muuteteen %25
#  + tekee myös FTP:llä tarvittavat alihakemistot ennen siirtoa
#
# 12.1.2003  Heikki Kainulainen
#  + tekee java-koodista javadocin ja sorsat html-muotoon
#    käytetään ohjelmaa java2html (http://www.java2html.com)
#
# 27.1.2011  Vesa Lappalainen
#  + tekee .cs tiedosta doxygen dokut ja linkit vastaavasti
#
###############################################################################
# require('vlftplib.pl');  # siirretty vain niihin kohti, joissa tarvitaan

use strict;

###############################################################################
sub trim($) { # merkkijono => merkkijono
  my($s) = @_;
# Poistetaan merkkijonosta alkutyhjat, lopputyhjat ja rivinvaihdot (lopusta)
# Esim. "   kissa istuu\n   "  => "kissa istuu"
  $s =~ s/^\s*//;      # alkutyhjat
  $s =~ s/\s*$//;      # lopputyhjat (myös rivinvaihdot)
# s/^\s*(.*?)\s*$/\1/;
  return $s;
}

###############################################################################
sub ToHtmlName($) { # merkkijono => merkkijono
  my($s) = @_;
# Poistetaan merkkijonosta alkutyhjat, lopputyhjat ja rivinvaihdot (lopusta)
# Esim. "   kissa istuu\n   "  => "kissa istuu"
  $s =~ s/%/%25/g;        # välilyönnit
  $s =~ s/ /%20/g;        # välilyönnit
  return $s;
}

###############################################################################
sub CheckHTTP($) { # merkkijono => merkkijono
  my($s) = @_;
# Jos jonossa ei ole http://, niin se lisätään
# Samoin loppu / jos se puuttuu
# Esim. "www.mit.jyu.fi/~vesal"  => "http://www.mit.jyu.fi/~vesal/"
# Tyhjästä jonosta palautetaan tyhjä jono
#
  if ( $s eq "" ) { return $s; }
  if ( !( $s =~ /\/$/ ) ) { $s = "$s/"; }
  if ( !( $s =~ /^http:/ ) ) {
    if ( !( $s =~ /^\// ) ) { $s = "/$s"; }
    if ( !( $s =~ /^\/\// ) ) { $s = "/$s"; }
    $s = "http:$s";
  }
  return $s;
}

use Time::localtime;
use File::stat;

###############################################################################
sub GetWWWFileDate($) # => mtime
#------------------------------------------------------------------------------
# Hakee WWW-tiedoston päiväyksen
# Esim: GetWWWFileDate('http://www.jyu.fi/~vesal/gko/delphi/vespacadf.dfm')
###############################################################################
{
  my ($url) = @_;
  $url        = ToHtmlName(trim($url));


  require LWP;
  # Create the user agent object
  my $ua =new LWP::UserAgent;

  # Set up a request.  We will use the same request object for all URLs.
  my $request = new HTTP::Request "GET";

  # Send the request and get a response back from the server
  $request->url($url);
  my $response = $ua->request($request);

  if ($response->is_success) {
    $response->headers->last_modified;
  } else {
    0;
  }

}

#open(VSTDERR,">c:\\temp\\error.txt");

###############################################################################
sub GetWWWFile($$) {
  my ($url,$file) = map {trim($_)} @_;
  $url        = ToHtmlName($url);
#  $file = trim($file);
#------------------------------------------------------------------------------
# Hakee WWW-tiedoston ja tallettaa sen lokaalisti valituksi tiedostoksi
# Esim: GetWWWFile('http://www.jyu.fi/~vesal/gko/delphi/vespacadf.dfm',
#                   'delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Otetaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
  my $filedate = 0;
  my $filestat;
  $filestat = stat($file) and $filedate = $filestat->mtime;
# my $filedate = $filestat->mtime if $filestat = stat($file);
  require LWP;
  # Create the user agent object
  my $ua =new LWP::UserAgent;

  # Set up a request.  We will use the same request object for all URLs.
  my $request = new HTTP::Request "GET";

  # Send the request and get a response back from the server
  $request->url($url);
  my $response = $ua->request($request);

  if ($response->is_success) {
    if ( $response->headers->last_modified > $filedate ) {
      print "$url => $file\n";
      # print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n";
      # print $response->headers->last_modified . " $filedate"\n";
      open(OUT, ">$file") or die "Error opening output file $file: $!\n";
      binmode OUT;
      print OUT $response->content;
      close(OUT) if ($file);
      utime $response->headers->last_modified,$response->headers->last_modified,$file;
    }
    # else { print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n"; }
    # else { print "@{[ctime($response->headers->last_modified) ctime($filedate)\n"; }
    # else { print "$response->headers->last_modified";
  } else {
    print STDERR "ERROR: $url\n";
    print STDERR $response->error_as_HTML;
  }

}

###############################################################################
sub CopyTrim($$) {
  my ($source,$dest) = map {trim($_)} @_;
#  $url  = trim($url);
#  $file = trim($file);
#------------------------------------------------------------------------------
# Kopioi lokaalin tiedoston toiselle levylle
# Ei kopioi tyhjiä rivejä
# Esim: CopyTrim('delphi/vespacadf.dfm','w:/gko/delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Kopioidaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
        unless ( open(SOURCE,"<$source") ) { return 0; }
        my @array = <SOURCE>;
        close(SOURCE);
        unless (open(DEST, ">$dest")) { return 0; }
        print "JUHUU AUKESI  " . ">$dest\n";
        for (my $k = 0; $k < @array; $k++) {
             my $line = $array[$k];
             if ( $line ne "\n" ) { print DEST $line; }
        }
        close(DEST);
}

###############################################################################
sub CopyFileIfNewerTrim($$) {
  my ($source,$dest) = map {trim($_)} @_;
#  $url  = trim($url);
#  $file = trim($file);
#------------------------------------------------------------------------------
# Kopioi lokaalin tiedoston toiselle levylle
# Ei kopioi tyhjiä rivejä
# Esim: CopyFileIfNewer('delphi/vespacadf.dfm','w:/gko/delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Kopioidaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
  my $destdate = 0;
  my $deststat;
  my $sourcedate = 0;
  my $sourcestat;
  $deststat = stat($dest) and $destdate = $deststat->mtime;
  $sourcestat = stat($source) and $sourcedate = $sourcestat->mtime;
  my $filetype = substr($source, -5);
  if ( $sourcedate > $destdate ) {
    print "  $source => $dest";
    if ( !CopyTrim($source,$dest) ) { print " Error: $!"; }
    print "\n";
  }
}

###############################################################################
sub CopyFileIfNewer($$) {
  my ($source,$dest) = map {trim($_)} @_;
#  $url  = trim($url);
#  $file = trim($file);
#------------------------------------------------------------------------------
# Kopioi lokaalin tiedoston toiselle levylle
# Esim: CopyFileIfNewer('delphi/vespacadf.dfm','w:/gko/delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Kopioidaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
use File::Copy;
  my $destdate = 0;
  my $deststat;
  my $sourcedate = 0;
  my $sourcestat;
  $deststat = stat($dest) and $destdate = $deststat->mtime;
  $sourcestat = stat($source) and $sourcedate = $sourcestat->mtime;
  my $filetype = substr($source, -5);
#  if($filetype eq ".java"){
#    my $src = substr($source, 0, index($source,"."));
#    my $dst = substr($dest, 0, index($dest,$source));
#    copy("doc/$src.html","$dst/doc/$src.html");
#    copy("doc/$src.java.html","$dst/doc/$src.java.html");
#  }

#  print "try: $source => $dest\n";
  if ( $sourcedate <= $destdate ) { return 0; }
  print "  $source => $dest";
  if ( !copy($source,$dest) ) { print " Error: $!"; }
  print "\n";
  return 1;
  # else { print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n"; }
  # else { print "@{[ctime($response->headers->last_modified) ctime($filedate)\n"; }
  # else { print "$response->headers->last_modified";
}

###############################################################################
sub hakemisto_lista($$) { # $hakemisto,\%hakemistot
#------------------------------------------------------------------------------
# Lisää %hakemistot-listaan kaikki hakemiston alihakemistot joita ei vielä ole
# listassa.
# Esim: $hakemisto = "oma1/oma2"  => lisätään ("oma1","oma1/oma2")
###############################################################################
  my ($hakemisto,$hakemistot) = @_;
  my $loput = $hakemisto;
  my $alku = "";
  my $hak;
  while ( 1 ) {
    ($hak,$loput) = split("[/\\x5c]",$loput,2);
#    print "$hak $loput \n";
    if ( not $loput ) { last; }
    if ( not $hak ) { next; }
    $alku .= $hak;
    $$hakemistot{($alku)} = "";
#    $$hakemistot{lc($alku)} = "";
    $alku .= "/";
  }
}

# @dirs = split "/", lc $hakemisto;
# for(0..$#dirs) {$hakemistot->{join '/', @dirs[0..$_]} = ""}



###############################################################################
sub takeType($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta tyyppiosan
# Esim: takeType("kalle.ville\\oma.cs") => .cs
# ei toimi jos . puuttuu
###############################################################################
   my($rivi) = @_;
   my ($filename,$filetype) = split(/\.([^\.]+)$/,$rivi,2);
   $filetype = ".".$filetype;
   return $filetype;
}


###############################################################################
sub takeFilename($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta nimiosan
# Esim: takeFilename("kalle.ville/oma.cs") => kalle.ville/oma
# ei toimi jos . puuttuu
###############################################################################
   my($rivi) = @_;
   my ($filename,$filetype) = split(/\.([^\.]+)$/,$rivi,2);
   #print "|$rivi| => |$filename|\n";
   return $filename
}


###############################################################################
sub takeJustFilename($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta nimiosan
# Esim: takeJustFilename("kalle.ville/oma.cs") => kalle.ville/oma
# ei toimi jos . puuttuu
###############################################################################
   my($rivi) = @_;
   my ($path,$justfile) = split(/\/([^\/]+)$/,takeFilename($rivi),2);
   #print "|$rivi| => |$filename|\n";
   if ( $justfile ne "" ) { return $justfile; }
   return $path;
}


###############################################################################
sub takePath($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta polkuosan
# Esim: takePath("kalle.ville/oma.cs") => kalle.ville
###############################################################################
   my($rivi) = @_;
   my ($path,$file) = split(/\/([^\/]+)$/,$rivi,2);
   if ( $file ne "" ) { return $path; }
   return "";
}



use Cwd;
use Cwd 'abs_path';

###############################################################################
sub findFile($$) { # file,def => filewithpath
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedoston nimen kiiveten hakemistoa ylöispäin kunnes löytyy.
# Jos ei löydy, paluttaa tiedoston nimen oletushakemistosta.
# Esim: findFile("ohj.txt","c:\mytemp") => xxx/ohj.txt missä xxx on hakemisto
#                                          josta ohj.txt löytyi kun aloitettiin
#                                          nykyhakemistosta
###############################################################################
  my ($file,$def) = @_;
  my ($path) = getcwd();
  while ( 1 == 1 ) {
    my $name = "$path/$file";
    # print "$name|$path|$file|$def\n";
    if ( -e $name ) { return $name; }
    my ($p,$last) =  split(/\/([^\/]+)$/,$path,2);
    # print "hajoitus: |$p|$path|\n";
    if ( $p eq "" ) { last; }
    if ( $p eq $path ) { last; }
    $path = $p;
  }
  return "$def/$file";
}



###############################################################################
sub ShowFtpError() {
###############################################################################
#  my $error = ftp::error();
#  if ( $error ) { print "FTP error: $error\n"; }
}


###############################################################################
# Pääohjelma
###############################################################################
my $command  = $ARGV[0];
my $filename = $ARGV[1];
my $www      = $ARGV[2];
my $user     = $ARGV[3];
#my $kurssi   = $ARGV[4];
my ($kurssi,$foo) = split("[/\\x5c]",$ARGV[4],2);
my $comps    = $ARGV[5];
my $passwd   = $ARGV[6];
my $mainpath = $ARGV[2];
my $subpath  = $ARGV[4];
my $srcreplace = $ARGV[5];
my $docdir   = "doc";
$subpath =~ s!/*$!!;                          # delete extra / end of subpath
$www =~ s!/*$!!;                          # delete extra / end of www-machine
my $defwww   = "$www/~$user/$subpath";

my $filenr   = $filename;
$filenr =~ s!(.*?)([0-9]*).txt!\2!;
if ( $filenr == $filename ) { $filenr = ""; }

my $fileshtml = "files$filenr.html";
my $indexhtml = "index$filenr.html";


if ( $www =~ /\// ) { $defwww = $www; }  # if / in www then this is the
                                         # total path


if ( $comps lt "           " ) {  $comps = '../comps/'; }  # as default

my $sourcepath        = "";
my $destination = "";

$defwww = CheckHTTP("$defwww");

if ( $command eq "GET" ) {
  GetWWWFile("$defwww$filename","$filename");
}

#print "Args: 0:$command 1:$filename 2:$www 3:$user 4:$kurssi 5:$comps 6:$passwd 7:$mainpath $subpath 8:$defwww 9:$docdir $srcreplace\n";

open(TIEDOSTOT,$filename) or die("File not found: $filename!\n");

my @tiedostot  = ();
my @alkuosat   = ();
my @kommentit  = ();
my @lahdepolut = ();
my @lahteet    = ();
my @kohdepolut = ();
my %hakemistot = ();  # Käytetään vain hashin avainosaa :-)
my $deflink = "";

while (my $rivi=<TIEDOSTOT>) {
  $rivi = trim($rivi);
  my ($alkuosa, $kommentti) = split(/\B= *|=\B */,$rivi,2);
  $alkuosa = trim($alkuosa);
  $kommentti = trim($kommentti);
  if ( $alkuosa eq '=' ) {
    $alkuosa = "";
  }
  if ( ( $command eq "SVN" ) && ( $alkuosa =~ /overview-tree.html/ ) ) { next; }
  if ( $alkuosa eq '$SOURCEPATH' )  { $sourcepath  = trim($kommentti); next; }
  if ( $alkuosa eq '$DESTINATION' ) {
    $destination = trim($kommentti);
    if ( $destination eq '$COMPS' ) { $destination = $comps; }
    next;
  }

  if ( $alkuosa =~ m/^[\!@].*/ ) { # alkaa ! tai @, eli linkki
    my $link = substr($alkuosa,1);
    $kommentti = "<a href=\"$link\">$kommentti</a>";
    if ( $alkuosa =~ m/^\!.*/ && $deflink eq "" ) { # ensimmäisestä ! oletuslinkki
      $deflink = $link;
    }
    if ( $kommentti le "    " ) { next; }
    $alkuosa = "";
  }

  if ( ($kommentti =~ m/http/)  && (! ($kommentti =~ m/<a/) ) ) { # jos kommentissa on http muttei linkkiä, niin korvataan tuo http linkillä
    my ($beflink,$link2,$afterlink) = $kommentti =~ /^(.*)http([^ ]*)(.*)/;
    # print "1: |$beflink|, 2: |$link2|, 3: |$afterlink|\n";
    $kommentti = "$beflink<a href=\"http$link2\">http$link2</a>$afterlink";
    # print "KOMMENTTI: $kommentti\n";
  }

  
  push @alkuosat, ($alkuosa);
  push @kommentit,(trim($kommentti));
  push @lahteet,($sourcepath);


  if ( $alkuosa ge "           " ) {
    push @lahdepolut,($sourcepath);
    push @kohdepolut,($destination);
    push @tiedostot, ($alkuosa);
    hakemisto_lista("$destination$alkuosa",\%hakemistot);
  }
}
close(TIEDOSTOT);

if ($deflink le "      " ) {
  $deflink = $tiedostot[0];
}



my @lajiteltu = sort(keys(%hakemistot));


###############################################################################
sub MakeHtmlFiles() {
###############################################################################
use File::Copy;
#  my $javadoc = "javadoc -nodeprecatedlist -nohelp -private -version -author -d doc   -docletpath c:/bat/XHTML_Doclet.jar -doclet xhtmldoclet.XhtmlDoclet -linksource -tag example:a:\"Example:\" ";
  my $javadoc = "javadoc -nodeprecatedlist -nohelp -version -author -d $docdir -link http://docs.oracle.com/javase/8/docs/api/  -linksource -tag example:a:\"Example:\" ";
  my $j2h = "j2h -d $docdir/src-html -js ";
  my @arr = glob("*.java");
  my $source = "";
  my $files = "";
  my $csfiles = "";

  if(@arr > 0){
    $source = "*.java ";
  }
  $" = ".";
  for(my $i = 0; $i < @lajiteltu; $i++){
    my @parts = split("/",$lajiteltu[$i]);
    @arr = glob("$lajiteltu[$i]/*.java");
    if(@arr > 0){
       $source = "$source $lajiteltu[$i]/*.java";
    }
  }

  for (my $i=0; $i < @tiedostot; $i++ ) {
    my $tied = trim($tiedostot[$i]);
    if ( $lahdepolut[$i] gt "        " ) { next; }

    my $filetype = takeType($tied);
    if($filetype eq ".java"){
      $files = "$files $tied";
    }
    if ( $filetype eq ".cs"){
      $csfiles = "$csfiles $tied";
    }
    if ( $filetype eq ".c"){
      $csfiles = "$csfiles $tied";
    }
    if ( $filetype eq ".cpp"){
      $csfiles = "$csfiles $tied";
    }
  }


  if ( $source ge "  " ) {
    print "$javadoc $files\n";
#    print `$javadoc $source`;
    print `$javadoc $files`;
    print `$j2h .`;
    print "$j2h .\n";
    print "Paketteja käsittelmään: $source\n";
    handlePackages($source);
  }


print "CSFILES: $csfiles\n";

  if ( $csfiles ge "  " ) {
    my $doxycs = "doxygen " . findFile("doxyfile",takePath(abs_path($0)));

    open(OUT, ">d.dox") || die "Error opening output file d.ox $!\n";
    print OUT <<"__STOP__";
PROJECT_NAME=$user
OUTPUT_DIRECTORY=csdoc
INPUT=
__STOP__
    close OUT;
    print "$doxycs \n";
    print `$doxycs `;
  }


  open(OUT, ">$indexhtml") || die "Error opening output file $indexhtml: $!\n";
  print OUT <<"__STOP__";
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>$user/$kurssi/</title>
</head>
<frameset cols=\"33%,66%\">
<frame src=\"$fileshtml\" NAME=m1>
<frame src=\"$deflink\" NAME=m2>
<noframes>
<body>
<!-- Made by lue.pl -->
<h1>$kurssi/$user</h1>
</body>
</noframes>
</frameset>
</html>
__STOP__
  close OUT;

  open(OUT, ">$fileshtml") || die "Error opening output file $fileshtml: $!\n";
  print OUT <<"__STOP__";
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<base target=m2>
<title>$user/$kurssi</title>
</head>
<body>
<h1>$kurssi/$user</h1>
__STOP__

   for (my $i=0; $i < @alkuosat; $i++ ) {
    if ( $alkuosat[$i] ge "          " ) {
      my $htmlfile = ToHtmlName("$lahteet[$i]$alkuosat[$i]");
      my $filetype = takeType($htmlfile);
#  print "$htmlfile  =>$filetype=> ";
      if ( $htmlfile =~ m/\.\..*/ ){   # jos tiedoston nimessä .. eli eri hakemistossa, ei tehdä dokuja
        print OUT "<a href=\"$htmlfile\">$alkuosat[$i]</a>";
#  print "ei\n";
      }
      elsif ( $filetype eq ".cs" ) { # .cs tiedosto
        my $fileName = takeFilename($htmlfile);
        my $justFileName = takeJustFilename($htmlfile);
        my $coloredfilelink = "csdoc/html/$justFileName"."_8cs_source.html";
        if ( !(-e $coloredfilelink) ) {
           $coloredfilelink = "csdoc/html/$justFileName"."_8cs-source.html"; #older doxygen
        }
        print OUT "<a href=\"$coloredfilelink\">$fileName</a>";
# file:///E:/kurssit/ohjelmointi1/2011/demot/vast/demo4/csdoc/html/KirjaintenMuutos_8cs.html
        print OUT "<a href=\"csdoc/html/$justFileName" . "_8cs.html\">\.</a>";
        print OUT "<a href=\"$fileName.cs\">cs</a>";
      }
      elsif ( $filetype eq ".cpp" ) { # .cpp tiedosto
        my $fileName = takeFilename($htmlfile);
        my $justFileName = takeJustFilename($htmlfile);
        my $coloredfilelink = "csdoc/html/$justFileName"."_8cpp_source.html";
        if ( !(-e $coloredfilelink) ) {
           $coloredfilelink = "csdoc/html/$justFileName"."_8cpp-source.html"; #older doxygen
        }
        print OUT "<a href=\"$coloredfilelink\">$fileName</a>";
# file:///E:/kurssit/ohjelmointi1/2011/demot/vast/demo4/csdoc/html/KirjaintenMuutos_8cs.html
        print OUT "<a href=\"csdoc/html/$justFileName" . "_8cpp.html\">\.</a>";
        print OUT "<a href=\"$fileName.cpp\">cpp</a>";
      }
      elsif ( $filetype eq ".c" ) { # .c tiedosto
        my $fileName = takeFilename($htmlfile);
        my $justFileName = takeJustFilename($htmlfile);
        my $coloredfilelink = "csdoc/html/$justFileName"."_8c_source.html";
        if ( !(-e $coloredfilelink) ) {
           $coloredfilelink = "csdoc/html/$justFileName"."_8c-source.html"; #older doxygen
        }
        print OUT "<a href=\"$coloredfilelink\">$fileName</a>";
# file:///E:/kurssit/ohjelmointi1/2011/demot/vast/demo4/csdoc/html/KirjaintenMuutos_8cs.html
        print OUT "<a href=\"csdoc/html/$justFileName" . "_8c.html\">\.</a>";
        print OUT "<a href=\"$fileName.c\">c</a>";
      }
      elsif ( $filetype eq ".java"   ) {  # .java tiedosto
#         my $part = substr($htmlfile, 0, index($htmlfile,"."));
        my $origpart = substr($htmlfile, 0, -5);
        my $part = $origpart;
        $origpart =~ s/^src\//$srcreplace/;
        $part =~ s/^src\///;
        print OUT "<a href=\"$docdir/src-html/$part.java.html\">$part</a>";
#         print OUT "<a href=\"$part.java\">java</a>";
#        print "DOCFILE: $docdir/$part.html\n";
        if ( open(DOCFILE,"<$docdir/$part.html") ) { #|| die "ERROR!";
#           print "AUKESI  " . "<$docdir/$part.html\n";
#           print OUT "<a href=\"doc/$part.html\">doc</a>\n";
#           print "<a href=\"doc/$part.html\">doc</a>\n";
          print OUT "<a href=\"$docdir/$part.html\">.</a>";
          my $j2hSrcFile = "$docdir/src-html/$part.java.html";
          my $javadocSrcFile = "$docdir/src-html/$part.html";
#          unless (-e $j2hSrcFile ) {
#            print "File Doesn't Exist! $j2hSrcFile \n";
          CopyFileIfNewer("$javadocSrcFile","$j2hSrcFile"); # Jos j2h ei tehnyt työtään
#          }   
          if ( 0 ) { # ei tarvii lisätä SRC-HTML -linkkiä
          my @array = <DOCFILE>;
          close(DOCFILE);
          my $target = "<TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1Rev\"> " .
                       "&nbsp;<FONT CLASS=\"NavBarFont1Rev\"><B>Class</B></FONT>&nbsp;</TD>";
         if (open(RESULTFILE, ">$docdir/$part.html")) {
            print "AUKESI  " . ">$docdir/$part.html\n";
            for(my $k = 0; $k < @array; $k++){
              my $line = $array[$k];
              if( $line =~ m/$target/){
                my @foo = split("/",$part);
                print "part: $part\n";
                $line = $line . "<TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\">    " .
#                        "<A HREF=\"$foo[@foo-1].java.html\"><FONT CLASS=\"NavBarFont1\">" .
                        "<A HREF=\"src-html/$part.java.html\"><FONT CLASS=\"NavBarFont1\">" .
                        "<B>SRC-HTML</B></FONT></A>&nbsp;</TD>\n";
              }
              print RESULTFILE $line;
            }
            close(RESULTFILE);
           } else { # if (open(RESULTFILE
           }
         } # ei SCR-HTML -linkkiä
        } else {
          print OUT ".";
        }
        print OUT "<a href=\"$origpart.java\">java</a>";

#         print OUT "<a href=\"doc/$part.java.html\">html</a>\n";
      } # .java tiedosto
      else { # kaikista muista pelkkä linkki
        print OUT "<a href=\"$htmlfile\">$alkuosat[$i]</a>";
      }
      #print OUT " <a href
      print OUT " = $kommentit[$i]<br>\n";
#      print OUT qq{<a href="$lahteet[$i]$alkuosat[$i]">$alkuosat[$i]</a> = $kommentit[$i]<br>\n};
    } else {
      if ( "-" le $kommentit[$i] && $kommentit[$i] lt "-A" ) { print OUT "<hr>\n"; }
      elsif ( $kommentit[$i] ge "            " )    {
        print OUT "$kommentit[$i]";
        if ( ! ( $kommentit[$i] =~ /<h.*>/ ) ) { print OUT "<br>"; }
        print OUT "\n";
      }
      else                                           { print OUT "<br>\n";                   }
    }
  }

  print OUT "</body>\n";
  print OUT "</html>\n";
  close OUT;
}


###############################################################################
if ( $command eq "GET" ) {
  foreach my $hak (@lajiteltu) {
    mkdir $hak,0;
    print "mkdir $hak\n";
  }

# for my $i (0..$#tiedostot) {
  for (my $i=0; $i < @tiedostot; $i++ ) {
    my $tied = $tiedostot[$i];
    my $lahde = $lahdepolut[$i];
    my $kohde = $kohdepolut[$i];
    if ( $lahde eq "" ) { $lahde = CheckHTTP($defwww); }
#   my $lahde = ($lahdepolut[$i] || CheckHTTP("$www/~$user/$kurssi");
    GetWWWFile("$lahde$tied","$kohde$tied");
  }
}

###############################################################################
if ( $command eq "PUREHTML" ) {
  if ( $subpath ne "" ) { $docdir = $subpath . "/"; }
  MakeHtmlFiles();
}

###############################################################################
if ( $command eq "HTML" || $command eq "FTP" ) {
  require('vlftplib.pl');
  MakeHtmlFiles();

  my $host = $www;
  $host =~ s!.*//!!;              # Mahdollinen http:// pois
  $host =~ s!/.*!!;              # Kaikki /-jälkeiset osat pois
  if ( $passwd eq "" ) {
    print "Password for $host.$user >";
    $passwd = <STDIN>;
    if ( $passwd eq "" ) { die "No passwd"; }
    $passwd =~ s/\n//;
  }

  if ( $passwd eq "-" ) { die "No ftp"; }

  ftp::debug('ON');
  ftp::open($host, $user, $passwd) or die("Can not open ftp $host, $user");
                               ShowFtpError;
  ftp::binary();
  my %polun_palat = ();  # Käytetään vain hashin avainosaa :-)
  hakemisto_lista("$subpath/.",\%polun_palat);
  my @spolun_palat = sort(keys(%polun_palat));

#  print %polun_palat; print "\n";
#  print @spolun_palat; print "\n";

  ftp::cwd("www");     ShowFtpError;
  foreach my $hak (@spolun_palat) {
    ftp::mkdir("$hak");   ShowFtpError;
#   ftp::cwd("$hak");        ShowFtpError;
    print "mkdir $hak\n";
  }
#  ftp::mkdir("www/$subpath");         ShowFtpError;
   ftp::cwd("$subpath");     ShowFtpError;

  ftp::put("$fileshtml","$fileshtml");            ShowFtpError;
  ftp::put("$indexhtml","$indexhtml");            ShowFtpError;
#  my @dir = ftp::dir(".");
#  print "---------\n";
#  print $dir[0];
#  print "---------\n";

###############################################################################
if ( $command eq "FTP" ) {
  require('vlftplib.pl');

  ftp::mkdir("doc");        ShowFtpError;

  foreach my $hak (@lajiteltu) {
    print "mkdir $hak\n";
    ftp::mkdir($hak);               ShowFtpError;
    ftp::mkdir("doc/$hak");    ShowFtpError;
  }

  ftp::put("$filename","$filename");  ShowFtpError;
  ftp::put("doc/stylesheet.css","doc/stylesheet.css");        ShowFtpError;
  ftp::put("doc/overview-tree.html","doc/overview-tree.html");        ShowFtpError;
  ftp::put("doc/index-all.html","doc/index-all.html");        ShowFtpError;


#  foreach my $tied (@tiedostot) {
  for (my $i=0; $i < @tiedostot; $i++ ) {
    my $tied = trim($tiedostot[$i]);
    if ( $lahdepolut[$i] gt "        " ) { next; }

    my $lahde = $lahdepolut[$i];
#    if ( $lahde eq "" ) { $lahde = CheckHTTP("$www/~$user/$subpath"); }
    if ( $lahde eq "" ) { $lahde = CheckHTTP("$defwww"); }
#    print "$lahde$tied\n";
    my $mtime = GetWWWFileDate("$lahde$tied");

    my $filedate = 0;
    my $filestat;
    $filestat = stat($tied) and $filedate = $filestat->mtime;
    print "$tied: " . ctime($filedate) . " - " . ctime($mtime) ;

    if ( $filedate > $mtime ) {
      ftp::put($tied,$tied);   ShowFtpError;
      print "->";
    }
    my $filetype = substr($tied, -5);
    if($filetype eq ".java"){
      my $part = substr($tied, 0, index($tied,"."));
      ftp::put("doc/$part.html","doc/$part.html");
      ftp::put("doc/$part.java.html","doc/$part.java.html");
    }
    print "\n";
  }
}

  ftp::close();
}
###############################################################################

###############################################################################
if ( $command eq "COPY" ) {
  MakeHtmlFiles();
  my $destpath = "$mainpath/$subpath";

  my %polun_palat = ();  # Käytetään vain hashin avainosaa :-)
  hakemisto_lista("$subpath/.",\%polun_palat);
  my @spolun_palat = sort(keys(%polun_palat));

#  print %polun_palat; print "\n";
#  print @spolun_palat; print "\n";

  foreach my $hak (@spolun_palat) {
    mkdir "$mainpath/$hak",0;
    print "mkdir $mainpath/$hak\n";
  }
#  print "mkdir $destpath\n";
#  mkdir "$destpath",0;

  mkdir "$destpath/doc",0;
  mkdir "$destpath/doc/src-html",0;

  foreach my $hak (@lajiteltu) {
    my $dochak = $hak;
    $dochak =~ s/^src\///;
    $hak =~ s/^src\//$srcreplace/;
    print "mkdir $destpath/$hak\n";
    mkdir "$destpath/$hak",0;
    mkdir "$destpath/doc/$dochak",0;
    mkdir "$destpath/doc/src-html/$dochak",0;
    CopyFileIfNewer("doc/$dochak/package-frame.html","$destpath/doc/$dochak/package-frame.html");
    CopyFileIfNewer("doc/$dochak/package-summary.html","$destpath/doc/$dochak/package-summary.html");
    CopyFileIfNewer("doc/$dochak/package-tree.html","$destpath/doc/$dochak/package-tree.html");
#    copy("doc/$hak/*.html","$destpath/doc/$hak/");
  }

  CopyFileIfNewer("$filename","$destpath/$filename");
  CopyFileIfNewer("$fileshtml","$destpath/$fileshtml");
  CopyFileIfNewer("$indexhtml","$destpath/$indexhtml");
  CopyFileIfNewer("doc/front.html","$destpath/doc/front.html");
  CopyFileIfNewer("doc/AllClasses.html","$destpath/doc/AllClasses.html");
  CopyFileIfNewer("doc/allclasses-frame.html","$destpath/doc/allclasses-frame.html");
  CopyFileIfNewer("doc/$indexhtml","$destpath/doc/$indexhtml");
  CopyFileIfNewer("doc/stylesheet.css","$destpath/doc/stylesheet.css");
  CopyFileIfNewer("doc/src-html/stylesheet.css","$destpath/doc/src-html/stylesheet.css");
  CopyFileIfNewer("doc/overview-tree.html","$destpath/doc/overview-tree.html");
  CopyFileIfNewer("doc/overview-summary.html","$destpath/doc/overview-summary.html");
  CopyFileIfNewer("doc/overview-frame.html","$destpath/doc/overview-frame.html");
  CopyFileIfNewer("doc/index-all.html","$destpath/doc/index-all.html");
  CopyFileIfNewer("doc/packages.html","$destpath/doc/packages.html");

#  foreach my $tied (@tiedostot) {
  for (my $i=0; $i < @tiedostot; $i++ ) {
    my $tied = trim($tiedostot[$i]);
    if ( $lahdepolut[$i] gt "        " ) { next; }
    my $desttied = $tied;
    $desttied =~ s/^src\//$srcreplace/;

    CopyFileIfNewer($tied,"$destpath/$desttied");

    my $filetype = substr($tied, -5);
    if($filetype eq ".java"){
      my $part = substr($tied, 0, index($tied,"."));
      $part =~ s/^src\///;
      CopyFileIfNewer("doc/$part.html","$destpath/doc/$part.html");
      CopyFileIfNewer("doc/src-html/$part.html","$destpath/doc/src-html/$part.html");
      CopyFileIfNewer("doc/src-html/$part.java.html","$destpath/doc/src-html/$part.java.html");
    }
  }
}
###############################################################################

###############################################################################
if ( $command eq "SVN" ) {
#  my $destpath = "$mainpath/$subpath";

  my %polun_palat = ();  # Käytetään vain hashin avainosaa :-)
  hakemisto_lista("$subpath/.",\%polun_palat);
  my @spolun_palat = sort(keys(%polun_palat));

#  print %polun_palat; print "\n";
#  print @spolun_palat; print "\n";

  foreach my $hak (@spolun_palat) {
    print `svn add -N $hak 2>nul`;
  }
  print `svn add -N .svnignore 2>nul`;
  print `svn add -N files.txt 2>nul`;
  print `svn add -N .classpath 2>nul`;
  print `svn add -N .project 2>nul`;

  foreach my $hak (@lajiteltu) {
    print `svn add -N $hak 2>nul`;
  }


  for (my $i=0; $i < @tiedostot; $i++ ) {
    my $tied = trim($tiedostot[$i]);
    if ( $lahdepolut[$i] gt "        " ) { next; }

#    print "svn add -N $tied 2>nul\n";
    print `svn add -N $tied 2>nul`;
#    print `svn add -N $tied `;
  }
}
###############################################################################

sub handlePackages() {
  my $mask = shift;
  my @packages = split(" ",$mask);
  foreach my $package (@packages) {
    handlePackage($package);
  }
}


###############################################################################
#
sub handlePackage() {
  my $package = shift;
  #print "Paketti: $package\n";
  $package =~ s/\/\*\.java//;
  print "Paketti: $package\n";
  if ( $package =~ m/^\.\./ ) { return;        }
  if ( $package eq "*.java" ) { $package = ""; }
  print "Paketti: $package\n";

  $package =~ s/^src\///;
  my $dir = "$docdir/src-html/$package";
  $dir =~s/\\\\\/\//\//; # korvataan \\// yhdellä /
  $dir =~s/\\//; # poistetaan \
  print "dir = $dir\n";
  opendir(D, $dir) ||  return;  # die "can't opendir $dir: $!";
  my @f = readdir(D);
  closedir(D);

  foreach my $file (@f) {
    my $filename = $dir . '/' . $file;
    print "$filename\n";
    if ($file eq '.' || $file eq '..') {
    } elsif (-d $filename) {
      # depending on your needs you can do subdirs
    } else {
      if ( $filename =~ m/\.java\.html/ ) {
        handleFile($filename);
      }
    }
  }


  foreach my $file (@f) {
    my $filename = $dir . '/' . $file;
    my $repname;

    if ($file eq '.' || $file eq '..') {
    } elsif (-d $filename) {
      # depending on your needs you can do subdirs
    } else {
      if ( $file =~ m/\..*\.html/  && !($file =~ m/\.java\.html/) ) {
        $repname = $file; # copy something??? why???
        $repname =~ s!\..*\.!.!;
        print "$repname <= $filename\n";
        copy($dir . '/' . $repname,$filename);
      }
    }
  }
}

###############################################################################
sub handleFile() {
  # make copies from j2h java source files Class.java.html and change links a bit
  my $name = shift;
  my $outname = $name;
  my $line;
  $outname =~ s/\.java//;   # copy over javadoc file Class.html
  print "$outname\n";

  if ( CopyFileIfNewer("$outname","$name") ) { return; } # Jos j2h ei tehnyt työtään  
  
  open(FILE,"<$name") or die "Error opening input file $name: $!\n";
  open(OUT, ">$outname") or die "Error opening output file $outname: $!\n";

  while ($line = <FILE>) {
    $line =~ s/NAME=\"/NAME=\"line\./g;
    $line =~ s!\.java\.html!\.html!g;
    print OUT $line;
  }


  close(OUT);
  close(FILE);
  utime(undef, undef, $name);
}

###############################################################################
###############################################################################

