Home | History | Annotate | Download | only in os-win32
      1 /*
      2  *  Copyright (C) 2009 Patrick Gansterer (paroga (at) paroga.com)
      3  *
      4  *  This library is free software; you can redistribute it and/or
      5  *  modify it under the terms of the GNU Library General Public
      6  *  License as published by the Free Software Foundation; either
      7  *  version 2 of the License, or (at your option) any later version.
      8  *
      9  *  This library is distributed in the hope that it will be useful,
     10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  *  Library General Public License for more details.
     13  *
     14  *  You should have received a copy of the GNU Library General Public License
     15  *  along with this library; see the file COPYING.LIB.  If not, write to
     16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  *  Boston, MA 02110-1301, USA.
     18  *
     19  */
     20 
     21 #include "config.h"
     22 #include "Vector.h"
     23 #include <winbase.h>
     24 #include <winnls.h>
     25 #include <wtf/UnusedParam.h>
     26 
     27 int main(int argc, char** argv);
     28 
     29 static inline char* convertToUtf8(LPCWSTR widecharString, int length)
     30 {
     31     int requiredSize = WideCharToMultiByte(CP_UTF8, 0, widecharString, length, 0, 0, 0, 0);
     32     char* multibyteString = new char[requiredSize + 1];
     33 
     34     WideCharToMultiByte(CP_UTF8, 0, widecharString, length, multibyteString, requiredSize, 0, 0);
     35     multibyteString[requiredSize] = '\0';
     36 
     37     return multibyteString;
     38 }
     39 
     40 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
     41 {
     42     UNUSED_PARAM(hInstance);
     43     UNUSED_PARAM(hPrevInstance);
     44     UNUSED_PARAM(nCmdShow);
     45 
     46     Vector<char*> arguments;
     47     TCHAR buffer[MAX_PATH];
     48 
     49     int length = GetModuleFileNameW(0, buffer, MAX_PATH);
     50     arguments.append(convertToUtf8(buffer, length));
     51 
     52     WCHAR* commandLine = lpCmdLine;
     53     while (commandLine[0] != '\0') {
     54         int commandLineLength = 1;
     55         WCHAR endChar = ' ';
     56 
     57         while (commandLine[0] == ' ')
     58             ++commandLine;
     59 
     60         if (commandLine[0] == '\"') {
     61             ++commandLine;
     62             endChar = '\"';
     63         }
     64 
     65         while (commandLine[commandLineLength] != endChar && commandLine[commandLineLength] != '\0')
     66             ++commandLineLength;
     67 
     68         arguments.append(convertToUtf8(commandLine, commandLineLength));
     69 
     70         commandLine += commandLineLength;
     71         if (endChar != ' ' && commandLine[0] != '\0')
     72             ++commandLine;
     73     }
     74 
     75     int res = main(arguments.size(), arguments.data());
     76 
     77     for (size_t i = 0; i < arguments.size(); i++)
     78         delete arguments[i];
     79 
     80     return res;
     81 }
     82