Martin Wilck : xcopy: Move command line parsing code into separate function .

Alexandre Julliard julliard at winehq.org
Wed Oct 27 12:50:58 CDT 2010


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

Author: Martin Wilck <Martin.Wilck at particle-dynamics.de>
Date:   Wed Oct 27 01:48:50 2010 +0200

xcopy: Move command line parsing code into separate function.

---

 programs/xcopy/xcopy.c |  153 +++++++++++++++++++++++++++--------------------
 programs/xcopy/xcopy.h |    1 +
 2 files changed, 89 insertions(+), 65 deletions(-)

diff --git a/programs/xcopy/xcopy.c b/programs/xcopy/xcopy.c
index 4572374..ed736db 100644
--- a/programs/xcopy/xcopy.c
+++ b/programs/xcopy/xcopy.c
@@ -49,6 +49,9 @@
 WINE_DEFAULT_DEBUG_CHANNEL(xcopy);
 
 /* Prototypes */
+static int XCOPY_ParseCommandLine(int argc, WCHAR **argvW,
+				  WCHAR *suppliedsource,
+				  WCHAR *supplieddestination, DWORD *flags);
 static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem,
                                    WCHAR *spec, DWORD flags);
 static int XCOPY_ProcessDestParm(WCHAR *supplieddestination, WCHAR *stem,
@@ -108,17 +111,6 @@ int wmain (int argc, WCHAR *argvW[])
     const WCHAR PROMPTSTR1[]  = {'/', 'Y', 0};
     const WCHAR PROMPTSTR2[]  = {'/', 'y', 0};
     const WCHAR COPYCMD[]  = {'C', 'O', 'P', 'Y', 'C', 'M', 'D', 0};
-    const WCHAR EXCLUDE[]  = {'E', 'X', 'C', 'L', 'U', 'D', 'E', ':', 0};
-
-    /*
-     * Parse the command line
-     */
-
-    /* Confirm at least one parameter */
-    if (argc < 2) {
-        XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARMS));
-        return RC_INITERROR;
-    }
 
     /* Preinitialize flags based on COPYCMD */
     if (GetEnvironmentVariableW(COPYCMD, copyCmd, MAXSTRING)) {
@@ -135,6 +127,88 @@ int wmain (int argc, WCHAR *argvW[])
        lose                                                                   */
     flags |= OPT_COPYHIDSYS;
 
+    /*
+     * Parse the command line
+     */
+    if ((rc = XCOPY_ParseCommandLine(argc, argvW, suppliedsource,
+				     supplieddestination, &flags)) != RC_OK) {
+	if (rc == RC_HELP)
+	    return RC_OK;
+	else
+	    return rc;
+    }
+
+    /* Trace out the supplied information */
+    WINE_TRACE("Supplied parameters:\n");
+    WINE_TRACE("Source      : '%s'\n", wine_dbgstr_w(suppliedsource));
+    WINE_TRACE("Destination : '%s'\n", wine_dbgstr_w(supplieddestination));
+
+    /* Extract required information from source specification */
+    rc = XCOPY_ProcessSourceParm(suppliedsource, sourcestem, sourcespec, flags);
+    if (rc != RC_OK) return rc;
+
+    /* Extract required information from destination specification */
+    rc = XCOPY_ProcessDestParm(supplieddestination, destinationstem,
+                               destinationspec, sourcespec, flags);
+    if (rc != RC_OK) return rc;
+
+    /* Trace out the resulting information */
+    WINE_TRACE("Resolved parameters:\n");
+    WINE_TRACE("Source Stem : '%s'\n", wine_dbgstr_w(sourcestem));
+    WINE_TRACE("Source Spec : '%s'\n", wine_dbgstr_w(sourcespec));
+    WINE_TRACE("Dest   Stem : '%s'\n", wine_dbgstr_w(destinationstem));
+    WINE_TRACE("Dest   Spec : '%s'\n", wine_dbgstr_w(destinationspec));
+
+    /* Pause if necessary */
+    if (flags & OPT_PAUSE) {
+        DWORD count;
+        char pausestr[10];
+
+        XCOPY_wprintf(XCOPY_LoadMessage(STRING_PAUSE));
+        ReadFile (GetStdHandle(STD_INPUT_HANDLE), pausestr, sizeof(pausestr),
+                  &count, NULL);
+    }
+
+    /* Now do the hard work... */
+    rc = XCOPY_DoCopy(sourcestem, sourcespec,
+                destinationstem, destinationspec,
+                flags);
+
+    /* Clear up exclude list allocated memory */
+    while (excludeList) {
+        EXCLUDELIST *pos = excludeList;
+        excludeList = excludeList -> next;
+        HeapFree(GetProcessHeap(), 0, pos->name);
+        HeapFree(GetProcessHeap(), 0, pos);
+    }
+
+    /* Finished - print trailer and exit */
+    if (flags & OPT_SIMULATE) {
+        XCOPY_wprintf(XCOPY_LoadMessage(STRING_SIMCOPY), filesCopied);
+    } else if (!(flags & OPT_NOCOPY)) {
+        XCOPY_wprintf(XCOPY_LoadMessage(STRING_COPY), filesCopied);
+    }
+    if (rc == RC_OK && filesCopied == 0) rc = RC_NOFILES;
+    return rc;
+
+}
+
+/* =========================================================================
+   XCOPY_ParseCommandLine - Parses the command line
+   ========================================================================= */
+static int XCOPY_ParseCommandLine(int argc, WCHAR **argvW,
+				  WCHAR *suppliedsource,
+				  WCHAR *supplieddestination, DWORD *pflags)
+{
+    const WCHAR EXCLUDE[]  = {'E', 'X', 'C', 'L', 'U', 'D', 'E', ':', 0};
+    DWORD flags = *pflags;
+
+    /* Confirm at least one parameter */
+    if (argc < 2) {
+        XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARMS));
+        return RC_INITERROR;
+    }
+
     /* Skip first arg, which is the program name */
     argvW++;
 
@@ -241,7 +315,7 @@ int wmain (int argc, WCHAR *argvW[])
             case '-': if (toupper(argvW[0][2])=='Y')
                           flags &= ~OPT_NOPROMPT; break;
             case '?': XCOPY_wprintf(XCOPY_LoadMessage(STRING_HELP));
-                      return RC_OK;
+                      return RC_HELP;
             default:
                 WINE_TRACE("Unhandled parameter '%s'\n", wine_dbgstr_w(*argvW));
                 XCOPY_wprintf(XCOPY_LoadMessage(STRING_INVPARM), *argvW);
@@ -255,59 +329,8 @@ int wmain (int argc, WCHAR *argvW[])
     if (supplieddestination[0] == 0x00)
         lstrcpyW(supplieddestination, wchr_dot);
 
-    /* Trace out the supplied information */
-    WINE_TRACE("Supplied parameters:\n");
-    WINE_TRACE("Source      : '%s'\n", wine_dbgstr_w(suppliedsource));
-    WINE_TRACE("Destination : '%s'\n", wine_dbgstr_w(supplieddestination));
-
-    /* Extract required information from source specification */
-    rc = XCOPY_ProcessSourceParm(suppliedsource, sourcestem, sourcespec, flags);
-    if (rc != RC_OK) return rc;
-
-    /* Extract required information from destination specification */
-    rc = XCOPY_ProcessDestParm(supplieddestination, destinationstem,
-                               destinationspec, sourcespec, flags);
-    if (rc != RC_OK) return rc;
-
-    /* Trace out the resulting information */
-    WINE_TRACE("Resolved parameters:\n");
-    WINE_TRACE("Source Stem : '%s'\n", wine_dbgstr_w(sourcestem));
-    WINE_TRACE("Source Spec : '%s'\n", wine_dbgstr_w(sourcespec));
-    WINE_TRACE("Dest   Stem : '%s'\n", wine_dbgstr_w(destinationstem));
-    WINE_TRACE("Dest   Spec : '%s'\n", wine_dbgstr_w(destinationspec));
-
-    /* Pause if necessary */
-    if (flags & OPT_PAUSE) {
-        DWORD count;
-        char pausestr[10];
-
-        XCOPY_wprintf(XCOPY_LoadMessage(STRING_PAUSE));
-        ReadFile (GetStdHandle(STD_INPUT_HANDLE), pausestr, sizeof(pausestr),
-                  &count, NULL);
-    }
-
-    /* Now do the hard work... */
-    rc = XCOPY_DoCopy(sourcestem, sourcespec,
-                destinationstem, destinationspec,
-                flags);
-
-    /* Clear up exclude list allocated memory */
-    while (excludeList) {
-        EXCLUDELIST *pos = excludeList;
-        excludeList = excludeList -> next;
-        HeapFree(GetProcessHeap(), 0, pos->name);
-        HeapFree(GetProcessHeap(), 0, pos);
-    }
-
-    /* Finished - print trailer and exit */
-    if (flags & OPT_SIMULATE) {
-        XCOPY_wprintf(XCOPY_LoadMessage(STRING_SIMCOPY), filesCopied);
-    } else if (!(flags & OPT_NOCOPY)) {
-        XCOPY_wprintf(XCOPY_LoadMessage(STRING_COPY), filesCopied);
-    }
-    if (rc == RC_OK && filesCopied == 0) rc = RC_NOFILES;
-    return rc;
-
+    *pflags = flags;
+    return RC_OK;
 }
 
 
diff --git a/programs/xcopy/xcopy.h b/programs/xcopy/xcopy.h
index 1c93395..3e9644e 100644
--- a/programs/xcopy/xcopy.h
+++ b/programs/xcopy/xcopy.h
@@ -26,6 +26,7 @@
 #define RC_CTRLC      2
 #define RC_INITERROR  4
 #define RC_WRITEERROR 5
+#define RC_HELP       6
 
 #define OPT_ASSUMEDIR    0x00000001
 #define OPT_RECURSIVE    0x00000002




More information about the wine-cvs mailing list