//===-- Environment.cpp ---------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/Utility/Environment.h"

using namespace lldb_private;

char *Environment::Envp::make_entry(llvm::StringRef Key,
                                    llvm::StringRef Value) {
  const size_t size = Key.size() + 1 /*=*/ + Value.size() + 1 /*\0*/;
  char *Result = static_cast<char *>(
      Allocator.Allocate(sizeof(char) * size, alignof(char)));
  char *Next = Result;

  Next = std::copy(Key.begin(), Key.end(), Next);
  *Next++ = '=';
  Next = std::copy(Value.begin(), Value.end(), Next);
  *Next++ = '\0';

  return Result;
}

Environment::Envp::Envp(const Environment &Env) {
  Data = static_cast<char **>(
      Allocator.Allocate(sizeof(char *) * (Env.size() + 1), alignof(char *)));
  char **Next = Data;
  for (const auto &KV : Env)
    *Next++ = make_entry(KV.first(), KV.second);
  *Next++ = nullptr;
}

Environment::Environment(const char *const *Env) {
  if (!Env)
    return;
  while (*Env)
    insert(*Env++);
}

void Environment::insert(const_iterator first, const_iterator last) {
  while (first != last) {
    try_emplace(first->first(), first->second);
    ++first;
  }
}
