diff options
| author | Deepak Panickal <deepak@codeplay.com> | 2014-05-16 10:51:01 +0000 |
|---|---|---|
| committer | Deepak Panickal <deepak@codeplay.com> | 2014-05-16 10:51:01 +0000 |
| commit | 6f9c46810298dd00dc95d4ffb60faf7d914ab978 (patch) | |
| tree | 7d8abbb2b6cd0aa3dfb8824f318baa432bb9e3c4 /lldb/tools/lldb-mi/MICmdArgValString.cpp | |
| parent | d04688d1c6cdffae4623a3a60e2d46f0bd72fe48 (diff) | |
| download | bcm5719-llvm-6f9c46810298dd00dc95d4ffb60faf7d914ab978.tar.gz bcm5719-llvm-6f9c46810298dd00dc95d4ffb60faf7d914ab978.zip | |
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
Diffstat (limited to 'lldb/tools/lldb-mi/MICmdArgValString.cpp')
| -rw-r--r-- | lldb/tools/lldb-mi/MICmdArgValString.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/lldb/tools/lldb-mi/MICmdArgValString.cpp b/lldb/tools/lldb-mi/MICmdArgValString.cpp new file mode 100644 index 00000000000..ef4a3743325 --- /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; +} |

