| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- // Filename: p3dPythonMain.cxx
- // Created by: drose (29Aug09)
- //
- ////////////////////////////////////////////////////////////////////
- //
- // 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."
- //
- ////////////////////////////////////////////////////////////////////
- #include "run_p3dpython.h"
- #include <iostream>
- #include <sstream>
- #include <vector>
- #include <assert.h>
- #include <string.h> // strrchr
- using namespace std;
- #if defined(_WIN32) && defined(NON_CONSOLE)
- // On Windows, we may need to build p3dpythonw.exe, a non-console
- // version of this program.
- // We'll wrap the main() function with our own startup WinMain().
- #define main local_main
- int main(int argc, char *argv[]);
- // 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;
- 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) {
- 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();
- 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());
- return main(argv.size(), &argv[0]);
- }
- #endif // NON_CONSOLE
- ////////////////////////////////////////////////////////////////////
- // Function: main
- // Description: This is a trivial main() function that invokes
- // P3DPythonRun. It's used to build p3dpython.exe,
- // which is the preferred way to run Python in a child
- // process, as a separate executable.
- ////////////////////////////////////////////////////////////////////
- int
- main(int argc, char *argv[]) {
- const char *program_name = argv[0];
- const char *archive_file = NULL;
- const char *input_handle_str = NULL;
- const char *output_handle_str = NULL;
- const char *interactive_console_str = NULL;
- if (argc > 1) {
- archive_file = argv[1];
- }
- if (argc > 2) {
- input_handle_str = argv[2];
- }
- if (argc > 3) {
- output_handle_str = argv[3];
- }
- if (argc > 4) {
- interactive_console_str = argv[4];
- }
- if (archive_file == NULL || *archive_file == '\0') {
- cerr << "No archive filename specified on command line.\n";
- return 1;
- }
- FHandle input_handle = invalid_fhandle;
- if (input_handle_str != NULL && *input_handle_str) {
- stringstream stream(input_handle_str);
- stream >> input_handle;
- if (!stream) {
- input_handle = invalid_fhandle;
- }
- }
- FHandle output_handle = invalid_fhandle;
- if (output_handle_str != NULL && *output_handle_str) {
- stringstream stream(output_handle_str);
- stream >> output_handle;
- if (!stream) {
- output_handle = invalid_fhandle;
- }
- }
- bool interactive_console = false;
- if (interactive_console_str != NULL && *interactive_console_str) {
- stringstream stream(interactive_console_str);
- int flag;
- stream >> flag;
- if (!stream.fail()) {
- interactive_console = (flag != 0);
- }
- }
- int status = run_p3dpython(program_name, archive_file, input_handle,
- output_handle, NULL, interactive_console);
- if (status != 0) {
- cerr << "Failure on startup.\n";
- }
- return status;
- }
|