2014-05-16 18:51:01 +08:00
|
|
|
//===-- MICmdArgValString.cpp -----------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
//++
|
2014-11-18 02:06:21 +08:00
|
|
|
// File: MICmdArgValString.cpp
|
2014-05-16 18:51:01 +08:00
|
|
|
//
|
2014-11-18 02:06:21 +08:00
|
|
|
// Overview: CMICmdArgValString implementation.
|
2014-05-16 18:51:01 +08:00
|
|
|
//
|
2014-11-18 02:06:21 +08:00
|
|
|
// Environment: Compilers: Visual C++ 12.
|
|
|
|
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
|
|
|
|
// Libraries: See MIReadmetxt.
|
2014-05-16 18:51:01 +08:00
|
|
|
//
|
2014-11-18 02:06:21 +08:00
|
|
|
// Copyright: None.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
|
|
|
|
|
|
|
// In-house headers:
|
|
|
|
#include "MICmdArgValString.h"
|
|
|
|
#include "MICmdArgContext.h"
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// Details: CMICmdArgValString constructor.
|
|
|
|
// Type: Method.
|
|
|
|
// Args: None.
|
|
|
|
// Return: None.
|
|
|
|
// Throws: None.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
CMICmdArgValString::CMICmdArgValString(void)
|
|
|
|
: m_bHandleQuotedString(false)
|
|
|
|
, m_bAcceptNumbers(false)
|
|
|
|
, m_bHandleDirPaths(false)
|
|
|
|
, m_bHandleAnything(false)
|
2014-08-15 00:40:15 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// Details: CMICmdArgValString constructor.
|
|
|
|
// Type: Method.
|
|
|
|
// Args: vbAnything - (R) True = Parse a string and accept anything, false = do not accept anything.
|
|
|
|
// Return: None.
|
|
|
|
// Throws: None.
|
2014-08-15 00:40:15 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
CMICmdArgValString::CMICmdArgValString(const bool vbAnything)
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
: m_bHandleQuotedString(vbAnything ? true : false)
|
2014-11-18 02:06:21 +08:00
|
|
|
, m_bAcceptNumbers(false)
|
|
|
|
, m_bHandleDirPaths(false)
|
|
|
|
, m_bHandleAnything(vbAnything)
|
2014-06-25 00:35:50 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// Details: CMICmdArgValString constructor.
|
|
|
|
// Type: Method.
|
|
|
|
// Args: vbHandleQuotes - (R) True = Parse a string surrounded by quotes spaces are not delimitors, 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.
|
2014-06-25 00:35:50 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
CMICmdArgValString::CMICmdArgValString(const bool vbHandleQuotes, const bool vbAcceptNumbers, const bool vbHandleDirPaths)
|
|
|
|
: m_bHandleQuotedString(vbHandleQuotes)
|
|
|
|
, m_bAcceptNumbers(vbAcceptNumbers)
|
|
|
|
, m_bHandleDirPaths(vbHandleDirPaths)
|
|
|
|
, m_bHandleAnything(false)
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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 delimitors, 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.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
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)
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// Details: CMICmdArgValString destructor.
|
|
|
|
// Type: Overridden.
|
|
|
|
// Args: None.
|
|
|
|
// Return: None.
|
|
|
|
// Throws: None.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
CMICmdArgValString::~CMICmdArgValString(void)
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::Validate(CMICmdArgContext &vrwArgContext)
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
2014-11-18 02:06:21 +08:00
|
|
|
if (vrwArgContext.IsEmpty())
|
|
|
|
return MIstatus::success;
|
2014-05-16 18:51:01 +08:00
|
|
|
|
2014-11-18 02:06:21 +08:00
|
|
|
if (m_bHandleQuotedString)
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
return ValidateQuotedText(vrwArgContext);
|
2014-05-16 18:51:01 +08:00
|
|
|
|
2014-11-18 02:06:21 +08:00
|
|
|
return ValidateSingleText(vrwArgContext);
|
2014-05-16 18:51:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::ValidateSingleText(CMICmdArgContext &vrwArgContext)
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
2014-11-18 02:06:21 +08:00
|
|
|
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;
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
m_argValue = rArg.StripSlashes();
|
2014-11-18 02:06:21 +08:00
|
|
|
return MIstatus::success;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return MIstatus::failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Next
|
|
|
|
++it;
|
|
|
|
}
|
|
|
|
|
|
|
|
return MIstatus::failure;
|
2014-05-16 18:51:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// Details: Parse the command's argument options string and try to extract all the words
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
// between quotes then delimited by the next space.
|
2014-11-18 02:06:21 +08:00
|
|
|
// Type: Method.
|
|
|
|
// Args: vrwArgContext - (RW) The command's argument options string.
|
|
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
|
|
// MIstatus::failure - Functional failed.
|
|
|
|
// Throws: None.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::ValidateQuotedText(CMICmdArgContext &vrwArgContext)
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
const CMIUtilString::VecString_t vecOptions(vrwArgContext.GetArgs());
|
|
|
|
if (vecOptions.size() == 0)
|
2014-11-18 02:06:21 +08:00
|
|
|
return MIstatus::failure;
|
|
|
|
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
const CMIUtilString &rArg(vecOptions[0]);
|
|
|
|
if (!IsStringArg(rArg))
|
2014-11-18 02:06:21 +08:00
|
|
|
return MIstatus::failure;
|
|
|
|
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
m_bFound = true;
|
2014-11-18 02:06:21 +08:00
|
|
|
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
if (vrwArgContext.RemoveArg(rArg))
|
2014-11-18 02:06:21 +08:00
|
|
|
{
|
|
|
|
m_bValid = true;
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
const MIchar cQuote = '"';
|
|
|
|
m_argValue = rArg.Trim(cQuote).StripSlashes();
|
2014-11-18 02:06:21 +08:00
|
|
|
return MIstatus::success;
|
|
|
|
}
|
|
|
|
|
|
|
|
return MIstatus::failure;
|
2014-05-16 18:51:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-05-16 18:51:01 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::IsStringArg(const CMIUtilString &vrTxt) const
|
2014-05-16 18:51:01 +08:00
|
|
|
{
|
2014-11-18 02:06:21 +08:00
|
|
|
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);
|
2014-06-25 00:35:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-06-25 00:35:50 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::IsStringArgSingleText(const CMIUtilString &vrTxt) const
|
2014-06-25 00:35:50 +08:00
|
|
|
{
|
2014-11-18 02:06:21 +08:00
|
|
|
if (!m_bHandleDirPaths)
|
|
|
|
{
|
|
|
|
// Look for directory file paths, if found reject
|
|
|
|
const bool bHavePosSlash = (vrTxt.find_first_of("/") != std::string::npos);
|
|
|
|
const bool bHaveBckSlash = (vrTxt.find_first_of("\\") != 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;
|
2014-06-25 00:35:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-06-25 00:35:50 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::IsStringArgQuotedText(const CMIUtilString &vrTxt) const
|
2014-06-25 00:35:50 +08:00
|
|
|
{
|
Fix handling of double quotes (MI)
Summary:
* Clean CMICmdArgValString::Validate: now it's based on CMIUtilString::SplitConsiderQuotes method:
A bit of introduction:
# Command line is wrapped into CMICmdArgContext.
# CMICmdArgSet is a set of arguments to be parsed. This class contains CMICmdArgContext as a private member.
# MI command is class which is inhereted from CMICmdBase. It contains CMICmdArgSet as a private member.
When command is executed CMICmdBase::ParseArgs() is called. This method adds args for parsing using CMICmdArgSet::Add(). Then CMICmdBase::ParseValidateCmdOptions() is called, which calls CMICmdArgSet::Validate(). Then it gets a number of arguments (using SplitConsiderQuotes().array_length) and for each arguments registered in ParseArgs() tries to validate it using CMICmdArgValBase::Validate(). Every user commands parses this string again (first time it was made in SplitConsiderQuotes) and in case of CMICmdArgValString it was made incorrectly. It searches the first and last quotes (but it should be first and next after first). Besides, it was splitted into 4 cases.
I'm just using SplitConsiderQuotes directly, and I don't split them by hand again.
Actually, I think we should do so in every CMICmdArgVal_XXX::Validate() method.
* Enable MiInterpreterExecTestCase.test_lldbmi_target_create test
* Fix MiExecTestCase.test_lldbmi_exec_arguments_set test
All tests pass on OS X.
Reviewers: abidh, emaste, zturner, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, zturner, emaste, clayborg, abidh
Differential Revision: http://reviews.llvm.org/D7860
llvm-svn: 230654
2015-02-27 02:21:22 +08:00
|
|
|
// Accept anything as string word
|
|
|
|
if (m_bHandleAnything)
|
|
|
|
return true;
|
|
|
|
|
2014-11-18 02:06:21 +08:00
|
|
|
// CODETAG_QUOTEDTEXT_SIMILAR_CODE
|
|
|
|
const MIchar cQuote = '"';
|
|
|
|
const MIint nPos = vrTxt.find(cQuote);
|
|
|
|
if (nPos == (MIint)std::string::npos)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Is one and only quote at end of the string
|
|
|
|
if (nPos == (MIint)(vrTxt.length() - 1))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Quote must be the first character in the string or be preceeded by a space
|
|
|
|
// Also check for embedded string formating quote
|
|
|
|
const MIchar cBckSlash = '\\';
|
|
|
|
const MIchar 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 MIint nPos2 = vrTxt.rfind(cQuote);
|
|
|
|
if (nPos2 == (MIint)std::string::npos)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Make sure not same quote, need two quotes
|
|
|
|
if (nPos == nPos2)
|
|
|
|
return MIstatus::failure;
|
|
|
|
|
|
|
|
return true;
|
2014-08-09 00:47:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-08-09 00:47:42 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::IsStringArgQuotedTextEmbedded(const CMIUtilString &vrTxt) const
|
2014-08-09 00:47:42 +08:00
|
|
|
{
|
2014-11-18 02:06:21 +08:00
|
|
|
// CODETAG_QUOTEDTEXT_SIMILAR_CODE
|
|
|
|
const MIchar cBckSlash = '\\';
|
|
|
|
const MIint nPos = vrTxt.find(cBckSlash);
|
|
|
|
if (nPos == (MIint)std::string::npos)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Slash must be the first character in the string or be preceeded by a space
|
|
|
|
const MIchar cSpace = ' ';
|
|
|
|
if ((nPos > 0) && (vrTxt[nPos - 1] != cSpace))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Need to find the other matching slash
|
|
|
|
const MIint nPos2 = vrTxt.rfind(cBckSlash);
|
|
|
|
if (nPos2 == (MIint)std::string::npos)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Make sure not same back slash, need two slashs
|
|
|
|
if (nPos == nPos2)
|
|
|
|
return MIstatus::failure;
|
|
|
|
|
|
|
|
return false;
|
2014-08-09 00:47:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
2014-11-18 02:06:21 +08:00
|
|
|
// 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.
|
2014-08-09 00:47:42 +08:00
|
|
|
//--
|
2014-11-18 02:06:21 +08:00
|
|
|
bool
|
|
|
|
CMICmdArgValString::IsStringArgQuotedQuotedTextEmbedded(const CMIUtilString &vrTxt) const
|
2014-08-09 00:47:42 +08:00
|
|
|
{
|
2014-11-18 02:06:21 +08:00
|
|
|
const MIint nPos = vrTxt.find("\"\\\"");
|
|
|
|
if (nPos == (MIint)std::string::npos)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
const MIint nPos2 = vrTxt.rfind("\\\"\"");
|
|
|
|
if (nPos2 == (MIint)std::string::npos)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
const MIint nLen = vrTxt.length();
|
|
|
|
if ((nLen > 5) && ((nPos + 2) == (nPos2 - 2)))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
2014-05-16 18:51:01 +08:00
|
|
|
}
|