1ca69be21SWalter Erquinigo //===-- SBEnvironment.cpp -------------------------------------------------===//
2ca69be21SWalter Erquinigo //
3ca69be21SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ca69be21SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information.
5ca69be21SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ca69be21SWalter Erquinigo //
7ca69be21SWalter Erquinigo //===----------------------------------------------------------------------===//
8ca69be21SWalter Erquinigo 
9ca69be21SWalter Erquinigo #include "lldb/API/SBEnvironment.h"
10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h"
11ca69be21SWalter Erquinigo #include "Utils.h"
12ca69be21SWalter Erquinigo #include "lldb/API/SBStringList.h"
13ca69be21SWalter Erquinigo #include "lldb/Utility/ConstString.h"
14ca69be21SWalter Erquinigo #include "lldb/Utility/Environment.h"
15ca69be21SWalter Erquinigo 
16ca69be21SWalter Erquinigo using namespace lldb;
17ca69be21SWalter Erquinigo using namespace lldb_private;
18ca69be21SWalter Erquinigo 
19690993a0SJonas Devlieghere SBEnvironment::SBEnvironment() : m_opaque_up(new Environment()) {
20690993a0SJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBEnvironment);
21690993a0SJonas Devlieghere }
22ca69be21SWalter Erquinigo 
23ca69be21SWalter Erquinigo SBEnvironment::SBEnvironment(const SBEnvironment &rhs)
24690993a0SJonas Devlieghere     : m_opaque_up(clone(rhs.m_opaque_up)) {
25690993a0SJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBEnvironment, (const lldb::SBEnvironment &), rhs);
26690993a0SJonas Devlieghere }
27ca69be21SWalter Erquinigo 
28ca69be21SWalter Erquinigo SBEnvironment::SBEnvironment(Environment rhs)
29ca69be21SWalter Erquinigo     : m_opaque_up(new Environment(std::move(rhs))) {}
30ca69be21SWalter Erquinigo 
31ca69be21SWalter Erquinigo SBEnvironment::~SBEnvironment() = default;
32ca69be21SWalter Erquinigo 
33ca69be21SWalter Erquinigo const SBEnvironment &SBEnvironment::operator=(const SBEnvironment &rhs) {
34690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBEnvironment &,
35690993a0SJonas Devlieghere                      SBEnvironment, operator=,(const lldb::SBEnvironment &),
36690993a0SJonas Devlieghere                      rhs);
37690993a0SJonas Devlieghere 
38ca69be21SWalter Erquinigo   if (this != &rhs)
39ca69be21SWalter Erquinigo     m_opaque_up = clone(rhs.m_opaque_up);
40*d232abc3SJonas Devlieghere   return *this;
41ca69be21SWalter Erquinigo }
42ca69be21SWalter Erquinigo 
43ca69be21SWalter Erquinigo size_t SBEnvironment::GetNumValues() {
44690993a0SJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBEnvironment, GetNumValues);
45690993a0SJonas Devlieghere 
46ca69be21SWalter Erquinigo   return m_opaque_up->size();
47ca69be21SWalter Erquinigo }
48ca69be21SWalter Erquinigo 
49ca69be21SWalter Erquinigo const char *SBEnvironment::Get(const char *name) {
50690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(const char *, SBEnvironment, Get, (const char *), name);
51690993a0SJonas Devlieghere 
52ca69be21SWalter Erquinigo   auto entry = m_opaque_up->find(name);
53ca69be21SWalter Erquinigo   if (entry == m_opaque_up->end()) {
54ca69be21SWalter Erquinigo     return nullptr;
55ca69be21SWalter Erquinigo   }
56ca69be21SWalter Erquinigo   return ConstString(entry->second).AsCString("");
57ca69be21SWalter Erquinigo }
58ca69be21SWalter Erquinigo 
59ca69be21SWalter Erquinigo const char *SBEnvironment::GetNameAtIndex(size_t index) {
60690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(const char *, SBEnvironment, GetNameAtIndex, (size_t),
61690993a0SJonas Devlieghere                      index);
62690993a0SJonas Devlieghere 
63ca69be21SWalter Erquinigo   if (index >= GetNumValues())
64ca69be21SWalter Erquinigo     return nullptr;
65ca69be21SWalter Erquinigo   return ConstString(std::next(m_opaque_up->begin(), index)->first())
66ca69be21SWalter Erquinigo       .AsCString("");
67ca69be21SWalter Erquinigo }
68ca69be21SWalter Erquinigo 
69ca69be21SWalter Erquinigo const char *SBEnvironment::GetValueAtIndex(size_t index) {
70690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(const char *, SBEnvironment, GetValueAtIndex, (size_t),
71690993a0SJonas Devlieghere                      index);
72690993a0SJonas Devlieghere 
73ca69be21SWalter Erquinigo   if (index >= GetNumValues())
74ca69be21SWalter Erquinigo     return nullptr;
75ca69be21SWalter Erquinigo   return ConstString(std::next(m_opaque_up->begin(), index)->second)
76ca69be21SWalter Erquinigo       .AsCString("");
77ca69be21SWalter Erquinigo }
78ca69be21SWalter Erquinigo 
79ca69be21SWalter Erquinigo bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) {
80690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEnvironment, Set,
81690993a0SJonas Devlieghere                      (const char *, const char *, bool), name, value,
82690993a0SJonas Devlieghere                      overwrite);
83690993a0SJonas Devlieghere 
84ca69be21SWalter Erquinigo   if (overwrite) {
85ca69be21SWalter Erquinigo     m_opaque_up->insert_or_assign(name, std::string(value));
86ca69be21SWalter Erquinigo     return true;
87ca69be21SWalter Erquinigo   }
88ca69be21SWalter Erquinigo   return m_opaque_up->try_emplace(name, std::string(value)).second;
89ca69be21SWalter Erquinigo }
90ca69be21SWalter Erquinigo 
91ca69be21SWalter Erquinigo bool SBEnvironment::Unset(const char *name) {
92690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBEnvironment, Unset, (const char *), name);
93690993a0SJonas Devlieghere 
94ca69be21SWalter Erquinigo   return m_opaque_up->erase(name);
95ca69be21SWalter Erquinigo }
96ca69be21SWalter Erquinigo 
97ca69be21SWalter Erquinigo SBStringList SBEnvironment::GetEntries() {
98690993a0SJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBStringList, SBEnvironment, GetEntries);
99690993a0SJonas Devlieghere 
100ca69be21SWalter Erquinigo   SBStringList entries;
101ca69be21SWalter Erquinigo   for (const auto &KV : *m_opaque_up) {
102ca69be21SWalter Erquinigo     entries.AppendString(Environment::compose(KV).c_str());
103ca69be21SWalter Erquinigo   }
104*d232abc3SJonas Devlieghere   return entries;
105ca69be21SWalter Erquinigo }
106ca69be21SWalter Erquinigo 
107ca69be21SWalter Erquinigo void SBEnvironment::PutEntry(const char *name_and_value) {
108690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(void, SBEnvironment, PutEntry, (const char *),
109690993a0SJonas Devlieghere                      name_and_value);
110690993a0SJonas Devlieghere 
111ca69be21SWalter Erquinigo   auto split = llvm::StringRef(name_and_value).split('=');
112ca69be21SWalter Erquinigo   m_opaque_up->insert_or_assign(split.first.str(), split.second.str());
113ca69be21SWalter Erquinigo }
114ca69be21SWalter Erquinigo 
115ca69be21SWalter Erquinigo void SBEnvironment::SetEntries(const SBStringList &entries, bool append) {
116690993a0SJonas Devlieghere   LLDB_RECORD_METHOD(void, SBEnvironment, SetEntries,
117690993a0SJonas Devlieghere                      (const lldb::SBStringList &, bool), entries, append);
118690993a0SJonas Devlieghere 
119ca69be21SWalter Erquinigo   if (!append)
120ca69be21SWalter Erquinigo     m_opaque_up->clear();
121ca69be21SWalter Erquinigo   for (size_t i = 0; i < entries.GetSize(); i++) {
122ca69be21SWalter Erquinigo     PutEntry(entries.GetStringAtIndex(i));
123ca69be21SWalter Erquinigo   }
124ca69be21SWalter Erquinigo }
125ca69be21SWalter Erquinigo 
126ca69be21SWalter Erquinigo void SBEnvironment::Clear() {
127690993a0SJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBEnvironment, Clear);
128690993a0SJonas Devlieghere 
129ca69be21SWalter Erquinigo   m_opaque_up->clear();
130ca69be21SWalter Erquinigo }
131ca69be21SWalter Erquinigo 
132ca69be21SWalter Erquinigo Environment &SBEnvironment::ref() const { return *m_opaque_up; }
133