/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#include <windows.h>
#include <tchar.h>
#include <corecrt_startup.h>

#ifndef _UNICODE
#include <mbctype.h>
#endif

#define SPACECHAR _T(' ')
#define DQUOTECHAR _T('\"')

extern IMAGE_DOS_HEADER __ImageBase;

int _tmain (int, _TCHAR **, _TCHAR **);
int _tmain (int      __UNUSED_PARAM(argc),
           _TCHAR ** __UNUSED_PARAM(argv),
           _TCHAR ** __UNUSED_PARAM(envp))
{
  HINSTANCE hInstance;
  _TCHAR *lpCmdLine;
  DWORD nShowCmd;

  hInstance = (HINSTANCE) &__ImageBase;

#ifdef _UNICODE
  lpCmdLine = _wcmdln;
#else
  lpCmdLine = _acmdln;
#endif
  if (lpCmdLine)
    {
      BOOL inDoubleQuote = FALSE;
      while (*lpCmdLine > SPACECHAR || (*lpCmdLine && inDoubleQuote))
        {
          if (*lpCmdLine == DQUOTECHAR)
            inDoubleQuote = !inDoubleQuote;
#ifndef _UNICODE
          if (_ismbblead (*lpCmdLine))
            {
              if (lpCmdLine[1])
                ++lpCmdLine;
            }
#endif
          ++lpCmdLine;
        }
      while (*lpCmdLine && (*lpCmdLine <= SPACECHAR))
        lpCmdLine++;
    }
  else
    lpCmdLine = _TEXT("");

  {
    STARTUPINFO StartupInfo;
    GetStartupInfo (&StartupInfo);
    if (StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
      nShowCmd = StartupInfo.wShowWindow;
    else
      nShowCmd = SW_SHOWDEFAULT;
  }

  return _tWinMain (hInstance, NULL, lpCmdLine, nShowCmd);
}
