From 7c35db000b26852fc2bf4a7a7e349953f60d183f Mon Sep 17 00:00:00 2001
From: James Hawkins <truiken@gmail.com>
Date: Mon, 26 Jun 2006 14:53:32 -0700
Subject: [PATCH] msiexec: Use CommandLineToArgvW instead of process_args to
 reduce code duplication.

---
 programs/msiexec/Makefile.in |   2 +-
 programs/msiexec/msiexec.c   | 104 +----------------------------------
 2 files changed, 4 insertions(+), 102 deletions(-)

diff --git a/programs/msiexec/Makefile.in b/programs/msiexec/Makefile.in
index 22815a00f8d..2ddd27248fd 100644
--- a/programs/msiexec/Makefile.in
+++ b/programs/msiexec/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = msiexec.exe
 APPMODE   = -mconsole
-IMPORTS   = msi ole32 advapi32 user32 kernel32
+IMPORTS   = msi shell32 ole32 advapi32 user32 kernel32
 EXTRALIBS = $(LIBUNICODE)
 
 C_SRCS = \
diff --git a/programs/msiexec/msiexec.c b/programs/msiexec/msiexec.c
index 809b38fb58b..d6372165399 100644
--- a/programs/msiexec/msiexec.c
+++ b/programs/msiexec/msiexec.c
@@ -25,6 +25,7 @@
 #include <msi.h>
 #include <objbase.h>
 #include <stdio.h>
+#include <shellapi.h>
 
 #include "wine/debug.h"
 #include "wine/unicode.h"
@@ -210,14 +211,6 @@ static DWORD msi_atou(LPCWSTR str)
 	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 */
 static BOOL msi_strequal(LPCWSTR str1, LPCSTR str2)
 {
@@ -316,97 +309,6 @@ static DWORD DoDllUnregisterServer(LPCWSTR DllName)
 	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 )
 {
 	LONG r;
@@ -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);
 		if( r == ERROR_SUCCESS )
 		{
-			process_args(buf, pargc, pargv);
+			*pargv = CommandLineToArgvW(buf, pargc);
 			ret = TRUE;
 		}
 	}
@@ -471,7 +373,7 @@ int main(int argc, char **argv)
 	LPWSTR *argvW = NULL;
 
 	/* 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
-- 
GitLab