/usr/local/CPAN/ClearCase-Region/ClearCase/Vob_Cfg_Parser.pm
package ClearCase::Vob_Cfg_Parser;
$VERSION = 1.01;
use strict;
use Carp;
use Log::Log4perl qw(:easy);
my(@keys ) = ();
my(@values ) = ();
my($configFile ) = "";
my($dir ) = "";
my($found ) = 0;
my($logger ) = "";
$logger = Log::Log4perl->get_logger("Vob_Cfg_Parser");
$logger->level($INFO);
foreach $dir (@INC) {
if ( -f "$dir/Vob.cfg" ) {
$configFile = "$dir/Vob.cfg";
$found = 1;
last;
}
}
if ($found == 0) {
$logger->error("Error: Vob.cfg not found in any \@INC directory\n");
exit 1;
}
#*************************************************************************
# create anonymous array from comma delimited string
#*************************************************************************
sub create_anon_array
{
use strict;
my(@array ) = split(/,/, $_[0]);
return \@array;
}
#*************************************************************************
# create anonymous hash
#*************************************************************************
sub create_anon_hash
{
use strict;
my($i ) = 0;
my($len ) = $#keys;
my(%hash ) = ();
for ($i=0 ; $i <= $len ; $i++) {
$hash{$keys[$i]} = $values[$i];
}
return \%hash;
}
#*************************************************************************
# get configuration info from cfg file
#*************************************************************************
sub new
{
use strict;
my($proto ) = shift;
my($class ) = ref($proto) || $proto;
my($region_name ) = Region->name();
my($subregion ) = $_[0];
my($vob ) = $_[1];
my($argstg ) = $region_name . ' ' . $subregion;
my($match ) = 0;
my($rname ) = "";
my($key ) = "";
my($keyflg ) = 0;
my($name ) = "";
my($value ) = "";
my($valuestg ) = "";
my(@Fld ) = ();
my($hashref ) = {};
croak("Private method, Vob_Cfg_Parser->new(), cannot be called directly")
unless caller->isa("Vob");
push(@keys, 'vob');
push(@values, $vob);
push(@keys, 'subregion');
push(@values, $subregion);
if (! open (INFILE,"$configFile")) {
$logger->error("Bad open on $configFile\n");
exit 1;
}
while (<INFILE>) {
# Ignore the comments and blank lines in the configuration file
# This allows for documentation in the configuration file
if (/^\s*#/) { # ignore comments
if ($match) {
if ($keyflg == 1) {
last;
}
}
next;
}
elsif (/^\s+/) { # ignore blank lines
if ($match) {
if ($keyflg == 1) {
last;
}
}
next;
}
chomp; # chop off the trailing new line character
@Fld = split(' ',$_,9999);
# Look for the entry matching for the region label
if (/^[ \t]*\[/) {
$rname = $_;
$rname =~ s/[ \t]*\[//g;
$rname =~ s/\].*//;
$rname =~ s/\'//g;
if ($argstg eq $rname) {
$match = 1;
}
else {
if ($match == 1) {
last;
}
$match = 0;
}
next;
}
if ($match) {
# load the hash with the vob specific configuration options
if ($keyflg == 0) {
$key = $Fld[1];
$key =~ s/\'//g;
$key =~ s/\#.*//;
if ($vob eq $key) {
$keyflg = 1;
}
else {
next;
}
}
else {
$name = $Fld[0];
$value = $_;
$value =~ s/$name[ \t]*//;
$value =~ s/\'*//g;
$value =~ s/\#.*//;
if ($value =~ /\[/) {
$valuestg = $value;
$valuestg=~ s/\[//;
$valuestg =~ s/\].*//;
$valuestg=~ s/[ \t]*//g;
$value = create_anon_array($valuestg);
}
push(@keys, $name);
push(@values, $value);
}
}
} # end of while loop
close(INFILE);
$hashref = create_anon_hash();
bless $hashref, $class;
return $hashref;
}
1;