open_toontown_panda3d/direct/src/plugin_standalone/panda3dWinMain.cxx

77 lines
1.7 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file panda3dWinMain.cxx
* @author drose
* @date 2009-10-23
*/
#include "panda3d.h"
// On Windows, we may need to build panda3dw.exe, a non-console version of
// this program.
// Returns a newly-allocated string representing the quoted argument beginning
// at p. Advances p to the first character following the close quote.
static char *
parse_quoted_arg(char *&p) {
char quote = *p;
++p;
std::string result;
while (*p != '\0' && *p != quote) {
// TODO: handle escape characters? Not sure if we need to.
result += *p;
++p;
}
if (*p == quote) {
++p;
}
return strdup(result.c_str());
}
// Returns a newly-allocated string representing the unquoted argument
// beginning at p. Advances p to the first whitespace following the argument.
static char *
parse_unquoted_arg(char *&p) {
std::string result;
while (*p != '\0' && !isspace(*p)) {
result += *p;
++p;
}
return strdup(result.c_str());
}
int WINAPI
WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
char *command_line = GetCommandLine();
std::vector<char *> argv;
char *p = command_line;
while (*p != '\0') {
if (*p == '"') {
char *arg = parse_quoted_arg(p);
argv.push_back(arg);
} else {
char *arg = parse_unquoted_arg(p);
argv.push_back(arg);
}
// Skip whitespace.
while (*p != '\0' && isspace(*p)) {
++p;
}
}
assert(!argv.empty());
Panda3D program(false);
return program.run_command_line(argv.size(), &argv[0]);
}