forked from KolibriOS/kolibrios
145 lines
4.3 KiB
C
145 lines
4.3 KiB
C
|
/*
|
||
|
Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
|
||
|
|
||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||
|
*/
|
||
|
/*---------------------------------------------------------------------------
|
||
|
|
||
|
wcemain.c
|
||
|
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
#define __WCEMAIN_C /* identifies this source module */
|
||
|
#define UNZIP_INTERNAL
|
||
|
#include "unzip.h" /* includes, typedefs, macros, prototypes, etc. */
|
||
|
|
||
|
|
||
|
int WINAPI WinMain( HINSTANCE hInstance,
|
||
|
HINSTANCE hPrevInstance,
|
||
|
LPTSTR lpCmdLine,
|
||
|
int nCmdShow)
|
||
|
{
|
||
|
int r;
|
||
|
int i;
|
||
|
LPTSTR argArray[10];
|
||
|
int argBuffSize = lstrlen(lpCmdLine) + 1;
|
||
|
void* argBuff = malloc(argBuffSize);
|
||
|
char* argv[10];
|
||
|
|
||
|
|
||
|
/* Parse the command line into an argument array */
|
||
|
int argc = 0;
|
||
|
LPTSTR argPtr = lpCmdLine;
|
||
|
LPTSTR nextParam = NULL;
|
||
|
LPTSTR closingQuote = NULL;
|
||
|
unsigned short* endOfCmdLine = lpCmdLine + lstrlen(lpCmdLine);
|
||
|
TCHAR Blank = _T(' ');
|
||
|
|
||
|
/* Init the arrays */
|
||
|
for (i = 0; i < 10;i++)
|
||
|
argArray[i];
|
||
|
for (i = 0;i < 10;i++)
|
||
|
argv[i] = NULL;
|
||
|
|
||
|
|
||
|
/* Create the argument array, we have to convert this from wchar
|
||
|
* (unicode) to mbcs (single byte ascii)
|
||
|
*/
|
||
|
while(argPtr != NULL)
|
||
|
{
|
||
|
/* Look for the first non-blank character */
|
||
|
while((memcmp(argPtr, &Blank, sizeof(TCHAR)) == 0) &&
|
||
|
(argPtr < endOfCmdLine))
|
||
|
{
|
||
|
argPtr++;
|
||
|
}
|
||
|
|
||
|
/* Check for quote enclosed strings for extended file names. */
|
||
|
if (argPtr[0] == _T('"') &&
|
||
|
/* Look for closing quote */
|
||
|
(closingQuote = _tcschr(argPtr + 1, _T('"'))) != NULL)
|
||
|
{
|
||
|
/* Clear the enclosing quotes */
|
||
|
*argPtr++ = _T('\0');
|
||
|
*closingQuote = _T('\0');
|
||
|
nextParam = closingQuote + 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nextParam = argPtr;
|
||
|
}
|
||
|
|
||
|
/* Set the parameter */
|
||
|
argArray[argc] = argPtr;
|
||
|
argc++;
|
||
|
|
||
|
/* Look for the next blank */
|
||
|
argPtr = _tcschr(nextParam, _T(' '));
|
||
|
if (argPtr != NULL)
|
||
|
{
|
||
|
/* Terminate the parameter and
|
||
|
point after the blank to the keyword */
|
||
|
*argPtr++ = _T('\0');
|
||
|
}
|
||
|
}
|
||
|
/* Add one to the arg count for null terminator. */
|
||
|
argc++;
|
||
|
|
||
|
#ifndef UNICODE
|
||
|
/* No need to convert the parameters */
|
||
|
argv = (char*)argArray;
|
||
|
#else
|
||
|
/* Unicode so we need to convert the parameters to ascii. */
|
||
|
/* Get the storage we need to hold the converted data */
|
||
|
if (argBuff != NULL)
|
||
|
{
|
||
|
|
||
|
int i;
|
||
|
char* ptrArgBuff;
|
||
|
|
||
|
/* Clear the asci argument buffer */
|
||
|
memset(argBuff,'\0',argBuffSize);
|
||
|
/* Command line parameters give ? */
|
||
|
if (argBuffSize == 0)
|
||
|
{
|
||
|
/* No so just set the first argumen in the array to
|
||
|
* the buffer */
|
||
|
argv[0] = argBuff;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
argv[0] = (char*)_T("UnzipCE.exe");
|
||
|
/* We have some storage build an asci version of
|
||
|
* the command parameters */
|
||
|
ptrArgBuff = (char*)argBuff;
|
||
|
for(i = 0; i < (argc - 1); i++)
|
||
|
{
|
||
|
/* convert the data */
|
||
|
int paramLength = lstrlen(argArray[i]);
|
||
|
int bytesWritten =
|
||
|
WideCharToMultiByte(CP_ACP, 0,
|
||
|
argArray[i], paramLength,
|
||
|
ptrArgBuff, paramLength,
|
||
|
NULL, NULL);
|
||
|
if (bytesWritten == 0)
|
||
|
{
|
||
|
/* Conversion failed ser return value and exit loop */
|
||
|
r = (int)GetLastError();
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
argv[i + 1] = ptrArgBuff;
|
||
|
/* Point to the next area of the buffer */
|
||
|
ptrArgBuff = ptrArgBuff + bytesWritten + 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif /* UNICODE */
|
||
|
return MAIN(argc, argv);
|
||
|
}
|