#!/usr/local/bin/perl
#
# checkfiles -- MiNTLib.
# Copyright (C) 1999 Guido Flohr <gufl0000@stud.uni-sb.de>
#
# This file is part of the MiNTLib project, and may only be used
# modified and distributed under the terms of the MiNTLib project
# license, COPYMINT.  By continuing to use, modify, or distribute
# this file you indicate that you have read the license and
# understand and accept it fully.

# This little Perl script checks for anomalities in the files
# BINFILES, SRCFILES and MISCFILES.

sub clean ($checkfiles);

# Files that don't need to occur in *FILES.
@dontlist =  ("\\spatches\\s",
              "\\sdeps\\s",
              "\\errlog\\s",
              "\\score\\s",
              "\\sreport\\s",
              "\\snohup.out\\s",
              "\\sexpired\\s", 
              "\\sCFILES\\s", 
              "\\scrlf\\s", 
              "\\slattice\\s", 
              "\\spurec\\s", 
              "\\ssozobon\\s",
              "\\S+~\\s",
              "\\S+\\.orig\\s",
              "\\S+\\.old\\s",
	      "\\S+\\.rej\\s",
              "\\S+\\.o\\s",
   	      "\\S+\\.a\\s",
   	      "\\S+\\.olb\\s",
   	      "\\S+\\.gz\\s",
);

$dontfiles = "(" . join ('|', @dontlist) . ")";

$srcdir = ".";
$errdir = "";

$errors = 0;
$warnings = 0;

if ($ARGV[0] ne "")
{
  $srcdir = $ARGV[0];  
  $errdir = "$srcdir/";
}

$files = `cat $srcdir/SRCFILES 2>/dev/null`;
if ($files eq "")
{
  die "can't read $srcdir/SRCFILES";
}
$files =~ s/#.*//g;
$files =~ s/^[ \t]*$//g;
$files =~ s/SRCFILES *= *//g;
$files =~ s/\\\n/ /g;
$files =~ s/\n//g;
$files =~ s/$dontfiles/ /g;

@srcfiles = split (/  */, $files);

$files = `cat $srcdir/BINFILES 2>/dev/null`;
if ($files eq "")
{
  die "can't read $srcdir/BINFILES";
}
$files =~ s/#.*//g;
$files =~ s/^[ \t]*$//g;
$files =~ s/BINFILES *= *//g;
$files =~ s/\\\n/ /g;
$files =~ s/\n//g;
$files =~ s/$dontfiles/ /g;

@binfiles = split (/  */, $files);

$files = `cat $srcdir/MISCFILES 2>/dev/null`;
if ($files eq "")
{
  die "can't read $srcdir/MISCFILES";
}
$files =~ s/#.*//g;
$files =~ s/^[ \t]*$//g;
$files =~ s/MISCFILES *= *//g;
$files =~ s/\\\n/ /g;
$files =~ s/\n//g;
$files =~ s/$dontfiles/ /g;

@miscfiles = split (/  */, $files);

$files = `ls -C $srcdir`;
if ($files eq "")
{
  die "ls $srcdir failed";
}

$files =~ s/$dontfiles/ /g;

@lsfiles = split (/[ \t\n]+/, $files);

# First check for duplicate entries.
foreach (@srcfiles)
{
  my $srcfile = $_;

  # Check for carriage returns.
 if (!-d "$errdir$srcfile")
 {
    open (HANDLE, "$errdir$srcfile") or die "can't open $errdir$srcfile for reading: $!";
    LINE: while ($line = <HANDLE>)
    {
      if ($line =~ /\r\n/)
      {
        print "warning: $errdir$srcfile contains carriage returns\n";
        $warnings++;
        last LINE;
      }
    }
    close HANDLE;
  }

  DUP: foreach (@binfiles)
  {
    if ($srcfile eq $_)
    {
      print "error: $errdir$srcfile in ${errdir}SRCFILES and ${errdir}BINFILES.\n";
      $errors++;
      next DUP;
    }
  }
}

foreach (@miscfiles)
{
  my $miscfile = $_;

  # Check for carriage returns.
  if (!-d "$errdir$miscfile")
  {
    open (HANDLE, "$errdir$miscfile") or die "can't open $errdir$miscfile for reading: $!";
    LINE: while ($line = <HANDLE>)
    {
      if ($line =~ /\r\n/)
      {
        print "warning: $errdir$miscfile contains carriage returns\n";
        $warnings++;
        last LINE;
      }
    }
    close HANDLE;
  }

  DUP: foreach (@binfiles)
  {
    if ($miscfile eq $_)
    {
      print "error: $errdir$miscfile in ${errdir}MISCFILES and ${errdir}BINFILES.\n";
      $errors++;
      next DUP;
    }
  }
}

foreach (@miscfiles)
{
  my $miscfile = $_;

  DUP: foreach (@srcfiles)
  {
    if ($miscfile eq $_)
    {
      print "error: $errdir$miscfile in $errdir{MISCFILES} and $errdir{SRCFILES}.\n";
      $errors++;
      next DUP;
    }
  }
}

# Pump all files into a hash.  This will also allow us to check for
# duplicate entries in one file.
foreach (@srcfiles)
{
  $listedfiles{$_}++;

  if ($listedfiles{$_} > 1)
  {
    $times = $listedfiles{$_} == 2 ? "twice" : "$listedfiles{$_} times";

    print "error: $_ is listed $times in ${errdir}SRCFILES\n";
    $errors++ unless $listedfiles{$_} > 2;
  }
}
foreach (@miscfiles)
{
  $listedfiles{$_}++;

  if ($listedfiles{$_} > 1)
  {
    $times = $listedfiles{$_} == 2 ? "twice" : "$listedfiles{$_} times";

    print "error: $_ is listed $times in ${errdir}MISCFILES\n";
    $errors++ unless $listedfiles{$_} > 2;
  }
}
foreach (@binfiles)
{
  $listedfiles{$_}++;

  if ($listedfiles{$_} > 1)
  {
    $times = $listedfiles{$_} == 2 ? "twice" : "$listedfiles{$_} times";

    print "error: $_ is listed $times in ${errdir}BINFILES\n";
    $errors++ unless $listedfiles{$_} > 2;
  }
}

# Now check if every file is listed somewhere.
LISTEDFILE: foreach (@lsfiles)
{
  $file = $listedfiles{$_};

  # Maybe it's a subdirectory?
  next LISTEDFILE if (-f "$_/SRCFILES");

  if ($file eq "")
  {
    print "warning: $errdir$_ occurs in no dist file list\n";
    $warnings++;
  }
}

$error = $errors == 1 ? "error" : "errors";
$warning = $warnings == 1 ? "warning" : "warnings";

print "$errors $error and $warnings $warning.\n";

exit (1) if $errors;

