1cfca06d7SDimitry Andric //===-- SBEnvironment.cpp -------------------------------------------------===//
2cfca06d7SDimitry Andric //
3cfca06d7SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cfca06d7SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5cfca06d7SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cfca06d7SDimitry Andric //
7cfca06d7SDimitry Andric //===----------------------------------------------------------------------===//
8cfca06d7SDimitry Andric
9cfca06d7SDimitry Andric #include "lldb/API/SBEnvironment.h"
10cfca06d7SDimitry Andric #include "Utils.h"
11cfca06d7SDimitry Andric #include "lldb/API/SBStringList.h"
12cfca06d7SDimitry Andric #include "lldb/Utility/ConstString.h"
13cfca06d7SDimitry Andric #include "lldb/Utility/Environment.h"
146f8fc217SDimitry Andric #include "lldb/Utility/Instrumentation.h"
15cfca06d7SDimitry Andric
16cfca06d7SDimitry Andric using namespace lldb;
17cfca06d7SDimitry Andric using namespace lldb_private;
18cfca06d7SDimitry Andric
SBEnvironment()19cfca06d7SDimitry Andric SBEnvironment::SBEnvironment() : m_opaque_up(new Environment()) {
206f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
21cfca06d7SDimitry Andric }
22cfca06d7SDimitry Andric
SBEnvironment(const SBEnvironment & rhs)23cfca06d7SDimitry Andric SBEnvironment::SBEnvironment(const SBEnvironment &rhs)
24cfca06d7SDimitry Andric : m_opaque_up(clone(rhs.m_opaque_up)) {
256f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
26cfca06d7SDimitry Andric }
27cfca06d7SDimitry Andric
SBEnvironment(Environment rhs)28cfca06d7SDimitry Andric SBEnvironment::SBEnvironment(Environment rhs)
29cfca06d7SDimitry Andric : m_opaque_up(new Environment(std::move(rhs))) {}
30cfca06d7SDimitry Andric
31cfca06d7SDimitry Andric SBEnvironment::~SBEnvironment() = default;
32cfca06d7SDimitry Andric
operator =(const SBEnvironment & rhs)33cfca06d7SDimitry Andric const SBEnvironment &SBEnvironment::operator=(const SBEnvironment &rhs) {
346f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
35cfca06d7SDimitry Andric
36cfca06d7SDimitry Andric if (this != &rhs)
37cfca06d7SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up);
386f8fc217SDimitry Andric return *this;
39cfca06d7SDimitry Andric }
40cfca06d7SDimitry Andric
GetNumValues()41cfca06d7SDimitry Andric size_t SBEnvironment::GetNumValues() {
426f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
43cfca06d7SDimitry Andric
44cfca06d7SDimitry Andric return m_opaque_up->size();
45cfca06d7SDimitry Andric }
46cfca06d7SDimitry Andric
Get(const char * name)47cfca06d7SDimitry Andric const char *SBEnvironment::Get(const char *name) {
486f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, name);
49cfca06d7SDimitry Andric
50cfca06d7SDimitry Andric auto entry = m_opaque_up->find(name);
51cfca06d7SDimitry Andric if (entry == m_opaque_up->end()) {
52cfca06d7SDimitry Andric return nullptr;
53cfca06d7SDimitry Andric }
54cfca06d7SDimitry Andric return ConstString(entry->second).AsCString("");
55cfca06d7SDimitry Andric }
56cfca06d7SDimitry Andric
GetNameAtIndex(size_t index)57cfca06d7SDimitry Andric const char *SBEnvironment::GetNameAtIndex(size_t index) {
586f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, index);
59cfca06d7SDimitry Andric
60cfca06d7SDimitry Andric if (index >= GetNumValues())
61cfca06d7SDimitry Andric return nullptr;
62cfca06d7SDimitry Andric return ConstString(std::next(m_opaque_up->begin(), index)->first())
63cfca06d7SDimitry Andric .AsCString("");
64cfca06d7SDimitry Andric }
65cfca06d7SDimitry Andric
GetValueAtIndex(size_t index)66cfca06d7SDimitry Andric const char *SBEnvironment::GetValueAtIndex(size_t index) {
676f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, index);
68cfca06d7SDimitry Andric
69cfca06d7SDimitry Andric if (index >= GetNumValues())
70cfca06d7SDimitry Andric return nullptr;
71cfca06d7SDimitry Andric return ConstString(std::next(m_opaque_up->begin(), index)->second)
72cfca06d7SDimitry Andric .AsCString("");
73cfca06d7SDimitry Andric }
74cfca06d7SDimitry Andric
Set(const char * name,const char * value,bool overwrite)75cfca06d7SDimitry Andric bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) {
766f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, name, value, overwrite);
77cfca06d7SDimitry Andric
78cfca06d7SDimitry Andric if (overwrite) {
79cfca06d7SDimitry Andric m_opaque_up->insert_or_assign(name, std::string(value));
80cfca06d7SDimitry Andric return true;
81cfca06d7SDimitry Andric }
82cfca06d7SDimitry Andric return m_opaque_up->try_emplace(name, std::string(value)).second;
83cfca06d7SDimitry Andric }
84cfca06d7SDimitry Andric
Unset(const char * name)85cfca06d7SDimitry Andric bool SBEnvironment::Unset(const char *name) {
866f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, name);
87cfca06d7SDimitry Andric
88cfca06d7SDimitry Andric return m_opaque_up->erase(name);
89cfca06d7SDimitry Andric }
90cfca06d7SDimitry Andric
GetEntries()91cfca06d7SDimitry Andric SBStringList SBEnvironment::GetEntries() {
926f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
93cfca06d7SDimitry Andric
94cfca06d7SDimitry Andric SBStringList entries;
95cfca06d7SDimitry Andric for (const auto &KV : *m_opaque_up) {
96cfca06d7SDimitry Andric entries.AppendString(Environment::compose(KV).c_str());
97cfca06d7SDimitry Andric }
986f8fc217SDimitry Andric return entries;
99cfca06d7SDimitry Andric }
100cfca06d7SDimitry Andric
PutEntry(const char * name_and_value)101cfca06d7SDimitry Andric void SBEnvironment::PutEntry(const char *name_and_value) {
1026f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, name_and_value);
103cfca06d7SDimitry Andric
104cfca06d7SDimitry Andric auto split = llvm::StringRef(name_and_value).split('=');
105cfca06d7SDimitry Andric m_opaque_up->insert_or_assign(split.first.str(), split.second.str());
106cfca06d7SDimitry Andric }
107cfca06d7SDimitry Andric
SetEntries(const SBStringList & entries,bool append)108cfca06d7SDimitry Andric void SBEnvironment::SetEntries(const SBStringList &entries, bool append) {
1096f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this, entries, append);
110cfca06d7SDimitry Andric
111cfca06d7SDimitry Andric if (!append)
112cfca06d7SDimitry Andric m_opaque_up->clear();
113cfca06d7SDimitry Andric for (size_t i = 0; i < entries.GetSize(); i++) {
114cfca06d7SDimitry Andric PutEntry(entries.GetStringAtIndex(i));
115cfca06d7SDimitry Andric }
116cfca06d7SDimitry Andric }
117cfca06d7SDimitry Andric
Clear()118cfca06d7SDimitry Andric void SBEnvironment::Clear() {
1196f8fc217SDimitry Andric LLDB_INSTRUMENT_VA(this);
120cfca06d7SDimitry Andric
121cfca06d7SDimitry Andric m_opaque_up->clear();
122cfca06d7SDimitry Andric }
123cfca06d7SDimitry Andric
ref() const124cfca06d7SDimitry Andric Environment &SBEnvironment::ref() const { return *m_opaque_up; }
125