309{
311
314
315 argument_list<Character> expansion_buffer;
316 for (Character** it =
argv; *it !=
nullptr; ++it)
317 {
318 Character const wildcard_characters[] = { '*', '?', '\0' };
319 Character* const wildcard = traits::tcspbrk(*it, wildcard_characters);
320
321
322
323 if (!wildcard)
324 {
326 *it,
327 static_cast<Character*>(nullptr),
328 0,
329 expansion_buffer);
330
331 if (append_status != 0)
332 return append_status;
333 }
334 else
335 {
337 if (expand_status != 0)
338 return expand_status;
339 }
340 }
341
342
343
344
345 size_t const argument_count = expansion_buffer.size() + 1;
347 for (auto it = expansion_buffer.begin(); it != expansion_buffer.end(); ++it)
349
351 argument_count,
353 sizeof(Character)));
354
355 if (!expanded_argv)
356 return -1;
357
358 Character** const argument_first = reinterpret_cast<Character**>(expanded_argv.get());
359 Character* const character_first = reinterpret_cast<Character*>(
360 expanded_argv.get() +
361 argument_count * sizeof(Character*));
362
363 Character** argument_it = argument_first;
364 Character* character_it = character_first;
365 for (auto it = expansion_buffer.begin(); it != expansion_buffer.end(); ++it)
366 {
367 size_t const count = traits::tcslen(*it) + 1;
368
370 character_it,
372 *it,
374
375 *argument_it++ = character_it;
376 character_it +=
count;
377 }
378
379 *
result =
reinterpret_cast<Character**
>(expanded_argv.detach());
380 return 0;
381}
unsigned char *__cdecl __acrt_allocate_buffer_for_argv(size_t const argument_count, size_t const character_count, size_t const character_size)
static errno_t expand_argument_wildcards(Character *const argument, Character *const wildcard, argument_list< Character > &buffer)
static errno_t copy_and_add_argument_to_buffer(_In_z_ Character const *const file_name, _In_z_ Character const *const directory, size_t const directory_length, argument_list< Character > &buffer)
_In_ size_t character_count
GLuint GLuint GLsizei count
#define _VALIDATE_RETURN_ERRCODE(expr, errorcode)