James Hawkins : advpack: Rewrite get_parameter to be able to handle an empty parameter.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Apr 7 08:05:24 CDT 2006


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

Author: James Hawkins <truiken at gmail.com>
Date:   Fri Apr  7 05:20:58 2006 -0500

advpack: Rewrite get_parameter to be able to handle an empty parameter.

---

 dlls/advpack/files.c |   47 +++++++++++++++++++++++------------------------
 1 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/dlls/advpack/files.c b/dlls/advpack/files.c
index 072434f..565c600 100644
--- a/dlls/advpack/files.c
+++ b/dlls/advpack/files.c
@@ -452,29 +452,23 @@ HRESULT WINAPI DelNodeW( LPCWSTR pszFile
     return ret;
 }
 
-/* returns the parameter at dwIndex in a list of parameters
- * separated by the cSeparator character
- */
-static LPSTR get_parameter(LPSTR szParameters, CHAR cSeparator, DWORD dwIndex)
+/* sequentially returns pointers to parameters in a parameter list
+ * returns NULL if the parameter is empty, e.g. one,,three  */
+static LPSTR get_parameter(LPSTR *params, char separator)
 {
-    LPSTR szParam = NULL;
-    DWORD i = 0;
+    LPSTR token = *params;
 
-    while (*szParameters && i < dwIndex)
-    {
-        if (*szParameters == cSeparator)
-            i++;
+    if (!*params)
+        return NULL;
 
-        szParameters++;
-    }
+    *params = strchr(*params, separator);
+    if (*params)
+        *(*params)++ = '\0';
 
-    if (!*szParameters)
+    if (!*token)
         return NULL;
 
-    szParam = HeapAlloc(GetProcessHeap(), 0, lstrlenA(szParameters));
-    lstrcpyA(szParam, szParameters);
-
-    return szParam;
+    return token;
 }
 
 /***********************************************************************
@@ -495,21 +489,26 @@ static LPSTR get_parameter(LPSTR szParam
 HRESULT WINAPI DelNodeRunDLL32A( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show )
 {
     LPSTR szFilename, szFlags;
-    DWORD dwFlags;
+    LPSTR cmdline_copy, cmdline_ptr;
+    DWORD dwFlags = 0;
     HRESULT res;
 
-    TRACE("(%s)\n", debugstr_a(cmdline));
+    TRACE("(%p, %p, %s, %i)\n", hWnd, hInst, debugstr_a(cmdline), show);
+
+    cmdline_copy = HeapAlloc(GetProcessHeap(), 0, lstrlenA(cmdline) + 1);
+    cmdline_ptr = cmdline_copy;
+    lstrcpyA(cmdline_copy, cmdline);
 
     /* get the parameters at indexes 0 and 1 respectively */
-    szFilename = get_parameter(cmdline, ',', 0);
-    szFlags = get_parameter(cmdline, ',', 1);
+    szFilename = get_parameter(&cmdline_ptr, ',');
+    szFlags = get_parameter(&cmdline_ptr, ',');
 
-    dwFlags = atol(szFlags);
+    if (szFlags)
+        dwFlags = atol(szFlags);
 
     res = DelNodeA(szFilename, dwFlags);
 
-    HeapFree(GetProcessHeap(), 0, szFilename);
-    HeapFree(GetProcessHeap(), 0, szFlags);
+    HeapFree(GetProcessHeap(), 0, cmdline_copy);
 
     return res;
 }




More information about the wine-cvs mailing list