1314564Sdim//===-- OptionValueUInt64.cpp ------------------------------------*- C++
2314564Sdim//-*-===//
3254721Semaste//
4353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5353358Sdim// See https://llvm.org/LICENSE.txt for license information.
6353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Interpreter/OptionValueUInt64.h"
11254721Semaste
12288943Sdim#include "lldb/Host/StringConvert.h"
13321369Sdim#include "lldb/Utility/Stream.h"
14254721Semaste
15254721Semasteusing namespace lldb;
16254721Semasteusing namespace lldb_private;
17254721Semaste
18314564Sdimlldb::OptionValueSP OptionValueUInt64::Create(llvm::StringRef value_str,
19321369Sdim                                              Status &error) {
20314564Sdim  lldb::OptionValueSP value_sp(new OptionValueUInt64());
21314564Sdim  error = value_sp->SetValueFromString(value_str);
22314564Sdim  if (error.Fail())
23314564Sdim    value_sp.reset();
24314564Sdim  return value_sp;
25254721Semaste}
26254721Semaste
27314564Sdimvoid OptionValueUInt64::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
28314564Sdim                                  uint32_t dump_mask) {
29314564Sdim  if (dump_mask & eDumpOptionType)
30314564Sdim    strm.Printf("(%s)", GetTypeAsCString());
31314564Sdim  if (dump_mask & eDumpOptionValue) {
32254721Semaste    if (dump_mask & eDumpOptionType)
33314564Sdim      strm.PutCString(" = ");
34314564Sdim    strm.Printf("%" PRIu64, m_current_value);
35314564Sdim  }
36254721Semaste}
37254721Semaste
38321369SdimStatus OptionValueUInt64::SetValueFromString(llvm::StringRef value_ref,
39321369Sdim                                             VarSetOperationType op) {
40321369Sdim  Status error;
41314564Sdim  switch (op) {
42314564Sdim  case eVarSetOperationClear:
43314564Sdim    Clear();
44314564Sdim    NotifyValueChanged();
45314564Sdim    break;
46314564Sdim
47314564Sdim  case eVarSetOperationReplace:
48314564Sdim  case eVarSetOperationAssign: {
49314564Sdim    bool success = false;
50314564Sdim    std::string value_str = value_ref.trim().str();
51314564Sdim    uint64_t value = StringConvert::ToUInt64(value_str.c_str(), 0, 0, &success);
52314564Sdim    if (success) {
53314564Sdim      m_value_was_set = true;
54314564Sdim      m_current_value = value;
55314564Sdim      NotifyValueChanged();
56314564Sdim    } else {
57314564Sdim      error.SetErrorStringWithFormat("invalid uint64_t string value: '%s'",
58314564Sdim                                     value_str.c_str());
59254721Semaste    }
60314564Sdim  } break;
61314564Sdim
62314564Sdim  case eVarSetOperationInsertBefore:
63314564Sdim  case eVarSetOperationInsertAfter:
64314564Sdim  case eVarSetOperationRemove:
65314564Sdim  case eVarSetOperationAppend:
66314564Sdim  case eVarSetOperationInvalid:
67314564Sdim    error = OptionValue::SetValueFromString(value_ref, op);
68314564Sdim    break;
69314564Sdim  }
70314564Sdim  return error;
71254721Semaste}
72254721Semaste
73314564Sdimlldb::OptionValueSP OptionValueUInt64::DeepCopy() const {
74314564Sdim  return OptionValueSP(new OptionValueUInt64(*this));
75254721Semaste}
76