#
# Copyright 1999, 2000, 2001 Patrik Stridvall
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

package util;

use strict;

use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
require Exporter;

@ISA = qw(Exporter);
@EXPORT = qw(
    &append_file &edit_file &read_file &replace_file
    &normalize_set &is_subset
);
@EXPORT_OK = qw();
%EXPORT_TAGS = ();

########################################################################
# _compare_files

sub _compare_files {
    my $file1 = shift;
    my $file2 = shift;

    local $/ = undef;

    return -1 if !open(IN, "< $file1");
    my $s1 = <IN>;
    close(IN);

    return 1 if !open(IN, "< $file2");
    my $s2 = <IN>;
    close(IN);

    return $s1 cmp $s2;
}

########################################################################
# append_file

sub append_file {
    my $filename = shift;
    my $function = shift;

    open(OUT, ">> $filename") || die "Can't open file '$filename'";
    my $result = &$function(\*OUT, @_);
    close(OUT);

    return $result;
}

########################################################################
# edit_file

sub edit_file {
    my $filename = shift;
    my $function = shift;

    open(IN, "< $filename") || die "Can't open file '$filename'";
    open(OUT, "> $filename.tmp") || die "Can't open file '$filename.tmp'";

    my $result = &$function(\*IN, \*OUT, @_);

    close(IN);
    close(OUT);

    if($result) {
        unlink("$filename");
        rename("$filename.tmp", "$filename");
    } else {
        unlink("$filename.tmp");
    }

    return $result;
}

########################################################################
# read_file

sub read_file {
    my $filename = shift;
    my $function = shift;

    open(IN, "< $filename") || die "Can't open file '$filename'";
    my $result = &$function(\*IN, @_);
    close(IN);

    return $result;
}

########################################################################
# replace_file

sub replace_file {
    my $filename = shift;
    my $function = shift;

    open(OUT, "> $filename.tmp") || die "Can't open file '$filename.tmp'";

    my $result = &$function(\*OUT, @_);

    close(OUT);

    if($result && _compare_files($filename, "$filename.tmp")) {
        unlink("$filename");
        rename("$filename.tmp", $filename);
    } else {
        unlink("$filename.tmp");
    }

    return $result;
}

########################################################################
# normalize_set

sub normalize_set {
    local $_ = shift;

    if(!defined($_)) {
	return undef;
    }

    my %hash = ();
    foreach my $key (split(/\s*&\s*/)) {
	$hash{$key}++;
    }

    return join(" & ", sort(keys(%hash)));
}

########################################################################
# is_subset

sub is_subset {
    my $subset = shift;
    my $set = shift;

    foreach my $subitem (split(/ & /, $subset)) {
	my $match = 0;
	foreach my $item (split(/ & /, $set)) {
	    if($subitem eq $item) {
		$match = 1;
		last;
	    }
	}
	if(!$match) {
	    return 0;
	}
    }
    return 1;
}

1;
