Initial commit of LLDB Machine Interface Frontend.
- Tested with Eclipse, likely to work with other GDB/MI compatible GUIs.
- Some but not all MI commands have been implemented. See MIReadme.txt for more info.
- Written from scratch, no GPL code, based on LLDB Public API.
- Built for Linux, Windows and OSX. Tested on Linux and Windows.
- GDB/MI Command Reference, https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI.html
llvm-svn: 208972
diff --git a/lldb/tools/lldb-mi/MICmdArgValString.cpp b/lldb/tools/lldb-mi/MICmdArgValString.cpp
new file mode 100644
index 0000000..ef4a374
--- /dev/null
+++ b/lldb/tools/lldb-mi/MICmdArgValString.cpp
@@ -0,0 +1,219 @@
+//===-- MICmdArgValString.cpp -----------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+//++
+// File: MICmdArgValString.cpp
+//
+// Overview: CMICmdArgValString 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 "MICmdArgValString.h"
+#include "MICmdArgContext.h"
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdArgValString constructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdArgValString::CMICmdArgValString( void )
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdArgValString constructor.
+// Type: Method.
+// Args: vrArgName - (R) Argument's name to search by.
+// vbMandatory - (R) True = Yes must be present, false = optional argument.
+// vbHandleByCmd - (R) True = Command processes *this option, false = not handled.
+// vbHandleQuotes - (R) True = Parse a string surrounded by quotes spaces are not delimitors, false = only text up to next delimiting space character. (Dflt = false)
+// Return: None.
+// Throws: None.
+//--
+CMICmdArgValString::CMICmdArgValString( const CMIUtilString & vrArgName, const bool vbMandatory, const bool vbHandleByCmd, const bool vbHandleQuotes /* = false */ )
+: CMICmdArgValBaseTemplate( vrArgName, vbMandatory, vbHandleByCmd )
+, m_bHandleQuotedString( vbHandleQuotes )
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdArgValString destructor.
+// Type: Overidden.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdArgValString::~CMICmdArgValString( void )
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Parse the command's argument options string and try to extract the value *this
+// argument is looking for.
+// Type: Overridden.
+// Args: vrwArgContext - (RW) The command's argument options string.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMICmdArgValString::Validate( CMICmdArgContext & vrwArgContext )
+{
+ if( vrwArgContext.IsEmpty() )
+ return MIstatus::success;
+
+ if( m_bHandleQuotedString )
+ return ValidateQuotedText( vrwArgContext );
+
+ return ValidateSingleText( vrwArgContext );
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Parse the command's argument options string and try to extract only the next
+// word delimited by the next space.
+// Type: Method.
+// Args: vrwArgContext - (RW) The command's argument options string.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMICmdArgValString::ValidateSingleText( CMICmdArgContext & vrwArgContext )
+{
+ if( vrwArgContext.GetNumberArgsPresent() == 1 )
+ {
+ const CMIUtilString & rArg( vrwArgContext.GetArgsLeftToParse() );
+ if( IsStringArg( rArg ) )
+ {
+ m_bFound = true;
+ m_bValid = true;
+ m_argValue = rArg;
+ vrwArgContext.RemoveArg( rArg );
+ return MIstatus::success;
+ }
+ else
+ return MIstatus::failure;
+ }
+
+ // More than one option...
+ const CMIUtilString::VecString_t vecOptions( vrwArgContext.GetArgs() );
+ CMIUtilString::VecString_t::const_iterator it = vecOptions.begin();
+ while( it != vecOptions.end() )
+ {
+ const CMIUtilString & rArg( *it );
+ if( IsStringArg( rArg ) )
+ {
+ m_bFound = true;
+
+ if( vrwArgContext.RemoveArg( rArg ) )
+ {
+ m_bValid = true;
+ m_argValue = rArg;
+ return MIstatus::success;
+ }
+ else
+ return MIstatus::failure;
+ }
+
+ // Next
+ ++it;
+ }
+
+ return MIstatus::failure;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Parse the command's argument options string and try to extract all the words
+// between quotes then delimited by the next space.
+// Type: Method.
+// Args: vrwArgContext - (RW) The command's argument options string.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMICmdArgValString::ValidateQuotedText( CMICmdArgContext & vrwArgContext )
+{
+ const CMIUtilString strOptions = vrwArgContext.GetArgsLeftToParse();
+ const MIint nPos = strOptions.find( '"' );
+ if( nPos == (MIint) std::string::npos )
+ return ValidateSingleText( vrwArgContext );
+
+ // Is one and only quote at end of the string
+ if( nPos == (MIint)(strOptions.length() - 1) )
+ return MIstatus::failure;
+
+ // Quote must be the first character in the string or be preceeded by a space
+ if( (nPos > 0) && (strOptions[ nPos - 1 ] != ' ' ) )
+ return MIstatus::failure;
+
+ // Need to find the other quote
+ const MIint nPos2 = strOptions.find( '"', nPos + 1 );
+ if( nPos2 == (MIint) std::string::npos )
+ return MIstatus::failure;
+
+ // Extract quoted text
+ const CMIUtilString strQuotedTxt = strOptions.substr( nPos, nPos2 - nPos + 1 ).c_str();
+ if( vrwArgContext.RemoveArg( strQuotedTxt ) )
+ {
+ m_bFound = true;
+ m_bValid = true;
+ m_argValue = strOptions.substr( nPos + 1, nPos2 - nPos - 1 ).c_str();;
+ return MIstatus::success;
+ }
+
+ return MIstatus::failure;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Examine the string and determine if it is a valid string type argument.
+// Type: Method.
+// Args: vrTxt - (R) Some text.
+// Return: bool - True = yes valid arg, false = no.
+// Throws: None.
+//--
+bool CMICmdArgValString::IsStringArg( const CMIUtilString & vrTxt ) const
+{
+ const bool bHavePosSlash = (vrTxt.find_first_of( "/" ) != std::string::npos);
+ const bool bHaveBckSlash = (vrTxt.find_first_of( "\\" ) != std::string::npos);
+ if( bHavePosSlash || bHaveBckSlash )
+ return false;
+
+ // Look for --someLongOption
+ if( std::string::npos != vrTxt.find( "--" ) )
+ return false;
+
+ // Look for -f type short parameters
+ const MIint nPos2 = vrTxt.find( "-" );
+ if( (MIint) std::string::npos != nPos2 )
+ {
+ if( (MIint) vrTxt.length() > (nPos2 + 1) )
+ {
+ const CMIUtilString s = vrTxt.substr( 1 ).c_str();
+ if( s.IsNumber() )
+ return false;
+ }
+ }
+
+ // Look for i1 i2 i3....
+ const MIint nPos = vrTxt.find_first_of( "i" );
+ const bool bFoundI1 = ((nPos == 0) && (::isdigit( vrTxt[ 1 ] )) );
+ if( bFoundI1 )
+ return false;
+
+ if( vrTxt.IsNumber() )
+ return false;
+
+ return true;
+}