Piotr Caban : msvcrt: Support expand_wildcards parameter in __getmainargs function.
Alexandre Julliard
julliard at winehq.org
Thu Dec 13 14:22:48 CST 2012
Module: wine
Branch: master
Commit: c34769cfa1624aea76186fc9f524902cd38ecad3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c34769cfa1624aea76186fc9f524902cd38ecad3
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Dec 13 13:45:24 2012 +0100
msvcrt: Support expand_wildcards parameter in __getmainargs function.
---
dlls/msvcrt/data.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 75 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c
index 0b8695a..2dc393c 100644
--- a/dlls/msvcrt/data.c
+++ b/dlls/msvcrt/data.c
@@ -30,6 +30,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
int MSVCRT___argc = 0;
+static int argc_expand;
unsigned int MSVCRT_basemajor = 0;/* FIXME: */
unsigned int MSVCRT_baseminor = 0;/* FIXME: */
unsigned int MSVCRT_baseversion = 0; /* FIXME: */
@@ -48,6 +49,7 @@ unsigned int MSVCRT___setlc_active = 0;
unsigned int MSVCRT___unguarded_readlc_active = 0;
double MSVCRT__HUGE = 0;
char **MSVCRT___argv = NULL;
+static char **argv_expand;
MSVCRT_wchar_t **MSVCRT___wargv = NULL;
char *MSVCRT__acmdln = NULL;
MSVCRT_wchar_t *MSVCRT__wcmdln = NULL;
@@ -348,7 +350,6 @@ void msvcrt_init_args(void)
}
}
-
/* INTERNAL: free memory used by args */
void msvcrt_free_args(void)
{
@@ -359,6 +360,51 @@ void msvcrt_free_args(void)
HeapFree(GetProcessHeap(), 0, MSVCRT__wenviron);
HeapFree(GetProcessHeap(), 0, MSVCRT__pgmptr);
HeapFree(GetProcessHeap(), 0, MSVCRT__wpgmptr);
+ HeapFree(GetProcessHeap(), 0, argv_expand);
+}
+
+static int build_expanded_argv(int *argc, char **argv)
+{
+ int i, size=0, args_no=0;
+ HANDLE h;
+
+ args_no = 0;
+ for(i=0; i<__wine_main_argc; i++) {
+ WIN32_FIND_DATAA data;
+ int len = 0;
+
+ h = FindFirstFileA(__wine_main_argv[i], &data);
+ if(h != INVALID_HANDLE_VALUE) {
+ do {
+ if(data.cFileName[0]=='.' && (data.cFileName[1]=='\0' ||
+ (data.cFileName[1]=='.' && data.cFileName[2]=='\0')))
+ continue;
+
+ len = strlen(data.cFileName)+1;
+ if(argv) {
+ argv[args_no] = (char*)(argv+*argc)+size;
+ memcpy(argv[args_no], data.cFileName, len*sizeof(char));
+ }
+ args_no++;
+ size += len;
+ }while(FindNextFileA(h, &data));
+ CloseHandle(h);
+ }
+
+ if(!len) {
+ len = strlen(__wine_main_argv[i])+1;
+ if(argv) {
+ argv[args_no] = (char*)(argv+*argc)+size;
+ memcpy(argv[args_no], __wine_main_argv[i], len*sizeof(char));
+ }
+ args_no++;
+ size += len;
+ }
+ }
+
+ size += args_no*sizeof(char*);
+ *argc = args_no;
+ return size;
}
/*********************************************************************
@@ -367,12 +413,34 @@ void msvcrt_free_args(void)
void CDECL __getmainargs(int *argc, char** *argv, char** *envp,
int expand_wildcards, int *new_mode)
{
- TRACE("(%p,%p,%p,%d,%p).\n", argc, argv, envp, expand_wildcards, new_mode);
- *argc = MSVCRT___argc;
- *argv = MSVCRT___argv;
- *envp = MSVCRT___initenv;
- if (new_mode)
- MSVCRT__set_new_mode( *new_mode );
+ TRACE("(%p,%p,%p,%d,%p).\n", argc, argv, envp, expand_wildcards, new_mode);
+
+ if (expand_wildcards) {
+ HeapFree(GetProcessHeap(), 0, argv_expand);
+ argv_expand = NULL;
+
+ argv_expand = HeapAlloc(GetProcessHeap(), 0,
+ build_expanded_argv(&argc_expand, NULL));
+ if (argv_expand) {
+ build_expanded_argv(&argc_expand, argv_expand);
+
+ MSVCRT___argc = argc_expand;
+ MSVCRT___argv = argv_expand;
+ }else {
+ expand_wildcards = 0;
+ }
+ }
+ if (!expand_wildcards) {
+ MSVCRT___argc = __wine_main_argc;
+ MSVCRT___argv = __wine_main_argv;
+ }
+
+ *argc = MSVCRT___argc;
+ *argv = MSVCRT___argv;
+ *envp = MSVCRT___initenv;
+
+ if (new_mode)
+ MSVCRT__set_new_mode( *new_mode );
}
/*********************************************************************
More information about the wine-cvs
mailing list