12#pragma pack(push, _CRT_PACKING)
32 int const initial_block_use,
33 char const *
const initial_file_name,
34 int const initial_line_number
36 : _block_use(initial_block_use),
37 _file_name(initial_file_name),
38 _line_number(initial_line_number)
59 char const * _file_name;
107 debug_info.block_use(),
108 debug_info.file_name(),
109 debug_info.line_number()
112 if (
ret ==
nullptr) {
150template <
typename Character,
typename ResizePolicy>
208 size_t const buffer_capacity
222 size_t const buffer_capacity,
288 ResizePolicy::allocate(
289 reinterpret_cast<void **
>(&return_val),
290 _size *
sizeof(Character),
302 template <
typename Win32Function>
308 if (required_size == 0) {
315 _size = required_size;
319 size_t const required_size_plus_null_terminator = required_size + 1;
329 if (required_size2 == 0) {
335 _size = required_size2;
349 reinterpret_cast<void **
>(&
_string),
398template <
typename Character>
401template <
typename Character>
404template <
typename Character>
424 _LocaleUpdate locale_update(
nullptr);
425 unsigned int const current_code_page = locale_update.GetLocaleT()->locinfo->_public._locale_lc_codepage;
427 if (current_code_page ==
CP_UTF8) {
433 if (use_oem_code_page) {
447template <
typename FromChar,
typename ToChar,
typename CvtFunction,
typename ResizePolicy>
449 FromChar
const *
const null_terminated_input_string,
451 CvtFunction
const& cvt_func,
456 if (null_terminated_input_string ==
nullptr) {
462 size_t const required_size = cvt_func(
nullptr, null_terminated_input_string, 0,
locale);
464 if (required_size ==
static_cast<size_t>(-1)) {
468 size_t const required_size_plus_null_terminator = required_size + 1;
470 if (required_size_plus_null_terminator > win32_buffer.
capacity()) {
477 size_t const chars_converted = cvt_func(win32_buffer.
data(), null_terminated_input_string, win32_buffer.
capacity(),
locale);
478 if (chars_converted ==
static_cast<size_t>(-1) || chars_converted == win32_buffer.
capacity()) {
483 win32_buffer.
size(chars_converted);
487template <
typename FromChar,
typename ToChar,
typename CvtFunction,
typename ResizePolicy>
489 FromChar
const *
const null_terminated_input_string,
491 CvtFunction
const& cvt_func,
496 if (null_terminated_input_string ==
nullptr) {
502 if (null_terminated_input_string[0] ==
'\0') {
510 win32_buffer.
data()[0] =
'\0';
511 win32_buffer.
size(0);
515 size_t const required_size_plus_null_terminator = cvt_func(
517 null_terminated_input_string,
522 if (required_size_plus_null_terminator == 0) {
527 if (required_size_plus_null_terminator > win32_buffer.
capacity()) {
534 size_t const chars_converted_plus_null_terminator = cvt_func(
536 null_terminated_input_string,
541 if (chars_converted_plus_null_terminator == 0) {
546 win32_buffer.
size(chars_converted_plus_null_terminator - 1);
550template <
typename ResizePolicy>
552 wchar_t const *
const null_terminated_input_string,
559 null_terminated_input_string,
567template <
typename ResizePolicy>
569 wchar_t const *
const null_terminated_input_string,
574 auto const wcs_to_mbs = [](
576 wchar_t const *
const null_terminated_input_string,
584 null_terminated_input_string,
594 null_terminated_input_string,
601template <
typename ResizePolicy>
603 char const *
const null_terminated_input_string,
610 null_terminated_input_string,
618template <
typename ResizePolicy>
620 char const *
const null_terminated_input_string,
625 auto const mbs_to_wcs = [](
627 char const *
const null_terminated_input_string,
632 return __acrt_MultiByteToWideChar(
635 null_terminated_input_string,
643 null_terminated_input_string,
653 wchar_t const *
const null_terminated_input_string,
663 return win32_buffer.
size();
668 wchar_t const *
const null_terminated_input_string,
678 return win32_buffer.
size();
683 char const *
const null_terminated_input_string,
693 return win32_buffer.
size();
698 char const *
const null_terminated_input_string,
708 return win32_buffer.
size();
711template <
typename ResizePolicy>
718 return ::GetCurrentDirectoryW(buffer_length,
buffer);
722template <
typename ResizePolicy>
743template <
typename ResizePolicy>
751 return ::GetFullPathNameW(
760template <
typename ResizePolicy>
769 wchar_t default_file_name_space[
_MAX_PATH];
return __acrt_WideCharToMultiByte(code_page, 0, buffer.get(), -1, result_size !=0 ? result :nullptr, result_size, nullptr, nullptr)
__crt_win32_buffer_debug_info(int, char const *, int)
typename ResizePolicy::debug_info_type debug_info_type
__crt_win32_buffer(__crt_win32_buffer &&)=delete
errno_t allocate(size_t requested_size)
__crt_win32_buffer(Character *const buffer, size_t const buffer_capacity, debug_info_type const &debug_info)
errno_t call_win32_function(Win32Function const &win32_function)
__crt_win32_buffer(debug_info_type const &debug_info)
__crt_win32_buffer & operator=(__crt_win32_buffer const &)=delete
char_type const * data() const
void size(size_t new_size)
__crt_win32_buffer(Character(&buffer)[N])
debug_info_type const & debug_info() const
__crt_win32_buffer & operator=(__crt_win32_buffer &&)=delete
__crt_win32_buffer(Character(&buffer)[N], debug_info_type const &debug_info)
char_type *const _initial_string
__crt_win32_buffer(Character *const buffer, size_t const buffer_capacity)
__crt_win32_buffer(__crt_win32_buffer const &)=delete
_Out_opt_ UINT * code_page
void __cdecl __acrt_errno_map_os_error(unsigned long)
BOOL WINAPI __acrt_AreFileApisANSI(void)
errno_t __acrt_get_current_directory_narrow_acp_or_utf8(__crt_win32_buffer< char, ResizePolicy > &win32_buffer)
errno_t __acrt_mbs_to_wcs_cp(char const *const null_terminated_input_string, __crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer, unsigned int const code_page)
errno_t __acrt_wcs_to_mbs_cp(wchar_t const *const null_terminated_input_string, __crt_win32_buffer< char, ResizePolicy > &win32_buffer, unsigned int const code_page)
errno_t __acrt_get_full_path_name_narrow_acp_or_utf8(char const *const lpFileName, __crt_win32_buffer< char, ResizePolicy > &win32_buffer)
size_t __acrt_wcs_to_mbs_cp_array(wchar_t const *const null_terminated_input_string, char(&buffer)[N], unsigned int const code_page)
errno_t __acrt_get_full_path_name_wide(wchar_t const *const lpFileName, __crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer)
errno_t __acrt_mbs_to_wcs(char const *const null_terminated_input_string, __crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer, _locale_t locale=nullptr)
errno_t __acrt_convert_wcs_mbs(FromChar const *const null_terminated_input_string, __crt_win32_buffer< ToChar, ResizePolicy > &win32_buffer, CvtFunction const &cvt_func, _locale_t locale)
size_t __acrt_mbs_to_wcs_array(char const *const null_terminated_input_string, wchar_t(&buffer)[N], _locale_t locale=nullptr)
errno_t __acrt_wcs_to_mbs(wchar_t const *const null_terminated_input_string, __crt_win32_buffer< char, ResizePolicy > &win32_buffer, _locale_t locale=nullptr)
size_t __acrt_mbs_to_wcs_cp_array(char const *const null_terminated_input_string, wchar_t(&buffer)[N], unsigned int const code_page)
errno_t __acrt_get_current_directory_wide(__crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer)
size_t __acrt_wcs_to_mbs_array(wchar_t const *const null_terminated_input_string, char(&buffer)[N], _locale_t locale=nullptr)
errno_t __acrt_convert_wcs_mbs_cp(FromChar const *const null_terminated_input_string, __crt_win32_buffer< ToChar, ResizePolicy > &win32_buffer, CvtFunction const &cvt_func, unsigned int const code_page)
unsigned int __acrt_get_utf8_acp_compatibility_codepage()
#define _malloc_dbg(s, t, f, l)
size_t const requested_size
int const char const *const int const line_number
_Out_opt_ size_t *const Character const *const int const block_use
#define MB_ERR_INVALID_CHARS
#define _BEGIN_SECURE_CRT_DEPRECATION_DISABLE
#define _END_SECURE_CRT_DEPRECATION_DISABLE
#define UNREFERENCED_PARAMETER(P)
int CDECL memcpy_s(void *dest, size_t numberOfElements, const void *src, size_t count)
wchar_t const *const size_t const buffer_size
static void deallocate(void *const ptr, debug_info_type const &)
static _Check_return_ errno_t allocate(void **const address, size_t const size, debug_info_type const &)
static void deallocate(void *const, debug_info_type const &)
static _Check_return_ errno_t allocate(void **const, size_t const, debug_info_type const &)
static void deallocate(void *const ptr, debug_info_type const &debug_info)
static _Check_return_ errno_t allocate(void **const address, size_t const size, debug_info_type const &debug_info)
static const char alloc_err[]
DWORD WINAPI GetLastError(void)