unzip/wince/wcemain.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);
}