1 //===-- MICmdArgValNumber.cpp -----------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 #include "MICmdArgValNumber.h"
11 #include "MICmdArgContext.h"
14 // Details: CMICmdArgValNumber constructor.
20 CMICmdArgValNumber::CMICmdArgValNumber()
21 : m_nNumberFormatMask(CMICmdArgValNumber::eArgValNumberFormat_Decimal),
25 // Details: CMICmdArgValNumber constructor.
27 // Args: vrArgName - (R) Argument's name to search by.
28 // vbMandatory - (R) True = Yes must be present, false =
30 // vbHandleByCmd - (R) True = Command processes *this option,
31 // false = not handled.
32 // vnNumberFormatMask - (R) Mask of the number formats. (Dflt =
33 // CMICmdArgValNumber::eArgValNumberFormat_Decimal)
37 CMICmdArgValNumber::CMICmdArgValNumber(
38 const CMIUtilString &vrArgName, const bool vbMandatory,
39 const bool vbHandleByCmd,
41 vnNumberFormatMask /* = CMICmdArgValNumber::eArgValNumberFormat_Decimal*/)
42 : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd),
43 m_nNumberFormatMask(vnNumberFormatMask), m_nNumber(0) {}
46 // Details: CMICmdArgValNumber destructor.
52 CMICmdArgValNumber::~CMICmdArgValNumber() {}
55 // Details: Parse the command's argument options string and try to extract the
57 // argument is looking for.
59 // Args: vwArgContext - (RW) The command's argument options string.
60 // Return: MIstatus::success - Functional succeeded.
61 // MIstatus::failure - Functional failed.
64 bool CMICmdArgValNumber::Validate(CMICmdArgContext &vwArgContext) {
65 if (vwArgContext.IsEmpty())
66 return m_bMandatory ? MIstatus::failure : MIstatus::success;
68 if (vwArgContext.GetNumberArgsPresent() == 1) {
69 const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse());
70 if (IsArgNumber(rArg) && ExtractNumber(rArg)) {
73 m_argValue = GetNumber();
74 vwArgContext.RemoveArg(rArg);
75 return MIstatus::success;
77 return MIstatus::failure;
80 // More than one option...
81 const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs());
82 CMIUtilString::VecString_t::const_iterator it = vecOptions.begin();
83 while (it != vecOptions.end()) {
84 const CMIUtilString &rArg(*it);
85 if (IsArgNumber(rArg) && ExtractNumber(rArg)) {
88 if (vwArgContext.RemoveArg(rArg)) {
90 m_argValue = GetNumber();
91 return MIstatus::success;
93 return MIstatus::failure;
100 return MIstatus::failure;
104 // Details: Examine the string and determine if it is a valid string type
107 // Args: vrTxt - (R) Some text.
108 // Return: bool - True = yes valid arg, false = no.
111 bool CMICmdArgValNumber::IsArgNumber(const CMIUtilString &vrTxt) const {
112 const bool bFormatDecimal(m_nNumberFormatMask &
113 CMICmdArgValNumber::eArgValNumberFormat_Decimal);
114 const bool bFormatHexadecimal(
115 m_nNumberFormatMask &
116 CMICmdArgValNumber::eArgValNumberFormat_Hexadecimal);
118 // Look for --someLongOption
119 if (std::string::npos != vrTxt.find("--"))
122 if (bFormatDecimal && vrTxt.IsNumber())
125 if (bFormatHexadecimal && vrTxt.IsHexadecimalNumber())
132 // Details: Extract the thread group number from the thread group argument.
134 // Args: vrTxt - (R) Some text.
135 // Return: MIstatus::success - Functional succeeded.
136 // MIstatus::failure - Functional failed.
139 bool CMICmdArgValNumber::ExtractNumber(const CMIUtilString &vrTxt) {
141 bool bOk = vrTxt.ExtractNumber(nNumber);
143 m_nNumber = static_cast<MIint64>(nNumber);
150 // Details: Retrieve the thread group ID found in the argument.
153 // Return: MIuint - Thread group ID.
156 MIint64 CMICmdArgValNumber::GetNumber() const { return m_nNumber; }