2009-05-02 05:04:19 -04:00
|
|
|
#include "master.hpp"
|
|
|
|
|
2010-01-18 07:12:04 -05:00
|
|
|
/*
|
|
|
|
Windows argument parsing ported to work on
|
|
|
|
int main(int argc, wchar_t **argv).
|
|
|
|
|
|
|
|
Based on MinGW's public domain char** version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
VM_C_API int parse_tokens(wchar_t *string, wchar_t ***tokens, int length)
|
|
|
|
{
|
|
|
|
/* Extract whitespace- and quotes- delimited tokens from the given string
|
|
|
|
and put them into the tokens array. Returns number of tokens
|
|
|
|
extracted. Length specifies the current size of tokens[].
|
|
|
|
THIS METHOD MODIFIES string. */
|
|
|
|
|
|
|
|
const wchar_t *whitespace = L" \t\r\n";
|
|
|
|
wchar_t *tokenEnd = 0;
|
|
|
|
const wchar_t *quoteCharacters = L"\"\'";
|
|
|
|
wchar_t *end = string + wcslen(string);
|
|
|
|
|
|
|
|
if (string == NULL)
|
|
|
|
return length;
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
const wchar_t *q;
|
|
|
|
/* Skip over initial whitespace. */
|
|
|
|
string += wcsspn(string, whitespace);
|
|
|
|
if (*string == '\0')
|
|
|
|
break;
|
|
|
|
|
|
|
|
for (q = quoteCharacters; *q; ++q)
|
|
|
|
{
|
|
|
|
if (*string == *q)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (*q)
|
|
|
|
{
|
|
|
|
/* Token is quoted. */
|
|
|
|
wchar_t quote = *string++;
|
|
|
|
tokenEnd = wcschr(string, quote);
|
|
|
|
/* If there is no endquote, the token is the rest of the string. */
|
|
|
|
if (!tokenEnd)
|
|
|
|
tokenEnd = end;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tokenEnd = string + wcscspn(string, whitespace);
|
|
|
|
}
|
|
|
|
|
|
|
|
*tokenEnd = '\0';
|
|
|
|
|
|
|
|
{
|
|
|
|
wchar_t **new_tokens;
|
|
|
|
int newlen = length + 1;
|
|
|
|
new_tokens = (wchar_t **)realloc (*tokens, sizeof (wchar_t**) * newlen);
|
|
|
|
if (!new_tokens)
|
|
|
|
{
|
|
|
|
/* Out of memory. */
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
*tokens = new_tokens;
|
|
|
|
(*tokens)[length] = string;
|
|
|
|
length = newlen;
|
|
|
|
}
|
|
|
|
if (tokenEnd == end)
|
|
|
|
break;
|
|
|
|
string = tokenEnd + 1;
|
|
|
|
}
|
|
|
|
return length;
|
|
|
|
}
|
|
|
|
|
|
|
|
VM_C_API void parse_args(int *argc, wchar_t ***argv, wchar_t *cmdlinePtrW)
|
|
|
|
{
|
|
|
|
int cmdlineLen = 0;
|
|
|
|
|
|
|
|
if (!cmdlinePtrW)
|
|
|
|
cmdlineLen = 0;
|
|
|
|
else
|
|
|
|
cmdlineLen = wcslen(cmdlinePtrW);
|
|
|
|
|
|
|
|
/* gets realloc()'d later */
|
|
|
|
*argc = 0;
|
|
|
|
*argv = (wchar_t **)malloc (sizeof (wchar_t**));
|
|
|
|
|
|
|
|
if (!*argv)
|
|
|
|
ExitProcess(1);
|
|
|
|
|
|
|
|
#ifdef WINCE
|
|
|
|
wchar_t cmdnameBufW[MAX_UNICODE_PATH];
|
|
|
|
|
|
|
|
/* argv[0] is the path of invoked program - get this from CE. */
|
|
|
|
cmdnameBufW[0] = 0;
|
|
|
|
GetModuleFileNameW(NULL, cmdnameBufW, sizeof (cmdnameBufW)/sizeof (cmdnameBufW[0]));
|
|
|
|
|
|
|
|
(*argv)[0] = wcsdup(cmdnameBufW);
|
|
|
|
if(!(*argv[0]))
|
|
|
|
ExitProcess(1);
|
|
|
|
/* Add one to account for argv[0] */
|
|
|
|
(*argc)++;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (cmdlineLen > 0)
|
|
|
|
{
|
|
|
|
wchar_t *string = wcsdup(cmdlinePtrW);
|
|
|
|
if(!string)
|
|
|
|
ExitProcess(1);
|
|
|
|
*argc = parse_tokens(string, argv, *argc);
|
|
|
|
if (*argc < 0)
|
|
|
|
ExitProcess(1);
|
|
|
|
}
|
|
|
|
(*argv)[*argc] = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-01-16 09:43:22 -05:00
|
|
|
int WINAPI WinMain(
|
2009-05-02 05:04:19 -04:00
|
|
|
HINSTANCE hInstance,
|
|
|
|
HINSTANCE hPrevInstance,
|
|
|
|
LPWSTR lpCmdLine,
|
|
|
|
int nCmdShow)
|
|
|
|
{
|
2010-01-16 09:43:22 -05:00
|
|
|
int __argc;
|
|
|
|
wchar_t **__argv;
|
|
|
|
factor::parse_args(&__argc, &__argv, lpCmdLine);
|
|
|
|
factor::init_globals();
|
2009-05-04 02:46:13 -04:00
|
|
|
factor::start_standalone_factor(__argc,(LPWSTR*)__argv);
|
2010-01-16 09:43:22 -05:00
|
|
|
|
2009-05-02 05:04:19 -04:00
|
|
|
// memory leak from malloc, wcsdup
|
|
|
|
return 0;
|
|
|
|
}
|