Ilya Shpigor : extrac32: Add command-line parsing.

Alexandre Julliard julliard at winehq.org
Wed Nov 4 10:26:26 CST 2009


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

Author: Ilya Shpigor <shpigor at etersoft.ru>
Date:   Tue Nov  3 10:55:12 2009 +0300

extrac32: Add command-line parsing.

---

 programs/extrac32/Makefile.in |    2 +-
 programs/extrac32/extrac32.c  |   86 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 1 deletions(-)

diff --git a/programs/extrac32/Makefile.in b/programs/extrac32/Makefile.in
index 470c196..31aa7e0 100644
--- a/programs/extrac32/Makefile.in
+++ b/programs/extrac32/Makefile.in
@@ -5,7 +5,7 @@ VPATH     = @srcdir@
 MODULE    = extrac32.exe
 APPMODE   = -mwindows -municode
 EXTRADEFS = -DWINE_NO_UNICODE
-IMPORTS   = kernel32
+IMPORTS   = shell32 user32 kernel32
 
 C_SRCS = \
 	extrac32.c
diff --git a/programs/extrac32/extrac32.c b/programs/extrac32/extrac32.c
index 7e8fbed..e6fefc9 100644
--- a/programs/extrac32/extrac32.c
+++ b/programs/extrac32/extrac32.c
@@ -2,6 +2,7 @@
  * Extract - Wine-compatible program for extract *.cab files.
  *
  * Copyright 2007 Etersoft (Lyutin Anatoly)
+ * Copyright 2009 Ilya Shpigor
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -19,6 +20,7 @@
  */
 
 #include <windows.h>
+#include <shellapi.h>
 
 #include "wine/unicode.h"
 #include "wine/debug.h"
@@ -27,5 +29,89 @@ WINE_DEFAULT_DEBUG_CHANNEL(extrac32);
 
 int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show)
 {
+    LPWSTR *argv;
+    int argc;
+    int i;
+    WCHAR check, cmd = 0;
+    WCHAR path[MAX_PATH];
+    WCHAR backslash[] = {'\\',0};
+    LPCWSTR cabfile = NULL;
+
+    path[0] = 0;
+    argv = CommandLineToArgvW(cmdline, &argc);
+
+    if(!argv)
+    {
+        WINE_ERR("Bad command line arguments\n");
+        return 0;
+    }
+
+    /* Parse arguments */
+    for(i = 0; i < argc; i++)
+    {
+        /* Get cabfile */
+        if ((argv[i][0] != '/') && !cabfile)
+        {
+            cabfile = argv[i];
+            continue;
+        }
+        /* Get parameters for commands */
+        check = toupperW( argv[i][1] );
+        switch(check)
+        {
+            case 'A':
+                WINE_FIXME("/A not implemented\n");
+                break;
+            case 'Y':
+                WINE_FIXME("/Y not implemented\n");
+                break;
+            case 'L':
+                if ((i + 1) >= argc) return 0;
+                if (!GetFullPathNameW(argv[++i], MAX_PATH, path, NULL))
+                    return 0;
+                break;
+            case 'C':
+                if (cmd) return 0;
+                if ((i + 2) >= argc) return 0;
+                cmd = check;
+                cabfile = argv[++i];
+                if (!GetFullPathNameW(argv[++i], MAX_PATH, path, NULL))
+                    return 0;
+                break;
+            case 'E':
+            case 'D':
+                if (cmd) return 0;
+                cmd = check;
+                break;
+            default:
+                return 0;
+        }
+    }
+
+    if (!cabfile)
+        return 0;
+
+    if (!path[0])
+        GetCurrentDirectoryW(MAX_PATH, path);
+
+    lstrcatW(path, backslash);
+
+    /* Execute the specified command */
+    switch(cmd)
+    {
+        case 'C':
+            /* Copy file */
+            WINE_FIXME("/C not implemented\n");
+            break;
+        case 'E':
+            /* Extract CAB archive */
+            WINE_FIXME("/E not implemented\n");
+            break;
+        case 0:
+        case 'D':
+            /* Display CAB archive */
+            WINE_FIXME("/D not implemented\n");
+            break;
+    }
     return 0;
 }




More information about the wine-cvs mailing list