1 | //===-- OptionValueBoolean.cpp --------------------------------------------===// |
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 | #include "lldb/Interpreter/OptionValueBoolean.h" |
10 | |
11 | #include "lldb/Host/PosixApi.h" |
12 | #include "lldb/Interpreter/OptionArgParser.h" |
13 | #include "lldb/Utility/Stream.h" |
14 | #include "lldb/Utility/StringList.h" |
15 | #include "llvm/ADT/STLExtras.h" |
16 | |
17 | using namespace lldb; |
18 | using namespace lldb_private; |
19 | |
20 | void OptionValueBoolean::DumpValue(const ExecutionContext *exe_ctx, |
21 | Stream &strm, uint32_t dump_mask) { |
22 | if (dump_mask & eDumpOptionType) |
23 | strm.Printf(format: "(%s)" , GetTypeAsCString()); |
24 | // if (dump_mask & eDumpOptionName) |
25 | // DumpQualifiedName (strm); |
26 | if (dump_mask & eDumpOptionValue) { |
27 | if (dump_mask & eDumpOptionType) |
28 | strm.PutCString(cstr: " = " ); |
29 | strm.PutCString(cstr: m_current_value ? "true" : "false" ); |
30 | } |
31 | } |
32 | |
33 | Status OptionValueBoolean::SetValueFromString(llvm::StringRef value_str, |
34 | VarSetOperationType op) { |
35 | Status error; |
36 | switch (op) { |
37 | case eVarSetOperationClear: |
38 | Clear(); |
39 | NotifyValueChanged(); |
40 | break; |
41 | |
42 | case eVarSetOperationReplace: |
43 | case eVarSetOperationAssign: { |
44 | bool success = false; |
45 | bool value = OptionArgParser::ToBoolean(s: value_str, fail_value: false, success_ptr: &success); |
46 | if (success) { |
47 | m_value_was_set = true; |
48 | m_current_value = value; |
49 | NotifyValueChanged(); |
50 | } else { |
51 | if (value_str.size() == 0) |
52 | error.SetErrorString("invalid boolean string value <empty>" ); |
53 | else |
54 | error.SetErrorStringWithFormat("invalid boolean string value: '%s'" , |
55 | value_str.str().c_str()); |
56 | } |
57 | } break; |
58 | |
59 | case eVarSetOperationInsertBefore: |
60 | case eVarSetOperationInsertAfter: |
61 | case eVarSetOperationRemove: |
62 | case eVarSetOperationAppend: |
63 | case eVarSetOperationInvalid: |
64 | error = OptionValue::SetValueFromString(value: value_str, op); |
65 | break; |
66 | } |
67 | return error; |
68 | } |
69 | |
70 | void OptionValueBoolean::AutoComplete(CommandInterpreter &interpreter, |
71 | CompletionRequest &request) { |
72 | llvm::StringRef autocomplete_entries[] = {"true" , "false" , "on" , "off" , |
73 | "yes" , "no" , "1" , "0" }; |
74 | |
75 | auto entries = llvm::ArrayRef(autocomplete_entries); |
76 | |
77 | // only suggest "true" or "false" by default |
78 | if (request.GetCursorArgumentPrefix().empty()) |
79 | entries = entries.take_front(N: 2); |
80 | |
81 | for (auto entry : entries) |
82 | request.TryCompleteCurrentArg(completion: entry); |
83 | } |
84 | |