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

233 lines
6.8 KiB
C++

//===-- MICmdArgContext.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 "MICmdArgContext.h"
//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgContext constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdArgContext::CMICmdArgContext() {}
//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgContext constructor.
// Type: Method.
// Args: vrCmdLineArgsRaw - (R) The text description of the arguments
// options.
// Return: None.
// Throws: None.
//--
CMICmdArgContext::CMICmdArgContext(const CMIUtilString &vrCmdLineArgsRaw)
: m_strCmdArgsAndOptions(vrCmdLineArgsRaw) {}
//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgContext destructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmdArgContext::~CMICmdArgContext() {}
//++
//------------------------------------------------------------------------------------
// Details: Retrieve the remainder of the command's argument options left to
// parse.
// Type: Method.
// Args: None.
// Return: CMIUtilString & - Argument options text.
// Throws: None.
//--
const CMIUtilString &CMICmdArgContext::GetArgsLeftToParse() const {
return m_strCmdArgsAndOptions;
}
//++
//------------------------------------------------------------------------------------
// Details: Ask if this arguments string has any arguments.
// Type: Method.
// Args: None.
// Return: bool - True = Has one or more arguments present, false = no
// arguments.
// Throws: None.
//--
bool CMICmdArgContext::IsEmpty() const {
return m_strCmdArgsAndOptions.empty();
}
//++
//------------------------------------------------------------------------------------
// Details: Remove the argument from the options text and any space after the
// argument
// if applicable.
// Type: Method.
// Args: vArg - (R) The name of the argument.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdArgContext::RemoveArg(const CMIUtilString &vArg) {
if (vArg.empty())
return MIstatus::success;
const size_t nLen = vArg.length();
const size_t nLenCntxt = m_strCmdArgsAndOptions.length();
if (nLen > nLenCntxt)
return MIstatus::failure;
size_t nExtraSpace = 0;
size_t nPos = m_strCmdArgsAndOptions.find(vArg);
while (1) {
if (nPos == std::string::npos)
return MIstatus::success;
bool bPass1 = false;
if (nPos != 0) {
if (m_strCmdArgsAndOptions[nPos - 1] == ' ')
bPass1 = true;
} else
bPass1 = true;
const size_t nEnd = nPos + nLen;
if (bPass1) {
bool bPass2 = false;
if (nEnd < nLenCntxt) {
if (m_strCmdArgsAndOptions[nEnd] == ' ') {
bPass2 = true;
nExtraSpace = 1;
}
} else
bPass2 = true;
if (bPass2)
break;
}
nPos = m_strCmdArgsAndOptions.find(vArg, nEnd);
}
const size_t nPosEnd = nLen + nExtraSpace;
m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.replace(nPos, nPosEnd, "");
m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.Trim();
return MIstatus::success;
}
//++
//------------------------------------------------------------------------------------
// Details: Remove the argument at the Nth word position along in the context
// string.
// Any space after the argument is removed if applicable. A search is
// not
// performed as there may be more than one vArg with the same 'name' in
// the
// context string.
// Type: Method.
// Args: vArg - (R) The name of the argument.
// nArgIndex - (R) The word count position to which to remove the
// vArg word.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmdArgContext::RemoveArgAtPos(const CMIUtilString &vArg,
size_t nArgIndex) {
size_t nWordIndex = 0;
CMIUtilString strBuildContextUp;
const CMIUtilString::VecString_t vecWords(GetArgs());
const bool bSpaceRequired(GetNumberArgsPresent() > 2);
CMIUtilString::VecString_t::const_iterator it = vecWords.begin();
const CMIUtilString::VecString_t::const_iterator itEnd = vecWords.end();
while (it != itEnd) {
const CMIUtilString &rWord(*it);
if (nWordIndex++ != nArgIndex) {
// Single words
strBuildContextUp += rWord;
if (bSpaceRequired)
strBuildContextUp += " ";
} else {
// If quoted loose quoted text
if (++it != itEnd) {
CMIUtilString words = rWord;
while (vArg != words) {
if (bSpaceRequired)
words += " ";
words += *it;
if (++it == itEnd)
break;
}
if (it != itEnd)
--it;
}
}
// Next
if (it != itEnd)
++it;
}
m_strCmdArgsAndOptions = strBuildContextUp;
m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.Trim();
return MIstatus::success;
}
//++
//------------------------------------------------------------------------------------
// Details: Retrieve number of arguments or options present in the command's
// option text.
// Type: Method.
// Args: None.
// Return: size_t - 0 to n arguments present.
// Throws: None.
//--
size_t CMICmdArgContext::GetNumberArgsPresent() const {
CMIUtilString::VecString_t vecOptions;
return m_strCmdArgsAndOptions.SplitConsiderQuotes(" ", vecOptions);
}
//++
//------------------------------------------------------------------------------------
// Details: Retrieve all the arguments or options remaining in *this context.
// Type: Method.
// Args: None.
// Return: MIUtilString::VecString_t - List of args remaining.
// Throws: None.
//--
CMIUtilString::VecString_t CMICmdArgContext::GetArgs() const {
CMIUtilString::VecString_t vecOptions;
m_strCmdArgsAndOptions.SplitConsiderQuotes(" ", vecOptions);
return vecOptions;
}
//++
//------------------------------------------------------------------------------------
// Details: Copy assignment operator.
// Type: Method.
// Args: vOther - (R) The variable to copy from.
// Return: CMIUtilString & - this object.
// Throws: None.
//--
CMICmdArgContext &CMICmdArgContext::operator=(const CMICmdArgContext &vOther) {
if (this != &vOther) {
m_strCmdArgsAndOptions = vOther.m_strCmdArgsAndOptions;
}
return *this;
}