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;
+}