#!/usr/bin/perl -w

use strict;

############################################################################
#
#    Debian System Wide Information Manager                       
#
#    Copyright (C) 1999-2001 Jonathan Rosenbaum 
#
#                                                                             
#
#    This program is free software; you can redistribute it and/or modify 
#
#    it under the terms of the GNU General Public License as published by     
#    the Free Software Foundation; either version 2 of the License, or        
#    (at your option) any later version.                                       
#                                                                              
#    This program is distributed in the hope that it will be useful,         
#    but WITHOUT ANY WARRANTY; without even the implied warranty of            
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
#    GNU General Public License for more details.                              
#                                                                            
#    You should have received a copy of the GNU General Public License        
#    along with this program; if not, write to the Free Software              
#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 
#    USA
#
#############################################################################
=pod

This program only takes two argument, a temp directory and the name of the
binary sort..sort.  You can test a filedir.deb file. 


=cut

 if ($#ARGV == -1) {
  print STDERR "swim: slowswim requires arguments, see program for instructions\n";
  exit;
 }

my $tmp = $ARGV[0];
my $sort = $ARGV[1];

pre_md();

# This is nmd()'s version of fastswim..also a lowmem method, after making
# long.debian and big.debian, process_md() finishes the job.
sub pre_md {

  my %HL;
  my $temp;
  my %repeaters;
  my $fcount = 0;
  my @tempholder;

  print STDERR "Sorting everything\n";
  system ("$sort $tmp/filedir.deb > $tmp/sortfiledir.deb");
  unlink("$tmp/filedir.deb");

    # grab the keys from the sorted file
     print STDERR "Making the massive hash using lowmem\n";
     $| = 1; my $x = 1;
     open(FILEDIR, "$tmp/sortfiledir.deb") or die "where is sortfiledir.deb?\n";
         while (<FILEDIR>) {
          $x = 1 if $x == 6;
          print STDERR "|\r" if $x == 1 || $x == 4; print STDERR "/\r" if $x == 2;
          print STDERR "-\r" if $x == 3 || $x == 6; print STDERR "\\\r" if $x == 5;
          $x++;
             my ($place, $packname) = split(/ -> /,$_,2);
             push(@tempholder,"$place -> $packname");
              if ($fcount != 0) {
              my($tplace,$tpackname) = split(/ -> /,$tempholder[$fcount - 1],2);
              chomp $tpackname;
                # As long as they aren't different add to HL because they
                # belong to a group.
                if ($tplace eq $place) {
                    #print "$tplace and $place\n";
                    $repeaters{$tplace}++;
                    if ($repeaters{$tplace} == 1) {  
                       $temp = 0;
                    }
                    else {
                      $temp = $repeaters{$tplace} - 1;
                    }              
                    $HL{$tplace}[$temp] = $tpackname;
                } 
                # they new guy is different, but the old guy belongs to the
                # previous group or not, so finish adding to %HL and then
                # print out, and undef %HL
                else {
                   #print "I AM DIFF $tplace\n";
                    # finish adding
                    $repeaters{$tplace}++;
                    if ($repeaters{$tplace} == 1) {  
                       $temp = 0;
                    }
                    else {
                      $temp = $repeaters{$tplace} - 1;
                    }              
                    $HL{$tplace}[$temp] = $tpackname;
                 
                   # print out
                   open(BIG, ">>$tmp/big.debian") or die;
                   open(LONG, ">>$tmp/long.debian") or die;
                   my $thingo;
                   foreach $thingo (sort keys %HL ) {
                    my $tingy  = "@{ $HL{$thingo} }";
                    if (@{ $HL{$thingo} } > 1 || @{ $HL{$thingo} } eq "") {
                      print LONG "$thingo -> $tingy\n";
                    }
                    elsif (@{ $HL{$thingo} } == 1) {
                      print BIG "$thingo -> $tingy\n"; 
                    }
                  }
                 close(BIG);
                 close(LONG);

                 # The whole key for lowmem systems
                 undef %repeaters; 
                 undef %HL; 
                 undef $tempholder[$fcount - 1];

               }              
              } # if fcount ne 0
                               
         $fcount++;
         }

         # also do this in db() & ndb()
         unlink("$tmp/sortfiledir.deb");
         

} # end sub pre_md