aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MICmdArgSet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MICmdArgSet.cpp')
-rw-r--r--tools/lldb-mi/MICmdArgSet.cpp420
1 files changed, 420 insertions, 0 deletions
diff --git a/tools/lldb-mi/MICmdArgSet.cpp b/tools/lldb-mi/MICmdArgSet.cpp
new file mode 100644
index 000000000000..b0bee357cd6b
--- /dev/null
+++ b/tools/lldb-mi/MICmdArgSet.cpp
@@ -0,0 +1,420 @@
+//===-- MICmdArgSet.cpp -----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+//++
+// File: MICmdArgSet.cpp
+//
+// Overview: CMICmdArgSet 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 "MICmdArgSet.h"
+#include "MICmdArgValBase.h"
+#include "MICmnResources.h"
+#include "MICmnLog.h"
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdArgSet constructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdArgSet::CMICmdArgSet( void )
+: m_bIsArgsPresentButNotHandledByCmd( false )
+, m_constStrCommaSpc( ", " )
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdArgSet destructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMICmdArgSet::~CMICmdArgSet( void )
+{
+ // Tidy up
+ Destroy();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Release resources used by *this container object.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+void CMICmdArgSet::Destroy( void )
+{
+ // Delete command argument objects
+ if( !m_setCmdArgs.empty() )
+ {
+ SetCmdArgs_t::iterator it = m_setCmdArgs.begin();
+ while( it != m_setCmdArgs.end() )
+ {
+ CMICmdArgValBase * pArg( *it );
+ delete pArg;
+
+ // Next
+ ++it;
+ }
+ m_setCmdArgs.clear();
+ }
+
+ m_setCmdArgsThatNotValid.clear();
+ m_setCmdArgsThatAreMissing.clear();
+ m_setCmdArgsNotHandledByCmd.clear();
+ m_setCmdArgsMissingInfo.clear();
+ m_bIsArgsPresentButNotHandledByCmd = false;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Retrieve the state flag indicating that the command set up ready to parse
+// command arguments or options found that one or more arguments was indeed
+// present but not handled. This is given as a warning in the MI log file.
+// Type: Method.
+// Args: None.
+// Return: bool - True = one or more args not handled, false = all args handled
+// Throws: None.
+//--
+bool CMICmdArgSet::IsArgsPresentButNotHandledByCmd( void ) const
+{
+ return m_bIsArgsPresentButNotHandledByCmd;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Add the list of command's arguments to parse and validate another one.
+// Type: Method.
+// Args: vArg - (R) A command argument object.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMICmdArgSet::Add( const CMICmdArgValBase & vArg )
+{
+ CMICmdArgValBase * pArg = const_cast< CMICmdArgValBase * >( &vArg );
+ m_setCmdArgs.push_back( pArg );
+
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: After validating an options line of text (the context) and there is a failure,
+// it is likely a mandatory command argument that is required is missing. This
+// function returns the argument that should be present.
+// Type: Method.
+// Args: None.
+// Return: SetCmdArgs_t & - Set of argument objects.
+// Throws: None.
+//--
+const CMICmdArgSet::SetCmdArgs_t & CMICmdArgSet::GetArgsThatAreMissing( void ) const
+{
+ return m_setCmdArgsThatAreMissing;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: After validating an options line of text (the context) and there is a failure,
+// it may be because one or more arguments were unable to extract a value. This
+// function returns the argument that were found to be invalid.
+// Type: Method.
+// Args: None.
+// Return: SetCmdArgs_t & - Set of argument objects.
+// Throws: None.
+//--
+const CMICmdArgSet::SetCmdArgs_t & CMICmdArgSet::GetArgsThatInvalid( void ) const
+{
+ return m_setCmdArgsThatNotValid;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The list of argument or option (objects) that were specified by the command
+// and so recognised when parsed but were not handled. Ideally the command
+// should handle all arguments and options presented to it. The command sends
+// warning to the MI log file to say that these options were not handled.
+// Used as one way to determine option that maybe should really be implemented
+// and not just ignored.
+// Type: Method.
+// Args: None.
+// Return: SetCmdArgs_t & - Set of argument objects.
+// Throws: None.
+//--
+const CMICmdArgSet::SetCmdArgs_t & CMICmdArgSet::GetArgsNotHandledByCmd( void ) const
+{
+ return m_setCmdArgsNotHandledByCmd;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Given a set of command argument objects parse the context option string to
+// find those argument and retrieve their value. If the function fails call
+// GetArgsThatAreMissing() to see which commands that were mandatory were
+// missing or failed to parse.
+// Type: Method.
+// Args: vStrMiCmd - (R) Command's name.
+// vCmdArgsText - (RW) A command's options or argument.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMICmdArgSet::Validate( const CMIUtilString & vStrMiCmd, CMICmdArgContext & vwCmdArgsText )
+{
+ m_cmdArgContext = vwCmdArgsText;
+
+ // Iterate all the arguments or options required by a command
+ const MIuint nArgs = vwCmdArgsText.GetNumberArgsPresent();
+ MIuint nArgsMandatoryCnt = 0;
+ SetCmdArgs_t::const_iterator it = m_setCmdArgs.begin();
+ while( it != m_setCmdArgs.end() )
+ {
+ const CMICmdArgValBase * pArg( *it );
+ const CMIUtilString & rArgName( pArg->GetName() ); MIunused( rArgName );
+ if( pArg->GetIsMandatory() )
+ nArgsMandatoryCnt++;
+ if( !const_cast< CMICmdArgValBase * >( pArg )->Validate( vwCmdArgsText ) )
+ {
+ if( pArg->GetIsMandatory() && !pArg->GetFound() )
+ m_setCmdArgsThatAreMissing.push_back( const_cast< CMICmdArgValBase * >( pArg ) );
+ else if( pArg->GetFound() )
+ {
+ if( pArg->GetIsMissingOptions() )
+ m_setCmdArgsMissingInfo.push_back( const_cast< CMICmdArgValBase * >( pArg ) );
+ else if( !pArg->GetValid() )
+ m_setCmdArgsThatNotValid.push_back( const_cast< CMICmdArgValBase * >( pArg ) );
+ }
+ }
+ if( pArg->GetFound() && !pArg->GetIsHandledByCmd() )
+ {
+ m_bIsArgsPresentButNotHandledByCmd = true;
+ m_setCmdArgsNotHandledByCmd.push_back( const_cast< CMICmdArgValBase * >( pArg ) );
+ }
+
+ // Next
+ ++it;
+ }
+
+ // Check that one or more argument objects have any issues to report...
+
+ if( nArgs < nArgsMandatoryCnt )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_CMD_ARGS_ERR_N_OPTIONS_REQUIRED ), nArgsMandatoryCnt ) );
+ return MIstatus::failure;
+ }
+
+ if( IsArgsPresentButNotHandledByCmd() )
+ WarningArgsNotHandledbyCmdLogFile( vStrMiCmd );
+
+ return ValidationFormErrorMessages( vwCmdArgsText );
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Having validated the command's options text and failed for some reason form
+// the error message made up with the faults found.
+// Type: Method.
+// vCmdArgsText - (RW) A command's options or argument.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMICmdArgSet::ValidationFormErrorMessages( const CMICmdArgContext & vwCmdArgsText )
+{
+ CMIUtilString strListMissing;
+ CMIUtilString strListInvalid;
+ CMIUtilString strListMissingInfo;
+ const bool bArgsMissing = (m_setCmdArgsThatAreMissing.size() > 0);
+ const bool bArgsInvalid = (m_setCmdArgsThatNotValid.size() > 0);
+ const bool bArgsMissingInfo = (m_setCmdArgsMissingInfo.size() > 0);
+ if( !(bArgsMissing || bArgsInvalid || bArgsMissingInfo) )
+ return MIstatus::success;
+ if( bArgsMissing )
+ {
+ MIuint i = 0;
+ SetCmdArgs_t::const_iterator it = m_setCmdArgsThatAreMissing.begin();
+ while( it != m_setCmdArgsThatAreMissing.end() )
+ {
+ if( i++ > 0 )
+ strListMissing += m_constStrCommaSpc;
+
+ const CMICmdArgValBase * pArg( *it );
+ strListMissing += pArg->GetName();
+
+ // Next
+ ++it;
+ }
+ }
+ if( bArgsInvalid )
+ {
+ MIuint i = 0;
+ SetCmdArgs_t::const_iterator it = m_setCmdArgsThatNotValid.begin();
+ while( it != m_setCmdArgsThatNotValid.end() )
+ {
+ if( i++ > 0 )
+ strListMissing += m_constStrCommaSpc;
+
+ const CMICmdArgValBase * pArg( *it );
+ strListInvalid += pArg->GetName();
+
+ // Next
+ ++it;
+ }
+ }
+ if( bArgsMissingInfo )
+ {
+ MIuint i = 0;
+ SetCmdArgs_t::const_iterator it = m_setCmdArgsMissingInfo.begin();
+ while( it != m_setCmdArgsMissingInfo.end() )
+ {
+ if( i++ > 0 )
+ strListMissingInfo += m_constStrCommaSpc;
+
+ const CMICmdArgValBase * pArg( *it );
+ strListMissingInfo += pArg->GetName();
+
+ // Next
+ ++it;
+ }
+ }
+
+ bool bHaveOneError = false;
+ CMIUtilString strError = MIRSRC( IDS_CMD_ARGS_ERR_PREFIX_MSG );
+ if( bArgsMissing && bArgsInvalid )
+ {
+ bHaveOneError = true;
+ strError += CMIUtilString::Format( MIRSRC( IDS_CMD_ARGS_ERR_VALIDATION_MAN_INVALID ), strListMissing.c_str(), strListInvalid.c_str() );
+ }
+ if( bArgsMissing )
+ {
+ if( bHaveOneError )
+ strError += ". ";
+ bHaveOneError = true;
+ strError += CMIUtilString::Format( MIRSRC( IDS_CMD_ARGS_ERR_VALIDATION_MANDATORY ), strListMissing.c_str() );
+ }
+ if( bArgsMissingInfo )
+ {
+ if( bHaveOneError )
+ strError += ". ";
+ bHaveOneError = true;
+ strError += CMIUtilString::Format( MIRSRC( IDS_CMD_ARGS_ERR_VALIDATION_MISSING_INF ), strListMissingInfo.c_str() );
+ }
+ if( bArgsInvalid )
+ {
+ if( bHaveOneError )
+ strError += ". ";
+ bHaveOneError = true;
+ strError += CMIUtilString::Format( MIRSRC( IDS_CMD_ARGS_ERR_VALIDATION_INVALID ), strListInvalid.c_str() );
+ }
+ if( !vwCmdArgsText.IsEmpty() )
+ {
+ if( bHaveOneError )
+ strError += ". ";
+ bHaveOneError = true;
+ strError += CMIUtilString::Format( MIRSRC( IDS_CMD_ARGS_ERR_CONTEXT_NOT_ALL_EATTEN ), vwCmdArgsText.GetArgsLeftToParse().c_str() );
+ }
+
+ if( bHaveOneError )
+ {
+ SetErrorDescription( strError );
+ return MIstatus::failure;
+ }
+
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Ask if the command's argument options text had any arguments.
+// Type: Method.
+// Args: None.
+// Return: bool - True = Has one or more arguments present, false = no arguments.
+// Throws: None.
+//--
+bool CMICmdArgSet::IsArgContextEmpty( void ) const
+{
+ return m_cmdArgContext.IsEmpty();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Retrieve the number of arguments that are being used for the command.
+// Type: Method.
+// Args: None.
+// Return: MIuint - Argument count.
+// Throws: None.
+//--
+MIuint CMICmdArgSet::GetCount( void ) const
+{
+ return m_setCmdArgs.size();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Given a set of command argument objects retrieve the argument with the
+// specified name.
+// Type: Method.
+// Args: vpArg - (W) A pointer to a command's argument object.
+// Return: True - Argument found.
+// False - Argument not found.
+// Throws: None.
+//--
+bool CMICmdArgSet::GetArg( const CMIUtilString & vArgName, CMICmdArgValBase *& vpArg ) const
+{
+ bool bFound = false;
+ SetCmdArgs_t::const_iterator it = m_setCmdArgs.begin();
+ while( it != m_setCmdArgs.end() )
+ {
+ CMICmdArgValBase * pArg( *it );
+ if( pArg->GetName() == vArgName )
+ {
+ bFound = true;
+ vpArg = pArg;
+ break;
+ }
+
+ // Next
+ ++it;
+ }
+
+ return bFound;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Write a warning message to the MI Log file about the command's arguments or
+// options that were found present but not handled.
+// Type: Method.
+// Args: vrCmdName - (R) The command's name.
+// Return: None.
+// Throws: None.
+//--
+void CMICmdArgSet::WarningArgsNotHandledbyCmdLogFile( const CMIUtilString & vrCmdName )
+{
+#if MICONFIG_GIVE_WARNING_CMD_ARGS_NOT_HANDLED
+
+ CMIUtilString strArgsNotHandled;
+ const CMICmdArgSet::SetCmdArgs_t & rSetArgs = GetArgsNotHandledByCmd();
+ MIuint nCnt = 0;
+ CMICmdArgSet::SetCmdArgs_t::const_iterator it = rSetArgs.begin();
+ while( it != rSetArgs.end() )
+ {
+ if( nCnt++ > 0 )
+ strArgsNotHandled += m_constStrCommaSpc;
+ const CMICmdArgValBase * pArg = *it;
+ strArgsNotHandled += pArg->GetName();
+
+ // Next
+ ++it;
+ }
+
+ const CMIUtilString strWarningMsg( CMIUtilString::Format( MIRSRC( IDS_CMD_WRN_ARGS_NOT_HANDLED ), vrCmdName.c_str(), strArgsNotHandled.c_str() ) );
+ m_pLog->WriteLog( strWarningMsg );
+
+#endif // MICONFIG_GIVE_WARNING_CMD_ARGS_NOT_HANDLED
+}