94template <
typename Character>
99 size_t* argument_count,
111 Character*
p = cmdstart;
122 bool in_quotes =
false;
127 in_quotes = !in_quotes;
146 while (
c !=
'\0' && (in_quotes || (
c !=
' ' &&
c !=
'\t')));
165 while (*
p ==
' ' || *
p ==
'\t')
200 if (numslash % 2 == 0)
202 if (in_quotes &&
p[1] ==
'"')
210 in_quotes = !in_quotes;
226 if (*
p ==
'\0' || (!in_quotes && (*
p ==
' ' || *
p ==
'\t')))
267 size_t const argument_count,
272 if (argument_count >=
SIZE_MAX /
sizeof(
void*))
278 size_t const argument_array_size = argument_count *
sizeof(
void*);
281 if (
SIZE_MAX - argument_array_size <= character_array_size)
284 size_t const total_size = argument_array_size + character_array_size;
285 __crt_unique_heap_ptr<unsigned char>
buffer(_calloc_crt_t(
unsigned char, total_size));
318template <
typename Character>
344 Character*
const command_line = raw_command_line ==
nullptr || raw_command_line[0] ==
'\0'
348 size_t argument_count = 0;
352 static_cast<Character**
>(
nullptr),
353 static_cast<Character*
>(
nullptr),
365 Character*
const first_string =
reinterpret_cast<Character*
>(
buffer.get() + argument_count *
sizeof(Character*));
372 __argc =
static_cast<int>(argument_count - 1);
373 get_argv(Character()) =
reinterpret_cast<Character**
>(
buffer.detach());
378 __crt_unique_heap_ptr<Character*> expanded_argv;
380 if (argv_expansion_status != 0)
381 return argv_expansion_status;
386 for (
auto it = expanded_argv.get(); *it; ++it, ++
n) { }
387 return static_cast<int>(
n);
390 get_argv(Character()) = expanded_argv.detach();
398 return common_configure_argv<char>(
mode);
403 return common_configure_argv<wchar_t>(
mode);
errno_t __cdecl _configure_wide_argv(_crt_argv_mode const mode)
static errno_t expand_argv_wildcards(_In_z_ char **const argv, _Out_ _Deref_post_z_ char ***const expanded_argv)
static void __cdecl parse_command_line(Character *cmdstart, Character **argv, Character *args, size_t *argument_count, size_t *character_count)
errno_t __cdecl _configure_narrow_argv(_crt_argv_mode const mode)
static bool __cdecl should_copy_another_character(char const c)
static void do_locale_initialization(wchar_t)
static errno_t __cdecl common_configure_argv(_crt_argv_mode const mode)
static char **& get_argv(char)
unsigned char *__cdecl __acrt_allocate_buffer_for_argv(size_t const argument_count, size_t const character_count, size_t const character_size)
static char * get_command_line(char)
errno_t __acrt_expand_wide_argv_wildcards(wchar_t **const argv, wchar_t ***const result)
errno_t __acrt_expand_narrow_argv_wildcards(char **const argv, char ***const result)
_In_z_ Character const *const first_argument
_In_ size_t character_count
_In_ size_t _In_ size_t character_size
bool __cdecl __acrt_initialize_multibyte(void)
#define _VALIDATE_RETURN_ERRCODE(expr, errorcode)
#define _VALIDATE_RETURN_ERRCODE_NOEXC(expr, errorcode)
static char * program_name
int __cdecl _ismbblead(unsigned int)
@ _crt_argv_expanded_arguments
@ _crt_argv_unexpanded_arguments