aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MICmdArgContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MICmdArgContext.cpp')
-rw-r--r--tools/lldb-mi/MICmdArgContext.cpp255
1 files changed, 255 insertions, 0 deletions
diff --git a/tools/lldb-mi/MICmdArgContext.cpp b/tools/lldb-mi/MICmdArgContext.cpp
new file mode 100644
index 000000000000..b6efa9660c3b
--- /dev/null
+++ b/tools/lldb-mi/MICmdArgContext.cpp
@@ -0,0 +1,255 @@
+//===-- 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;
+} \ No newline at end of file