###################################################
# utility functions to support the build farm
# Copyright (C) tridge@samba.org, 2001
#
#   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., 675 Mass Ave, Cambridge, MA 02139, USA.

package util;

use Data::Dumper;

##############################################
# load a list from a file, using : to separate
sub load_list($)
{
	my $fname = shift;
	my @lines = split('\n', `grep -v ^# $fname`);
	return @lines;
}

##############################################
# load a hash from a file, using : to separate
sub load_hash($)
{
	my $fname = shift;
	my @lines = load_list($fname);
	my %ret;
	for my $l (@lines) {
		if ($l =~ /^([\w\-]*)\s*:\s*(.*)$/) {
			$ret{$1} = $2;
		}
	}
	return %ret;
}

#####################################################################
# check if a string is in an array
sub InArray($$)
{
    my ($s, $a) = @_;
    for my $v (@{$a}) {
		return 1 if ($v eq $s);
    }
    return 0;
}

#####################################################################
# flatten an array of arrays into a single array
sub FlattenArray($) 
{ 
    my $a = shift;
    my @b;
    for my $d (@{$a}) {
		push(@b, $_) foreach (@{$d});
    }
    return \@b;
}

#####################################################################
# flatten an array of hashes into a single hash
sub FlattenHash($) 
{ 
    my $a = shift;
    my %b;
    for my $d (@{$a}) {
		for my $k (keys %{$d}) {
			$b{$k} = $d->{$k};
		}
    }
    return \%b;
}

#####################################################################
# return the modification time of a file
sub FileModtime($)
{
    my($filename) = shift;
    return (stat($filename))[9];
}

#####################################################################
# read a file into a string
sub FileLoad($)
{
    my($filename) = shift;
    local(*INPUTFILE);
    open(INPUTFILE, $filename) || return "";
    my($saved_delim) = $/;
    undef $/;
    my($data) = <INPUTFILE>;
    close(INPUTFILE);
    $/ = $saved_delim;
    return $data;
}

#####################################################################
# write a string into a file
sub FileSave($$)
{
    my($filename) = shift;
    my($v) = shift;
    local(*FILE);
    open(FILE, ">$filename") || die "can't open $filename";    
    print FILE $v;
    close(FILE);
}

#####################################################################
# return a filename with a changed extension
sub ChangeExtension($$)
{
    my($fname,$ext) = @_;
	return "$1.$ext" if ($fname =~ /^(.*)\.(.*?)$/);
    return "$fname.$ext";
}

#####################################################################
# save a data structure into a file
sub SaveStructure($$)
{
    my($filename) = shift;
    my($v) = shift;
    FileSave($filename, Dumper($v));
}

#####################################################################
# load a data structure from a file (as saved with SaveStructure)
sub LoadStructure($)
{
    return eval FileLoad(shift);
}

##########################################
# count the number of lines in a buffer
sub count_lines($)
{
    my $s = shift;
    my $count;
    $count++ while $s =~ /$/gm;
    return $count;
}

################
# display a time as days, hours, minutes
sub dhm_time($)
{
	my $sec = shift;
	my $days = int($sec / (60*60*24));
	my $hour = int($sec / (60*60)) % 24;
	my $min = int($sec / 60) % 60;

	my $ret = "";

	if ($sec < 0) { 
		return "-";
	}

	if ($days != 0) { 
		return sprintf("%dd %dh %dm", $days, $hour, $min);
	}
	if ($hour != 0) {
		return sprintf("%dh %dm", $hour, $min);
	}
	if ($min != 0) {
		return sprintf("%dm", $min);
	}
	return sprintf("%ds", $sec);
}

##############################################
# simple html markup stripper
sub strip_html($) {
	my $string = shift;

	# get rid of comments
	$string =~ s/<!\-\-(.*?)\-\->/$2/g;

	# and remove tags.
	while ($string =~ s&<(\w+).*?>(.*?)</\1>&$2&) {
		;
	}

	return $string;
}

1;
