James Hawkins : msiexec: Also support options using a hyphen.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 14 10:50:24 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 8c3fc3a889bd6c5e0dc965d0aec4dad9fc5937db
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=8c3fc3a889bd6c5e0dc965d0aec4dad9fc5937db

Author: James Hawkins <truiken at gmail.com>
Date:   Thu Jul 13 14:46:51 2006 -0700

msiexec: Also support options using a hyphen.

---

 programs/msiexec/msiexec.c |   56 ++++++++++++++++++++++++++++++--------------
 1 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/programs/msiexec/msiexec.c b/programs/msiexec/msiexec.c
index d637216..e63727b 100644
--- a/programs/msiexec/msiexec.c
+++ b/programs/msiexec/msiexec.c
@@ -229,6 +229,16 @@ static BOOL msi_strequal(LPCWSTR str1, L
 	return (ret != CSTR_EQUAL);
 }
 
+/* prefix is hyphen or dash, and str1 is the same as str2, ignoring case */
+static BOOL msi_option_equal(LPCWSTR str1, LPCSTR str2)
+{
+    if (str1[0] != '/' && str1[0] != '-')
+        return TRUE;
+
+    /* skip over the hyphen or slash */
+    return msi_strequal(str1 + 1, str2);
+}
+
 /* str2 is at the beginning of str1, ignoring case */
 static BOOL msi_strprefix(LPCWSTR str1, LPCSTR str2)
 {
@@ -247,6 +257,16 @@ static BOOL msi_strprefix(LPCWSTR str1, 
 	return (ret != CSTR_EQUAL);
 }
 
+/* prefix is hyphen or dash, and str2 is at the beginning of str1, ignoring case */
+static BOOL msi_option_prefix(LPCWSTR str1, LPCSTR str2)
+{
+    if (str1[0] != '/' && str1[0] != '-')
+        return TRUE;
+
+    /* skip over the hyphen or slash */
+    return msi_strprefix(str1 + 1, str2);
+}
+
 static VOID *LoadProc(LPCWSTR DllName, LPCSTR ProcName, HMODULE* DllHandle)
 {
 	VOID* (*proc)(void);
@@ -381,7 +401,7 @@ int main(int argc, char **argv)
 	 *  We do that before starting to process the real commandline,
 	 * then overwrite the commandline again.
 	 */
-	if(!msi_strequal(argvW[1], "/@"))
+	if(!msi_option_equal(argvW[1], "@"))
 	{
 		if(!process_args_from_reg( argvW[2], &argc, &argvW ))
 			return 1;
@@ -391,15 +411,15 @@ int main(int argc, char **argv)
 	{
 		WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 
-		if (!msi_strequal(argvW[i], "/regserver"))
+		if (!msi_option_equal(argvW[i], "regserver"))
 		{
 			FunctionRegServer = TRUE;
 		}
-		else if (!msi_strequal(argvW[i], "/unregserver") || !msi_strequal(argvW[i], "/unregister"))
+		else if (!msi_option_equal(argvW[i], "unregserver") || !msi_option_equal(argvW[i], "unregister"))
 		{
 			FunctionUnregServer = TRUE;
 		}
-		else if(!msi_strprefix(argvW[i], "/i"))
+		else if(!msi_option_prefix(argvW[i], "i"))
 		{
 			LPWSTR argvWi = argvW[i];
 			FunctionInstall = TRUE;
@@ -415,7 +435,7 @@ int main(int argc, char **argv)
 			}
 			PackageName = argvWi;
 		}
-		else if(!msi_strequal(argvW[i], "/a"))
+		else if(!msi_option_equal(argvW[i], "a"))
 		{
 			FunctionInstall = TRUE;
 			FunctionInstallAdmin = TRUE;
@@ -427,7 +447,7 @@ int main(int argc, char **argv)
 			PackageName = argvW[i];
 			StringListAppend(&property_list, ActionAdmin);
 		}
-		else if(!msi_strprefix(argvW[i], "/f"))
+		else if(!msi_option_prefix(argvW[i], "f"))
 		{
 			int j;
 			int len = lstrlenW(argvW[i]);
@@ -495,7 +515,7 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			PackageName = argvW[i];
 		}
-		else if(!msi_strequal(argvW[i], "/x"))
+		else if(!msi_option_equal(argvW[i], "x"))
 		{
 			FunctionInstall = TRUE;
 			i++;
@@ -505,7 +525,7 @@ int main(int argc, char **argv)
 			PackageName = argvW[i];
 			StringListAppend(&property_list, RemoveAll);
 		}
-		else if(!msi_strprefix(argvW[i], "/j"))
+		else if(!msi_option_prefix(argvW[i], "j"))
 		{
 			int j;
 			int len = lstrlenW(argvW[i]);
@@ -553,7 +573,7 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			PackageName = argvW[i];
 		}
-		else if(!msi_strequal(argvW[i], "/t"))
+		else if(!msi_option_equal(argvW[i], "t"))
 		{
 			i++;
 			if(i >= argc)
@@ -561,7 +581,7 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			StringListAppend(&transform_list, argvW[i]);
 		}
-		else if(!msi_strequal(argvW[i], "/g"))
+		else if(!msi_option_equal(argvW[i], "g"))
 		{
 			i++;
 			if(i >= argc)
@@ -569,7 +589,7 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			Language = msi_atou(argvW[i]);
 		}
-		else if(!msi_strprefix(argvW[i], "/l"))
+		else if(!msi_option_prefix(argvW[i], "l"))
 		{
 			int j;
 			int len = lstrlenW(argvW[i]);
@@ -660,7 +680,7 @@ int main(int argc, char **argv)
 				ExitProcess(1);
 			}
 		}
-		else if(!msi_strequal(argvW[i], "/p"))
+		else if(!msi_option_equal(argvW[i], "p"))
 		{
 			FunctionPatch = TRUE;
 			i++;
@@ -669,7 +689,7 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			PatchFileName = argvW[i];
 		}
-		else if(!msi_strprefix(argvW[i], "/q"))
+		else if(!msi_option_prefix(argvW[i], "q"))
 		{
 			if(lstrlenW(argvW[i]) == 2 || !msi_strequal(argvW[i]+2, "n"))
 			{
@@ -710,7 +730,7 @@ int main(int argc, char **argv)
 					 wine_dbgstr_w(argvW[i]+2));
 			}
 		}
-		else if(!msi_strequal(argvW[i], "/y"))
+		else if(!msi_option_equal(argvW[i], "y"))
 		{
 			FunctionDllRegisterServer = TRUE;
 			i++;
@@ -719,7 +739,7 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			DllName = argvW[i];
 		}
-		else if(!msi_strequal(argvW[i], "/z"))
+		else if(!msi_option_equal(argvW[i], "z"))
 		{
 			FunctionDllUnregisterServer = TRUE;
 			i++;
@@ -728,16 +748,16 @@ int main(int argc, char **argv)
 			WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
 			DllName = argvW[i];
 		}
-		else if(!msi_strequal(argvW[i], "/h") || !msi_strequal(argvW[i], "/?"))
+		else if(!msi_option_equal(argvW[i], "h") || !msi_option_equal(argvW[i], "?"))
 		{
 			ShowUsage(0);
 		}
-		else if(!msi_strequal(argvW[i], "/m"))
+		else if(!msi_option_equal(argvW[i], "m"))
 		{
 			FunctionUnknown = TRUE;
 			WINE_FIXME("Unknown parameter /m\n");
 		}
-		else if(!msi_strequal(argvW[i], "/D"))
+		else if(!msi_option_equal(argvW[i], "D"))
 		{
 			FunctionUnknown = TRUE;
 			WINE_FIXME("Unknown parameter /D\n");




More information about the wine-cvs mailing list