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