]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/tools/lldb-mi/MICmdArgValNumber.cpp
Merge ^/head r285793 through r285923.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / tools / lldb-mi / MICmdArgValNumber.cpp
1 //===-- MICmdArgValNumber.cpp -----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // In-house headers:
11 #include "MICmdArgValNumber.h"
12 #include "MICmdArgContext.h"
13
14 //++ ------------------------------------------------------------------------------------
15 // Details: CMICmdArgValNumber constructor.
16 // Type:    Method.
17 // Args:    None.
18 // Return:  None.
19 // Throws:  None.
20 //--
21 CMICmdArgValNumber::CMICmdArgValNumber(void)
22     : m_nNumberFormatMask(CMICmdArgValNumber::eArgValNumberFormat_Decimal)
23     , m_nNumber(0)
24 {
25 }
26
27 //++ ------------------------------------------------------------------------------------
28 // Details: CMICmdArgValNumber constructor.
29 // Type:    Method.
30 // Args:    vrArgName          - (R) Argument's name to search by.
31 //          vbMandatory        - (R) True = Yes must be present, false = optional argument.
32 //          vbHandleByCmd      - (R) True = Command processes *this option, false = not handled.
33 //          vnNumberFormatMask - (R) Mask of the number formats. (Dflt = CMICmdArgValNumber::eArgValNumberFormat_Decimal)
34 // Return:  None.
35 // Throws:  None.
36 //--
37 CMICmdArgValNumber::CMICmdArgValNumber(const CMIUtilString &vrArgName, const bool vbMandatory, const bool vbHandleByCmd,
38                                        const MIuint vnNumberFormatMask /* = CMICmdArgValNumber::eArgValNumberFormat_Decimal*/)
39     : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd)
40     , m_nNumberFormatMask(vnNumberFormatMask)
41     , m_nNumber(0)
42 {
43 }
44
45 //++ ------------------------------------------------------------------------------------
46 // Details: CMICmdArgValNumber destructor.
47 // Type:    Overridden.
48 // Args:    None.
49 // Return:  None.
50 // Throws:  None.
51 //--
52 CMICmdArgValNumber::~CMICmdArgValNumber(void)
53 {
54 }
55
56 //++ ------------------------------------------------------------------------------------
57 // Details: Parse the command's argument options string and try to extract the value *this
58 //          argument is looking for.
59 // Type:    Overridden.
60 // Args:    vwArgContext    - (RW) The command's argument options string.
61 // Return:  MIstatus::success - Functional succeeded.
62 //          MIstatus::failure - Functional failed.
63 // Throws:  None.
64 //--
65 bool
66 CMICmdArgValNumber::Validate(CMICmdArgContext &vwArgContext)
67 {
68     if (vwArgContext.IsEmpty())
69         return m_bMandatory ? MIstatus::failure : MIstatus::success;
70
71     if (vwArgContext.GetNumberArgsPresent() == 1)
72     {
73         const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse());
74         if (IsArgNumber(rArg) && ExtractNumber(rArg))
75         {
76             m_bFound = true;
77             m_bValid = true;
78             m_argValue = GetNumber();
79             vwArgContext.RemoveArg(rArg);
80             return MIstatus::success;
81         }
82         else
83             return MIstatus::failure;
84     }
85
86     // More than one option...
87     const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs());
88     CMIUtilString::VecString_t::const_iterator it = vecOptions.begin();
89     while (it != vecOptions.end())
90     {
91         const CMIUtilString &rArg(*it);
92         if (IsArgNumber(rArg) && ExtractNumber(rArg))
93         {
94             m_bFound = true;
95
96             if (vwArgContext.RemoveArg(rArg))
97             {
98                 m_bValid = true;
99                 m_argValue = GetNumber();
100                 return MIstatus::success;
101             }
102             else
103                 return MIstatus::failure;
104         }
105
106         // Next
107         ++it;
108     }
109
110     return MIstatus::failure;
111 }
112
113 //++ ------------------------------------------------------------------------------------
114 // Details: Examine the string and determine if it is a valid string type argument.
115 // Type:    Method.
116 // Args:    vrTxt   - (R) Some text.
117 // Return:  bool    - True = yes valid arg, false = no.
118 // Throws:  None.
119 //--
120 bool
121 CMICmdArgValNumber::IsArgNumber(const CMIUtilString &vrTxt) const
122 {
123     const bool bFormatDecimal(m_nNumberFormatMask & CMICmdArgValNumber::eArgValNumberFormat_Decimal);
124     const bool bFormatHexadecimal(m_nNumberFormatMask & CMICmdArgValNumber::eArgValNumberFormat_Hexadecimal);
125
126     // Look for --someLongOption
127     if (std::string::npos != vrTxt.find("--"))
128         return false;
129
130     if (bFormatDecimal && vrTxt.IsNumber())
131         return true;
132
133     if (bFormatHexadecimal && vrTxt.IsHexadecimalNumber())
134         return true;
135
136     return false;
137 }
138
139 //++ ------------------------------------------------------------------------------------
140 // Details: Extract the thread group number from the thread group argument.
141 // Type:    Method.
142 // Args:    vrTxt   - (R) Some text.
143 // Return:  MIstatus::success - Functional succeeded.
144 //          MIstatus::failure - Functional failed.
145 // Throws:  None.
146 //--
147 bool
148 CMICmdArgValNumber::ExtractNumber(const CMIUtilString &vrTxt)
149 {
150     MIint64 nNumber = 0;
151     bool bOk = vrTxt.ExtractNumber(nNumber);
152     if (bOk)
153     {
154         m_nNumber = static_cast<MIint64>(nNumber);
155     }
156
157     return bOk;
158 }
159
160 //++ ------------------------------------------------------------------------------------
161 // Details: Retrieve the thread group ID found in the argument.
162 // Type:    Method.
163 // Args:    None.
164 // Return:  MIuint - Thread group ID.
165 // Throws:  None.
166 //--
167 MIint64
168 CMICmdArgValNumber::GetNumber(void) const
169 {
170     return m_nNumber;
171 }