Commit 7c35db00 authored by James Hawkins's avatar James Hawkins Committed by Alexandre Julliard

msiexec: Use CommandLineToArgvW instead of process_args to reduce code duplication.

parent 27c6c83e
...@@ -4,7 +4,7 @@ SRCDIR = @srcdir@ ...@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MODULE = msiexec.exe MODULE = msiexec.exe
APPMODE = -mconsole APPMODE = -mconsole
IMPORTS = msi ole32 advapi32 user32 kernel32 IMPORTS = msi shell32 ole32 advapi32 user32 kernel32
EXTRALIBS = $(LIBUNICODE) EXTRALIBS = $(LIBUNICODE)
C_SRCS = \ C_SRCS = \
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <msi.h> #include <msi.h>
#include <objbase.h> #include <objbase.h>
#include <stdio.h> #include <stdio.h>
#include <shellapi.h>
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/unicode.h" #include "wine/unicode.h"
...@@ -210,14 +211,6 @@ static DWORD msi_atou(LPCWSTR str) ...@@ -210,14 +211,6 @@ static DWORD msi_atou(LPCWSTR str)
return 0; return 0;
} }
static LPWSTR msi_strdup(LPCWSTR str)
{
DWORD len = lstrlenW(str)+1;
LPWSTR ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
lstrcpyW(ret, str);
return ret;
}
/* str1 is the same as str2, ignoring case */ /* str1 is the same as str2, ignoring case */
static BOOL msi_strequal(LPCWSTR str1, LPCSTR str2) static BOOL msi_strequal(LPCWSTR str1, LPCSTR str2)
{ {
...@@ -316,97 +309,6 @@ static DWORD DoDllUnregisterServer(LPCWSTR DllName) ...@@ -316,97 +309,6 @@ static DWORD DoDllUnregisterServer(LPCWSTR DllName)
return 0; return 0;
} }
/*
* state machine to break up the command line properly
*/
enum chomp_state
{
cs_whitespace,
cs_token,
cs_quote
};
static int chomp( WCHAR *str )
{
enum chomp_state state = cs_whitespace;
WCHAR *p, *out;
int count = 0, ignore;
for( p = str, out = str; *p; p++ )
{
ignore = 1;
switch( state )
{
case cs_whitespace:
switch( *p )
{
case ' ':
break;
case '"':
state = cs_quote;
count++;
break;
default:
count++;
ignore = 0;
state = cs_token;
}
break;
case cs_token:
switch( *p )
{
case '"':
state = cs_quote;
break;
case ' ':
state = cs_whitespace;
*out++ = 0;
break;
default:
ignore = 0;
}
break;
case cs_quote:
switch( *p )
{
case '"':
state = cs_token;
break;
default:
ignore = 0;
}
break;
}
if( !ignore )
*out++ = *p;
}
*out = 0;
return count;
}
static void process_args( WCHAR *cmdline, int *pargc, WCHAR ***pargv )
{
WCHAR **argv, *p = msi_strdup(cmdline);
int i, n;
n = chomp( p );
argv = HeapAlloc(GetProcessHeap(), 0, sizeof (WCHAR*)*(n+1));
for( i=0; i<n; i++ )
{
argv[i] = p;
p += lstrlenW(p) + 1;
}
argv[i] = NULL;
*pargc = n;
*pargv = argv;
}
static BOOL process_args_from_reg( LPWSTR ident, int *pargc, WCHAR ***pargv ) static BOOL process_args_from_reg( LPWSTR ident, int *pargc, WCHAR ***pargv )
{ {
LONG r; LONG r;
...@@ -425,7 +327,7 @@ static BOOL process_args_from_reg( LPWSTR ident, int *pargc, WCHAR ***pargv ) ...@@ -425,7 +327,7 @@ static BOOL process_args_from_reg( LPWSTR ident, int *pargc, WCHAR ***pargv )
r = RegQueryValueExW(hkey, ident, 0, &type, (LPBYTE)buf, &sz); r = RegQueryValueExW(hkey, ident, 0, &type, (LPBYTE)buf, &sz);
if( r == ERROR_SUCCESS ) if( r == ERROR_SUCCESS )
{ {
process_args(buf, pargc, pargv); *pargv = CommandLineToArgvW(buf, pargc);
ret = TRUE; ret = TRUE;
} }
} }
...@@ -471,7 +373,7 @@ int main(int argc, char **argv) ...@@ -471,7 +373,7 @@ int main(int argc, char **argv)
LPWSTR *argvW = NULL; LPWSTR *argvW = NULL;
/* overwrite the command line */ /* overwrite the command line */
process_args( GetCommandLineW(), &argc, &argvW ); argvW = CommandLineToArgvW( GetCommandLineW(), &argc );
/* /*
* If the args begin with /@ IDENT then we need to load the real * If the args begin with /@ IDENT then we need to load the real
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment