//===-- MICmdArgValString.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 "MICmdArgValString.h"
#include "MICmdArgContext.h"

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValString constructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmdArgValString::CMICmdArgValString()
    : m_bHandleQuotedString(false), m_bAcceptNumbers(false),
      m_bHandleDirPaths(false), m_bHandleAnything(false) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValString constructor.
// Type:    Method.
// Args:    vbAnything  - (R) True = Parse a string and accept anything, false =
// do not accept anything.
// Return:  None.
// Throws:  None.
//--
CMICmdArgValString::CMICmdArgValString(const bool vbAnything)
    : m_bHandleQuotedString(vbAnything ? true : false), m_bAcceptNumbers(false),
      m_bHandleDirPaths(false), m_bHandleAnything(vbAnything) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValString constructor.
// Type:    Method.
// Args:    vbHandleQuotes      - (R) True = Parse a string surrounded by quotes
// spaces are not delimiters, false = only text up to
// next delimiting space character.
//          vbAcceptNumbers     - (R) True = Parse a string and accept as a
//          number if number, false = numbers not recognised
// as string types.
//          vbHandleDirPaths    - (R) True = Parse a string and accept as a file
//          path if a path, false = file paths are not
// recognised as string types.
// Return:  None.
// Throws:  None.
//--
CMICmdArgValString::CMICmdArgValString(const bool vbHandleQuotes,
                                       const bool vbAcceptNumbers,
                                       const bool vbHandleDirPaths)
    : m_bHandleQuotedString(vbHandleQuotes), m_bAcceptNumbers(vbAcceptNumbers),
      m_bHandleDirPaths(vbHandleDirPaths), m_bHandleAnything(false) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValString constructor.
// Type:    Method.
// Args:    vrArgName       - (R) Argument's name to search by.
//          vbMandatory     - (R) True = Yes must be present, false = optional
//          argument.
//          vbHandleByCmd   - (R) True = Command processes *this option, false =
//          not handled.
//          vbHandleQuotes  - (R) True = Parse a string surrounded by quotes
//          spaces are not delimiters, false = only text up to
// next delimiting space character. (Dflt = false)
//          vbAcceptNumbers - (R) True = Parse a string and accept as a number
//          if number, false = numbers not recognised as
// string types. (Dflt = false)
// Return:  None.
// Throws:  None.
//--
CMICmdArgValString::CMICmdArgValString(const CMIUtilString &vrArgName,
                                       const bool vbMandatory,
                                       const bool vbHandleByCmd,
                                       const bool vbHandleQuotes /* = false */,
                                       const bool vbAcceptNumbers /* = false */)
    : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd),
      m_bHandleQuotedString(vbHandleQuotes), m_bAcceptNumbers(vbAcceptNumbers),
      m_bHandleDirPaths(false), m_bHandleAnything(false) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValString constructor.
// Type:    Method.
// Args:    vrArgName       - (R) Argument's name to search by.
//          vbMandatory     - (R) True = Yes must be present, false = optional
//          argument.
//          vbHandleByCmd   - (R) True = Command processes *this option, false =
//          not handled.
//          vbHandleQuotes  - (R) True = Parse a string surrounded by quotes
//          spaces are not delimiters, false = only text up to
// next delimiting space character.
//          vbAcceptNumbers - (R) True = Parse a string and accept as a number
//          if number, false = numbers not recognised as
//          vbHandleDirPaths - (R) True = Parse a string and accept as a file
//          path if a path, false = file paths are not
// string types.
// Return:  None.
// Throws:  None.
//--
CMICmdArgValString::CMICmdArgValString(const CMIUtilString &vrArgName,
                                       const bool vbMandatory,
                                       const bool vbHandleByCmd,
                                       const bool vbHandleQuotes,
                                       const bool vbAcceptNumbers,
                                       const bool vbHandleDirPaths)
    : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd),
      m_bHandleQuotedString(vbHandleQuotes), m_bAcceptNumbers(vbAcceptNumbers),
      m_bHandleDirPaths(vbHandleDirPaths), m_bHandleAnything(false) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValString destructor.
// Type:    Overridden.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmdArgValString::~CMICmdArgValString() {}

//++
//------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract the
// value *this
//          argument is looking for.
// Type:    Overridden.
// Args:    vrwArgContext   - (RW) The command's argument options string.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMICmdArgValString::Validate(CMICmdArgContext &vrwArgContext) {
  if (vrwArgContext.IsEmpty())
    return m_bMandatory ? MIstatus::failure : MIstatus::success;

  if (m_bHandleQuotedString)
    return ValidateQuotedText(vrwArgContext);

  return ValidateSingleText(vrwArgContext);
}

//++
//------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract only
// the next
//          word delimited by the next space.
// Type:    Method.
// Args:    vrwArgContext   - (RW) The command's argument options string.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMICmdArgValString::ValidateSingleText(CMICmdArgContext &vrwArgContext) {
  const CMIUtilString::VecString_t vecOptions(vrwArgContext.GetArgs());
  CMIUtilString::VecString_t::const_iterator it = vecOptions.begin();
  while (it != vecOptions.end()) {
    const CMIUtilString &rArg(*it);
    if (IsStringArg(rArg)) {
      m_bFound = true;

      if (vrwArgContext.RemoveArg(rArg)) {
        m_bValid = true;
        m_argValue = rArg.StripSlashes();
        return MIstatus::success;
      } else
        return MIstatus::failure;
    }

    // Next
    ++it;
  }

  return MIstatus::failure;
}

//++
//------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract all
// the words
//          between quotes then delimited by the next space.
// Type:    Method.
// Args:    vrwArgContext   - (RW) The command's argument options string.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMICmdArgValString::ValidateQuotedText(CMICmdArgContext &vrwArgContext) {
  const CMIUtilString::VecString_t vecOptions(vrwArgContext.GetArgs());
  if (vecOptions.size() == 0)
    return MIstatus::failure;

  const CMIUtilString &rArg(vecOptions[0]);
  if (!IsStringArg(rArg))
    return MIstatus::failure;

  m_bFound = true;

  if (vrwArgContext.RemoveArg(rArg)) {
    m_bValid = true;
    const char cQuote = '"';
    m_argValue = rArg.Trim(cQuote).StripSlashes();
    return MIstatus::success;
  }

  return MIstatus::failure;
}

//++
//------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type
// argument.
// Type:    Method.
// Args:    vrTxt   - (R) Some text.
// Return:  bool    - True = yes valid arg, false = no.
// Throws:  None.
//--
bool CMICmdArgValString::IsStringArg(const CMIUtilString &vrTxt) const {
  if (m_bHandleQuotedString)
    return (IsStringArgQuotedText(vrTxt) ||
            IsStringArgQuotedTextEmbedded(vrTxt) ||
            IsStringArgQuotedQuotedTextEmbedded(vrTxt) ||
            IsStringArgSingleText(
                vrTxt)); // Still test for this as could just be one word still

  return IsStringArgSingleText(vrTxt);
}

//++
//------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type
// argument or
//          option value. If the string looks like a long option, short option,
//          a thread
//          group ID or just a number it is rejected as a string type value.
//          There is an
//          option to allow the string to accept a number as a string type.
// Type:    Method.
// Args:    vrTxt   - (R) Some text.
// Return:  bool    - True = yes valid argument value, false = something else.
// Throws:  None.
//--
bool CMICmdArgValString::IsStringArgSingleText(
    const CMIUtilString &vrTxt) const {
  if (!m_bHandleDirPaths) {
    // Look for directory file paths, if found reject
    const bool bHavePosSlash = (vrTxt.find('/') != std::string::npos);
    const bool bHaveBckSlash = (vrTxt.find('\\') != std::string::npos);
    if (bHavePosSlash || bHaveBckSlash)
      return false;
  }

  // Look for --someLongOption, if found reject
  if (0 == vrTxt.find("--"))
    return false;

  // Look for -f type short options, if found reject
  if ((0 == vrTxt.find('-')) && (vrTxt.length() == 2))
    return false;

  // Look for thread group i1 i2 i3...., if found reject
  if ((vrTxt.find('i') == 0) && ::isdigit(vrTxt[1]))
    return false;

  // Look for numbers, if found reject
  if (!m_bAcceptNumbers && vrTxt.IsNumber())
    return false;

  return true;
}

//++
//------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type
// argument.
//          Take into account quotes surrounding the text. Note this function
//          falls
//          through to IsStringArgSingleText() should the criteria match fail.
// Type:    Method.
// Args:    vrTxt   - (R) Some text.
// Return:  bool    - True = yes valid arg, false = no.
// Throws:  None.
//--
bool CMICmdArgValString::IsStringArgQuotedText(
    const CMIUtilString &vrTxt) const {
  // Accept anything as string word
  if (m_bHandleAnything)
    return true;

  // CODETAG_QUOTEDTEXT_SIMILAR_CODE
  const char cQuote = '"';
  const size_t nPos = vrTxt.find(cQuote);
  if (nPos == std::string::npos)
    return false;

  // Is one and only quote at end of the string
  if (nPos == (vrTxt.length() - 1))
    return false;

  // Quote must be the first character in the string or be preceded by a space
  // Also check for embedded string formating quote
  const char cBckSlash = '\\';
  const char cSpace = ' ';
  if ((nPos > 1) && (vrTxt[nPos - 1] == cBckSlash) &&
      (vrTxt[nPos - 2] != cSpace)) {
    return false;
  }
  if ((nPos > 0) && (vrTxt[nPos - 1] != cSpace))
    return false;

  // Need to find the other quote
  const size_t nPos2 = vrTxt.rfind(cQuote);
  if (nPos2 == std::string::npos)
    return false;

  // Make sure not same quote, need two quotes
  if (nPos == nPos2)
    return MIstatus::failure;

  return true;
}

//++
//------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type
// argument.
//          Take into account quotes surrounding the text. Take into account
//          string format
//          embedded quotes surrounding the text i.e. "\\\"%5d\\\"". Note this
//          function falls
//          through to IsStringArgQuotedText() should the criteria match fail.
// Type:    Method.
// Args:    vrTxt   - (R) Some text.
// Return:  bool    - True = yes valid arg, false = no.
// Throws:  None.
//--
bool CMICmdArgValString::IsStringArgQuotedTextEmbedded(
    const CMIUtilString &vrTxt) const {
  // CODETAG_QUOTEDTEXT_SIMILAR_CODE
  const char cBckSlash = '\\';
  const size_t nPos = vrTxt.find(cBckSlash);
  if (nPos == std::string::npos)
    return false;

  // Slash must be the first character in the string or be preceded by a space
  const char cSpace = ' ';
  if ((nPos > 0) && (vrTxt[nPos - 1] != cSpace))
    return false;

  // Need to find the other matching slash
  const size_t nPos2 = vrTxt.rfind(cBckSlash);
  if (nPos2 == std::string::npos)
    return false;

  // Make sure not same back slash, need two slashes
  if (nPos == nPos2)
    return MIstatus::failure;

  return false;
}

//++
//------------------------------------------------------------------------------------
// Details: Examine the string and determine if it is a valid string type
// argument.
//          Take into account quotes surrounding the text. Take into account
//          string format
//          embedded quotes surrounding the text i.e. "\\\"%5d\\\"". Note this
//          function falls
//          through to IsStringArgQuotedTextEmbedded() should the criteria match
//          fail.
// Type:    Method.
// Args:    vrTxt   - (R) Some text.
// Return:  bool    - True = yes valid arg, false = no.
// Throws:  None.
//--
bool CMICmdArgValString::IsStringArgQuotedQuotedTextEmbedded(
    const CMIUtilString &vrTxt) const {
  const size_t nPos = vrTxt.find("\"\\\"");
  if (nPos == std::string::npos)
    return false;

  const size_t nPos2 = vrTxt.rfind("\\\"\"");
  if (nPos2 == std::string::npos)
    return false;

  const size_t nLen = vrTxt.length();
  if ((nLen > 5) && ((nPos + 2) == (nPos2 - 2)))
    return false;

  return true;
}
