dius 0.1.0
Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1#pragma once
2
3#include <di/vocab/pointer/box.h>
4
5#include "di/container/string/string.h"
6#include "di/container/string/zstring.h"
7#include "di/container/tree/tree_map.h"
8#include "di/container/tree/tree_set.h"
9
10namespace dius::posix {
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()) {
18 continue;
19 }
20 auto key = di::TransparentStringView(*env_var, &*it);
21 if (extra_vars.contains(key)) {
22 continue;
23 }
24 result.push_back(*env_var);
25 }
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('=');
30 string += value;
31 auto [it, _] = storage.insert(di::make_box<di::TransparentString>(di::move(string)));
32 result.push_back(const_cast<char*>((*it)->c_str()));
33 }
34 result.push_back(nullptr);
35 return { di::move(storage), di::move(result) };
36}
37
38auto get_env() -> char**;
39}
Definition utils.h:10
auto make_env(char **environ, di::TreeMap< di::TransparentString, di::TransparentString > const &extra_vars) -> di::Tuple< di::TreeSet< di::Box< di::TransparentString > >, di::Vector< char * > >
Definition utils.h:11
auto get_env() -> char **