//===----------------------------------------------------------------------===//
//
// 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 <__assert>
#include <__config>
#include <__optional/optional.h>
#include <__system_error/throw_system_error.h>
#include <__verbose_abort>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <string>
#include <system_error>

#include "include/config_elast.h"

#ifdef _WIN32
#  include <windows.h>
#  include <winerror.h>
#endif

_LIBCPP_BEGIN_NAMESPACE_STD
_LIBCPP_BEGIN_EXPLICIT_ABI_ANNOTATIONS

#ifdef _WIN32

namespace {
std::optional<errc> __win_err_to_errc(int err) {
  switch (err) {
  case ERROR_ACCESS_DENIED:
    return errc::permission_denied;
  case ERROR_ALREADY_EXISTS:
    return errc::file_exists;
  case ERROR_BAD_NETPATH:
    return errc::no_such_file_or_directory;
  case ERROR_BAD_PATHNAME:
    return errc::no_such_file_or_directory;
  case ERROR_BAD_UNIT:
    return errc::no_such_device;
  case ERROR_BROKEN_PIPE:
    return errc::broken_pipe;
  case ERROR_BUFFER_OVERFLOW:
    return errc::filename_too_long;
  case ERROR_BUSY:
    return errc::device_or_resource_busy;
  case ERROR_BUSY_DRIVE:
    return errc::device_or_resource_busy;
  case ERROR_CANNOT_MAKE:
    return errc::permission_denied;
  case ERROR_CANTOPEN:
    return errc::io_error;
  case ERROR_CANTREAD:
    return errc::io_error;
  case ERROR_CANTWRITE:
    return errc::io_error;
  case ERROR_CURRENT_DIRECTORY:
    return errc::permission_denied;
  case ERROR_DEV_NOT_EXIST:
    return errc::no_such_device;
  case ERROR_DEVICE_IN_USE:
    return errc::device_or_resource_busy;
  case ERROR_DIR_NOT_EMPTY:
    return errc::directory_not_empty;
  case ERROR_DIRECTORY:
    return errc::invalid_argument;
  case ERROR_DISK_FULL:
    return errc::no_space_on_device;
  case ERROR_FILE_EXISTS:
    return errc::file_exists;
  case ERROR_FILE_NOT_FOUND:
    return errc::no_such_file_or_directory;
  case ERROR_HANDLE_DISK_FULL:
    return errc::no_space_on_device;
  case ERROR_INVALID_ACCESS:
    return errc::permission_denied;
  case ERROR_INVALID_DRIVE:
    return errc::no_such_device;
  case ERROR_INVALID_FUNCTION:
    return errc::function_not_supported;
  case ERROR_INVALID_HANDLE:
    return errc::invalid_argument;
  case ERROR_INVALID_NAME:
    return errc::no_such_file_or_directory;
  case ERROR_INVALID_PARAMETER:
    return errc::invalid_argument;
  case ERROR_LOCK_VIOLATION:
    return errc::no_lock_available;
  case ERROR_LOCKED:
    return errc::no_lock_available;
  case ERROR_NEGATIVE_SEEK:
    return errc::invalid_argument;
  case ERROR_NETNAME_DELETED:
    return errc::no_such_file_or_directory;
  case ERROR_NOACCESS:
    return errc::permission_denied;
  case ERROR_NOT_ENOUGH_MEMORY:
    return errc::not_enough_memory;
  case ERROR_NOT_READY:
    return errc::resource_unavailable_try_again;
  case ERROR_NOT_SAME_DEVICE:
    return errc::cross_device_link;
  case ERROR_NOT_SUPPORTED:
    return errc::not_supported;
  case ERROR_OPEN_FAILED:
    return errc::io_error;
  case ERROR_OPEN_FILES:
    return errc::device_or_resource_busy;
  case ERROR_OPERATION_ABORTED:
    return errc::operation_canceled;
  case ERROR_OUTOFMEMORY:
    return errc::not_enough_memory;
  case ERROR_PATH_NOT_FOUND:
    return errc::no_such_file_or_directory;
  case ERROR_READ_FAULT:
    return errc::io_error;
  case ERROR_REPARSE_TAG_INVALID:
    return errc::invalid_argument;
  case ERROR_RETRY:
    return errc::resource_unavailable_try_again;
  case ERROR_SEEK:
    return errc::io_error;
  case ERROR_SHARING_VIOLATION:
    return errc::permission_denied;
  case ERROR_TOO_MANY_OPEN_FILES:
    return errc::too_many_files_open;
  case ERROR_WRITE_FAULT:
    return errc::io_error;
  case ERROR_WRITE_PROTECT:
    return errc::permission_denied;
  default:
    return {};
  }
}
} // namespace
#endif

namespace {
#if _LIBCPP_HAS_THREADS

//  GLIBC also uses 1024 as the maximum buffer size internally.
constexpr size_t strerror_buff_size = 1024;

string do_strerror_r(int ev);

#  ifdef _WIN32
string do_strerror_r(int ev) {
  char buffer[strerror_buff_size];
  if (::strerror_s(buffer, strerror_buff_size, ev) == 0)
    return string(buffer);
  std::snprintf(buffer, strerror_buff_size, "unknown error %d", ev);
  return string(buffer);
}
#  else

// Only one of the two following functions will be used, depending on
// the return type of strerror_r:

// For the GNU variant, a char* return value:
__attribute__((unused)) const char* handle_strerror_r_return(char* strerror_return, char* buffer) {
  // GNU always returns a string pointer in its return value. The
  // string might point to either the input buffer, or a static
  // buffer, but we don't care which.
  return strerror_return;
}

// For the POSIX variant: an int return value.
__attribute__((unused)) const char* handle_strerror_r_return(int strerror_return, char* buffer) {
  // The POSIX variant either:
  // - fills in the provided buffer and returns 0
  // - returns a positive error value, or
  // - returns -1 and fills in errno with an error value.
  if (strerror_return == 0)
    return buffer;

  // Only handle EINVAL. Other errors abort.
  int new_errno = strerror_return == -1 ? errno : strerror_return;
  if (new_errno == EINVAL)
    return "";

  _LIBCPP_ASSERT_INTERNAL(new_errno == ERANGE, "unexpected error from ::strerror_r");
  // FIXME maybe? 'strerror_buff_size' is likely to exceed the
  // maximum error size so ERANGE shouldn't be returned.
  std::abort();
}

// This function handles both GNU and POSIX variants, dispatching to
// one of the two above functions.
string do_strerror_r(int ev) {
  char buffer[strerror_buff_size];
  // Preserve errno around the call. (The C++ standard requires that
  // system_error functions not modify errno).
  const int old_errno       = errno;
  const char* error_message = handle_strerror_r_return(::strerror_r(ev, buffer, strerror_buff_size), buffer);
  // If we didn't get any message, print one now.
  if (!error_message[0]) {
    std::snprintf(buffer, strerror_buff_size, "Unknown error %d", ev);
    error_message = buffer;
  }
  errno = old_errno;
  return string(error_message);
}
#  endif

#endif // _LIBCPP_HAS_THREADS

string make_error_str(const error_code& ec, string what_arg) {
  if (ec) {
    if (!what_arg.empty()) {
      what_arg += ": ";
    }
    what_arg += ec.message();
  }
  return what_arg;
}

string make_error_str(const error_code& ec) {
  if (ec) {
    return ec.message();
  }
  return string();
}
} // namespace

string __do_message::message(int ev) const {
#if !_LIBCPP_HAS_THREADS
  return string(::strerror(ev));
#else
  return do_strerror_r(ev);
#endif
}

class _LIBCPP_HIDDEN __generic_error_category : public __do_message {
public:
  virtual const char* name() const noexcept;
  virtual string message(int ev) const;
};

const char* __generic_error_category::name() const noexcept { return "generic"; }

string __generic_error_category::message(int ev) const {
#ifdef _LIBCPP_ELAST
  if (ev > _LIBCPP_ELAST)
    return string("unspecified generic_category error");
#endif // _LIBCPP_ELAST
  return __do_message::message(ev);
}

const error_category& generic_category() noexcept {
  union AvoidDestroyingGenericCategory {
    __generic_error_category generic_error_category;
    constexpr explicit AvoidDestroyingGenericCategory() : generic_error_category() {}
    ~AvoidDestroyingGenericCategory() {}
  };
  constinit static AvoidDestroyingGenericCategory helper;
  return helper.generic_error_category;
}

class _LIBCPP_HIDDEN __system_error_category : public __do_message {
public:
  virtual const char* name() const noexcept;
  virtual string message(int ev) const;
  virtual error_condition default_error_condition(int ev) const noexcept;
};

const char* __system_error_category::name() const noexcept { return "system"; }

string __system_error_category::message(int ev) const {
#ifdef _WIN32
  std::string result;
  char* str               = nullptr;
  unsigned long num_chars = ::FormatMessageA(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
      nullptr,
      ev,
      0,
      reinterpret_cast<char*>(&str),
      0,
      nullptr);
  auto is_whitespace = [](char ch) { return ch == '\n' || ch == '\r' || ch == ' '; };
  while (num_chars > 0 && is_whitespace(str[num_chars - 1]))
    --num_chars;

  if (num_chars)
    result = std::string(str, num_chars);
  else
    result = "Unknown error";

  LocalFree(str);
  return result;
#else
#  ifdef _LIBCPP_ELAST
  if (ev > _LIBCPP_ELAST)
    return string("unspecified system_category error");
#  endif // _LIBCPP_ELAST
  return __do_message::message(ev);
#endif
}

error_condition __system_error_category::default_error_condition(int ev) const noexcept {
#ifdef _WIN32
  // Remap windows error codes to generic error codes if possible.
  if (ev == 0)
    return error_condition(0, generic_category());
  if (auto maybe_errc = __win_err_to_errc(ev))
    return error_condition(static_cast<int>(*maybe_errc), generic_category());
  return error_condition(ev, system_category());
#else
#  ifdef _LIBCPP_ELAST
  if (ev > _LIBCPP_ELAST)
    return error_condition(ev, system_category());
#  endif // _LIBCPP_ELAST
  return error_condition(ev, generic_category());
#endif
}

const error_category& system_category() noexcept {
  union AvoidDestroyingSystemCategory {
    __system_error_category system_error_category;
    constexpr explicit AvoidDestroyingSystemCategory() : system_error_category() {}
    ~AvoidDestroyingSystemCategory() {}
  };
  constinit static AvoidDestroyingSystemCategory helper;
  return helper.system_error_category;
}

// error_condition

string error_condition::message() const { return __cat_->message(__val_); }

// error_code

string error_code::message() const { return __cat_->message(__val_); }

// system_error

system_error::system_error(error_code ec, const string& what_arg)
    : runtime_error(make_error_str(ec, what_arg)), __ec_(ec) {}

system_error::system_error(error_code ec, const char* what_arg)
    : runtime_error(make_error_str(ec, what_arg)), __ec_(ec) {}

system_error::system_error(error_code ec) : runtime_error(make_error_str(ec)), __ec_(ec) {}

system_error::system_error(int ev, const error_category& ecat, const string& what_arg)
    : runtime_error(make_error_str(error_code(ev, ecat), what_arg)), __ec_(error_code(ev, ecat)) {}

system_error::system_error(int ev, const error_category& ecat, const char* what_arg)
    : runtime_error(make_error_str(error_code(ev, ecat), what_arg)), __ec_(error_code(ev, ecat)) {}

system_error::system_error(int ev, const error_category& ecat)
    : runtime_error(make_error_str(error_code(ev, ecat))), __ec_(error_code(ev, ecat)) {}

system_error::~system_error() noexcept {}

void __throw_system_error(int ev, const char* what_arg) {
#if _LIBCPP_HAS_EXCEPTIONS
  std::__throw_system_error(error_code(ev, generic_category()), what_arg);
#else
  // The above could also handle the no-exception case, but for size, avoid referencing system_category() unnecessarily.
  _LIBCPP_VERBOSE_ABORT(
      "system_error was thrown in -fno-exceptions mode with error %i and message \"%s\"", ev, what_arg);
#endif
}

_LIBCPP_END_EXPLICIT_ABI_ANNOTATIONS
_LIBCPP_END_NAMESPACE_STD
