918 lines
25 KiB
C++
918 lines
25 KiB
C++
|
/*************************************************************************
|
||
|
#*
|
||
|
#* $RCSfile: getopt.cxx,v $
|
||
|
#*
|
||
|
#* class classname(s)
|
||
|
#*
|
||
|
#* Description perl-like commandline processor
|
||
|
#* (see description in headerfile)
|
||
|
#*
|
||
|
#* Creation Date Stefan Zimmermann 09/15/2000
|
||
|
#* last change $Author: lla $ $Date: 2003-01-09 11:06:02 $
|
||
|
#* $Revision: 1.1 $
|
||
|
#*
|
||
|
#* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
|
||
|
#*
|
||
|
#*************************************************************************
|
||
|
|
||
|
Source Code Control System - Header
|
||
|
|
||
|
$Header: /zpool/svn/migration/cvs_rep_09_09_08/code/testshl2/source/getopt.cxx,v 1.1 2003-01-09 11:06:02 lla Exp $
|
||
|
|
||
|
Source Code Control System - Update
|
||
|
|
||
|
*************************************************************************/
|
||
|
#ifndef __QADEV_REGSCAN_GETOPT_HXX__
|
||
|
#include "getopt.hxx"
|
||
|
#endif
|
||
|
|
||
|
#include "filehelper.hxx"
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// OptDsc
|
||
|
//----------------------------------------------------------------------------
|
||
|
//> createOptDsc
|
||
|
void OptDsc::createOptDsc( const rtl::OString& opt ) {
|
||
|
|
||
|
// analyze type of option
|
||
|
// in case of flag indicate and set name and hint
|
||
|
if ( ( opt.indexOf("=") == -1 ) && ( opt.indexOf(":") == -1 ) ) {
|
||
|
m_type = OT_BOOL;
|
||
|
|
||
|
// extract options dokumentation if any
|
||
|
sal_Int32 index = opt.indexOf(",");
|
||
|
if ( index == -1 ) {
|
||
|
m_name = opt;
|
||
|
}
|
||
|
else {
|
||
|
m_name = opt.copy( 0, index );
|
||
|
m_hint = ( opt.copy( index + 1 ) ).trim();
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
vector < rtl::OString > optLine;
|
||
|
|
||
|
// ':' indicates that option has optional parameter(s)
|
||
|
if ( opt.indexOf(":") != -1 ) {
|
||
|
m_type |= OT_OPTIONAL;
|
||
|
// create optionline tokenvector
|
||
|
split( opt, ":,", optLine );
|
||
|
}
|
||
|
else {
|
||
|
// create optionline tokenvector
|
||
|
split( opt, "=,", optLine );
|
||
|
}
|
||
|
|
||
|
// extract name of option
|
||
|
m_name = optLine[0];
|
||
|
|
||
|
// parameter(s) of string type
|
||
|
if ( optLine[1].indexOf("s") != -1 ) {
|
||
|
m_type |= OT_STRING;
|
||
|
m_legend += "arg";
|
||
|
}
|
||
|
// parameter(s) of numeric type
|
||
|
if ( optLine[1].indexOf("n") != -1 ) {
|
||
|
m_type |= OT_NUMBER;
|
||
|
m_legend += "arg";
|
||
|
}
|
||
|
// multiple parameters allowed
|
||
|
if ( optLine[1].indexOf("@") != -1 ) {
|
||
|
m_type |= OT_MULTI;
|
||
|
m_legend += "#1,[arg#n]";
|
||
|
}
|
||
|
else {
|
||
|
m_type |= OT_SINGLE;
|
||
|
}
|
||
|
|
||
|
// extract options dokumentation if any
|
||
|
m_hint = optLine[optLine.size()-1].trim();
|
||
|
|
||
|
} ///< createOptDsc
|
||
|
|
||
|
//> split
|
||
|
void OptDsc::split( const rtl::OString& opt, const rtl::OString& cSet,
|
||
|
vector< rtl::OString >& optLine ) {
|
||
|
|
||
|
const sal_Int32 cSetLen = cSet.getLength();
|
||
|
const sal_Char* pcSet = cSet.getStr();
|
||
|
sal_Int32 index = 0;
|
||
|
sal_Int32 oldIndex = 0;
|
||
|
|
||
|
sal_Int32 i;
|
||
|
for ( i = 0; i < cSetLen; i++ ) {
|
||
|
index = opt.indexOf( pcSet[i] );
|
||
|
if( index != -1 ) {
|
||
|
optLine.push_back( opt.copy( oldIndex, index - oldIndex ) );
|
||
|
oldIndex = index + 1;
|
||
|
}
|
||
|
}
|
||
|
optLine.push_back( opt.copy( oldIndex ) );
|
||
|
} ///< split
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// GetOpt
|
||
|
//----------------------------------------------------------------------------
|
||
|
//> ~GetOpt
|
||
|
GetOpt::~GetOpt() {
|
||
|
vector< OptDsc* >::iterator iter = m_optionset.begin();
|
||
|
while ( iter != m_optionset.end() ) {
|
||
|
delete (*iter);
|
||
|
(*iter) = 0;
|
||
|
iter++;
|
||
|
}
|
||
|
m_optionset.clear();
|
||
|
} ///< ~GetOpt
|
||
|
|
||
|
/**
|
||
|
* private
|
||
|
* initialization of GetOpt class means to fill the vector members
|
||
|
* representing the commandline and optionset
|
||
|
* @param char* cmdLine[] = comandline
|
||
|
* @param char* optSet[] = optionset
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
//> initialize
|
||
|
void GetOpt::initialize( char* cmdLine[], char* optSet[] ) {
|
||
|
|
||
|
while ( *cmdLine ) {
|
||
|
m_cmdline.push_back( rtl::OString( *cmdLine ) );
|
||
|
*cmdLine++;
|
||
|
}
|
||
|
// insert an empty OString, to mark the end.
|
||
|
m_cmdline.push_back(rtl::OString());
|
||
|
|
||
|
while ( *optSet && ( rtl::OString( optSet[0] ).indexOf("-") != -1 ) ) {
|
||
|
m_optionset.push_back( new OptDsc( *optSet ) );
|
||
|
*optSet++;
|
||
|
}
|
||
|
|
||
|
} ///< initialize
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* returns a pointer to an object of type optiondescription (OptDsc)
|
||
|
*
|
||
|
* @param rtl::OString& opt = name of option
|
||
|
*
|
||
|
* @return OptDsc* = pointer to requested optiondescription
|
||
|
* or NULL if not found
|
||
|
*/
|
||
|
//> getOptDsc
|
||
|
OptDsc* GetOpt::getOptDsc( rtl::OString& opt ) {
|
||
|
|
||
|
vector< OptDsc* >::iterator iter = m_optionset.begin();
|
||
|
while ( iter != m_optionset.end() ) {
|
||
|
if ( (*iter)->getName() == opt ) {
|
||
|
return (*iter);
|
||
|
}
|
||
|
iter++;
|
||
|
}
|
||
|
return NULL;
|
||
|
|
||
|
} ///< getOptDsc
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* check if option is already present in optionhash
|
||
|
* @param const rtl::OString& opt = name of option
|
||
|
* @return sal_Bool
|
||
|
*/
|
||
|
//> hasOpt
|
||
|
sal_Bool GetOpt::hasOpt( const rtl::OString& opt ) const {
|
||
|
|
||
|
if ( m_opthash.find( opt ) != m_opthash.end() ) {
|
||
|
return sal_True ;
|
||
|
}
|
||
|
return sal_False ;
|
||
|
|
||
|
} ///< hasOpt
|
||
|
|
||
|
/**
|
||
|
* private
|
||
|
* handles the initialized comandline vector
|
||
|
* and fill the optionhash with evaluated options
|
||
|
* @param none
|
||
|
* @return void
|
||
|
*/
|
||
|
//> createCmdLineOptions
|
||
|
void GetOpt::createCmdLineOptions() {
|
||
|
|
||
|
// get iterator of comandline vector
|
||
|
vector< rtl::OString >::iterator iter = m_cmdline.begin();
|
||
|
|
||
|
int nSize = m_cmdline.size();
|
||
|
// process the whole vector
|
||
|
while ( iter != m_cmdline.end() ) {
|
||
|
// extract first comandlineparameter as program name
|
||
|
if ( (*iter) == m_cmdline.front() ) {
|
||
|
m_prgname = (*iter);
|
||
|
iter++;
|
||
|
continue;
|
||
|
}
|
||
|
// extract following comandline parameter(s) as program parameter(s)
|
||
|
if ( ( (*iter) != m_cmdline.front() ) && /* not first parameter */
|
||
|
( (*iter).indexOf("-") == -1 ) /* start without '-' */
|
||
|
)
|
||
|
{
|
||
|
if ((*iter).getLength() > 0 ) /* is not empty */
|
||
|
m_param.push_back(*iter);
|
||
|
iter++;
|
||
|
continue;
|
||
|
}
|
||
|
// option occured
|
||
|
if ( (*iter).indexOf("-") != -1 )
|
||
|
{
|
||
|
// ignore invalid options
|
||
|
if ( ! evaluateOpt( iter ) )
|
||
|
{
|
||
|
iter++;
|
||
|
// check if wrong option has got a parameter
|
||
|
// and skip that, too
|
||
|
if( (iter + 1) != m_cmdline.end() )
|
||
|
{
|
||
|
if ( (*(iter + 1)).indexOf("-") == -1 )
|
||
|
{
|
||
|
iter++;
|
||
|
}
|
||
|
}
|
||
|
continue;
|
||
|
}
|
||
|
rtl::OString opt( (*iter) );
|
||
|
vector< rtl::OString > optValues;
|
||
|
|
||
|
// option is no flag
|
||
|
if ( ! getOptDsc( opt )->isFlag() ) {
|
||
|
// but has optional parameters
|
||
|
if ( getOptDsc( opt )->isOptional() ) {
|
||
|
// no parameters present
|
||
|
if ( ! hasParam( iter ) ) {
|
||
|
m_opthash[ opt ] = optValues;
|
||
|
optValues.clear();
|
||
|
iter++;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
iter++;
|
||
|
// more than one option parameters occured
|
||
|
if ( (*iter).indexOf( "," ) != -1 ) {
|
||
|
tokenize( (*iter), "," , optValues );
|
||
|
}
|
||
|
else {
|
||
|
optValues.push_back( (*iter) );
|
||
|
}
|
||
|
}
|
||
|
// create key/value pair in optionhash and clear value vector
|
||
|
m_opthash[ opt ] = optValues;
|
||
|
optValues.clear();
|
||
|
}
|
||
|
iter++;
|
||
|
}
|
||
|
} ///< createCmdLineOptions
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* check if option has parameter(s)
|
||
|
* @param vector< rtl::OString >::iterator iter = iterator of
|
||
|
* comandline vector
|
||
|
*
|
||
|
* @return sal_Bool
|
||
|
*/
|
||
|
//> hasParam
|
||
|
sal_Bool GetOpt::hasParam( vector< rtl::OString >::iterator iter ) {
|
||
|
if ( iter+1 == m_cmdline.end() ) {
|
||
|
return sal_False;
|
||
|
}
|
||
|
if ( (*(iter+1)).indexOf("-") == 0 ) {
|
||
|
return sal_False;
|
||
|
}
|
||
|
if ( (*(iter+1)) == "" ) {
|
||
|
return sal_False;
|
||
|
}
|
||
|
|
||
|
return sal_True;
|
||
|
} ///< hasParam
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* option evaluation in general means to verify if the option occur is
|
||
|
* a member of optionset say an admitted option, if so does it appear with
|
||
|
* the right or tolerable usage
|
||
|
*
|
||
|
* @param vector< rtl::OString >::iterator iter = iterator of
|
||
|
* comandline vector
|
||
|
*
|
||
|
* @return sal_Bool
|
||
|
*/
|
||
|
//> evaluateOpt
|
||
|
sal_Bool GetOpt::evaluateOpt( vector< rtl::OString >::iterator iter ) {
|
||
|
|
||
|
// option is no member of optionset
|
||
|
if ( ! exist( (*iter) ) ) {
|
||
|
cout << "Unknown option " << (*iter).getStr()
|
||
|
<< " occurred !" << endl;
|
||
|
return sal_False;
|
||
|
}
|
||
|
|
||
|
// option is a flag
|
||
|
if ( getOptDsc( (*iter) )->isFlag() ) {
|
||
|
return sal_True;
|
||
|
}
|
||
|
|
||
|
// parameter not optional
|
||
|
if ( ! getOptDsc( (*iter) )->isOptional() ) {
|
||
|
|
||
|
// verify that next vectoritem is present and no option
|
||
|
if ( ( *( iter + 1 ) ).getLength() &&
|
||
|
( ( *( iter + 1 ) ).indexOf( "-" ) != 0 ) ) {
|
||
|
|
||
|
// if we are waiting for one single parameter
|
||
|
if ( getOptDsc( *iter )->isSingle() ) {
|
||
|
// but find multiple parameters
|
||
|
if( ( *( iter + 1 ) ).indexOf(",") != -1 ) {
|
||
|
cout << "Wrong use of option " << (*iter).getStr()
|
||
|
<< " too many parameters !" << endl;
|
||
|
return sal_False;
|
||
|
}
|
||
|
return sal_True;
|
||
|
}
|
||
|
return sal_True;
|
||
|
}
|
||
|
|
||
|
cout << "Wrong use of option " << (*iter).getStr()
|
||
|
<< " parameter missing !" << endl;
|
||
|
return sal_False;
|
||
|
}
|
||
|
// parameter optional
|
||
|
if ( getOptDsc( *iter )->isSingle() ) {
|
||
|
|
||
|
if ( hasParam( iter ) ) {
|
||
|
if( ( *( iter + 1 ) ).indexOf(",") != -1 ) {
|
||
|
cout << "Wrong use of option " << (*iter).getStr()
|
||
|
<< " too many parameters !" << endl;
|
||
|
return sal_False;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return sal_True;
|
||
|
|
||
|
} ///< evaluateOpt
|
||
|
|
||
|
|
||
|
//> createOpt
|
||
|
void GetOpt::createOpt( rtl::OString& optDscStr ) {
|
||
|
m_optionset.push_back( new OptDsc( optDscStr ) );
|
||
|
} ///< createOpt
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* conditional addition of an option to optionhash
|
||
|
* overriding options, already present in optionhash, is not permitted
|
||
|
*
|
||
|
* @param rtl::OString& optStr = optionstring which is to break in a
|
||
|
* key/value pair and to add to optionhash
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
//> addOpt
|
||
|
void GetOpt::addOpt( rtl::OString& optStr, sal_Bool eval ) {
|
||
|
|
||
|
vector< rtl::OString > optTok;
|
||
|
tokenize( optStr, "=", optTok );
|
||
|
|
||
|
// prevent override of commandline options
|
||
|
// by options from ini file
|
||
|
if( hasOpt( optTok[0] ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// evaluate rigth usage of option
|
||
|
if( eval ) {
|
||
|
if ( ! evaluateOpt( optTok.begin() ) ) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
vector< rtl::OString > optValues;
|
||
|
|
||
|
if ( optTok.size() > 1 ) {
|
||
|
rtl::OString oValStr( optTok[1] );
|
||
|
// found a variable
|
||
|
if ( oValStr.indexOf(",") == -1 ) {
|
||
|
optValues.push_back( oValStr );
|
||
|
}
|
||
|
else {
|
||
|
tokenize( oValStr, ",", optValues );
|
||
|
}
|
||
|
}
|
||
|
m_opthash[ optTok[0] ] = optValues;
|
||
|
optValues.clear();
|
||
|
return;
|
||
|
} ///< addOpt
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* verify the existance of an option in optionset
|
||
|
* @param rtl::OString& opt = option name
|
||
|
* @return sal_Bool
|
||
|
*/
|
||
|
//> exist
|
||
|
sal_Bool GetOpt::exist( rtl::OString& opt ) {
|
||
|
if ( getOptDsc( opt ) ) {
|
||
|
return sal_True;
|
||
|
}
|
||
|
return sal_False;
|
||
|
} ///< exist
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* verify the existance of variables inside options
|
||
|
* @param none
|
||
|
* @return sal_Bool
|
||
|
*/
|
||
|
//> hasVars
|
||
|
sal_Bool GetOpt::hasVars() {
|
||
|
if ( m_varvec.size() ) {
|
||
|
return sal_True;
|
||
|
}
|
||
|
return sal_False;
|
||
|
} ///< hasVars
|
||
|
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* proceeds a buffer representing the content of an ini file and adds the
|
||
|
* options to optionhash. The optionstrings in the file are allowed to contain
|
||
|
* variables indicated by delimiters described with varDelim
|
||
|
*
|
||
|
* @param rtl::OString iOpts = raw filecontent
|
||
|
* @param const rtl::OString& varDelim = delimiter indicating a variable
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
//> str2Opt
|
||
|
void GetOpt::str2Opt( rtl::OString iOpts ) {
|
||
|
|
||
|
// tokenize filecontent by '\n' to create a vector of lines
|
||
|
vector< rtl::OString > iniLines;
|
||
|
tokenize( iOpts, "\n", iniLines );
|
||
|
|
||
|
sal_uInt32 tCnt = iniLines.size();
|
||
|
|
||
|
// process all lines
|
||
|
sal_uInt32 i;
|
||
|
for ( i = 1; i < tCnt; i++ ) {
|
||
|
rtl::OString optLine( iniLines[i] );
|
||
|
// ignore comments
|
||
|
if ( ! ( optLine.indexOf("#") == 0 ) ) {
|
||
|
// filter valid options after trim
|
||
|
if ( ( optLine.indexOf("-") == 0 ) ) {
|
||
|
// line contains a variable
|
||
|
if ( ( optLine.indexOf( m_vardelim ) != -1 ) ) {
|
||
|
// push to var vector for later process
|
||
|
m_varvec.push_back( optLine );
|
||
|
continue;
|
||
|
}
|
||
|
addOpt( optLine );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} ///< str2opt
|
||
|
|
||
|
void GetOpt::replVars() {
|
||
|
|
||
|
// process vector of lines containing variables
|
||
|
vector< rtl::OString >::iterator iter = m_varvec.begin();
|
||
|
while ( iter != m_varvec.end() ) {
|
||
|
sal_uInt32 index = 0;
|
||
|
while ( ( index = (*iter).indexOf( m_vardelim ) ) != -1 ) {
|
||
|
vector< rtl::OString > varLineTok;
|
||
|
rtl::OString varKey( "-" );
|
||
|
tokenize( *iter, m_vardelim, varLineTok );
|
||
|
varKey += varLineTok[1];
|
||
|
vector< rtl::OString > keyValues = getOptVec( varKey );
|
||
|
|
||
|
if ( keyValues.size() > 1 ) {
|
||
|
rtl::OString rplStr;
|
||
|
|
||
|
vector< rtl::OString >::iterator kvi = keyValues.begin();
|
||
|
while ( kvi != keyValues.end() ) {
|
||
|
rplStr += (*kvi);
|
||
|
kvi++;
|
||
|
if ( kvi != keyValues.end() ) {
|
||
|
rplStr += ",";
|
||
|
}
|
||
|
}
|
||
|
(*iter ) = (*iter).replaceAt(
|
||
|
index, varKey.getLength()+1, rplStr );
|
||
|
}
|
||
|
else {
|
||
|
if( *(keyValues[0])) {
|
||
|
(*iter) = (*iter).replaceAt(
|
||
|
index, varKey.getLength()+1, keyValues[0] );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
addOpt( (*iter) );
|
||
|
iter++;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* displays a formatted usagescreen
|
||
|
* @param none
|
||
|
* @return void
|
||
|
*/
|
||
|
//> showUsage
|
||
|
void GetOpt::showUsage() {
|
||
|
|
||
|
sFormat frm;
|
||
|
frm.fCol = getMaxNameLength() + 2;
|
||
|
frm.sCol = frm.fCol + getMaxLegendLength() + 2 ;
|
||
|
frm.len = 79;
|
||
|
|
||
|
vector< rtl::OString > nameVec;
|
||
|
vector< rtl::OString > paramVec;
|
||
|
|
||
|
tokenize( getName(), "/\\", nameVec );
|
||
|
if ( m_param.empty() ) {
|
||
|
if ( hasOpt( "-db" ) ) {
|
||
|
tokenize( getOpt( "-db" ), "/\\", paramVec );
|
||
|
}
|
||
|
else {
|
||
|
paramVec.push_back( rtl::OString( "not available" ) );
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
tokenize( getFirstParam(), "/\\", paramVec );
|
||
|
}
|
||
|
|
||
|
cout << "\n\n\n\n\nUsage: prgname param [options]\n\nPRGNAME = [path]";
|
||
|
|
||
|
if ( nameVec.end() ) {
|
||
|
cout << (*(nameVec.end()-1)).getStr();
|
||
|
}
|
||
|
cout << "\nPARAM = [path]";
|
||
|
if ( paramVec.end() ) {
|
||
|
cout << (*(paramVec.end()-1)).getStr() << endl;
|
||
|
}
|
||
|
|
||
|
cout << "\nOPTIONS = [" << flush;
|
||
|
|
||
|
vector< OptDsc* >::iterator iter = m_optionset.begin();
|
||
|
|
||
|
while ( iter != m_optionset.end() ) {
|
||
|
cout << (*iter)->getName().getStr() << "," << flush;
|
||
|
iter++;
|
||
|
}
|
||
|
cout << "]\n\nOPTIONS:\n" << flush;
|
||
|
|
||
|
iter = m_optionset.begin();
|
||
|
|
||
|
while ( iter != m_optionset.end() ) {
|
||
|
cout << optDsc2Str( *iter, frm ).getStr() << endl << flush;
|
||
|
|
||
|
iter++;
|
||
|
}
|
||
|
|
||
|
} ///< showUsage
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* displays the actual option/parameter status
|
||
|
* @param none
|
||
|
* @return void
|
||
|
*/
|
||
|
//> printStatus
|
||
|
void GetOpt::printStatus( void ) {
|
||
|
|
||
|
sal_uInt32 maxlen = getMaxNameLength();
|
||
|
optHashMap::iterator iter = m_opthash.begin();
|
||
|
cout << endl;
|
||
|
|
||
|
while ( iter != m_opthash.end() ) {
|
||
|
rtl::OString option( (*iter).first );
|
||
|
|
||
|
cout.setf(ios::left);
|
||
|
cout.width( maxlen+1 );
|
||
|
cout << option.getStr() << "= ";
|
||
|
|
||
|
if ( ! getOptDsc( option )->isFlag() ) {
|
||
|
if ( ! getOptVec( option ).empty() ) {
|
||
|
sal_uInt32 j;
|
||
|
for ( j = 0; j < (*iter).second.size(); j++ ) {
|
||
|
cout << (( (*iter).second )[j]).getStr() << " ";
|
||
|
}
|
||
|
cout << endl;
|
||
|
}
|
||
|
else {
|
||
|
cout << "FALSE\n";
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
cout << "TRUE\n";
|
||
|
}
|
||
|
iter++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* private
|
||
|
* converts an object of type optiondescription (OptDsc) to a formatted
|
||
|
* displayable string for usagescreen needs
|
||
|
* @param OptDsc* optDsc = pointer to option description
|
||
|
* @param sFormat frm = format structur
|
||
|
*
|
||
|
* @return const rtl::OString = formatted string for display purposes
|
||
|
*/
|
||
|
//> optDsc2Str >>> to be replaced by intelliget algorythm <<<
|
||
|
const rtl::OString GetOpt::optDsc2Str( OptDsc* optDsc , sFormat frm ) {
|
||
|
|
||
|
sal_Char* buf = new sal_Char[ frm.len + 1 ];
|
||
|
sal_Char* pBuf = buf;
|
||
|
|
||
|
sal_uInt32 i;
|
||
|
for ( i = 0; i < frm.len; i++ ) {
|
||
|
*pBuf++ = ' ';
|
||
|
}
|
||
|
*pBuf = '\0';
|
||
|
|
||
|
rtl::OStringBuffer strBuf( buf );
|
||
|
rtl::OString oStr = strBuf.makeStringAndClear();
|
||
|
|
||
|
oStr = oStr.replaceAt( 0, optDsc->getName().getLength(),
|
||
|
optDsc->getName() );
|
||
|
if ( optDsc->isOptional() ) {
|
||
|
oStr = oStr.replaceAt( frm.fCol-1, 1, "[" );
|
||
|
}
|
||
|
oStr = oStr.replaceAt( frm.fCol, optDsc->getLegend().getLength(),
|
||
|
optDsc->getLegend() );
|
||
|
if ( optDsc->isOptional() ) {
|
||
|
oStr = oStr.replaceAt( frm.fCol + optDsc->getLegend().getLength() ,
|
||
|
1, "]" );
|
||
|
}
|
||
|
if ( ( frm.sCol + optDsc->getHint().getLength() ) >= frm.len ) {
|
||
|
|
||
|
oStr = oStr.replaceAt( frm.sCol, frm.len - frm.sCol,
|
||
|
optDsc->getHint() );
|
||
|
}
|
||
|
else {
|
||
|
oStr = oStr.replaceAt( frm.sCol,
|
||
|
optDsc->getHint().getLength(), optDsc->getHint() );
|
||
|
}
|
||
|
|
||
|
delete( buf );
|
||
|
|
||
|
return oStr;
|
||
|
|
||
|
} ///< optDsc2Str
|
||
|
|
||
|
/**
|
||
|
* private
|
||
|
* returns the maximum length of all optionnames for format purposes
|
||
|
* @param none
|
||
|
* @return sal_uInt32 length of longest optionname
|
||
|
*/
|
||
|
//> getMaxNameLength
|
||
|
sal_uInt32 GetOpt::getMaxNameLength() {
|
||
|
|
||
|
sal_Int32 len = 0;
|
||
|
vector< OptDsc* >::iterator iter = m_optionset.begin();
|
||
|
|
||
|
while ( iter != m_optionset.end() ) {
|
||
|
if( len < (*iter)->getName().getLength() ){
|
||
|
len = (*iter)->getName().getLength();
|
||
|
}
|
||
|
iter++;
|
||
|
}
|
||
|
return len;
|
||
|
} ///< getMaxNameLength
|
||
|
|
||
|
/**
|
||
|
* private
|
||
|
* returns the maximum length of all option legends for format purposes
|
||
|
* @param none
|
||
|
* @return sal_uInt32 length of longest optionlegend
|
||
|
*/
|
||
|
//> getMaxLegendLength
|
||
|
sal_uInt32 GetOpt::getMaxLegendLength() {
|
||
|
|
||
|
sal_Int32 len = 0;
|
||
|
vector< OptDsc* >::iterator iter = m_optionset.begin();
|
||
|
|
||
|
while ( iter != m_optionset.end() ) {
|
||
|
if( len < (*iter)->getLegend().getLength() ){
|
||
|
len = (*iter)->getLegend().getLength();
|
||
|
}
|
||
|
iter++;
|
||
|
}
|
||
|
return len;
|
||
|
|
||
|
} ///< getMaxLegendLength
|
||
|
|
||
|
/**
|
||
|
* public
|
||
|
* reads the filecontent and pass it to str2opt to add valid options
|
||
|
* to optionhash
|
||
|
* @param rtl::OString iniPth = full qualified filename
|
||
|
* @return ::osl::FileBase::RC = to indicate errors
|
||
|
*/
|
||
|
//> getIniOptions
|
||
|
::osl::FileBase::RC GetOpt::getIniOptions( rtl::OString iniPth ) {
|
||
|
|
||
|
::osl::FileStatus fState( FileStatusMask_All );
|
||
|
::osl::DirectoryItem dItem;
|
||
|
rtl::OUString nrmPath( FileHelper::convertPath( iniPth ) );
|
||
|
|
||
|
::osl::DirectoryItem::get( nrmPath, dItem );
|
||
|
dItem.getFileStatus( fState );
|
||
|
rtl::OUString fName( fState.getFileURL() );
|
||
|
::osl::File iniFile( fName );
|
||
|
|
||
|
const sal_uInt32 filesize = (sal_uInt32)fState.getFileSize();
|
||
|
char* buf = new char[ filesize + 1 ];
|
||
|
|
||
|
::osl::FileBase::RC ret;
|
||
|
sal_uInt64 bytesread;
|
||
|
|
||
|
if ( ( ret = iniFile.open( OpenFlag_Read ) ) != ::osl::FileBase::E_None ) {
|
||
|
return ret;
|
||
|
}
|
||
|
ret = iniFile.read( buf, filesize, bytesread );
|
||
|
buf[ filesize ] = '\0';
|
||
|
|
||
|
str2Opt( buf );
|
||
|
delete [] buf;
|
||
|
return ret;
|
||
|
|
||
|
} ///< getIniOptions
|
||
|
|
||
|
/**
|
||
|
* private
|
||
|
* tokenize a string in dependance of a character set and stores the tokens
|
||
|
* to a token vector
|
||
|
* @param const rtl::OString& opt = optionstring to tokenize
|
||
|
* @param const rtl::OString& cSet = characterset of delimiters
|
||
|
* @param vector< rtl::OString >& optLine = vector of tokens
|
||
|
* @param sal_Bool strip = indicates if CR,LF and TAB should be stripped off
|
||
|
* the token
|
||
|
* @return void
|
||
|
*/
|
||
|
//> tokenize
|
||
|
void GetOpt::tokenize( const rtl::OString& opt, const rtl::OString& cSet,
|
||
|
vector< rtl::OString >& optLine, sal_Bool strip ) {
|
||
|
|
||
|
const sal_Char* pText; // pointer f. text,
|
||
|
const sal_Char* pcSet; // charset and
|
||
|
vector< const sal_Char* > delimVec; // vector of delimiters
|
||
|
|
||
|
// parametercheck for opt ...
|
||
|
if( ! opt.getLength() ) {
|
||
|
return;
|
||
|
}
|
||
|
// ... and charSet
|
||
|
if( ! cSet.getLength() ) {
|
||
|
return;
|
||
|
}
|
||
|
// pointer to begin of textinstance
|
||
|
pText = opt.getStr();
|
||
|
|
||
|
// text
|
||
|
while( *pText ) {
|
||
|
// charset-pointer to begin of charset
|
||
|
pcSet = cSet.getStr();
|
||
|
// charset
|
||
|
while( *pcSet ) {
|
||
|
// delimiter found
|
||
|
if( ( ( *pText == *pcSet ) ) && ( pText != opt ) ) {
|
||
|
delimVec.push_back( pText );
|
||
|
// increment counter
|
||
|
}
|
||
|
pcSet++;
|
||
|
}
|
||
|
// increment pointer
|
||
|
pText++;
|
||
|
}
|
||
|
|
||
|
// save endpointer
|
||
|
delimVec.push_back( opt + opt.getLength() );
|
||
|
|
||
|
sal_Char* pToken; // ptr to token chars
|
||
|
const sal_Char* pBegin; // ptr to begin of current,
|
||
|
const sal_Char* pEnd=opt; // and begin of prev. token
|
||
|
sal_uInt32 i=0;
|
||
|
|
||
|
while ( pEnd < delimVec[delimVec.size()-1] ) {
|
||
|
|
||
|
pBegin = pEnd;
|
||
|
if( pBegin > opt.getStr() ) {
|
||
|
pBegin += 1;
|
||
|
}
|
||
|
pEnd = delimVec[i];
|
||
|
// initialize size
|
||
|
sal_uInt32 nSize = pEnd - pBegin;
|
||
|
// allocate memory
|
||
|
|
||
|
// allocate memory for token
|
||
|
sal_Char* cToken = new sal_Char[ nSize + 1 ];
|
||
|
|
||
|
// get address of allocated memory
|
||
|
pToken = cToken;
|
||
|
|
||
|
// copy token from text
|
||
|
sal_uInt32 j;
|
||
|
for ( j = 0; j < nSize ; ++j ) {
|
||
|
*pToken++ = *pBegin++;
|
||
|
}
|
||
|
// append string end
|
||
|
*pToken = '\0';
|
||
|
|
||
|
rtl::OString oTok(cToken);
|
||
|
|
||
|
if( strip ) {
|
||
|
// strip off CR,LF and TAB
|
||
|
oTok = oTok.replace( 0x0a, 0x20 );
|
||
|
oTok = oTok.replace( 0x0d, 0x20 );
|
||
|
oTok = oTok.replace( 0x09, 0x20 );
|
||
|
oTok = oTok.trim();
|
||
|
}
|
||
|
if( oTok != "" ) {
|
||
|
// push to vector
|
||
|
optLine.push_back( oTok );
|
||
|
}
|
||
|
|
||
|
// free memory where cToken points to
|
||
|
delete [] cToken;
|
||
|
i++;
|
||
|
}
|
||
|
return ;
|
||
|
} ///< tokenize
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
rtl::OString& GetOpt::getOpt( const rtl::OString& opt )
|
||
|
{
|
||
|
if (m_opthash.find( opt ) != m_opthash.end())
|
||
|
{
|
||
|
if (m_opthash[opt].begin())
|
||
|
{
|
||
|
return *( m_opthash[opt].begin() );
|
||
|
}
|
||
|
rtl::OString aStr;
|
||
|
aStr = "GetOpt( ";
|
||
|
aStr += opt;
|
||
|
aStr += " ): Value not found.";
|
||
|
throw ValueNotFoundException(aStr.getStr());
|
||
|
}
|
||
|
else
|
||
|
throw ValueNotFoundException(opt);
|
||
|
}
|
||
|
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
|
||
|
Exception::Exception()
|
||
|
: m_sAsciiMessage()
|
||
|
{
|
||
|
}
|
||
|
//---------------------------------------------------------------------
|
||
|
Exception::Exception(char const* sAsciiMessage)
|
||
|
: m_sAsciiMessage(sAsciiMessage)
|
||
|
{
|
||
|
}
|
||
|
//---------------------------------------------------------------------
|
||
|
Exception::Exception(rtl::OString const& sAsciiMessage)
|
||
|
: m_sAsciiMessage(sAsciiMessage)
|
||
|
{
|
||
|
}
|
||
|
//---------------------------------------------------------------------
|
||
|
|
||
|
rtl::OUString Exception::message() const
|
||
|
{
|
||
|
return rtl::OStringToOUString( m_sAsciiMessage, RTL_TEXTENCODING_ASCII_US );
|
||
|
}
|
||
|
//---------------------------------------------------------------------
|
||
|
char const* Exception::what() const
|
||
|
{
|
||
|
return m_sAsciiMessage.getLength() ? m_sAsciiMessage.getStr() : "FAILURE in REGSCAN: No description available";
|
||
|
}
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
static const char c_sValueNotFoundException[] = "GetOpt: Value not Found Exception: ";
|
||
|
//---------------------------------------------------------------------
|
||
|
ValueNotFoundException::ValueNotFoundException()
|
||
|
: Exception( rtl::OString(RTL_CONSTASCII_STRINGPARAM(c_sValueNotFoundException)) )
|
||
|
{
|
||
|
}
|
||
|
//---------------------------------------------------------------------
|
||
|
|
||
|
ValueNotFoundException::ValueNotFoundException(char const* sException)
|
||
|
: Exception( rtl::OString(RTL_CONSTASCII_STRINGPARAM(c_sValueNotFoundException)) += sException)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
|