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