llvm-project/lldb/tools/lldb-mi/MICmdArgSet.cpp

402 lines
12 KiB
C++

//===-- MICmdArgSet.cpp -----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// In-house headers:
#include "MICmdArgSet.h"
#include "MICmdArgValBase.h"
#include "MICmnLog.h"
#include "MICmnResources.h"
//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgSet constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdArgSet::CMICmdArgSet()
: m_bIsArgsPresentButNotHandledByCmd(false), m_constStrCommaSpc(", ") {}
//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgSet destructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdArgSet::~CMICmdArgSet() {
// Tidy up
Destroy();
}
//++
//------------------------------------------------------------------------------------
// Details: Release resources used by *this container object.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
void CMICmdArgSet::Destroy() {
// 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() 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: None.
// Throws: None.
//--
void CMICmdArgSet::Add(CMICmdArgValBase *vArg) { m_setCmdArgs.push_back(vArg); }
//++
//------------------------------------------------------------------------------------
// 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() 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() 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() 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
SetCmdArgs_t::const_iterator it = m_setCmdArgs.begin();
while (it != m_setCmdArgs.end()) {
CMICmdArgValBase *pArg = *it;
if (!pArg->Validate(vwCmdArgsText)) {
if (pArg->GetFound()) {
if (pArg->GetIsMissingOptions())
m_setCmdArgsMissingInfo.push_back(pArg);
else if (!pArg->GetValid())
m_setCmdArgsThatNotValid.push_back(pArg);
} else if (pArg->GetIsMandatory())
m_setCmdArgsThatAreMissing.push_back(pArg);
}
if (pArg->GetFound() && !pArg->GetIsHandledByCmd()) {
m_bIsArgsPresentButNotHandledByCmd = true;
m_setCmdArgsNotHandledByCmd.push_back(pArg);
}
// Next
++it;
}
// report any issues with arguments/options
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() const {
return m_cmdArgContext.IsEmpty();
}
//++
//------------------------------------------------------------------------------------
// Details: Retrieve the number of arguments that are being used for the
// command.
// Type: Method.
// Args: None.
// Return: size_t - Argument count.
// Throws: None.
//--
size_t CMICmdArgSet::GetCount() 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
}