xref: /src/contrib/llvm-project/lldb/source/API/SBEnvironment.cpp (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
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