//===-- 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.SplitConsiderQuotes( 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.SplitConsiderQuotes( 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; }