Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.   Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
  3.  
  4.   See the accompanying file LICENSE, version 2009-Jan-02 or later
  5.   (the contents of which are also included in unzip.h) for terms of use.
  6.   If, for some reason, all these files are missing, the Info-ZIP license
  7.   also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
  8. */
  9. /*---------------------------------------------------------------------------
  10.  
  11.   wcemain.c
  12.  
  13.   ---------------------------------------------------------------------------*/
  14.  
  15. #define __WCEMAIN_C     /* identifies this source module */
  16. #define UNZIP_INTERNAL
  17. #include "unzip.h"      /* includes, typedefs, macros, prototypes, etc. */
  18.  
  19.  
  20. int WINAPI WinMain( HINSTANCE hInstance,
  21.                     HINSTANCE hPrevInstance,
  22.                     LPTSTR    lpCmdLine,
  23.                     int       nCmdShow)
  24. {
  25.     int r;
  26.     int i;
  27.     LPTSTR argArray[10];
  28.     int argBuffSize = lstrlen(lpCmdLine) + 1;
  29.     void* argBuff = malloc(argBuffSize);
  30.     char* argv[10];
  31.  
  32.  
  33.     /* Parse the command line into an argument array */
  34.     int argc = 0;
  35.     LPTSTR argPtr = lpCmdLine;
  36.     LPTSTR nextParam = NULL;
  37.     LPTSTR closingQuote = NULL;
  38.     unsigned short* endOfCmdLine = lpCmdLine + lstrlen(lpCmdLine);
  39.     TCHAR Blank = _T(' ');
  40.  
  41.     /* Init the arrays */
  42.     for (i = 0; i < 10;i++)
  43.         argArray[i];
  44.     for (i = 0;i < 10;i++)
  45.         argv[i] = NULL;
  46.  
  47.  
  48.     /* Create the argument array, we have to convert this from wchar
  49.      * (unicode) to mbcs (single byte ascii)
  50.      */
  51.     while(argPtr != NULL)
  52.     {
  53.         /* Look for the first non-blank character */
  54.         while((memcmp(argPtr, &Blank, sizeof(TCHAR)) == 0) &&
  55.               (argPtr < endOfCmdLine))
  56.         {
  57.             argPtr++;
  58.         }
  59.  
  60.         /* Check for quote enclosed strings for extended file names. */
  61.         if (argPtr[0] == _T('"') &&
  62.             /* Look for closing quote */
  63.             (closingQuote = _tcschr(argPtr + 1, _T('"'))) != NULL)
  64.         {
  65.             /* Clear the enclosing quotes */
  66.             *argPtr++ = _T('\0');
  67.             *closingQuote = _T('\0');
  68.             nextParam = closingQuote + 1;
  69.         }
  70.         else
  71.         {
  72.             nextParam = argPtr;
  73.         }
  74.  
  75.         /* Set the parameter */
  76.         argArray[argc] = argPtr;
  77.         argc++;
  78.  
  79.         /* Look for the next blank */
  80.         argPtr = _tcschr(nextParam, _T(' '));
  81.         if (argPtr != NULL)
  82.         {
  83.             /* Terminate the parameter and
  84.                point after the blank to the keyword */
  85.             *argPtr++ = _T('\0');
  86.         }
  87.     }
  88.     /* Add one to the arg count for null terminator. */
  89.     argc++;
  90.  
  91. #ifndef UNICODE
  92.     /* No need to convert the parameters */
  93.     argv = (char*)argArray;
  94. #else
  95.     /* Unicode so we need to convert the parameters to ascii. */
  96.     /* Get the storage we need to hold the converted data */
  97.     if (argBuff != NULL)
  98.     {
  99.  
  100.         int i;
  101.         char* ptrArgBuff;
  102.  
  103.         /* Clear the asci argument buffer */
  104.         memset(argBuff,'\0',argBuffSize);
  105.         /* Command line parameters give ? */
  106.         if (argBuffSize == 0)
  107.         {
  108.             /* No so just set the first argumen in the array to
  109.              * the buffer */
  110.             argv[0] = argBuff;
  111.         }
  112.         else
  113.         {
  114.             argv[0] = (char*)_T("UnzipCE.exe");
  115.             /* We have some storage build an asci version of
  116.              * the command parameters */
  117.             ptrArgBuff = (char*)argBuff;
  118.             for(i = 0; i < (argc - 1); i++)
  119.             {
  120.                 /* convert the data */
  121.                 int paramLength = lstrlen(argArray[i]);
  122.                 int bytesWritten =
  123.                     WideCharToMultiByte(CP_ACP, 0,
  124.                                         argArray[i], paramLength,
  125.                                         ptrArgBuff, paramLength,
  126.                                         NULL, NULL);
  127.                 if (bytesWritten == 0)
  128.                 {
  129.                     /* Conversion failed ser return value and exit loop */
  130.                     r = (int)GetLastError();
  131.                     break;
  132.                 }
  133.                 else
  134.                 {
  135.                     argv[i + 1] = ptrArgBuff;
  136.                     /* Point to the next area of the buffer */
  137.                     ptrArgBuff = ptrArgBuff + bytesWritten + 1;
  138.                 }
  139.             }
  140.         }
  141.     }
  142. #endif /* UNICODE */
  143.     return MAIN(argc, argv);
  144. }
  145.