]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/tools/lldb-mi/MICmdArgValNumber.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / tools / lldb-mi / MICmdArgValNumber.cpp
1 //===-- MICmdArgValNumber.cpp -----------------------------------*- C++ -*-===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8
9 // In-house headers:
10 #include "MICmdArgValNumber.h"
11 #include "MICmdArgContext.h"
12
13 //++
14 // Details: CMICmdArgValNumber constructor.
15 // Type:    Method.
16 // Args:    None.
17 // Return:  None.
18 // Throws:  None.
19 //--
20 CMICmdArgValNumber::CMICmdArgValNumber()
21     : m_nNumberFormatMask(CMICmdArgValNumber::eArgValNumberFormat_Decimal),
22       m_nNumber(0) {}
23
24 //++
25 // Details: CMICmdArgValNumber constructor.
26 // Type:    Method.
27 // Args:    vrArgName          - (R) Argument's name to search by.
28 //          vbMandatory        - (R) True = Yes must be present, false =
29 //          optional argument.
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)
34 // Return:  None.
35 // Throws:  None.
36 //--
37 CMICmdArgValNumber::CMICmdArgValNumber(
38     const CMIUtilString &vrArgName, const bool vbMandatory,
39     const bool vbHandleByCmd,
40     const MIuint
41         vnNumberFormatMask /* = CMICmdArgValNumber::eArgValNumberFormat_Decimal*/)
42     : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd),
43       m_nNumberFormatMask(vnNumberFormatMask), m_nNumber(0) {}
44
45 //++
46 // Details: CMICmdArgValNumber destructor.
47 // Type:    Overridden.
48 // Args:    None.
49 // Return:  None.
50 // Throws:  None.
51 //--
52 CMICmdArgValNumber::~CMICmdArgValNumber() {}
53
54 //++
55 // Details: Parse the command's argument options string and try to extract the
56 // value *this
57 //          argument is looking for.
58 // Type:    Overridden.
59 // Args:    vwArgContext    - (RW) The command's argument options string.
60 // Return:  MIstatus::success - Functional succeeded.
61 //          MIstatus::failure - Functional failed.
62 // Throws:  None.
63 //--
64 bool CMICmdArgValNumber::Validate(CMICmdArgContext &vwArgContext) {
65   if (vwArgContext.IsEmpty())
66     return m_bMandatory ? MIstatus::failure : MIstatus::success;
67
68   if (vwArgContext.GetNumberArgsPresent() == 1) {
69     const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse());
70     if (IsArgNumber(rArg) && ExtractNumber(rArg)) {
71       m_bFound = true;
72       m_bValid = true;
73       m_argValue = GetNumber();
74       vwArgContext.RemoveArg(rArg);
75       return MIstatus::success;
76     } else
77       return MIstatus::failure;
78   }
79
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)) {
86       m_bFound = true;
87
88       if (vwArgContext.RemoveArg(rArg)) {
89         m_bValid = true;
90         m_argValue = GetNumber();
91         return MIstatus::success;
92       } else
93         return MIstatus::failure;
94     }
95
96     // Next
97     ++it;
98   }
99
100   return MIstatus::failure;
101 }
102
103 //++
104 // Details: Examine the string and determine if it is a valid string type
105 // argument.
106 // Type:    Method.
107 // Args:    vrTxt   - (R) Some text.
108 // Return:  bool    - True = yes valid arg, false = no.
109 // Throws:  None.
110 //--
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);
117
118   // Look for --someLongOption
119   if (std::string::npos != vrTxt.find("--"))
120     return false;
121
122   if (bFormatDecimal && vrTxt.IsNumber())
123     return true;
124
125   if (bFormatHexadecimal && vrTxt.IsHexadecimalNumber())
126     return true;
127
128   return false;
129 }
130
131 //++
132 // Details: Extract the thread group number from the thread group argument.
133 // Type:    Method.
134 // Args:    vrTxt   - (R) Some text.
135 // Return:  MIstatus::success - Functional succeeded.
136 //          MIstatus::failure - Functional failed.
137 // Throws:  None.
138 //--
139 bool CMICmdArgValNumber::ExtractNumber(const CMIUtilString &vrTxt) {
140   MIint64 nNumber = 0;
141   bool bOk = vrTxt.ExtractNumber(nNumber);
142   if (bOk) {
143     m_nNumber = static_cast<MIint64>(nNumber);
144   }
145
146   return bOk;
147 }
148
149 //++
150 // Details: Retrieve the thread group ID found in the argument.
151 // Type:    Method.
152 // Args:    None.
153 // Return:  MIuint - Thread group ID.
154 // Throws:  None.
155 //--
156 MIint64 CMICmdArgValNumber::GetNumber() const { return m_nNumber; }