Rev 3967 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#! perl######################################################################### Copyright ( C ) 2004-2010 ERG Limited, All rights reserved## Module name : jats.sh# Module type : Jats Perl Module# Environment(s): jats## Description: Class to simply the process of creating and writing# a new configuration file## Used to create files used by JATS in the build process## Usage: $fh = ConfigurationFile::New( 'SomeName' );# $fh->HeaderSimple();# $fh->Header();# $fh->Write();# $fh->WriteLn();# $fh->Comment()# $fh->Dump()# $fh->DumpData()# $fh->Close();##......................................................................#require 5.006_001;use strict;use warnings;################################################################################## Package to manage the creation of configuration files##package ConfigurationFile;#-------------------------------------------------------------------------------# Function : ConfigurationFile::New## Description : Create and open a configuration file## Inputs : $name - Name of the file to create.# @opts - List of options# --NoEof - Supress EOF at the end of the file# --Type=xxx - Control the comment markers# --NoTime - Supress the time stamp## Returns : Package handle#sub New{my ($name, @opts) = @_;## Package variables#my ($self) = {FH => *CONFIG, # File HandleNAME => $name, # Name of the fileEOF => 1, # Print EOF on closureFTYPE => 'perl', # vi style file typeCMT => '#', # Line comments begin withTIME => '', # Inserted timestampDO_TIME => 1, # Insert timestamp in header};## Parse arguments#foreach ( @opts ){if ( /--NoEof/ ) {$self->{'EOF'} = 0;} elsif ( /--Type=(.*)/ ) {$self->{'FTYPE'} = $1;$self->{'CMT'} = 'REM' if ( $1 eq 'bat' );$self->{'CMT'} = '//' if ( $1 eq 'CSharp' );$self->{'CMT'} = '//' if ( $1 eq 'C++' );$self->{'CMT'} = '//' if ( $1 eq 'Delphi' );$self->{'CMT'} = '\'' if ( $1 eq 'Basic' );} elsif ( /^--NoTime/ ) {$self->{'DO_TIME'} = 0;} else {::Error("ConfigurationFile::New: Bad option: $_");}}## Insert a timestamp#$self->{TIME} = $::CurrentTime ? $::CurrentTime : localtime;## Create the file# Save the file handle#open( $self->{'FH'}, ">", $name ) || ::Error( "Cannot create '$name'");binmode ( $self->{'FH'} )if ( $self->{'FTYPE'} eq 'sh' );## Bless my self and return a handle#return bless $self, __PACKAGE__;}#-------------------------------------------------------------------------------# Function : Write# WriteLn# Comment## Description : print a line to the file# Called write to avoid massivce confusion with print## Inputs : $self - package handle# $* - print arguments# WriteLn will write each one with a newline# Arrays are allowed## Returns :#sub Write{my $self = shift;print {$self->{FH}} ( @_ );}sub WriteLn{my $self = shift;foreach my $entry ( @_ ) {if ( ref ($entry ) eq 'ARRAY' ) {print {$self->{FH}} $_ . "\n" foreach ( @$entry );} else {print {$self->{FH}} $entry . "\n"}}}sub Comment{my $self = shift;print {$self->{FH}} ( $self->{'CMT'}, ' ', @_ );}#-------------------------------------------------------------------------------# Function : Dump## Description : Write out a data structure to the configuration file.# Raw version. No header, no frills## Inputs : $varref - Array of stuff to dump# $name - Array of names to use## Returns :#sub Dump{my( $self, $varref, $name ) = @_;$Data::Dumper::Indent = 1; # Use 2 for readability, 1 or 0 for production$Data::Dumper::Sortkeys = 1; # Sort the output for readability# $Data::Dumper::Purity = 1;$Data::Dumper::Deepcopy = 1; # Need to get @LIBS, @MLIBS into .cfg$self->Write (Data::Dumper->Dump ($varref, $name));}#-------------------------------------------------------------------------------# Function : DumpData## Description : Write out a data structure with header## Inputs :## Returns :#sub DumpData # Will also work with a hash{my ($self, $desc, $name, $array) = @_;my ($sep) = "";$self->Write($desc) if ($desc);$self->Dump( [$array], ["*$name"] );$self->Write("\n\n");}#-------------------------------------------------------------------------------# Function : Header## Description: : Generate a "standard" configuration file.#..sub Header{my ($self, $by, $desc, $trailing) = @_;$desc = "" if ( !defined( $desc ) );$trailing = "" if ( !defined( $trailing ) );my ($diff);$diff = 0 if (($diff = ((80-6) - length($self->{'CMT'}) - length($desc))) < 0);$desc .= " " . ("-" x $diff);## Process HERE document to remove leading write space# Simply to make the source look nice#my $ts = '';if ( $self->{'DO_TIME'} ){$ts = <<HERE_TARGET;$self->{'CMT'} on $self->{'TIME'}HERE_TARGET}my $var;($var = <<HERE_TARGET) =~ s/^\s+//gm;$self->{'CMT'} -- $desc$self->{'CMT'}$self->{'CMT'} -- Please do not edit this file. --$self->{'CMT'}$self->{'CMT'} WARNING:$self->{'CMT'} This file is used internally by JATS to maintain information$self->{'CMT'} about the current sandbox. You not must modify, nor move or$self->{'CMT'} delete this file. To do so may result in a system failure,$self->{'CMT'} in additional to any changes made shall be overwritten.$self->{'CMT'}$self->{'CMT'} Created by $by$ts$self->{'CMT'}$trailingHERE_TARGET$self->Write ($var);}#-------------------------------------------------------------------------------# Function : HeaderSimple## Description: : Generate a "simple" configuration file.#..sub HeaderSimple{my ($self, $by, $desc, $trailing) = @_;$desc = "" if ( !defined( $desc ) );$trailing = "" if ( !defined( $trailing ) );my ($diff);$diff = 0 if (($diff = ((80-6) - length($self->{'CMT'}) - length($desc))) < 0);$desc .= " " . ("-" x $diff);## Process HERE document to remove leading write space# Simply to make the source look nice#my $ts = '';if ( $self->{'DO_TIME'} ){$ts = <<HERE_TARGET;$self->{'CMT'} on $self->{'TIME'}HERE_TARGET}my $var;($var = <<HERE_TARGET) =~ s/^\s+//gm;$self->{'CMT'} -- $desc$self->{'CMT'}$self->{'CMT'} -- Do not edit this file. --$self->{'CMT'}$self->{'CMT'} Created by $by$ts$self->{'CMT'}$trailingHERE_TARGET$self->Write ($var);}#-------------------------------------------------------------------------------# Function : Close## Description : Generate EOF markers and close the file## Inputs : $file - File handle# $noeof - TRUE: Don't generate an EOF## Returns :#sub Close{my ($self, $noeof ) = @_;$self->{'EOF'} = 0 if ( $noeof );if ( $self->{'EOF'} ){if ( $self->{'FTYPE'} eq 'perl' ){my $var;($var = <<HERE_TARGET) =~ s/^\s+//gm;#-EOF-1;HERE_TARGET$self->Write( $var);}else{$self->Comment("End of File\n" );}}close $self->{FH};$self->{FH} = '';}#-------------------------------------------------------------------------------# Function : DESTROY## Description : Object destructor# Sanity test. Generate an error if the object is destroyed# without being closed.## Inputs : $self## Returns :#sub DESTROY{my $self = shift;::Error("ConfigurationFile not closed: $self->{NAME}")if ( $self->{FH} );}################################################################################1;