//===----------------------------------------------------------------------===//
//
// 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 <__config>
#include <__locale_dir/locale.h>
#include <algorithm>
#include <atomic>
#include <ios>
#include <limits>
#include <memory>
#include <new>
#include <stdlib.h>
#include <string>

#include "include/config_elast.h"

_LIBCPP_PUSH_MACROS
#include <__undef_macros>

_LIBCPP_BEGIN_NAMESPACE_STD
_LIBCPP_BEGIN_EXPLICIT_ABI_ANNOTATIONS

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

const char* __iostream_category::name() const noexcept { return "iostream"; }

string __iostream_category::message(int ev) const {
  if (ev != static_cast<int>(io_errc::stream)
#ifdef _LIBCPP_ELAST
      && ev <= _LIBCPP_ELAST
#endif // _LIBCPP_ELAST
  )
    return __do_message::message(ev);
  return string("unspecified iostream_category error");
}

const error_category& iostream_category() noexcept {
  union AvoidDestroyingIostreamCategory {
    __iostream_category iostream_error_category;
    constexpr explicit AvoidDestroyingIostreamCategory() : iostream_error_category() {}
    ~AvoidDestroyingIostreamCategory() {}
  };
  // Use no-destroy since this removes the function local static guard variable.
  _LIBCPP_NO_DESTROY constinit static AvoidDestroyingIostreamCategory helper;
  return helper.iostream_error_category;
}

// ios_base::failure

ios_base::failure::failure(const string& msg, const error_code& ec) : system_error(ec, msg) {}

ios_base::failure::failure(const char* msg, const error_code& ec) : system_error(ec, msg) {}

ios_base::failure::~failure() throw() {}

// ios_base locale

const ios_base::fmtflags ios_base::boolalpha;
const ios_base::fmtflags ios_base::dec;
const ios_base::fmtflags ios_base::fixed;
const ios_base::fmtflags ios_base::hex;
const ios_base::fmtflags ios_base::internal;
const ios_base::fmtflags ios_base::left;
const ios_base::fmtflags ios_base::oct;
const ios_base::fmtflags ios_base::right;
const ios_base::fmtflags ios_base::scientific;
const ios_base::fmtflags ios_base::showbase;
const ios_base::fmtflags ios_base::showpoint;
const ios_base::fmtflags ios_base::showpos;
const ios_base::fmtflags ios_base::skipws;
const ios_base::fmtflags ios_base::unitbuf;
const ios_base::fmtflags ios_base::uppercase;
const ios_base::fmtflags ios_base::adjustfield;
const ios_base::fmtflags ios_base::basefield;
const ios_base::fmtflags ios_base::floatfield;

const ios_base::iostate ios_base::badbit;
const ios_base::iostate ios_base::eofbit;
const ios_base::iostate ios_base::failbit;
const ios_base::iostate ios_base::goodbit;

const ios_base::openmode ios_base::app;
const ios_base::openmode ios_base::ate;
const ios_base::openmode ios_base::binary;
const ios_base::openmode ios_base::in;
const ios_base::openmode ios_base::out;
const ios_base::openmode ios_base::trunc;

void ios_base::__call_callbacks(event ev) {
  for (size_t i = __event_size_; i;) {
    --i;
    __fn_[i](ev, *this, __index_[i]);
  }
}

// locale

locale ios_base::imbue(const locale& newloc) {
  locale loc = newloc;
  std::swap(__loc_, loc);
  __call_callbacks(imbue_event);
  return loc;
}

locale ios_base::getloc() const { return __loc_; }

template <typename _Tp>
static size_t __ios_new_cap(size_t __req_size, size_t __current_cap) { // Precondition: __req_size > __current_cap
  const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp);
  if (__req_size < mx / 2)
    return std::max(2 * __current_cap, __req_size);
  else
    return mx;
}

int ios_base::xalloc() {
#if _LIBCPP_HAS_THREADS
  constinit static atomic<int> xindex = 0;
#else
  // If we don't have atomics, fall back to single-threaded implementation.
  // FIXME: Should "single-threaded" be a separate option from
  // _LIBCPP_HAS_THREADS?
  static int xindex = 0;
#endif // _LIBCPP_HAS_THREADS
  return xindex++;
}

long& ios_base::iword(int index) {
  size_t req_size = static_cast<size_t>(index) + 1;
  if (req_size > __iarray_cap_) {
    size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_);
    long* iarray  = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long)));
    if (iarray == 0) {
      setstate(badbit);
      static long error;
      error = 0;
      return error;
    }
    __iarray_ = iarray;
    for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p)
      *p = 0;
    __iarray_cap_ = newcap;
  }
  __iarray_size_ = max<size_t>(__iarray_size_, req_size);
  return __iarray_[index];
}

void*& ios_base::pword(int index) {
  size_t req_size = static_cast<size_t>(index) + 1;
  if (req_size > __parray_cap_) {
    size_t newcap = __ios_new_cap<void*>(req_size, __iarray_cap_);
    void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void*)));
    if (parray == 0) {
      setstate(badbit);
      static void* error;
      error = 0;
      return error;
    }
    __parray_ = parray;
    for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p)
      *p = 0;
    __parray_cap_ = newcap;
  }
  __parray_size_ = max<size_t>(__parray_size_, req_size);
  return __parray_[index];
}

// register_callback

void ios_base::register_callback(event_callback fn, int index) {
  size_t req_size = __event_size_ + 1;
  if (req_size > __event_cap_) {
    size_t newcap       = __ios_new_cap<event_callback>(req_size, __event_cap_);
    event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback)));
    if (fns == 0) {
      setstate(badbit);
      return;
    }
    __fn_      = fns;
    int* indxs = static_cast<int*>(realloc(__index_, newcap * sizeof(int)));
    if (indxs == 0) {
      setstate(badbit);
      return;
    }
    __index_     = indxs;
    __event_cap_ = newcap;
  }
  __fn_[__event_size_]    = fn;
  __index_[__event_size_] = index;
  ++__event_size_;
}

ios_base::~ios_base() {
  // Avoid UB when not properly initialized. See ios_base::ios_base for
  // more information.
  if (!__loc_.__locale_)
    return;
  __call_callbacks(erase_event);
  __loc_.~locale();
  free(__fn_);
  free(__index_);
  free(__iarray_);
  free(__parray_);
}

// iostate

void ios_base::clear(iostate state) {
  if (__rdbuf_)
    __rdstate_ = state;
  else
    __rdstate_ = state | badbit;

  if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0)
    std::__throw_failure("ios_base::clear");
}

// init

void ios_base::init(void* sb) {
  __rdbuf_       = sb;
  __rdstate_     = __rdbuf_ ? goodbit : badbit;
  __exceptions_  = goodbit;
  __fmtflags_    = skipws | dec;
  __width_       = 0;
  __precision_   = 6;
  __fn_          = 0;
  __index_       = 0;
  __event_size_  = 0;
  __event_cap_   = 0;
  __iarray_      = 0;
  __iarray_size_ = 0;
  __iarray_cap_  = 0;
  __parray_      = 0;
  __parray_size_ = 0;
  __parray_cap_  = 0;
  ::new (&__loc_) locale;
}

void ios_base::copyfmt(const ios_base& rhs) {
  // If we can't acquire the needed resources, throw bad_alloc (can't set badbit)
  // Don't alter *this until all needed resources are acquired
  unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free);
  unique_ptr<int, void (*)(void*)> new_ints(0, free);
  unique_ptr<long, void (*)(void*)> new_longs(0, free);
  unique_ptr<void*, void (*)(void*)> new_pointers(0, free);
  if (__event_cap_ < rhs.__event_size_) {
    size_t newesize = sizeof(event_callback) * rhs.__event_size_;
    new_callbacks.reset(static_cast<event_callback*>(malloc(newesize)));
    if (!new_callbacks)
      std::__throw_bad_alloc();

    size_t newisize = sizeof(int) * rhs.__event_size_;
    new_ints.reset(static_cast<int*>(malloc(newisize)));
    if (!new_ints)
      std::__throw_bad_alloc();
  }
  if (__iarray_cap_ < rhs.__iarray_size_) {
    size_t newsize = sizeof(long) * rhs.__iarray_size_;
    new_longs.reset(static_cast<long*>(malloc(newsize)));
    if (!new_longs)
      std::__throw_bad_alloc();
  }
  if (__parray_cap_ < rhs.__parray_size_) {
    size_t newsize = sizeof(void*) * rhs.__parray_size_;
    new_pointers.reset(static_cast<void**>(malloc(newsize)));
    if (!new_pointers)
      std::__throw_bad_alloc();
  }
  // Got everything we need.  Copy everything but __rdstate_, __rdbuf_ and __exceptions_
  __fmtflags_  = rhs.__fmtflags_;
  __precision_ = rhs.__precision_;
  __width_     = rhs.__width_;
  __loc_       = rhs.__loc_;
  if (__event_cap_ < rhs.__event_size_) {
    free(__fn_);
    __fn_ = new_callbacks.release();
    free(__index_);
    __index_     = new_ints.release();
    __event_cap_ = rhs.__event_size_;
  }
  for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_) {
    __fn_[__event_size_]    = rhs.__fn_[__event_size_];
    __index_[__event_size_] = rhs.__index_[__event_size_];
  }
  if (__iarray_cap_ < rhs.__iarray_size_) {
    free(__iarray_);
    __iarray_     = new_longs.release();
    __iarray_cap_ = rhs.__iarray_size_;
  }
  for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_)
    __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_];
  if (__parray_cap_ < rhs.__parray_size_) {
    free(__parray_);
    __parray_     = new_pointers.release();
    __parray_cap_ = rhs.__parray_size_;
  }
  for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_)
    __parray_[__parray_size_] = rhs.__parray_[__parray_size_];
}

void ios_base::move(ios_base& rhs) {
  // *this is uninitialized
  __fmtflags_   = rhs.__fmtflags_;
  __precision_  = rhs.__precision_;
  __width_      = rhs.__width_;
  __rdstate_    = rhs.__rdstate_;
  __exceptions_ = rhs.__exceptions_;
  __rdbuf_      = 0;
  ::new (&__loc_) locale(rhs.__loc_);
  __fn_              = rhs.__fn_;
  rhs.__fn_          = 0;
  __index_           = rhs.__index_;
  rhs.__index_       = 0;
  __event_size_      = rhs.__event_size_;
  rhs.__event_size_  = 0;
  __event_cap_       = rhs.__event_cap_;
  rhs.__event_cap_   = 0;
  __iarray_          = rhs.__iarray_;
  rhs.__iarray_      = 0;
  __iarray_size_     = rhs.__iarray_size_;
  rhs.__iarray_size_ = 0;
  __iarray_cap_      = rhs.__iarray_cap_;
  rhs.__iarray_cap_  = 0;
  __parray_          = rhs.__parray_;
  rhs.__parray_      = 0;
  __parray_size_     = rhs.__parray_size_;
  rhs.__parray_size_ = 0;
  __parray_cap_      = rhs.__parray_cap_;
  rhs.__parray_cap_  = 0;
}

void ios_base::swap(ios_base& rhs) noexcept {
  std::swap(__fmtflags_, rhs.__fmtflags_);
  std::swap(__precision_, rhs.__precision_);
  std::swap(__width_, rhs.__width_);
  std::swap(__rdstate_, rhs.__rdstate_);
  std::swap(__exceptions_, rhs.__exceptions_);
  std::swap(__loc_, rhs.__loc_);
  std::swap(__fn_, rhs.__fn_);
  std::swap(__index_, rhs.__index_);
  std::swap(__event_size_, rhs.__event_size_);
  std::swap(__event_cap_, rhs.__event_cap_);
  std::swap(__iarray_, rhs.__iarray_);
  std::swap(__iarray_size_, rhs.__iarray_size_);
  std::swap(__iarray_cap_, rhs.__iarray_cap_);
  std::swap(__parray_, rhs.__parray_);
  std::swap(__parray_size_, rhs.__parray_size_);
  std::swap(__parray_cap_, rhs.__parray_cap_);
}

void ios_base::__set_badbit_and_consider_rethrow() {
  __rdstate_ |= badbit;
#if _LIBCPP_HAS_EXCEPTIONS
  if (__exceptions_ & badbit)
    throw;
#endif // _LIBCPP_HAS_EXCEPTIONS
}

void ios_base::__set_failbit_and_consider_rethrow() {
  __rdstate_ |= failbit;
#if _LIBCPP_HAS_EXCEPTIONS
  if (__exceptions_ & failbit)
    throw;
#endif // _LIBCPP_HAS_EXCEPTIONS
}

_LIBCPP_END_EXPLICIT_ABI_ANNOTATIONS
_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS
