| //===-- 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; |
| } |