15ffd83dbSDimitry Andric //===-- SBEnvironment.cpp -------------------------------------------------===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric
95ffd83dbSDimitry Andric #include "lldb/API/SBEnvironment.h"
105ffd83dbSDimitry Andric #include "Utils.h"
115ffd83dbSDimitry Andric #include "lldb/API/SBStringList.h"
125ffd83dbSDimitry Andric #include "lldb/Utility/ConstString.h"
135ffd83dbSDimitry Andric #include "lldb/Utility/Environment.h"
14*04eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
155ffd83dbSDimitry Andric
165ffd83dbSDimitry Andric using namespace lldb;
175ffd83dbSDimitry Andric using namespace lldb_private;
185ffd83dbSDimitry Andric
SBEnvironment()195ffd83dbSDimitry Andric SBEnvironment::SBEnvironment() : m_opaque_up(new Environment()) {
20*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
215ffd83dbSDimitry Andric }
225ffd83dbSDimitry Andric
SBEnvironment(const SBEnvironment & rhs)235ffd83dbSDimitry Andric SBEnvironment::SBEnvironment(const SBEnvironment &rhs)
245ffd83dbSDimitry Andric : m_opaque_up(clone(rhs.m_opaque_up)) {
25*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
265ffd83dbSDimitry Andric }
275ffd83dbSDimitry Andric
SBEnvironment(Environment rhs)285ffd83dbSDimitry Andric SBEnvironment::SBEnvironment(Environment rhs)
295ffd83dbSDimitry Andric : m_opaque_up(new Environment(std::move(rhs))) {}
305ffd83dbSDimitry Andric
315ffd83dbSDimitry Andric SBEnvironment::~SBEnvironment() = default;
325ffd83dbSDimitry Andric
operator =(const SBEnvironment & rhs)335ffd83dbSDimitry Andric const SBEnvironment &SBEnvironment::operator=(const SBEnvironment &rhs) {
34*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
355ffd83dbSDimitry Andric
365ffd83dbSDimitry Andric if (this != &rhs)
375ffd83dbSDimitry Andric m_opaque_up = clone(rhs.m_opaque_up);
38*04eeddc0SDimitry Andric return *this;
395ffd83dbSDimitry Andric }
405ffd83dbSDimitry Andric
GetNumValues()415ffd83dbSDimitry Andric size_t SBEnvironment::GetNumValues() {
42*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
435ffd83dbSDimitry Andric
445ffd83dbSDimitry Andric return m_opaque_up->size();
455ffd83dbSDimitry Andric }
465ffd83dbSDimitry Andric
Get(const char * name)475ffd83dbSDimitry Andric const char *SBEnvironment::Get(const char *name) {
48*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name);
495ffd83dbSDimitry Andric
505ffd83dbSDimitry Andric auto entry = m_opaque_up->find(name);
515ffd83dbSDimitry Andric if (entry == m_opaque_up->end()) {
525ffd83dbSDimitry Andric return nullptr;
535ffd83dbSDimitry Andric }
545ffd83dbSDimitry Andric return ConstString(entry->second).AsCString("");
555ffd83dbSDimitry Andric }
565ffd83dbSDimitry Andric
GetNameAtIndex(size_t index)575ffd83dbSDimitry Andric const char *SBEnvironment::GetNameAtIndex(size_t index) {
58*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, index);
595ffd83dbSDimitry Andric
605ffd83dbSDimitry Andric if (index >= GetNumValues())
615ffd83dbSDimitry Andric return nullptr;
625ffd83dbSDimitry Andric return ConstString(std::next(m_opaque_up->begin(), index)->first())
635ffd83dbSDimitry Andric .AsCString("");
645ffd83dbSDimitry Andric }
655ffd83dbSDimitry Andric
GetValueAtIndex(size_t index)665ffd83dbSDimitry Andric const char *SBEnvironment::GetValueAtIndex(size_t index) {
67*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, index);
685ffd83dbSDimitry Andric
695ffd83dbSDimitry Andric if (index >= GetNumValues())
705ffd83dbSDimitry Andric return nullptr;
715ffd83dbSDimitry Andric return ConstString(std::next(m_opaque_up->begin(), index)->second)
725ffd83dbSDimitry Andric .AsCString("");
735ffd83dbSDimitry Andric }
745ffd83dbSDimitry Andric
Set(const char * name,const char * value,bool overwrite)755ffd83dbSDimitry Andric bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) {
76*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, value, overwrite);
775ffd83dbSDimitry Andric
785ffd83dbSDimitry Andric if (overwrite) {
795ffd83dbSDimitry Andric m_opaque_up->insert_or_assign(name, std::string(value));
805ffd83dbSDimitry Andric return true;
815ffd83dbSDimitry Andric }
825ffd83dbSDimitry Andric return m_opaque_up->try_emplace(name, std::string(value)).second;
835ffd83dbSDimitry Andric }
845ffd83dbSDimitry Andric
Unset(const char * name)855ffd83dbSDimitry Andric bool SBEnvironment::Unset(const char *name) {
86*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name);
875ffd83dbSDimitry Andric
885ffd83dbSDimitry Andric return m_opaque_up->erase(name);
895ffd83dbSDimitry Andric }
905ffd83dbSDimitry Andric
GetEntries()915ffd83dbSDimitry Andric SBStringList SBEnvironment::GetEntries() {
92*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
935ffd83dbSDimitry Andric
945ffd83dbSDimitry Andric SBStringList entries;
955ffd83dbSDimitry Andric for (const auto &KV : *m_opaque_up) {
965ffd83dbSDimitry Andric entries.AppendString(Environment::compose(KV).c_str());
975ffd83dbSDimitry Andric }
98*04eeddc0SDimitry Andric return entries;
995ffd83dbSDimitry Andric }
1005ffd83dbSDimitry Andric
PutEntry(const char * name_and_value)1015ffd83dbSDimitry Andric void SBEnvironment::PutEntry(const char *name_and_value) {
102*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name_and_value);
1035ffd83dbSDimitry Andric
1045ffd83dbSDimitry Andric auto split = llvm::StringRef(name_and_value).split('=');
1055ffd83dbSDimitry Andric m_opaque_up->insert_or_assign(split.first.str(), split.second.str());
1065ffd83dbSDimitry Andric }
1075ffd83dbSDimitry Andric
SetEntries(const SBStringList & entries,bool append)1085ffd83dbSDimitry Andric void SBEnvironment::SetEntries(const SBStringList &entries, bool append) {
109*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, entries, append);
1105ffd83dbSDimitry Andric
1115ffd83dbSDimitry Andric if (!append)
1125ffd83dbSDimitry Andric m_opaque_up->clear();
1135ffd83dbSDimitry Andric for (size_t i = 0; i < entries.GetSize(); i++) {
1145ffd83dbSDimitry Andric PutEntry(entries.GetStringAtIndex(i));
1155ffd83dbSDimitry Andric }
1165ffd83dbSDimitry Andric }
1175ffd83dbSDimitry Andric
Clear()1185ffd83dbSDimitry Andric void SBEnvironment::Clear() {
119*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1205ffd83dbSDimitry Andric
1215ffd83dbSDimitry Andric m_opaque_up->clear();
1225ffd83dbSDimitry Andric }
1235ffd83dbSDimitry Andric
ref() const1245ffd83dbSDimitry Andric Environment &SBEnvironment::ref() const { return *m_opaque_up; }
125