From e7cc2868aadd110a99f91b68737c48545505e09c Mon Sep 17 00:00:00 2001 From: Ilya Shpigor Date: Tue, 3 Nov 2009 10:55:12 +0300 Subject: [PATCH] extrac32: Add command-line parsing. --- programs/extrac32/Makefile.in | 2 +- programs/extrac32/extrac32.c | 86 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/programs/extrac32/Makefile.in b/programs/extrac32/Makefile.in index 470c196a9c..31aa7e0aaa 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 7e8fbedc75..e6fefc9fc3 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 +#include #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; }