/*
 *  Copyright (C) 2009 Patrick Gansterer (paroga@paroga.com)
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library General Public License for more details.
 *
 *  You should have received a copy of the GNU Library General Public License
 *  along with this library; see the file COPYING.LIB.  If not, write to
 *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 *  Boston, MA 02110-1301, USA.
 *
 */

#include "config.h"
#include <wtf/Vector.h>
#include <winbase.h>
#include <winnls.h>
#include <wtf/UnusedParam.h>

int main(int argc, char** argv);

static inline char* convertToUtf8(LPCWSTR widecharString, int length)
{
    int requiredSize = WideCharToMultiByte(CP_UTF8, 0, widecharString, length, 0, 0, 0, 0);
    char* multibyteString = new char[requiredSize + 1];

    WideCharToMultiByte(CP_UTF8, 0, widecharString, length, multibyteString, requiredSize, 0, 0);
    multibyteString[requiredSize] = '\0';

    return multibyteString;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    UNUSED_PARAM(hInstance);
    UNUSED_PARAM(hPrevInstance);
    UNUSED_PARAM(nCmdShow);

    Vector<char*> arguments;
    TCHAR buffer[MAX_PATH];

    int length = GetModuleFileNameW(0, buffer, MAX_PATH);
    arguments.append(convertToUtf8(buffer, length));

    WCHAR* commandLine = lpCmdLine;
    while (commandLine[0] != '\0') {
        int commandLineLength = 1;
        WCHAR endChar = ' ';

        while (commandLine[0] == ' ')
            ++commandLine;

        if (commandLine[0] == '\"') {
            ++commandLine;
            endChar = '\"';
        }

        while (commandLine[commandLineLength] != endChar && commandLine[commandLineLength] != '\0')
            ++commandLineLength;

        arguments.append(convertToUtf8(commandLine, commandLineLength));

        commandLine += commandLineLength;
        if (endChar != ' ' && commandLine[0] != '\0')
            ++commandLine;
    }

    int res = main(arguments.size(), arguments.data());

    for (size_t i = 0; i < arguments.size(); i++)
        delete arguments[i];

    return res;
}
