extrac32: Add command-line parsing.

This commit is contained in:
Ilya Shpigor 2009-11-03 10:55:12 +03:00 committed by Alexandre Julliard
parent 95c525e21b
commit e7cc2868aa
2 changed files with 87 additions and 1 deletions

View File

@ -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

View File

@ -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;
}