11inline auto make_env(
char** environ, di::TreeMap<di::TransparentString, di::TransparentString>
const& extra_vars)
12 -> di::Tuple<di::TreeSet<di::Box<di::TransparentString>>, di::Vector<char*>> {
13 auto result = di::Vector<char*> {};
14 for (
auto* env_var = environ; *env_var; env_var++) {
15 auto zstring = di::ZString(*env_var);
16 auto it = di::find(zstring,
'=');
17 if (it == zstring.end()) {
20 auto key = di::TransparentStringView(*env_var, &*it);
21 if (extra_vars.contains(key)) {
24 result.push_back(*env_var);
26 auto storage = di::TreeSet<di::Box<di::TransparentString>> {};
27 for (
auto const& [key, value] : extra_vars) {
28 auto string = di::clone(key);
29 string.push_back(
'=');
31 auto [it, _] = storage.insert(di::make_box<di::TransparentString>(di::move(
string)));
32 result.push_back(
const_cast<char*
>((*it)->c_str()));
34 result.push_back(
nullptr);
35 return { di::move(storage), di::move(result) };