1*5ffd83dbSDimitry Andric //===-- SBEnvironment.cpp -------------------------------------------------===// 2*5ffd83dbSDimitry Andric // 3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5ffd83dbSDimitry Andric // 7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 8*5ffd83dbSDimitry Andric 9*5ffd83dbSDimitry Andric #include "lldb/API/SBEnvironment.h" 10*5ffd83dbSDimitry Andric #include "SBReproducerPrivate.h" 11*5ffd83dbSDimitry Andric #include "Utils.h" 12*5ffd83dbSDimitry Andric #include "lldb/API/SBStringList.h" 13*5ffd83dbSDimitry Andric #include "lldb/Utility/ConstString.h" 14*5ffd83dbSDimitry Andric #include "lldb/Utility/Environment.h" 15*5ffd83dbSDimitry Andric 16*5ffd83dbSDimitry Andric using namespace lldb; 17*5ffd83dbSDimitry Andric using namespace lldb_private; 18*5ffd83dbSDimitry Andric 19*5ffd83dbSDimitry Andric SBEnvironment::SBEnvironment() : m_opaque_up(new Environment()) { 20*5ffd83dbSDimitry Andric LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBEnvironment); 21*5ffd83dbSDimitry Andric } 22*5ffd83dbSDimitry Andric 23*5ffd83dbSDimitry Andric SBEnvironment::SBEnvironment(const SBEnvironment &rhs) 24*5ffd83dbSDimitry Andric : m_opaque_up(clone(rhs.m_opaque_up)) { 25*5ffd83dbSDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBEnvironment, (const lldb::SBEnvironment &), rhs); 26*5ffd83dbSDimitry Andric } 27*5ffd83dbSDimitry Andric 28*5ffd83dbSDimitry Andric SBEnvironment::SBEnvironment(Environment rhs) 29*5ffd83dbSDimitry Andric : m_opaque_up(new Environment(std::move(rhs))) {} 30*5ffd83dbSDimitry Andric 31*5ffd83dbSDimitry Andric SBEnvironment::~SBEnvironment() = default; 32*5ffd83dbSDimitry Andric 33*5ffd83dbSDimitry Andric const SBEnvironment &SBEnvironment::operator=(const SBEnvironment &rhs) { 34*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(const lldb::SBEnvironment &, 35*5ffd83dbSDimitry Andric SBEnvironment, operator=,(const lldb::SBEnvironment &), 36*5ffd83dbSDimitry Andric rhs); 37*5ffd83dbSDimitry Andric 38*5ffd83dbSDimitry Andric if (this != &rhs) 39*5ffd83dbSDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 40*5ffd83dbSDimitry Andric return LLDB_RECORD_RESULT(*this); 41*5ffd83dbSDimitry Andric } 42*5ffd83dbSDimitry Andric 43*5ffd83dbSDimitry Andric size_t SBEnvironment::GetNumValues() { 44*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(size_t, SBEnvironment, GetNumValues); 45*5ffd83dbSDimitry Andric 46*5ffd83dbSDimitry Andric return m_opaque_up->size(); 47*5ffd83dbSDimitry Andric } 48*5ffd83dbSDimitry Andric 49*5ffd83dbSDimitry Andric const char *SBEnvironment::Get(const char *name) { 50*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(const char *, SBEnvironment, Get, (const char *), name); 51*5ffd83dbSDimitry Andric 52*5ffd83dbSDimitry Andric auto entry = m_opaque_up->find(name); 53*5ffd83dbSDimitry Andric if (entry == m_opaque_up->end()) { 54*5ffd83dbSDimitry Andric return nullptr; 55*5ffd83dbSDimitry Andric } 56*5ffd83dbSDimitry Andric return ConstString(entry->second).AsCString(""); 57*5ffd83dbSDimitry Andric } 58*5ffd83dbSDimitry Andric 59*5ffd83dbSDimitry Andric const char *SBEnvironment::GetNameAtIndex(size_t index) { 60*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(const char *, SBEnvironment, GetNameAtIndex, (size_t), 61*5ffd83dbSDimitry Andric index); 62*5ffd83dbSDimitry Andric 63*5ffd83dbSDimitry Andric if (index >= GetNumValues()) 64*5ffd83dbSDimitry Andric return nullptr; 65*5ffd83dbSDimitry Andric return ConstString(std::next(m_opaque_up->begin(), index)->first()) 66*5ffd83dbSDimitry Andric .AsCString(""); 67*5ffd83dbSDimitry Andric } 68*5ffd83dbSDimitry Andric 69*5ffd83dbSDimitry Andric const char *SBEnvironment::GetValueAtIndex(size_t index) { 70*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(const char *, SBEnvironment, GetValueAtIndex, (size_t), 71*5ffd83dbSDimitry Andric index); 72*5ffd83dbSDimitry Andric 73*5ffd83dbSDimitry Andric if (index >= GetNumValues()) 74*5ffd83dbSDimitry Andric return nullptr; 75*5ffd83dbSDimitry Andric return ConstString(std::next(m_opaque_up->begin(), index)->second) 76*5ffd83dbSDimitry Andric .AsCString(""); 77*5ffd83dbSDimitry Andric } 78*5ffd83dbSDimitry Andric 79*5ffd83dbSDimitry Andric bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) { 80*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(bool, SBEnvironment, Set, 81*5ffd83dbSDimitry Andric (const char *, const char *, bool), name, value, 82*5ffd83dbSDimitry Andric overwrite); 83*5ffd83dbSDimitry Andric 84*5ffd83dbSDimitry Andric if (overwrite) { 85*5ffd83dbSDimitry Andric m_opaque_up->insert_or_assign(name, std::string(value)); 86*5ffd83dbSDimitry Andric return true; 87*5ffd83dbSDimitry Andric } 88*5ffd83dbSDimitry Andric return m_opaque_up->try_emplace(name, std::string(value)).second; 89*5ffd83dbSDimitry Andric } 90*5ffd83dbSDimitry Andric 91*5ffd83dbSDimitry Andric bool SBEnvironment::Unset(const char *name) { 92*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(bool, SBEnvironment, Unset, (const char *), name); 93*5ffd83dbSDimitry Andric 94*5ffd83dbSDimitry Andric return m_opaque_up->erase(name); 95*5ffd83dbSDimitry Andric } 96*5ffd83dbSDimitry Andric 97*5ffd83dbSDimitry Andric SBStringList SBEnvironment::GetEntries() { 98*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(lldb::SBStringList, SBEnvironment, GetEntries); 99*5ffd83dbSDimitry Andric 100*5ffd83dbSDimitry Andric SBStringList entries; 101*5ffd83dbSDimitry Andric for (const auto &KV : *m_opaque_up) { 102*5ffd83dbSDimitry Andric entries.AppendString(Environment::compose(KV).c_str()); 103*5ffd83dbSDimitry Andric } 104*5ffd83dbSDimitry Andric return LLDB_RECORD_RESULT(entries); 105*5ffd83dbSDimitry Andric } 106*5ffd83dbSDimitry Andric 107*5ffd83dbSDimitry Andric void SBEnvironment::PutEntry(const char *name_and_value) { 108*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(void, SBEnvironment, PutEntry, (const char *), 109*5ffd83dbSDimitry Andric name_and_value); 110*5ffd83dbSDimitry Andric 111*5ffd83dbSDimitry Andric auto split = llvm::StringRef(name_and_value).split('='); 112*5ffd83dbSDimitry Andric m_opaque_up->insert_or_assign(split.first.str(), split.second.str()); 113*5ffd83dbSDimitry Andric } 114*5ffd83dbSDimitry Andric 115*5ffd83dbSDimitry Andric void SBEnvironment::SetEntries(const SBStringList &entries, bool append) { 116*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD(void, SBEnvironment, SetEntries, 117*5ffd83dbSDimitry Andric (const lldb::SBStringList &, bool), entries, append); 118*5ffd83dbSDimitry Andric 119*5ffd83dbSDimitry Andric if (!append) 120*5ffd83dbSDimitry Andric m_opaque_up->clear(); 121*5ffd83dbSDimitry Andric for (size_t i = 0; i < entries.GetSize(); i++) { 122*5ffd83dbSDimitry Andric PutEntry(entries.GetStringAtIndex(i)); 123*5ffd83dbSDimitry Andric } 124*5ffd83dbSDimitry Andric } 125*5ffd83dbSDimitry Andric 126*5ffd83dbSDimitry Andric void SBEnvironment::Clear() { 127*5ffd83dbSDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(void, SBEnvironment, Clear); 128*5ffd83dbSDimitry Andric 129*5ffd83dbSDimitry Andric m_opaque_up->clear(); 130*5ffd83dbSDimitry Andric } 131*5ffd83dbSDimitry Andric 132*5ffd83dbSDimitry Andric Environment &SBEnvironment::ref() const { return *m_opaque_up; } 133*5ffd83dbSDimitry Andric 134*5ffd83dbSDimitry Andric namespace lldb_private { 135*5ffd83dbSDimitry Andric namespace repro { 136*5ffd83dbSDimitry Andric template <> void RegisterMethods<SBEnvironment>(Registry &R) { 137*5ffd83dbSDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBEnvironment, ()); 138*5ffd83dbSDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBEnvironment, (const lldb::SBEnvironment &)); 139*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(const lldb::SBEnvironment &, 140*5ffd83dbSDimitry Andric SBEnvironment, operator=,(const lldb::SBEnvironment &)); 141*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(size_t, SBEnvironment, GetNumValues, ()); 142*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(const char *, SBEnvironment, Get, (const char *)); 143*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(const char *, SBEnvironment, GetNameAtIndex, (size_t)); 144*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(const char *, SBEnvironment, GetValueAtIndex, (size_t)); 145*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(bool, SBEnvironment, Set, 146*5ffd83dbSDimitry Andric (const char *, const char *, bool)); 147*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(bool, SBEnvironment, Unset, (const char *)); 148*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(lldb::SBStringList, SBEnvironment, GetEntries, ()); 149*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(void, SBEnvironment, PutEntry, (const char *)); 150*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(void, SBEnvironment, SetEntries, 151*5ffd83dbSDimitry Andric (const lldb::SBStringList &, bool)); 152*5ffd83dbSDimitry Andric LLDB_REGISTER_METHOD(void, SBEnvironment, Clear, ()); 153*5ffd83dbSDimitry Andric } 154*5ffd83dbSDimitry Andric } // namespace repro 155*5ffd83dbSDimitry Andric } // namespace lldb_private 156