git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/include/fmt/os.h

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// Formatting library for C++ - optional OS-specific functionality
f8deb5b9 Poul Sander 2022-01-15 13:55 2
//
f8deb5b9 Poul Sander 2022-01-15 13:55 3
// Copyright (c) 2012 - present, Victor Zverovich
f8deb5b9 Poul Sander 2022-01-15 13:55 4
// All rights reserved.
f8deb5b9 Poul Sander 2022-01-15 13:55 5
//
f8deb5b9 Poul Sander 2022-01-15 13:55 6
// For the license information refer to format.h.
f8deb5b9 Poul Sander 2022-01-15 13:55 7
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#ifndef FMT_OS_H_
f8deb5b9 Poul Sander 2022-01-15 13:55 9
#define FMT_OS_H_
f8deb5b9 Poul Sander 2022-01-15 13:55 10
f8deb5b9 Poul Sander 2022-01-15 13:55 11
#include <cerrno>
f8deb5b9 Poul Sander 2022-01-15 13:55 12
#include <clocale>  // locale_t
f8deb5b9 Poul Sander 2022-01-15 13:55 13
#include <cstddef>
f8deb5b9 Poul Sander 2022-01-15 13:55 14
#include <cstdio>
f8deb5b9 Poul Sander 2022-01-15 13:55 15
#include <cstdlib>       // strtod_l
f8deb5b9 Poul Sander 2022-01-15 13:55 16
#include <system_error>  // std::system_error
f8deb5b9 Poul Sander 2022-01-15 13:55 17
f8deb5b9 Poul Sander 2022-01-15 13:55 18
#if defined __APPLE__ || defined(__FreeBSD__)
f8deb5b9 Poul Sander 2022-01-15 13:55 19
#  include <xlocale.h>  // for LC_NUMERIC_MASK on OS X
f8deb5b9 Poul Sander 2022-01-15 13:55 20
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 21
f8deb5b9 Poul Sander 2022-01-15 13:55 22
#include "format.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 23
f8deb5b9 Poul Sander 2022-01-15 13:55 24
#ifndef FMT_USE_FCNTL
f8deb5b9 Poul Sander 2022-01-15 13:55 25
// UWP doesn't provide _pipe.
f8deb5b9 Poul Sander 2022-01-15 13:55 26
#  if FMT_HAS_INCLUDE("winapifamily.h")
f8deb5b9 Poul Sander 2022-01-15 13:55 27
#    include <winapifamily.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 28
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 29
#  if (FMT_HAS_INCLUDE(<fcntl.h>) || defined(__APPLE__) || \
f8deb5b9 Poul Sander 2022-01-15 13:55 30
       defined(__linux__)) &&                              \
f8deb5b9 Poul Sander 2022-01-15 13:55 31
      (!defined(WINAPI_FAMILY) ||                          \
f8deb5b9 Poul Sander 2022-01-15 13:55 32
       (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP))
f8deb5b9 Poul Sander 2022-01-15 13:55 33
#    include <fcntl.h>  // for O_RDONLY
f8deb5b9 Poul Sander 2022-01-15 13:55 34
#    define FMT_USE_FCNTL 1
f8deb5b9 Poul Sander 2022-01-15 13:55 35
#  else
f8deb5b9 Poul Sander 2022-01-15 13:55 36
#    define FMT_USE_FCNTL 0
f8deb5b9 Poul Sander 2022-01-15 13:55 37
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 38
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 39
f8deb5b9 Poul Sander 2022-01-15 13:55 40
#ifndef FMT_POSIX
f8deb5b9 Poul Sander 2022-01-15 13:55 41
#  if defined(_WIN32) && !defined(__MINGW32__)
f8deb5b9 Poul Sander 2022-01-15 13:55 42
// Fix warnings about deprecated symbols.
f8deb5b9 Poul Sander 2022-01-15 13:55 43
#    define FMT_POSIX(call) _##call
f8deb5b9 Poul Sander 2022-01-15 13:55 44
#  else
f8deb5b9 Poul Sander 2022-01-15 13:55 45
#    define FMT_POSIX(call) call
f8deb5b9 Poul Sander 2022-01-15 13:55 46
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 47
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 48
f8deb5b9 Poul Sander 2022-01-15 13:55 49
// Calls to system functions are wrapped in FMT_SYSTEM for testability.
f8deb5b9 Poul Sander 2022-01-15 13:55 50
#ifdef FMT_SYSTEM
f8deb5b9 Poul Sander 2022-01-15 13:55 51
#  define FMT_POSIX_CALL(call) FMT_SYSTEM(call)
f8deb5b9 Poul Sander 2022-01-15 13:55 52
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 53
#  define FMT_SYSTEM(call) ::call
f8deb5b9 Poul Sander 2022-01-15 13:55 54
#  ifdef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 55
// Fix warnings about deprecated symbols.
f8deb5b9 Poul Sander 2022-01-15 13:55 56
#    define FMT_POSIX_CALL(call) ::_##call
f8deb5b9 Poul Sander 2022-01-15 13:55 57
#  else
f8deb5b9 Poul Sander 2022-01-15 13:55 58
#    define FMT_POSIX_CALL(call) ::call
f8deb5b9 Poul Sander 2022-01-15 13:55 59
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 60
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 61
f8deb5b9 Poul Sander 2022-01-15 13:55 62
// Retries the expression while it evaluates to error_result and errno
f8deb5b9 Poul Sander 2022-01-15 13:55 63
// equals to EINTR.
f8deb5b9 Poul Sander 2022-01-15 13:55 64
#ifndef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 65
#  define FMT_RETRY_VAL(result, expression, error_result) \
f8deb5b9 Poul Sander 2022-01-15 13:55 66
    do {                                                  \
f8deb5b9 Poul Sander 2022-01-15 13:55 67
      (result) = (expression);                            \
f8deb5b9 Poul Sander 2022-01-15 13:55 68
    } while ((result) == (error_result) && errno == EINTR)
f8deb5b9 Poul Sander 2022-01-15 13:55 69
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 70
#  define FMT_RETRY_VAL(result, expression, error_result) result = (expression)
f8deb5b9 Poul Sander 2022-01-15 13:55 71
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 72
f8deb5b9 Poul Sander 2022-01-15 13:55 73
#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
f8deb5b9 Poul Sander 2022-01-15 13:55 74
f8deb5b9 Poul Sander 2022-01-15 13:55 75
FMT_BEGIN_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 76
FMT_MODULE_EXPORT_BEGIN
f8deb5b9 Poul Sander 2022-01-15 13:55 77
f8deb5b9 Poul Sander 2022-01-15 13:55 78
/**
f8deb5b9 Poul Sander 2022-01-15 13:55 79
  \rst
f8deb5b9 Poul Sander 2022-01-15 13:55 80
  A reference to a null-terminated string. It can be constructed from a C
f8deb5b9 Poul Sander 2022-01-15 13:55 81
  string or ``std::string``.
f8deb5b9 Poul Sander 2022-01-15 13:55 82
f8deb5b9 Poul Sander 2022-01-15 13:55 83
  You can use one of the following type aliases for common character types:
f8deb5b9 Poul Sander 2022-01-15 13:55 84
f8deb5b9 Poul Sander 2022-01-15 13:55 85
  +---------------+-----------------------------+
f8deb5b9 Poul Sander 2022-01-15 13:55 86
  | Type          | Definition                  |
f8deb5b9 Poul Sander 2022-01-15 13:55 87
  +===============+=============================+
f8deb5b9 Poul Sander 2022-01-15 13:55 88
  | cstring_view  | basic_cstring_view<char>    |
f8deb5b9 Poul Sander 2022-01-15 13:55 89
  +---------------+-----------------------------+
f8deb5b9 Poul Sander 2022-01-15 13:55 90
  | wcstring_view | basic_cstring_view<wchar_t> |
f8deb5b9 Poul Sander 2022-01-15 13:55 91
  +---------------+-----------------------------+
f8deb5b9 Poul Sander 2022-01-15 13:55 92
f8deb5b9 Poul Sander 2022-01-15 13:55 93
  This class is most useful as a parameter type to allow passing
f8deb5b9 Poul Sander 2022-01-15 13:55 94
  different types of strings to a function, for example::
f8deb5b9 Poul Sander 2022-01-15 13:55 95
f8deb5b9 Poul Sander 2022-01-15 13:55 96
    template <typename... Args>
f8deb5b9 Poul Sander 2022-01-15 13:55 97
    std::string format(cstring_view format_str, const Args & ... args);
f8deb5b9 Poul Sander 2022-01-15 13:55 98
f8deb5b9 Poul Sander 2022-01-15 13:55 99
    format("{}", 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 100
    format(std::string("{}"), 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 101
  \endrst
f8deb5b9 Poul Sander 2022-01-15 13:55 102
 */
f8deb5b9 Poul Sander 2022-01-15 13:55 103
template <typename Char> class basic_cstring_view {
f8deb5b9 Poul Sander 2022-01-15 13:55 104
 private:
f8deb5b9 Poul Sander 2022-01-15 13:55 105
  const Char* data_;
f8deb5b9 Poul Sander 2022-01-15 13:55 106
f8deb5b9 Poul Sander 2022-01-15 13:55 107
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 108
  /** Constructs a string reference object from a C string. */
f8deb5b9 Poul Sander 2022-01-15 13:55 109
  basic_cstring_view(const Char* s) : data_(s) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 110
f8deb5b9 Poul Sander 2022-01-15 13:55 111
  /**
f8deb5b9 Poul Sander 2022-01-15 13:55 112
    \rst
f8deb5b9 Poul Sander 2022-01-15 13:55 113
    Constructs a string reference from an ``std::string`` object.
f8deb5b9 Poul Sander 2022-01-15 13:55 114
    \endrst
f8deb5b9 Poul Sander 2022-01-15 13:55 115
   */
f8deb5b9 Poul Sander 2022-01-15 13:55 116
  basic_cstring_view(const std::basic_string<Char>& s) : data_(s.c_str()) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 117
f8deb5b9 Poul Sander 2022-01-15 13:55 118
  /** Returns the pointer to a C string. */
f8deb5b9 Poul Sander 2022-01-15 13:55 119
  const Char* c_str() const { return data_; }
f8deb5b9 Poul Sander 2022-01-15 13:55 120
};
f8deb5b9 Poul Sander 2022-01-15 13:55 121
f8deb5b9 Poul Sander 2022-01-15 13:55 122
using cstring_view = basic_cstring_view<char>;
f8deb5b9 Poul Sander 2022-01-15 13:55 123
using wcstring_view = basic_cstring_view<wchar_t>;
f8deb5b9 Poul Sander 2022-01-15 13:55 124
f8deb5b9 Poul Sander 2022-01-15 13:55 125
template <typename Char> struct formatter<std::error_code, Char> {
f8deb5b9 Poul Sander 2022-01-15 13:55 126
  template <typename ParseContext>
f8deb5b9 Poul Sander 2022-01-15 13:55 127
  FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 128
    return ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 129
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 130
f8deb5b9 Poul Sander 2022-01-15 13:55 131
  template <typename FormatContext>
f8deb5b9 Poul Sander 2022-01-15 13:55 132
  FMT_CONSTEXPR auto format(const std::error_code& ec, FormatContext& ctx) const
f8deb5b9 Poul Sander 2022-01-15 13:55 133
      -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 134
    auto out = ctx.out();
f8deb5b9 Poul Sander 2022-01-15 13:55 135
    out = detail::write_bytes(out, ec.category().name(),
f8deb5b9 Poul Sander 2022-01-15 13:55 136
                              basic_format_specs<Char>());
f8deb5b9 Poul Sander 2022-01-15 13:55 137
    out = detail::write<Char>(out, Char(':'));
f8deb5b9 Poul Sander 2022-01-15 13:55 138
    out = detail::write<Char>(out, ec.value());
f8deb5b9 Poul Sander 2022-01-15 13:55 139
    return out;
f8deb5b9 Poul Sander 2022-01-15 13:55 140
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 141
};
f8deb5b9 Poul Sander 2022-01-15 13:55 142
f8deb5b9 Poul Sander 2022-01-15 13:55 143
#ifdef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 144
FMT_API const std::error_category& system_category() FMT_NOEXCEPT;
f8deb5b9 Poul Sander 2022-01-15 13:55 145
f8deb5b9 Poul Sander 2022-01-15 13:55 146
FMT_BEGIN_DETAIL_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 147
// A converter from UTF-16 to UTF-8.
f8deb5b9 Poul Sander 2022-01-15 13:55 148
// It is only provided for Windows since other systems support UTF-8 natively.
f8deb5b9 Poul Sander 2022-01-15 13:55 149
class utf16_to_utf8 {
f8deb5b9 Poul Sander 2022-01-15 13:55 150
 private:
f8deb5b9 Poul Sander 2022-01-15 13:55 151
  memory_buffer buffer_;
f8deb5b9 Poul Sander 2022-01-15 13:55 152
f8deb5b9 Poul Sander 2022-01-15 13:55 153
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 154
  utf16_to_utf8() {}
f8deb5b9 Poul Sander 2022-01-15 13:55 155
  FMT_API explicit utf16_to_utf8(basic_string_view<wchar_t> s);
f8deb5b9 Poul Sander 2022-01-15 13:55 156
  operator string_view() const { return string_view(&buffer_[0], size()); }
f8deb5b9 Poul Sander 2022-01-15 13:55 157
  size_t size() const { return buffer_.size() - 1; }
f8deb5b9 Poul Sander 2022-01-15 13:55 158
  const char* c_str() const { return &buffer_[0]; }
f8deb5b9 Poul Sander 2022-01-15 13:55 159
  std::string str() const { return std::string(&buffer_[0], size()); }
f8deb5b9 Poul Sander 2022-01-15 13:55 160
f8deb5b9 Poul Sander 2022-01-15 13:55 161
  // Performs conversion returning a system error code instead of
f8deb5b9 Poul Sander 2022-01-15 13:55 162
  // throwing exception on conversion error. This method may still throw
f8deb5b9 Poul Sander 2022-01-15 13:55 163
  // in case of memory allocation error.
f8deb5b9 Poul Sander 2022-01-15 13:55 164
  FMT_API int convert(basic_string_view<wchar_t> s);
f8deb5b9 Poul Sander 2022-01-15 13:55 165
};
f8deb5b9 Poul Sander 2022-01-15 13:55 166
f8deb5b9 Poul Sander 2022-01-15 13:55 167
FMT_API void format_windows_error(buffer<char>& out, int error_code,
f8deb5b9 Poul Sander 2022-01-15 13:55 168
                                  const char* message) FMT_NOEXCEPT;
f8deb5b9 Poul Sander 2022-01-15 13:55 169
FMT_END_DETAIL_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 170
f8deb5b9 Poul Sander 2022-01-15 13:55 171
FMT_API std::system_error vwindows_error(int error_code, string_view format_str,
f8deb5b9 Poul Sander 2022-01-15 13:55 172
                                         format_args args);
f8deb5b9 Poul Sander 2022-01-15 13:55 173
f8deb5b9 Poul Sander 2022-01-15 13:55 174
/**
f8deb5b9 Poul Sander 2022-01-15 13:55 175
 \rst
f8deb5b9 Poul Sander 2022-01-15 13:55 176
 Constructs a :class:`std::system_error` object with the description
f8deb5b9 Poul Sander 2022-01-15 13:55 177
 of the form
f8deb5b9 Poul Sander 2022-01-15 13:55 178
f8deb5b9 Poul Sander 2022-01-15 13:55 179
 .. parsed-literal::
f8deb5b9 Poul Sander 2022-01-15 13:55 180
   *<message>*: *<system-message>*
f8deb5b9 Poul Sander 2022-01-15 13:55 181
f8deb5b9 Poul Sander 2022-01-15 13:55 182
 where *<message>* is the formatted message and *<system-message>* is the
f8deb5b9 Poul Sander 2022-01-15 13:55 183
 system message corresponding to the error code.
f8deb5b9 Poul Sander 2022-01-15 13:55 184
 *error_code* is a Windows error code as given by ``GetLastError``.
f8deb5b9 Poul Sander 2022-01-15 13:55 185
 If *error_code* is not a valid error code such as -1, the system message
f8deb5b9 Poul Sander 2022-01-15 13:55 186
 will look like "error -1".
f8deb5b9 Poul Sander 2022-01-15 13:55 187
f8deb5b9 Poul Sander 2022-01-15 13:55 188
 **Example**::
f8deb5b9 Poul Sander 2022-01-15 13:55 189
f8deb5b9 Poul Sander 2022-01-15 13:55 190
   // This throws a system_error with the description
f8deb5b9 Poul Sander 2022-01-15 13:55 191
   //   cannot open file 'madeup': The system cannot find the file specified.
f8deb5b9 Poul Sander 2022-01-15 13:55 192
   // or similar (system message may vary).
f8deb5b9 Poul Sander 2022-01-15 13:55 193
   const char *filename = "madeup";
f8deb5b9 Poul Sander 2022-01-15 13:55 194
   LPOFSTRUCT of = LPOFSTRUCT();
f8deb5b9 Poul Sander 2022-01-15 13:55 195
   HFILE file = OpenFile(filename, &of, OF_READ);
f8deb5b9 Poul Sander 2022-01-15 13:55 196
   if (file == HFILE_ERROR) {
f8deb5b9 Poul Sander 2022-01-15 13:55 197
     throw fmt::windows_error(GetLastError(),
f8deb5b9 Poul Sander 2022-01-15 13:55 198
                              "cannot open file '{}'", filename);
f8deb5b9 Poul Sander 2022-01-15 13:55 199
   }
f8deb5b9 Poul Sander 2022-01-15 13:55 200
 \endrst
f8deb5b9 Poul Sander 2022-01-15 13:55 201
*/
f8deb5b9 Poul Sander 2022-01-15 13:55 202
template <typename... Args>
f8deb5b9 Poul Sander 2022-01-15 13:55 203
std::system_error windows_error(int error_code, string_view message,
f8deb5b9 Poul Sander 2022-01-15 13:55 204
                                const Args&... args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 205
  return vwindows_error(error_code, message, fmt::make_format_args(args...));
f8deb5b9 Poul Sander 2022-01-15 13:55 206
}
f8deb5b9 Poul Sander 2022-01-15 13:55 207
f8deb5b9 Poul Sander 2022-01-15 13:55 208
// Reports a Windows error without throwing an exception.
f8deb5b9 Poul Sander 2022-01-15 13:55 209
// Can be used to report errors from destructors.
f8deb5b9 Poul Sander 2022-01-15 13:55 210
FMT_API void report_windows_error(int error_code,
f8deb5b9 Poul Sander 2022-01-15 13:55 211
                                  const char* message) FMT_NOEXCEPT;
f8deb5b9 Poul Sander 2022-01-15 13:55 212
#else
f8deb5b9 Poul Sander 2022-01-15 13:55 213
inline const std::error_category& system_category() FMT_NOEXCEPT {
f8deb5b9 Poul Sander 2022-01-15 13:55 214
  return std::system_category();
f8deb5b9 Poul Sander 2022-01-15 13:55 215
}
f8deb5b9 Poul Sander 2022-01-15 13:55 216
#endif  // _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 217
f8deb5b9 Poul Sander 2022-01-15 13:55 218
// std::system is not available on some platforms such as iOS (#2248).
f8deb5b9 Poul Sander 2022-01-15 13:55 219
#ifdef __OSX__
f8deb5b9 Poul Sander 2022-01-15 13:55 220
template <typename S, typename... Args, typename Char = char_t<S>>
f8deb5b9 Poul Sander 2022-01-15 13:55 221
void say(const S& format_str, Args&&... args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 222
  std::system(format("say \"{}\"", format(format_str, args...)).c_str());
f8deb5b9 Poul Sander 2022-01-15 13:55 223
}
f8deb5b9 Poul Sander 2022-01-15 13:55 224
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 225
f8deb5b9 Poul Sander 2022-01-15 13:55 226
// A buffered file.
f8deb5b9 Poul Sander 2022-01-15 13:55 227
class buffered_file {
f8deb5b9 Poul Sander 2022-01-15 13:55 228
 private:
f8deb5b9 Poul Sander 2022-01-15 13:55 229
  FILE* file_;
f8deb5b9 Poul Sander 2022-01-15 13:55 230
f8deb5b9 Poul Sander 2022-01-15 13:55 231
  friend class file;
f8deb5b9 Poul Sander 2022-01-15 13:55 232
f8deb5b9 Poul Sander 2022-01-15 13:55 233
  explicit buffered_file(FILE* f) : file_(f) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 234
f8deb5b9 Poul Sander 2022-01-15 13:55 235
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 236
  buffered_file(const buffered_file&) = delete;
f8deb5b9 Poul Sander 2022-01-15 13:55 237
  void operator=(const buffered_file&) = delete;
f8deb5b9 Poul Sander 2022-01-15 13:55 238
f8deb5b9 Poul Sander 2022-01-15 13:55 239
  // Constructs a buffered_file object which doesn't represent any file.
f8deb5b9 Poul Sander 2022-01-15 13:55 240
  buffered_file() FMT_NOEXCEPT : file_(nullptr) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 241
f8deb5b9 Poul Sander 2022-01-15 13:55 242
  // Destroys the object closing the file it represents if any.
f8deb5b9 Poul Sander 2022-01-15 13:55 243
  FMT_API ~buffered_file() FMT_NOEXCEPT;
f8deb5b9 Poul Sander 2022-01-15 13:55 244
f8deb5b9 Poul Sander 2022-01-15 13:55 245
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 246
  buffered_file(buffered_file&& other) FMT_NOEXCEPT : file_(other.file_) {
f8deb5b9 Poul Sander 2022-01-15 13:55 247
    other.file_ = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 248
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 249
f8deb5b9 Poul Sander 2022-01-15 13:55 250
  buffered_file& operator=(buffered_file&& other) {
f8deb5b9 Poul Sander 2022-01-15 13:55 251
    close();
f8deb5b9 Poul Sander 2022-01-15 13:55 252
    file_ = other.file_;
f8deb5b9 Poul Sander 2022-01-15 13:55 253
    other.file_ = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 254
    return *this;
f8deb5b9 Poul Sander 2022-01-15 13:55 255
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 256
f8deb5b9 Poul Sander 2022-01-15 13:55 257
  // Opens a file.
f8deb5b9 Poul Sander 2022-01-15 13:55 258
  FMT_API buffered_file(cstring_view filename, cstring_view mode);
f8deb5b9 Poul Sander 2022-01-15 13:55 259
f8deb5b9 Poul Sander 2022-01-15 13:55 260
  // Closes the file.
f8deb5b9 Poul Sander 2022-01-15 13:55 261
  FMT_API void close();
f8deb5b9 Poul Sander 2022-01-15 13:55 262
f8deb5b9 Poul Sander 2022-01-15 13:55 263
  // Returns the pointer to a FILE object representing this file.
f8deb5b9 Poul Sander 2022-01-15 13:55 264
  FILE* get() const FMT_NOEXCEPT { return file_; }
f8deb5b9 Poul Sander 2022-01-15 13:55 265
f8deb5b9 Poul Sander 2022-01-15 13:55 266
  // We place parentheses around fileno to workaround a bug in some versions
f8deb5b9 Poul Sander 2022-01-15 13:55 267
  // of MinGW that define fileno as a macro.
f8deb5b9 Poul Sander 2022-01-15 13:55 268
  FMT_API int(fileno)() const;
f8deb5b9 Poul Sander 2022-01-15 13:55 269
f8deb5b9 Poul Sander 2022-01-15 13:55 270
  void vprint(string_view format_str, format_args args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 271
    fmt::vprint(file_, format_str, args);
f8deb5b9 Poul Sander 2022-01-15 13:55 272
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 273
f8deb5b9 Poul Sander 2022-01-15 13:55 274
  template <typename... Args>
f8deb5b9 Poul Sander 2022-01-15 13:55 275
  inline void print(string_view format_str, const Args&... args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 276
    vprint(format_str, fmt::make_format_args(args...));
f8deb5b9 Poul Sander 2022-01-15 13:55 277
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 278
};
f8deb5b9 Poul Sander 2022-01-15 13:55 279
f8deb5b9 Poul Sander 2022-01-15 13:55 280
#if FMT_USE_FCNTL
f8deb5b9 Poul Sander 2022-01-15 13:55 281
// A file. Closed file is represented by a file object with descriptor -1.
f8deb5b9 Poul Sander 2022-01-15 13:55 282
// Methods that are not declared with FMT_NOEXCEPT may throw
f8deb5b9 Poul Sander 2022-01-15 13:55 283
// fmt::system_error in case of failure. Note that some errors such as
f8deb5b9 Poul Sander 2022-01-15 13:55 284
// closing the file multiple times will cause a crash on Windows rather
f8deb5b9 Poul Sander 2022-01-15 13:55 285
// than an exception. You can get standard behavior by overriding the
f8deb5b9 Poul Sander 2022-01-15 13:55 286
// invalid parameter handler with _set_invalid_parameter_handler.
f8deb5b9 Poul Sander 2022-01-15 13:55 287
class file {
f8deb5b9 Poul Sander 2022-01-15 13:55 288
 private:
f8deb5b9 Poul Sander 2022-01-15 13:55 289
  int fd_;  // File descriptor.
f8deb5b9 Poul Sander 2022-01-15 13:55 290
f8deb5b9 Poul Sander 2022-01-15 13:55 291
  // Constructs a file object with a given descriptor.
f8deb5b9 Poul Sander 2022-01-15 13:55 292
  explicit file(int fd) : fd_(fd) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 293
f8deb5b9 Poul Sander 2022-01-15 13:55 294
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 295
  // Possible values for the oflag argument to the constructor.
f8deb5b9 Poul Sander 2022-01-15 13:55 296
  enum {
f8deb5b9 Poul Sander 2022-01-15 13:55 297
    RDONLY = FMT_POSIX(O_RDONLY),  // Open for reading only.
f8deb5b9 Poul Sander 2022-01-15 13:55 298
    WRONLY = FMT_POSIX(O_WRONLY),  // Open for writing only.
f8deb5b9 Poul Sander 2022-01-15 13:55 299
    RDWR = FMT_POSIX(O_RDWR),      // Open for reading and writing.
f8deb5b9 Poul Sander 2022-01-15 13:55 300
    CREATE = FMT_POSIX(O_CREAT),   // Create if the file doesn't exist.
f8deb5b9 Poul Sander 2022-01-15 13:55 301
    APPEND = FMT_POSIX(O_APPEND),  // Open in append mode.
f8deb5b9 Poul Sander 2022-01-15 13:55 302
    TRUNC = FMT_POSIX(O_TRUNC)     // Truncate the content of the file.
f8deb5b9 Poul Sander 2022-01-15 13:55 303
  };
f8deb5b9 Poul Sander 2022-01-15 13:55 304
f8deb5b9 Poul Sander 2022-01-15 13:55 305
  // Constructs a file object which doesn't represent any file.
f8deb5b9 Poul Sander 2022-01-15 13:55 306
  file() FMT_NOEXCEPT : fd_(-1) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 307
f8deb5b9 Poul Sander 2022-01-15 13:55 308
  // Opens a file and constructs a file object representing this file.
f8deb5b9 Poul Sander 2022-01-15 13:55 309
  FMT_API file(cstring_view path, int oflag);
f8deb5b9 Poul Sander 2022-01-15 13:55 310
f8deb5b9 Poul Sander 2022-01-15 13:55 311
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 312
  file(const file&) = delete;
f8deb5b9 Poul Sander 2022-01-15 13:55 313
  void operator=(const file&) = delete;
f8deb5b9 Poul Sander 2022-01-15 13:55 314
f8deb5b9 Poul Sander 2022-01-15 13:55 315
  file(file&& other) FMT_NOEXCEPT : fd_(other.fd_) { other.fd_ = -1; }
f8deb5b9 Poul Sander 2022-01-15 13:55 316
f8deb5b9 Poul Sander 2022-01-15 13:55 317
  // Move assignment is not noexcept because close may throw.
f8deb5b9 Poul Sander 2022-01-15 13:55 318
  file& operator=(file&& other) {
f8deb5b9 Poul Sander 2022-01-15 13:55 319
    close();
f8deb5b9 Poul Sander 2022-01-15 13:55 320
    fd_ = other.fd_;
f8deb5b9 Poul Sander 2022-01-15 13:55 321
    other.fd_ = -1;
f8deb5b9 Poul Sander 2022-01-15 13:55 322
    return *this;
f8deb5b9 Poul Sander 2022-01-15 13:55 323
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 324
f8deb5b9 Poul Sander 2022-01-15 13:55 325
  // Destroys the object closing the file it represents if any.
f8deb5b9 Poul Sander 2022-01-15 13:55 326
  FMT_API ~file() FMT_NOEXCEPT;
f8deb5b9 Poul Sander 2022-01-15 13:55 327
f8deb5b9 Poul Sander 2022-01-15 13:55 328
  // Returns the file descriptor.
f8deb5b9 Poul Sander 2022-01-15 13:55 329
  int descriptor() const FMT_NOEXCEPT { return fd_; }
f8deb5b9 Poul Sander 2022-01-15 13:55 330
f8deb5b9 Poul Sander 2022-01-15 13:55 331
  // Closes the file.
f8deb5b9 Poul Sander 2022-01-15 13:55 332
  FMT_API void close();
f8deb5b9 Poul Sander 2022-01-15 13:55 333
f8deb5b9 Poul Sander 2022-01-15 13:55 334
  // Returns the file size. The size has signed type for consistency with
f8deb5b9 Poul Sander 2022-01-15 13:55 335
  // stat::st_size.
f8deb5b9 Poul Sander 2022-01-15 13:55 336
  FMT_API long long size() const;
f8deb5b9 Poul Sander 2022-01-15 13:55 337
f8deb5b9 Poul Sander 2022-01-15 13:55 338
  // Attempts to read count bytes from the file into the specified buffer.
f8deb5b9 Poul Sander 2022-01-15 13:55 339
  FMT_API size_t read(void* buffer, size_t count);
f8deb5b9 Poul Sander 2022-01-15 13:55 340
f8deb5b9 Poul Sander 2022-01-15 13:55 341
  // Attempts to write count bytes from the specified buffer to the file.
f8deb5b9 Poul Sander 2022-01-15 13:55 342
  FMT_API size_t write(const void* buffer, size_t count);
f8deb5b9 Poul Sander 2022-01-15 13:55 343
f8deb5b9 Poul Sander 2022-01-15 13:55 344
  // Duplicates a file descriptor with the dup function and returns
f8deb5b9 Poul Sander 2022-01-15 13:55 345
  // the duplicate as a file object.
f8deb5b9 Poul Sander 2022-01-15 13:55 346
  FMT_API static file dup(int fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 347
f8deb5b9 Poul Sander 2022-01-15 13:55 348
  // Makes fd be the copy of this file descriptor, closing fd first if
f8deb5b9 Poul Sander 2022-01-15 13:55 349
  // necessary.
f8deb5b9 Poul Sander 2022-01-15 13:55 350
  FMT_API void dup2(int fd);
f8deb5b9 Poul Sander 2022-01-15 13:55 351
f8deb5b9 Poul Sander 2022-01-15 13:55 352
  // Makes fd be the copy of this file descriptor, closing fd first if
f8deb5b9 Poul Sander 2022-01-15 13:55 353
  // necessary.
f8deb5b9 Poul Sander 2022-01-15 13:55 354
  FMT_API void dup2(int fd, std::error_code& ec) FMT_NOEXCEPT;
f8deb5b9 Poul Sander 2022-01-15 13:55 355
f8deb5b9 Poul Sander 2022-01-15 13:55 356
  // Creates a pipe setting up read_end and write_end file objects for reading
f8deb5b9 Poul Sander 2022-01-15 13:55 357
  // and writing respectively.
f8deb5b9 Poul Sander 2022-01-15 13:55 358
  FMT_API static void pipe(file& read_end, file& write_end);
f8deb5b9 Poul Sander 2022-01-15 13:55 359
f8deb5b9 Poul Sander 2022-01-15 13:55 360
  // Creates a buffered_file object associated with this file and detaches
f8deb5b9 Poul Sander 2022-01-15 13:55 361
  // this file object from the file.
f8deb5b9 Poul Sander 2022-01-15 13:55 362
  FMT_API buffered_file fdopen(const char* mode);
f8deb5b9 Poul Sander 2022-01-15 13:55 363
};
f8deb5b9 Poul Sander 2022-01-15 13:55 364
f8deb5b9 Poul Sander 2022-01-15 13:55 365
// Returns the memory page size.
f8deb5b9 Poul Sander 2022-01-15 13:55 366
long getpagesize();
f8deb5b9 Poul Sander 2022-01-15 13:55 367
f8deb5b9 Poul Sander 2022-01-15 13:55 368
FMT_BEGIN_DETAIL_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 369
f8deb5b9 Poul Sander 2022-01-15 13:55 370
struct buffer_size {
f8deb5b9 Poul Sander 2022-01-15 13:55 371
  buffer_size() = default;
f8deb5b9 Poul Sander 2022-01-15 13:55 372
  size_t value = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 373
  buffer_size operator=(size_t val) const {
f8deb5b9 Poul Sander 2022-01-15 13:55 374
    auto bs = buffer_size();
f8deb5b9 Poul Sander 2022-01-15 13:55 375
    bs.value = val;
f8deb5b9 Poul Sander 2022-01-15 13:55 376
    return bs;
f8deb5b9 Poul Sander 2022-01-15 13:55 377
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 378
};
f8deb5b9 Poul Sander 2022-01-15 13:55 379
f8deb5b9 Poul Sander 2022-01-15 13:55 380
struct ostream_params {
f8deb5b9 Poul Sander 2022-01-15 13:55 381
  int oflag = file::WRONLY | file::CREATE | file::TRUNC;
f8deb5b9 Poul Sander 2022-01-15 13:55 382
  size_t buffer_size = BUFSIZ > 32768 ? BUFSIZ : 32768;
f8deb5b9 Poul Sander 2022-01-15 13:55 383
f8deb5b9 Poul Sander 2022-01-15 13:55 384
  ostream_params() {}
f8deb5b9 Poul Sander 2022-01-15 13:55 385
f8deb5b9 Poul Sander 2022-01-15 13:55 386
  template <typename... T>
f8deb5b9 Poul Sander 2022-01-15 13:55 387
  ostream_params(T... params, int new_oflag) : ostream_params(params...) {
f8deb5b9 Poul Sander 2022-01-15 13:55 388
    oflag = new_oflag;
f8deb5b9 Poul Sander 2022-01-15 13:55 389
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 390
f8deb5b9 Poul Sander 2022-01-15 13:55 391
  template <typename... T>
f8deb5b9 Poul Sander 2022-01-15 13:55 392
  ostream_params(T... params, detail::buffer_size bs)
f8deb5b9 Poul Sander 2022-01-15 13:55 393
      : ostream_params(params...) {
f8deb5b9 Poul Sander 2022-01-15 13:55 394
    this->buffer_size = bs.value;
f8deb5b9 Poul Sander 2022-01-15 13:55 395
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 396
f8deb5b9 Poul Sander 2022-01-15 13:55 397
// Intel has a bug that results in failure to deduce a constructor
f8deb5b9 Poul Sander 2022-01-15 13:55 398
// for empty parameter packs.
f8deb5b9 Poul Sander 2022-01-15 13:55 399
#  if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 2000
f8deb5b9 Poul Sander 2022-01-15 13:55 400
  ostream_params(int new_oflag) : oflag(new_oflag) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 401
  ostream_params(detail::buffer_size bs) : buffer_size(bs.value) {}
f8deb5b9 Poul Sander 2022-01-15 13:55 402
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 403
};
f8deb5b9 Poul Sander 2022-01-15 13:55 404
f8deb5b9 Poul Sander 2022-01-15 13:55 405
FMT_END_DETAIL_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 406
f8deb5b9 Poul Sander 2022-01-15 13:55 407
// Added {} below to work around default constructor error known to
f8deb5b9 Poul Sander 2022-01-15 13:55 408
// occur in Xcode versions 7.2.1 and 8.2.1.
f8deb5b9 Poul Sander 2022-01-15 13:55 409
constexpr detail::buffer_size buffer_size{};
f8deb5b9 Poul Sander 2022-01-15 13:55 410
f8deb5b9 Poul Sander 2022-01-15 13:55 411
/** A fast output stream which is not thread-safe. */
f8deb5b9 Poul Sander 2022-01-15 13:55 412
class FMT_API ostream final : private detail::buffer<char> {
f8deb5b9 Poul Sander 2022-01-15 13:55 413
 private:
f8deb5b9 Poul Sander 2022-01-15 13:55 414
  file file_;
f8deb5b9 Poul Sander 2022-01-15 13:55 415
f8deb5b9 Poul Sander 2022-01-15 13:55 416
  void grow(size_t) override;
f8deb5b9 Poul Sander 2022-01-15 13:55 417
f8deb5b9 Poul Sander 2022-01-15 13:55 418
  ostream(cstring_view path, const detail::ostream_params& params)
f8deb5b9 Poul Sander 2022-01-15 13:55 419
      : file_(path, params.oflag) {
f8deb5b9 Poul Sander 2022-01-15 13:55 420
    set(new char[params.buffer_size], params.buffer_size);
f8deb5b9 Poul Sander 2022-01-15 13:55 421
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 422
f8deb5b9 Poul Sander 2022-01-15 13:55 423
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 424
  ostream(ostream&& other)
f8deb5b9 Poul Sander 2022-01-15 13:55 425
      : detail::buffer<char>(other.data(), other.size(), other.capacity()),
f8deb5b9 Poul Sander 2022-01-15 13:55 426
        file_(std::move(other.file_)) {
f8deb5b9 Poul Sander 2022-01-15 13:55 427
    other.clear();
f8deb5b9 Poul Sander 2022-01-15 13:55 428
    other.set(nullptr, 0);
f8deb5b9 Poul Sander 2022-01-15 13:55 429
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 430
  ~ostream() {
f8deb5b9 Poul Sander 2022-01-15 13:55 431
    flush();
f8deb5b9 Poul Sander 2022-01-15 13:55 432
    delete[] data();
f8deb5b9 Poul Sander 2022-01-15 13:55 433
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 434
f8deb5b9 Poul Sander 2022-01-15 13:55 435
  void flush() {
f8deb5b9 Poul Sander 2022-01-15 13:55 436
    if (size() == 0) return;
f8deb5b9 Poul Sander 2022-01-15 13:55 437
    file_.write(data(), size());
f8deb5b9 Poul Sander 2022-01-15 13:55 438
    clear();
f8deb5b9 Poul Sander 2022-01-15 13:55 439
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 440
f8deb5b9 Poul Sander 2022-01-15 13:55 441
  template <typename... T>
f8deb5b9 Poul Sander 2022-01-15 13:55 442
  friend ostream output_file(cstring_view path, T... params);
f8deb5b9 Poul Sander 2022-01-15 13:55 443
f8deb5b9 Poul Sander 2022-01-15 13:55 444
  void close() {
f8deb5b9 Poul Sander 2022-01-15 13:55 445
    flush();
f8deb5b9 Poul Sander 2022-01-15 13:55 446
    file_.close();
f8deb5b9 Poul Sander 2022-01-15 13:55 447
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 448
f8deb5b9 Poul Sander 2022-01-15 13:55 449
  /**
f8deb5b9 Poul Sander 2022-01-15 13:55 450
    Formats ``args`` according to specifications in ``fmt`` and writes the
f8deb5b9 Poul Sander 2022-01-15 13:55 451
    output to the file.
f8deb5b9 Poul Sander 2022-01-15 13:55 452
   */
f8deb5b9 Poul Sander 2022-01-15 13:55 453
  template <typename... T> void print(format_string<T...> fmt, T&&... args) {
f8deb5b9 Poul Sander 2022-01-15 13:55 454
    vformat_to(detail::buffer_appender<char>(*this), fmt,
f8deb5b9 Poul Sander 2022-01-15 13:55 455
               fmt::make_format_args(args...));
f8deb5b9 Poul Sander 2022-01-15 13:55 456
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 457
};
f8deb5b9 Poul Sander 2022-01-15 13:55 458
f8deb5b9 Poul Sander 2022-01-15 13:55 459
/**
f8deb5b9 Poul Sander 2022-01-15 13:55 460
  \rst
f8deb5b9 Poul Sander 2022-01-15 13:55 461
  Opens a file for writing. Supported parameters passed in *params*:
f8deb5b9 Poul Sander 2022-01-15 13:55 462
f8deb5b9 Poul Sander 2022-01-15 13:55 463
  * ``<integer>``: Flags passed to `open
f8deb5b9 Poul Sander 2022-01-15 13:55 464
    <https://pubs.opengroup.org/onlinepubs/007904875/functions/open.html>`_
f8deb5b9 Poul Sander 2022-01-15 13:55 465
    (``file::WRONLY | file::CREATE`` by default)
f8deb5b9 Poul Sander 2022-01-15 13:55 466
  * ``buffer_size=<integer>``: Output buffer size
f8deb5b9 Poul Sander 2022-01-15 13:55 467
f8deb5b9 Poul Sander 2022-01-15 13:55 468
  **Example**::
f8deb5b9 Poul Sander 2022-01-15 13:55 469
f8deb5b9 Poul Sander 2022-01-15 13:55 470
    auto out = fmt::output_file("guide.txt");
f8deb5b9 Poul Sander 2022-01-15 13:55 471
    out.print("Don't {}", "Panic");
f8deb5b9 Poul Sander 2022-01-15 13:55 472
  \endrst
f8deb5b9 Poul Sander 2022-01-15 13:55 473
 */
f8deb5b9 Poul Sander 2022-01-15 13:55 474
template <typename... T>
f8deb5b9 Poul Sander 2022-01-15 13:55 475
inline ostream output_file(cstring_view path, T... params) {
f8deb5b9 Poul Sander 2022-01-15 13:55 476
  return {path, detail::ostream_params(params...)};
f8deb5b9 Poul Sander 2022-01-15 13:55 477
}
f8deb5b9 Poul Sander 2022-01-15 13:55 478
#endif  // FMT_USE_FCNTL
f8deb5b9 Poul Sander 2022-01-15 13:55 479
f8deb5b9 Poul Sander 2022-01-15 13:55 480
#ifdef FMT_LOCALE
f8deb5b9 Poul Sander 2022-01-15 13:55 481
// A "C" numeric locale.
f8deb5b9 Poul Sander 2022-01-15 13:55 482
class locale {
f8deb5b9 Poul Sander 2022-01-15 13:55 483
 private:
f8deb5b9 Poul Sander 2022-01-15 13:55 484
#  ifdef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 485
  using locale_t = _locale_t;
f8deb5b9 Poul Sander 2022-01-15 13:55 486
f8deb5b9 Poul Sander 2022-01-15 13:55 487
  static void freelocale(locale_t loc) { _free_locale(loc); }
f8deb5b9 Poul Sander 2022-01-15 13:55 488
f8deb5b9 Poul Sander 2022-01-15 13:55 489
  static double strtod_l(const char* nptr, char** endptr, _locale_t loc) {
f8deb5b9 Poul Sander 2022-01-15 13:55 490
    return _strtod_l(nptr, endptr, loc);
f8deb5b9 Poul Sander 2022-01-15 13:55 491
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 492
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 493
f8deb5b9 Poul Sander 2022-01-15 13:55 494
  locale_t locale_;
f8deb5b9 Poul Sander 2022-01-15 13:55 495
f8deb5b9 Poul Sander 2022-01-15 13:55 496
 public:
f8deb5b9 Poul Sander 2022-01-15 13:55 497
  using type = locale_t;
f8deb5b9 Poul Sander 2022-01-15 13:55 498
  locale(const locale&) = delete;
f8deb5b9 Poul Sander 2022-01-15 13:55 499
  void operator=(const locale&) = delete;
f8deb5b9 Poul Sander 2022-01-15 13:55 500
f8deb5b9 Poul Sander 2022-01-15 13:55 501
  locale() {
f8deb5b9 Poul Sander 2022-01-15 13:55 502
#  ifndef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 503
    locale_ = FMT_SYSTEM(newlocale(LC_NUMERIC_MASK, "C", nullptr));
f8deb5b9 Poul Sander 2022-01-15 13:55 504
#  else
f8deb5b9 Poul Sander 2022-01-15 13:55 505
    locale_ = _create_locale(LC_NUMERIC, "C");
f8deb5b9 Poul Sander 2022-01-15 13:55 506
#  endif
f8deb5b9 Poul Sander 2022-01-15 13:55 507
    if (!locale_) FMT_THROW(system_error(errno, "cannot create locale"));
f8deb5b9 Poul Sander 2022-01-15 13:55 508
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 509
  ~locale() { freelocale(locale_); }
f8deb5b9 Poul Sander 2022-01-15 13:55 510
f8deb5b9 Poul Sander 2022-01-15 13:55 511
  type get() const { return locale_; }
f8deb5b9 Poul Sander 2022-01-15 13:55 512
f8deb5b9 Poul Sander 2022-01-15 13:55 513
  // Converts string to floating-point number and advances str past the end
f8deb5b9 Poul Sander 2022-01-15 13:55 514
  // of the parsed input.
f8deb5b9 Poul Sander 2022-01-15 13:55 515
  FMT_DEPRECATED double strtod(const char*& str) const {
f8deb5b9 Poul Sander 2022-01-15 13:55 516
    char* end = nullptr;
f8deb5b9 Poul Sander 2022-01-15 13:55 517
    double result = strtod_l(str, &end, locale_);
f8deb5b9 Poul Sander 2022-01-15 13:55 518
    str = end;
f8deb5b9 Poul Sander 2022-01-15 13:55 519
    return result;
f8deb5b9 Poul Sander 2022-01-15 13:55 520
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 521
};
f8deb5b9 Poul Sander 2022-01-15 13:55 522
using Locale FMT_DEPRECATED_ALIAS = locale;
f8deb5b9 Poul Sander 2022-01-15 13:55 523
#endif  // FMT_LOCALE
f8deb5b9 Poul Sander 2022-01-15 13:55 524
FMT_MODULE_EXPORT_END
f8deb5b9 Poul Sander 2022-01-15 13:55 525
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 526
f8deb5b9 Poul Sander 2022-01-15 13:55 527
#endif  // FMT_OS_H_
1970-01-01 00:00 528