blob: 26e6f24cbe5932fe5fc0f5bf1a5ff837d46dfeaa [file] [log] [blame]
//===-- MICmnArgContext.cpp -------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//++
// File: MICmnArgContext.cpp
//
// Overview: CMICmdArgContext implementation.
//
// Environment: Compilers: Visual C++ 12.
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
// Libraries: See MIReadmetxt.
//
// Copyright: None.
//--
// In-house headers:
#include "MICmdArgContext.h"
//++ ------------------------------------------------------------------------------------
// Details: CMICmdArgContext constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdArgContext::CMICmdArgContext( void )
: m_constCharSpace( ' ' )
, m_constStrSpace( " " )
{
}
//++ ------------------------------------------------------------------------------------
// Details: CMICmdArgContext constructor.
// Type: Method.
// Args: vrCmdLineArgsRaw - (R) The text description of the arguments options.
// Return: None.
// Throws: None.
//--
CMICmdArgContext::CMICmdArgContext( const CMIUtilString & vrCmdLineArgsRaw )
: m_strCmdArgsAndOptions( vrCmdLineArgsRaw )
, m_constCharSpace( ' ' )
, m_constStrSpace( " " )
{
}
//++ ------------------------------------------------------------------------------------
// Details: CMICmdArgContext destructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdArgContext::~CMICmdArgContext( void )
{
}
//++ ------------------------------------------------------------------------------------
// Details: Retrieve the remainder of the command's argument options left to parse.
// Type: Method.
// Args: None.
// Return: CMIUtilString & - Argument options text.
// Throws: None.
//--
const CMIUtilString & CMICmdArgContext::GetArgsLeftToParse( void ) const
{
return m_strCmdArgsAndOptions;
}
//++ ------------------------------------------------------------------------------------
// Details: Ask if this arguments string has any arguments.
// Type: Method.
// Args: None.
// Return: bool - True = Has one or more arguments present, false = no arguments.
// Throws: None.
//--
bool CMICmdArgContext::IsEmpty( void ) const
{
return m_strCmdArgsAndOptions.empty();
}
//++ ------------------------------------------------------------------------------------
// Details: Remove the argument from the options text and any space after the argument
// if applicable.
// Type: Method.
// Args: vArg - (R) The name of the argument.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdArgContext::RemoveArg( const CMIUtilString & vArg )
{
if( vArg.empty() )
return MIstatus::success;
const MIuint nLen = vArg.length();
const MIuint nLenCntxt = m_strCmdArgsAndOptions.length();
if( nLen > nLenCntxt )
return MIstatus::failure;
MIuint nExtraSpace = 0;
MIint nPos = m_strCmdArgsAndOptions.find( vArg );
while( 1 )
{
if( nPos == (MIint) std::string::npos )
return MIstatus::success;
bool bPass1 = false;
if( nPos != 0 )
{
if( m_strCmdArgsAndOptions[ nPos - 1 ] == m_constCharSpace )
bPass1 = true;
}
else
bPass1 = true;
const MIuint nEnd = nPos + nLen;
if( bPass1 )
{
bool bPass2 = false;
if( nEnd < nLenCntxt )
{
if( m_strCmdArgsAndOptions[ nEnd ] == m_constCharSpace )
{
bPass2 = true;
nExtraSpace = 1;
}
}
else
bPass2 = true;
if( bPass2 )
break;
}
nPos = m_strCmdArgsAndOptions.find( vArg, nEnd );
}
const MIuint nPosEnd = nLen + nExtraSpace;
m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.replace( nPos, nPosEnd, "" ).c_str();
m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.Trim();
return MIstatus::success;
}
//++ ------------------------------------------------------------------------------------
// Details: Remove the argument at the Nth word position along in the context string.
// Any space after the argument is removed if applicable. A search is not
// performed as there may be more than one vArg with the same 'name' in the
// context string.
// Type: Method.
// Args: vArg - (R) The name of the argument.
// nArgIndex - (R) The word count position to which to remove the vArg word.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdArgContext::RemoveArgAtPos( const CMIUtilString & vArg, const MIuint nArgIndex )
{
MIuint nWordIndex = 0;
CMIUtilString strBuildContextUp;
const CMIUtilString::VecString_t vecWords( GetArgs() );
const bool bSpaceRequired( GetNumberArgsPresent() > 2 );
CMIUtilString::VecString_t::const_iterator it = vecWords.begin();
const CMIUtilString::VecString_t::const_iterator itEnd = vecWords.end();
while( it != itEnd )
{
const CMIUtilString & rWord( *it );
if( nWordIndex++ != nArgIndex )
{
// Single words
strBuildContextUp += rWord;
if( bSpaceRequired )
strBuildContextUp += m_constStrSpace;
}
else
{
// If quoted loose quoted text
if( ++it != itEnd )
{
CMIUtilString words = rWord;
while( vArg != words )
{
if( bSpaceRequired )
words += m_constStrSpace;
words += *it;
if( ++it == itEnd )
break;
}
if( it != itEnd )
--it;
}
}
// Next
if( it != itEnd )
++it;
}
m_strCmdArgsAndOptions = strBuildContextUp;
m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.Trim();
return MIstatus::success;
}
//++ ------------------------------------------------------------------------------------
// Details: Retrieve number of arguments or options present in the command's option text.
// Type: Method.
// Args: None.
// Return: MIuint - 0 to n arguments present.
// Throws: None.
//--
MIuint CMICmdArgContext::GetNumberArgsPresent( void ) const
{
CMIUtilString::VecString_t vecOptions;
return m_strCmdArgsAndOptions.Split( m_constStrSpace, vecOptions );
}
//++ ------------------------------------------------------------------------------------
// Details: Retrieve all the arguments or options remaining in *this context.
// Type: Method.
// Args: None.
// Return: MIUtilString::VecString_t - List of args remaining.
// Throws: None.
//--
CMIUtilString::VecString_t CMICmdArgContext::GetArgs( void ) const
{
CMIUtilString::VecString_t vecOptions;
m_strCmdArgsAndOptions.Split( m_constStrSpace, vecOptions );
return vecOptions;
}
//++ ------------------------------------------------------------------------------------
// Details: Copy assignment operator.
// Type: Method.
// Args: vOther - (R) The variable to copy from.
// Return: CMIUtilString & - this object.
// Throws: None.
//--
CMICmdArgContext & CMICmdArgContext::operator= ( const CMICmdArgContext & vOther )
{
if( this != &vOther )
{
m_strCmdArgsAndOptions = vOther.m_strCmdArgsAndOptions;
}
return *this;
}