// -*- c++ -*- // Distributed under the BSD 2-Clause License. // See accompanying file LICENSE for details. #include "pointerlist.h" #include PointerList::PointerList(int argc, const char* const argv[]) { for(int i = 0; i < argc; ++i) { push_back(argv[i]); } } std::pair PointerList::get() { argptrs.clear(); for(const auto& arg : *this) { argptrs.push_back(arg.data()); } argptrs.push_back(nullptr); return {argptrs.size() - 1, // size not counting the nullptr at the end argptrs.data()}; } EnvMap::EnvMap(const char* const env[]) { if(env == nullptr) { return; } auto ptr = env; while(*ptr) { insert(std::string_view(*ptr)); ++ptr; } } EnvMap::EnvMap(const char* env) { if(env == nullptr) { return; } auto ptr = env; while(*ptr) { insert(ptr); ptr += strlen(ptr) + 1; } } std::string EnvMap::operator[](const std::string& key) const { try { return data.at(key); } catch(...) { return {}; } } void EnvMap::clear() { data.clear(); } void EnvMap::insert(std::string_view key_value) { auto equals_sign = key_value.find('='); if(equals_sign == std::string::npos) { insert({key_value, ""}); return; } std::string key{key_value.substr(0, equals_sign)}; std::string value{key_value.substr(equals_sign + 1)}; // skip '=' insert({key, value}); } void EnvMap::insert(const std::pair& item) { data[std::string(item.first)] = item.second; } bool EnvMap::contains(std::string_view key) const { return data.contains(std::string{key}); } std::size_t EnvMap::size() const { return data.size(); } std::string EnvMap::stringify() const { std::string str; for(const auto& [key, value] : data) { str += key + "=" + value + '\0'; } str += '\0'; return str; } std::pair EnvMap::get() { pointerlist.clear(); for(const auto& [key, value] : data) { pointerlist.push_back(key + "=" + value + '\0'); } return pointerlist.get(); }