1*ca69be21SWalter Erquinigo //===-- SBEnvironment.cpp -------------------------------------------------===// 2*ca69be21SWalter Erquinigo // 3*ca69be21SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ca69be21SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information. 5*ca69be21SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ca69be21SWalter Erquinigo // 7*ca69be21SWalter Erquinigo //===----------------------------------------------------------------------===// 8*ca69be21SWalter Erquinigo 9*ca69be21SWalter Erquinigo #include "lldb/API/SBEnvironment.h" 10*ca69be21SWalter Erquinigo #include "Utils.h" 11*ca69be21SWalter Erquinigo #include "lldb/API/SBStringList.h" 12*ca69be21SWalter Erquinigo #include "lldb/Utility/ConstString.h" 13*ca69be21SWalter Erquinigo #include "lldb/Utility/Environment.h" 14*ca69be21SWalter Erquinigo 15*ca69be21SWalter Erquinigo using namespace lldb; 16*ca69be21SWalter Erquinigo using namespace lldb_private; 17*ca69be21SWalter Erquinigo 18*ca69be21SWalter Erquinigo /// This class is highly mutable, therefore we don't reproducers. 19*ca69be21SWalter Erquinigo 20*ca69be21SWalter Erquinigo SBEnvironment::SBEnvironment() : m_opaque_up(new Environment()) {} 21*ca69be21SWalter Erquinigo 22*ca69be21SWalter Erquinigo SBEnvironment::SBEnvironment(const SBEnvironment &rhs) 23*ca69be21SWalter Erquinigo : m_opaque_up(clone(rhs.m_opaque_up)) {} 24*ca69be21SWalter Erquinigo 25*ca69be21SWalter Erquinigo SBEnvironment::SBEnvironment(Environment rhs) 26*ca69be21SWalter Erquinigo : m_opaque_up(new Environment(std::move(rhs))) {} 27*ca69be21SWalter Erquinigo 28*ca69be21SWalter Erquinigo SBEnvironment::~SBEnvironment() = default; 29*ca69be21SWalter Erquinigo 30*ca69be21SWalter Erquinigo const SBEnvironment &SBEnvironment::operator=(const SBEnvironment &rhs) { 31*ca69be21SWalter Erquinigo if (this != &rhs) 32*ca69be21SWalter Erquinigo m_opaque_up = clone(rhs.m_opaque_up); 33*ca69be21SWalter Erquinigo return *this; 34*ca69be21SWalter Erquinigo } 35*ca69be21SWalter Erquinigo 36*ca69be21SWalter Erquinigo size_t SBEnvironment::GetNumValues() { 37*ca69be21SWalter Erquinigo return m_opaque_up->size(); 38*ca69be21SWalter Erquinigo } 39*ca69be21SWalter Erquinigo 40*ca69be21SWalter Erquinigo const char *SBEnvironment::Get(const char *name) { 41*ca69be21SWalter Erquinigo auto entry = m_opaque_up->find(name); 42*ca69be21SWalter Erquinigo if (entry == m_opaque_up->end()) { 43*ca69be21SWalter Erquinigo return nullptr; 44*ca69be21SWalter Erquinigo } 45*ca69be21SWalter Erquinigo return ConstString(entry->second).AsCString(""); 46*ca69be21SWalter Erquinigo } 47*ca69be21SWalter Erquinigo 48*ca69be21SWalter Erquinigo const char *SBEnvironment::GetNameAtIndex(size_t index) { 49*ca69be21SWalter Erquinigo if (index >= GetNumValues()) 50*ca69be21SWalter Erquinigo return nullptr; 51*ca69be21SWalter Erquinigo return ConstString(std::next(m_opaque_up->begin(), index)->first()) 52*ca69be21SWalter Erquinigo .AsCString(""); 53*ca69be21SWalter Erquinigo } 54*ca69be21SWalter Erquinigo 55*ca69be21SWalter Erquinigo const char *SBEnvironment::GetValueAtIndex(size_t index) { 56*ca69be21SWalter Erquinigo if (index >= GetNumValues()) 57*ca69be21SWalter Erquinigo return nullptr; 58*ca69be21SWalter Erquinigo return ConstString(std::next(m_opaque_up->begin(), index)->second) 59*ca69be21SWalter Erquinigo .AsCString(""); 60*ca69be21SWalter Erquinigo } 61*ca69be21SWalter Erquinigo 62*ca69be21SWalter Erquinigo bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) { 63*ca69be21SWalter Erquinigo if (overwrite) { 64*ca69be21SWalter Erquinigo m_opaque_up->insert_or_assign(name, std::string(value)); 65*ca69be21SWalter Erquinigo return true; 66*ca69be21SWalter Erquinigo } 67*ca69be21SWalter Erquinigo return m_opaque_up->try_emplace(name, std::string(value)).second; 68*ca69be21SWalter Erquinigo } 69*ca69be21SWalter Erquinigo 70*ca69be21SWalter Erquinigo bool SBEnvironment::Unset(const char *name) { 71*ca69be21SWalter Erquinigo return m_opaque_up->erase(name); 72*ca69be21SWalter Erquinigo } 73*ca69be21SWalter Erquinigo 74*ca69be21SWalter Erquinigo SBStringList SBEnvironment::GetEntries() { 75*ca69be21SWalter Erquinigo SBStringList entries; 76*ca69be21SWalter Erquinigo for (const auto &KV : *m_opaque_up) { 77*ca69be21SWalter Erquinigo entries.AppendString(Environment::compose(KV).c_str()); 78*ca69be21SWalter Erquinigo } 79*ca69be21SWalter Erquinigo return entries; 80*ca69be21SWalter Erquinigo } 81*ca69be21SWalter Erquinigo 82*ca69be21SWalter Erquinigo void SBEnvironment::PutEntry(const char *name_and_value) { 83*ca69be21SWalter Erquinigo auto split = llvm::StringRef(name_and_value).split('='); 84*ca69be21SWalter Erquinigo m_opaque_up->insert_or_assign(split.first.str(), split.second.str()); 85*ca69be21SWalter Erquinigo } 86*ca69be21SWalter Erquinigo 87*ca69be21SWalter Erquinigo void SBEnvironment::SetEntries(const SBStringList &entries, bool append) { 88*ca69be21SWalter Erquinigo if (!append) 89*ca69be21SWalter Erquinigo m_opaque_up->clear(); 90*ca69be21SWalter Erquinigo for (size_t i = 0; i < entries.GetSize(); i++) { 91*ca69be21SWalter Erquinigo PutEntry(entries.GetStringAtIndex(i)); 92*ca69be21SWalter Erquinigo } 93*ca69be21SWalter Erquinigo } 94*ca69be21SWalter Erquinigo 95*ca69be21SWalter Erquinigo void SBEnvironment::Clear() { 96*ca69be21SWalter Erquinigo m_opaque_up->clear(); 97*ca69be21SWalter Erquinigo } 98*ca69be21SWalter Erquinigo 99*ca69be21SWalter Erquinigo Environment &SBEnvironment::ref() const { return *m_opaque_up; } 100