From: Nikolay Sivov Subject: [v2 PATCH] ucrtbase: Implement _get_narrow_winmain_command_line/_get_wide_winmain_command_line Message-Id: <1469479368-11656-1-git-send-email-nsivov@codeweavers.com> Date: Mon, 25 Jul 2016 23:42:48 +0300 Signed-off-by: Nikolay Sivov --- v2: handle multiple leading quotes and embedded quoted blocks .../api-ms-win-crt-runtime-l1-1-0.spec | 4 +- dlls/msvcrt/data.c | 84 ++++++++++++++++++++++ dlls/ucrtbase/ucrtbase.spec | 4 +- 3 files changed, 88 insertions(+), 4 deletions(-) diff --git a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec index 17b9861..cbda9ce 100644 --- a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec +++ b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec @@ -43,11 +43,11 @@ @ cdecl _get_initial_narrow_environment() ucrtbase._get_initial_narrow_environment @ cdecl _get_initial_wide_environment() ucrtbase._get_initial_wide_environment @ cdecl _get_invalid_parameter_handler() ucrtbase._get_invalid_parameter_handler -@ stub _get_narrow_winmain_command_line +@ cdecl _get_narrow_winmain_command_line() ucrtbase._get_narrow_winmain_command_line @ cdecl _get_pgmptr(ptr) ucrtbase._get_pgmptr @ cdecl _get_terminate() ucrtbase._get_terminate @ cdecl _get_thread_local_invalid_parameter_handler() ucrtbase._get_thread_local_invalid_parameter_handler -@ stub _get_wide_winmain_command_line +@ cdecl _get_wide_winmain_command_line() ucrtbase._get_wide_winmain_command_line @ cdecl _get_wpgmptr(ptr) ucrtbase._get_wpgmptr @ cdecl _getdllprocaddr(long str long) ucrtbase._getdllprocaddr @ cdecl _getpid() ucrtbase._getpid diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c index fafbc38..b6dbfdb 100644 --- a/dlls/msvcrt/data.c +++ b/dlls/msvcrt/data.c @@ -692,3 +692,87 @@ int CDECL _initialize_wide_environment(void) FIXME("stub\n"); return 0; } + +/********************************************************************* + * _get_narrow_winmain_command_line (UCRTBASE.@) + */ +char* CDECL _get_narrow_winmain_command_line(void) +{ + static char *narrow_command_line; + char *s; + + if (narrow_command_line) + return narrow_command_line; + + s = GetCommandLineA(); + if (*s == '"') + { + /* skip all leading quotes */ + while (*++s == '"') + ; + /* skip everything up to next quote */ + while (*s && *s++ != '"') + ; + } + else + { + while (*s && *s != ' ' && *s != '\t') + { + /* allow embedded quoted blocks */ + if (*s == '"') + { + s++; + while (*s && *s++ != '"') + ; + } + else + s++; + } + } + while (*s == ' ' || *s == '\t') + s++; + + return narrow_command_line = s; +} + +/********************************************************************* + * _get_wide_winmain_command_line (UCRTBASE.@) + */ +MSVCRT_wchar_t* CDECL _get_wide_winmain_command_line(void) +{ + static MSVCRT_wchar_t *wide_command_line; + MSVCRT_wchar_t *s; + + if (wide_command_line) + return wide_command_line; + + s = GetCommandLineW(); + if (*s == '"') + { + /* skip all leading quotes */ + while (*++s == '"') + ; + /* skip everything up to next quote */ + while (*s && *s++ != '"') + ; + } + else + { + while (*s && *s != ' ' && *s != '\t') + { + /* allow embedded quoted blocks */ + if (*s == '"') + { + s++; + while (*s && *s++ != '"') + ; + } + else + s++; + } + } + while (*s == ' ' || *s == '\t') + s++; + + return wide_command_line = s; +} diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 7058990..99e5ec9 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -368,7 +368,7 @@ @ cdecl _get_initial_narrow_environment() @ cdecl _get_initial_wide_environment() @ cdecl _get_invalid_parameter_handler() -@ stub _get_narrow_winmain_command_line +@ cdecl _get_narrow_winmain_command_line() @ cdecl _get_osfhandle(long) MSVCRT__get_osfhandle @ cdecl _get_pgmptr(ptr) @ cdecl _get_printf_count_output() MSVCRT__get_printf_count_output @@ -379,7 +379,7 @@ @ cdecl _get_timezone(ptr) @ cdecl _get_tzname(ptr str long long) MSVCRT__get_tzname @ cdecl _get_unexpected() MSVCRT__get_unexpected -@ stub _get_wide_winmain_command_line +@ cdecl _get_wide_winmain_command_line() @ cdecl _get_wpgmptr(ptr) @ cdecl _getc_nolock(ptr) MSVCRT__fgetc_nolock @ cdecl _getch() -- 2.8.1