1//===-- SBEnvironment.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/API/SBEnvironment.h" 10#include "Utils.h" 11#include "lldb/API/SBStringList.h" 12#include "lldb/Utility/ConstString.h" 13#include "lldb/Utility/Environment.h" 14#include "lldb/Utility/Instrumentation.h" 15 16using namespace lldb; 17using namespace lldb_private; 18 19SBEnvironment::SBEnvironment() : m_opaque_up(new Environment()) { 20 LLDB_INSTRUMENT_VA(this); 21} 22 23SBEnvironment::SBEnvironment(const SBEnvironment &rhs) 24 : m_opaque_up(clone(rhs.m_opaque_up)) { 25 LLDB_INSTRUMENT_VA(this, rhs); 26} 27 28SBEnvironment::SBEnvironment(Environment rhs) 29 : m_opaque_up(new Environment(std::move(rhs))) {} 30 31SBEnvironment::~SBEnvironment() = default; 32 33const SBEnvironment &SBEnvironment::operator=(const SBEnvironment &rhs) { 34 LLDB_INSTRUMENT_VA(this, rhs); 35 36 if (this != &rhs) 37 m_opaque_up = clone(rhs.m_opaque_up); 38 return *this; 39} 40 41size_t SBEnvironment::GetNumValues() { 42 LLDB_INSTRUMENT_VA(this); 43 44 return m_opaque_up->size(); 45} 46 47const char *SBEnvironment::Get(const char *name) { 48 LLDB_INSTRUMENT_VA(this, name); 49 50 auto entry = m_opaque_up->find(name); 51 if (entry == m_opaque_up->end()) { 52 return nullptr; 53 } 54 return ConstString(entry->second).AsCString(""); 55} 56 57const char *SBEnvironment::GetNameAtIndex(size_t index) { 58 LLDB_INSTRUMENT_VA(this, index); 59 60 if (index >= GetNumValues()) 61 return nullptr; 62 return ConstString(std::next(m_opaque_up->begin(), index)->first()) 63 .AsCString(""); 64} 65 66const char *SBEnvironment::GetValueAtIndex(size_t index) { 67 LLDB_INSTRUMENT_VA(this, index); 68 69 if (index >= GetNumValues()) 70 return nullptr; 71 return ConstString(std::next(m_opaque_up->begin(), index)->second) 72 .AsCString(""); 73} 74 75bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) { 76 LLDB_INSTRUMENT_VA(this, name, value, overwrite); 77 78 if (overwrite) { 79 m_opaque_up->insert_or_assign(name, std::string(value)); 80 return true; 81 } 82 return m_opaque_up->try_emplace(name, std::string(value)).second; 83} 84 85bool SBEnvironment::Unset(const char *name) { 86 LLDB_INSTRUMENT_VA(this, name); 87 88 return m_opaque_up->erase(name); 89} 90 91SBStringList SBEnvironment::GetEntries() { 92 LLDB_INSTRUMENT_VA(this); 93 94 SBStringList entries; 95 for (const auto &KV : *m_opaque_up) { 96 entries.AppendString(Environment::compose(KV).c_str()); 97 } 98 return entries; 99} 100 101void SBEnvironment::PutEntry(const char *name_and_value) { 102 LLDB_INSTRUMENT_VA(this, name_and_value); 103 104 auto split = llvm::StringRef(name_and_value).split('='); 105 m_opaque_up->insert_or_assign(split.first.str(), split.second.str()); 106} 107 108void SBEnvironment::SetEntries(const SBStringList &entries, bool append) { 109 LLDB_INSTRUMENT_VA(this, entries, append); 110 111 if (!append) 112 m_opaque_up->clear(); 113 for (size_t i = 0; i < entries.GetSize(); i++) { 114 PutEntry(entries.GetStringAtIndex(i)); 115 } 116} 117 118void SBEnvironment::Clear() { 119 LLDB_INSTRUMENT_VA(this); 120 121 m_opaque_up->clear(); 122} 123 124Environment &SBEnvironment::ref() const { return *m_opaque_up; } 125