ReactOS 0.4.16-dev-822-gbcedb53
corecrt_internal_win32_buffer.h File Reference
#include <corecrt_internal.h>
Include dependency graph for corecrt_internal_win32_buffer.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  __crt_win32_buffer_debug_info
 
class  __crt_win32_buffer_empty_debug_info
 
struct  __crt_win32_buffer_internal_dynamic_resizing
 
struct  __crt_win32_buffer_public_dynamic_resizing
 
struct  __crt_win32_buffer_no_resizing
 
class  __crt_win32_buffer< Character, ResizePolicy >
 

Typedefs

template<typename Character >
using __crt_internal_win32_buffer = __crt_win32_buffer< Character, __crt_win32_buffer_internal_dynamic_resizing >
 
template<typename Character >
using __crt_public_win32_buffer = __crt_win32_buffer< Character, __crt_win32_buffer_public_dynamic_resizing >
 
template<typename Character >
using __crt_no_alloc_win32_buffer = __crt_win32_buffer< Character, __crt_win32_buffer_no_resizing >
 

Functions

unsigned int __acrt_get_utf8_acp_compatibility_codepage ()
 
template<typename FromChar , typename ToChar , typename CvtFunction , typename ResizePolicy >
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)
 
template<typename FromChar , typename ToChar , typename CvtFunction , typename ResizePolicy >
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)
 
template<typename ResizePolicy >
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)
 
template<typename ResizePolicy >
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)
 
template<typename ResizePolicy >
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)
 
template<typename ResizePolicy >
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)
 
template<size_t N>
size_t __acrt_wcs_to_mbs_array (wchar_t const *const null_terminated_input_string, char(&buffer)[N], _locale_t locale=nullptr)
 
template<size_t N>
size_t __acrt_wcs_to_mbs_cp_array (wchar_t const *const null_terminated_input_string, char(&buffer)[N], unsigned int const code_page)
 
template<size_t N>
size_t __acrt_mbs_to_wcs_array (char const *const null_terminated_input_string, wchar_t(&buffer)[N], _locale_t locale=nullptr)
 
template<size_t N>
size_t __acrt_mbs_to_wcs_cp_array (char const *const null_terminated_input_string, wchar_t(&buffer)[N], unsigned int const code_page)
 
template<typename ResizePolicy >
errno_t __acrt_get_current_directory_wide (__crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer)
 
template<typename ResizePolicy >
errno_t __acrt_get_current_directory_narrow_acp_or_utf8 (__crt_win32_buffer< char, ResizePolicy > &win32_buffer)
 
template<typename ResizePolicy >
errno_t __acrt_get_full_path_name_wide (wchar_t const *const lpFileName, __crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer)
 
template<typename ResizePolicy >
errno_t __acrt_get_full_path_name_narrow_acp_or_utf8 (char const *const lpFileName, __crt_win32_buffer< char, ResizePolicy > &win32_buffer)
 

Typedef Documentation

◆ __crt_internal_win32_buffer

◆ __crt_no_alloc_win32_buffer

◆ __crt_public_win32_buffer

Function Documentation

◆ __acrt_convert_wcs_mbs()

template<typename FromChar , typename ToChar , typename CvtFunction , typename ResizePolicy >
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 
)

Definition at line 448 of file corecrt_internal_win32_buffer.h.

454{
455 // Common code path for conversions using mbstowcs and wcstombs.
456 if (null_terminated_input_string == nullptr) {
457 win32_buffer.set_to_nullptr();
458 return 0;
459 }
460
461 // No empty string special case - mbstowcs/wcstombs handles them.
462 size_t const required_size = cvt_func(nullptr, null_terminated_input_string, 0, locale);
463
464 if (required_size == static_cast<size_t>(-1)) {
465 return errno;
466 }
467
468 size_t const required_size_plus_null_terminator = required_size + 1;
469
470 if (required_size_plus_null_terminator > win32_buffer.capacity()) {
471 errno_t const alloc_err = win32_buffer.allocate(required_size_plus_null_terminator);
472 if (alloc_err != 0) {
473 return alloc_err;
474 }
475 }
476
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()) {
479 // check for error or if output is not null terminated
480 return errno;
481 }
482
483 win32_buffer.size(chars_converted);
484 return 0;
485}
errno_t allocate(size_t requested_size)
Definition: _locale.h:75
#define errno
Definition: errno.h:18
static const char alloc_err[]
Definition: svc_dg.c:382
int errno_t
Definition: corecrt.h:615

Referenced by __acrt_mbs_to_wcs(), and __acrt_wcs_to_mbs().

◆ __acrt_convert_wcs_mbs_cp()

template<typename FromChar , typename ToChar , typename CvtFunction , typename ResizePolicy >
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 
)

Definition at line 488 of file corecrt_internal_win32_buffer.h.

494{
495 // Common code path for conversions using MultiByteToWideChar and WideCharToMultiByte with null terminated inputs.
496 if (null_terminated_input_string == nullptr) {
497 win32_buffer.set_to_nullptr();
498 return 0;
499 }
500
501 // Special Case: Empty strings are not valid input to MultiByteToWideChar/WideCharToMultiByte
502 if (null_terminated_input_string[0] == '\0') {
503 if (win32_buffer.capacity() == 0) {
504 errno_t alloc_err = win32_buffer.allocate(1);
505 if (alloc_err != 0) {
506 return alloc_err;
507 }
508 }
509
510 win32_buffer.data()[0] = '\0';
511 win32_buffer.size(0);
512 return 0;
513 }
514
515 size_t const required_size_plus_null_terminator = cvt_func(
516 code_page,
517 null_terminated_input_string,
518 nullptr,
519 0
520 );
521
522 if (required_size_plus_null_terminator == 0) {
524 return errno;
525 }
526
527 if (required_size_plus_null_terminator > win32_buffer.capacity()) {
528 errno_t alloc_err = win32_buffer.allocate(required_size_plus_null_terminator);
529 if (alloc_err != 0) {
530 return alloc_err;
531 }
532 }
533
534 size_t const chars_converted_plus_null_terminator = cvt_func(
535 code_page,
536 null_terminated_input_string,
537 win32_buffer.data(),
538 win32_buffer.capacity()
539 );
540
541 if (chars_converted_plus_null_terminator == 0) {
543 return errno;
544 }
545
546 win32_buffer.size(chars_converted_plus_null_terminator - 1); // size does not include the null terminator
547 return 0;
548}
_Out_opt_ UINT * code_page
void __cdecl __acrt_errno_map_os_error(unsigned long)
Definition: errno.cpp:91
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by __acrt_mbs_to_wcs_cp(), and __acrt_wcs_to_mbs_cp().

◆ __acrt_get_current_directory_narrow_acp_or_utf8()

template<typename ResizePolicy >
errno_t __acrt_get_current_directory_narrow_acp_or_utf8 ( __crt_win32_buffer< char, ResizePolicy > &  win32_buffer)

Definition at line 723 of file corecrt_internal_win32_buffer.h.

726{
727 wchar_t default_buffer_space[_MAX_PATH];
728 __crt_internal_win32_buffer<wchar_t> wide_buffer(default_buffer_space);
729
730 errno_t const err = __acrt_get_current_directory_wide(wide_buffer);
731
732 if (err != 0) {
733 return err;
734 }
735
737 wide_buffer.data(),
738 win32_buffer,
740 );
741}
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_current_directory_wide(__crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer)
unsigned int __acrt_get_utf8_acp_compatibility_codepage()
#define _MAX_PATH
Definition: utility.h:77
#define err(...)

◆ __acrt_get_current_directory_wide()

template<typename ResizePolicy >
errno_t __acrt_get_current_directory_wide ( __crt_win32_buffer< wchar_t, ResizePolicy > &  win32_buffer)

Definition at line 712 of file corecrt_internal_win32_buffer.h.

715{
716 return win32_buffer.call_win32_function([](wchar_t * buffer, DWORD buffer_length)
717 {
718 return ::GetCurrentDirectoryW(buffer_length, buffer);
719 });
720}
errno_t call_win32_function(Win32Function const &win32_function)
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915

Referenced by __acrt_get_current_directory_narrow_acp_or_utf8().

◆ __acrt_get_full_path_name_narrow_acp_or_utf8()

template<typename ResizePolicy >
errno_t __acrt_get_full_path_name_narrow_acp_or_utf8 ( char const *const  lpFileName,
__crt_win32_buffer< char, ResizePolicy > &  win32_buffer 
)

Definition at line 761 of file corecrt_internal_win32_buffer.h.

765{
766 wchar_t default_buffer_space[_MAX_PATH];
767 __crt_internal_win32_buffer<wchar_t> wide_buffer(default_buffer_space);
768
769 wchar_t default_file_name_space[_MAX_PATH];
770 __crt_internal_win32_buffer<wchar_t> wide_file_name(default_file_name_space);
771
773
774 errno_t const cvt_err = __acrt_mbs_to_wcs_cp(
776 wide_file_name,
778 );
779
780 if (cvt_err != 0)
781 {
782 return cvt_err;
783 }
784
785 errno_t const err = __acrt_get_full_path_name_wide(wide_file_name.data(), wide_buffer);
786
787 if (err != 0)
788 {
789 return err;
790 }
791
793 wide_buffer.data(),
794 win32_buffer,
796 );
797}
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_get_full_path_name_wide(wchar_t const *const lpFileName, __crt_win32_buffer< wchar_t, ResizePolicy > &win32_buffer)
_In_ LPCSTR lpFileName
Definition: winbase.h:3096

◆ __acrt_get_full_path_name_wide()

template<typename ResizePolicy >
errno_t __acrt_get_full_path_name_wide ( wchar_t const *const  lpFileName,
__crt_win32_buffer< wchar_t, ResizePolicy > &  win32_buffer 
)

Definition at line 744 of file corecrt_internal_win32_buffer.h.

748{
749 return win32_buffer.call_win32_function([lpFileName](wchar_t * buffer, DWORD buffer_length)
750 {
751 return ::GetFullPathNameW(
753 buffer_length,
754 buffer,
755 nullptr
756 );
757 });
758}

Referenced by __acrt_get_full_path_name_narrow_acp_or_utf8().

◆ __acrt_get_utf8_acp_compatibility_codepage()

unsigned int __acrt_get_utf8_acp_compatibility_codepage ( )
inline

Definition at line 422 of file corecrt_internal_win32_buffer.h.

423{
424 _LocaleUpdate locale_update(nullptr);
425 unsigned int const current_code_page = locale_update.GetLocaleT()->locinfo->_public._locale_lc_codepage;
426
427 if (current_code_page == CP_UTF8) {
428 return CP_UTF8;
429 }
430
431 bool const use_oem_code_page = !__acrt_AreFileApisANSI();
432
433 if (use_oem_code_page) {
434 return CP_OEMCP;
435 }
436
437 return CP_ACP;
438}
BOOL WINAPI __acrt_AreFileApisANSI(void)
#define CP_ACP
Definition: compat.h:109
#define CP_UTF8
Definition: nls.h:20
#define CP_OEMCP
Definition: winnls.h:233

Referenced by __acrt_CreateProcessA(), __acrt_get_current_directory_narrow_acp_or_utf8(), __acrt_get_full_path_name_narrow_acp_or_utf8(), __acrt_GetModuleFileNameA(), __acrt_LoadLibraryExA(), __acrt_SetCurrentDirectoryA(), __acrt_SetEnvironmentVariableA(), _access_s(), _chmod(), _findfirst32(), _findfirst32i64(), _findfirst64(), _findfirst64i32(), _findnext32(), _findnext32i64(), _findnext64(), _findnext64i32(), _mkdir(), _rmdir(), _sopen_nolock(), common_stat(), get_file_name(), get_wide(), remove(), rename(), and tzset_env_copy_to_tzname().

◆ __acrt_mbs_to_wcs()

template<typename ResizePolicy >
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 
)

Definition at line 602 of file corecrt_internal_win32_buffer.h.

607{
610 null_terminated_input_string,
611 win32_buffer,
613 locale
614 );
616}
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)
_mbstowcs_l
Definition: stdlib.h:951
#define _BEGIN_SECURE_CRT_DEPRECATION_DISABLE
#define _END_SECURE_CRT_DEPRECATION_DISABLE

Referenced by __acrt_mbs_to_wcs_array().

◆ __acrt_mbs_to_wcs_array()

template<size_t N>
size_t __acrt_mbs_to_wcs_array ( char const *const  null_terminated_input_string,
wchar_t(&)  buffer[N],
_locale_t  locale = nullptr 
)

Definition at line 682 of file corecrt_internal_win32_buffer.h.

687{
689 if (__acrt_mbs_to_wcs(null_terminated_input_string, win32_buffer, locale) != 0) {
690 return 0;
691 }
692
693 return win32_buffer.size();
694}
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)

◆ __acrt_mbs_to_wcs_cp()

template<typename ResizePolicy >
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 
)

Definition at line 619 of file corecrt_internal_win32_buffer.h.

624{
625 auto const mbs_to_wcs = [](
626 unsigned int const code_page,
627 char const * const null_terminated_input_string,
628 wchar_t * const buffer,
629 size_t const buffer_size)
630 {
631 // Return value includes null terminator.
632 return __acrt_MultiByteToWideChar(
633 code_page,
635 null_terminated_input_string,
636 -1,
637 buffer,
638 static_cast<int>(buffer_size)
639 );
640 };
641
643 null_terminated_input_string,
644 win32_buffer,
645 mbs_to_wcs,
647 );
648}
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)
#define MB_ERR_INVALID_CHARS
Definition: unicode.h:41
wchar_t const *const size_t const buffer_size
Definition: stat.cpp:95
#define MB_PRECOMPOSED
Definition: winnls.h:283

Referenced by __acrt_CreateProcessA(), __acrt_get_full_path_name_narrow_acp_or_utf8(), __acrt_LoadLibraryExA(), __acrt_mbs_to_wcs_cp_array(), __acrt_SetCurrentDirectoryA(), __acrt_SetEnvironmentVariableA(), _access_s(), _chmod(), _mkdir(), _rmdir(), _sopen_nolock(), common_stat(), get_wide(), remove(), and rename().

◆ __acrt_mbs_to_wcs_cp_array()

template<size_t N>
size_t __acrt_mbs_to_wcs_cp_array ( char const *const  null_terminated_input_string,
wchar_t(&)  buffer[N],
unsigned int const  code_page 
)

Definition at line 697 of file corecrt_internal_win32_buffer.h.

702{
704 if (__acrt_mbs_to_wcs_cp(null_terminated_input_string, win32_buffer, code_page) != 0) {
705 return 0;
706 }
707
708 return win32_buffer.size();
709}

◆ __acrt_wcs_to_mbs()

template<typename ResizePolicy >
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 
)

Definition at line 551 of file corecrt_internal_win32_buffer.h.

556{
559 null_terminated_input_string,
560 win32_buffer,
562 locale
563 );
565}
_wcstombs_l
Definition: stdlib.h:1039

Referenced by __acrt_wcs_to_mbs_array().

◆ __acrt_wcs_to_mbs_array()

template<size_t N>
size_t __acrt_wcs_to_mbs_array ( wchar_t const *const  null_terminated_input_string,
char(&)  buffer[N],
_locale_t  locale = nullptr 
)

Definition at line 652 of file corecrt_internal_win32_buffer.h.

657{
659 if (__acrt_wcs_to_mbs(null_terminated_input_string, win32_buffer, locale) != 0) {
660 return 0;
661 }
662
663 return win32_buffer.size();
664}
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)

◆ __acrt_wcs_to_mbs_cp()

template<typename ResizePolicy >
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 
)

Definition at line 568 of file corecrt_internal_win32_buffer.h.

573{
574 auto const wcs_to_mbs = [](
575 unsigned int const code_page,
576 wchar_t const * const null_terminated_input_string,
577 char * const buffer,
578 size_t const buffer_size)
579 {
580 // Return value includes null terminator.
582 code_page,
583 0,
584 null_terminated_input_string,
585 -1,
586 buffer,
587 static_cast<int>(buffer_size),
588 nullptr,
589 nullptr
590 );
591 };
592
594 null_terminated_input_string,
595 win32_buffer,
596 wcs_to_mbs,
598 );
599}
return __acrt_WideCharToMultiByte(code_page, 0, buffer.get(), -1, result_size !=0 ? result :nullptr, result_size, nullptr, nullptr)

Referenced by __acrt_get_current_directory_narrow_acp_or_utf8(), __acrt_get_full_path_name_narrow_acp_or_utf8(), __acrt_GetModuleFileNameA(), __acrt_wcs_to_mbs_cp_array(), and get_file_name().

◆ __acrt_wcs_to_mbs_cp_array()

template<size_t N>
size_t __acrt_wcs_to_mbs_cp_array ( wchar_t const *const  null_terminated_input_string,
char(&)  buffer[N],
unsigned int const  code_page 
)

Definition at line 667 of file corecrt_internal_win32_buffer.h.

672{
674 if (__acrt_wcs_to_mbs_cp(null_terminated_input_string, win32_buffer, code_page) != 0) {
675 return 0;
676 }
677
678 return win32_buffer.size();
679}

Referenced by _getch_nolock().