1 | //===-- Environment.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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "lldb/Utility/Environment.h" |
10 | |
11 | using namespace lldb_private; |
12 | |
13 | char *Environment::Envp::make_entry(llvm::StringRef Key, |
14 | llvm::StringRef Value) { |
15 | const size_t size = Key.size() + 1 /*=*/ + Value.size() + 1 /*\0*/; |
16 | char *Result = static_cast<char *>( |
17 | Allocator.Allocate(Size: sizeof(char) * size, Alignment: alignof(char))); |
18 | char *Next = Result; |
19 | |
20 | Next = std::copy(first: Key.begin(), last: Key.end(), result: Next); |
21 | *Next++ = '='; |
22 | Next = std::copy(first: Value.begin(), last: Value.end(), result: Next); |
23 | *Next++ = '\0'; |
24 | |
25 | return Result; |
26 | } |
27 | |
28 | Environment::Envp::Envp(const Environment &Env) { |
29 | Data = static_cast<char **>( |
30 | Allocator.Allocate(Size: sizeof(char *) * (Env.size() + 1), Alignment: alignof(char *))); |
31 | char **Next = Data; |
32 | for (const auto &KV : Env) |
33 | *Next++ = make_entry(Key: KV.first(), Value: KV.second); |
34 | *Next++ = nullptr; |
35 | } |
36 | |
37 | Environment::Environment(const char *const *Env) { |
38 | if (!Env) |
39 | return; |
40 | while (*Env) |
41 | insert(KeyEqValue: *Env++); |
42 | } |
43 | |
44 | void Environment::insert(iterator first, iterator last) { |
45 | while (first != last) { |
46 | try_emplace(Key: first->first(), Args&: first->second); |
47 | ++first; |
48 | } |
49 | } |
50 | |