# HG changeset patch # User John W. Eaton # Date 1345758822 14400 # Node ID a44e4a08fc55098d96489354f98cbe5808d05fdb # Parent 6ec6ddebb1a6dffd3599cca1ce21313c560e2b8d perform fewer actions before starting GUI * octave.cc (forced_line_editing, read_history_file, command_line_path, echo_executing_commands, doc_cache_file, exec_path, image_path, info_file, info_program, no_window_system, texi_macros_file): New file-scope static variables. (octave_process_command_line): New function. Process command line and set octave_cmdline_argc, octave_cmdline_argv, forced_line_editing, and read_history_file here, not in octave_initialize_interpreter. (octave_initialize_interpreter): Perform actions for command line options here instead of in command option processing loop in octave_process_command_line. (octave_main): Call octave_process_command_line. * octave.h (octave_process_command_line): Provide decl. * main.cc, main-cli.cc (main): Call octave_process_command_line. * main.cc (main): If not starting GUI, call octave_initialize_interpreter before calling octave_execute_interpreter. * main-cli.cc (main): Call octave_initialize_interpreter before calling octave_execute_interpreter. * octave-main-thread.cc (octave_main_thread::run): Likewise. diff -r 6ec6ddebb1a6 -r a44e4a08fc55 libgui/src/octave-adapter/octave-main-thread.cc --- a/libgui/src/octave-adapter/octave-main-thread.cc Thu Aug 23 15:08:19 2012 -0400 +++ b/libgui/src/octave-adapter/octave-main-thread.cc Thu Aug 23 17:53:42 2012 -0400 @@ -39,6 +39,11 @@ octave_main_thread::run () { setlocale (LC_ALL, "en_US.UTF-8"); + emit ready (); + + octave_initialize_interpreter (octave_cmdline_argc, octave_cmdline_argv, + octave_embedded); + octave_execute_interpreter (); } diff -r 6ec6ddebb1a6 -r a44e4a08fc55 libinterp/octave.cc --- a/libinterp/octave.cc Thu Aug 23 15:08:19 2012 -0400 +++ b/libinterp/octave.cc Thu Aug 23 17:53:42 2012 -0400 @@ -128,6 +128,51 @@ // (--no-gui) static bool no_gui_option = false; +// If TRUE, force readline command line editing. +// (--line-editing) +static bool forced_line_editing = false; + +// If TRUE, initialize history list from saved history file. +// (--no-history; -H) +static bool read_history_file = true; + +// The value of "path" specified on the command line. +// (--path; -p) +static std::string command_line_path; + +// Flags used to determine what commands should be echoed when they are +// parsed and executed. +// (--echo-commands; -x) +static int echo_executing_commands = 0; + +// The file used for the doc string cache. +// (--doc-cache-file) +static std::string doc_cache_file; + +// The value for "EXEC_PATH" specified on the command line. +// (--exec-path) +static std::string exec_path; + +// The value for "IMAGE_PATH" specified on the command line. +// (--image-path) +static std::string image_path; + +// The value for "info_file" specified on the command line. +// (--info-file) +static std::string info_file; + +// The value for "info_program" specified on the command line. +// (--info-program) +static std::string info_program; + +// If TRUE, ignore the window system even if it is available. +// (--no-window-system) +static bool no_window_system = false; + +// The value for "texi_macros_file" specified on the command line. +// (--texi-macros-file) +static std::string texi_macros_file; + // Usage message static const char *usage_string = "octave [-HVdfhiqvx] [--debug] [--echo-commands] [--eval CODE]\n\ @@ -654,19 +699,184 @@ int octave_main (int argc, char **argv, int embedded) { + octave_process_command_line (argc, argv); + octave_initialize_interpreter (argc, argv, embedded); return octave_execute_interpreter (); } +void +octave_process_command_line (int argc, char **argv) +{ + octave_cmdline_argc = argc; + octave_cmdline_argv = argv; + + while (true) + { + int long_idx; + + int optc = getopt_long (argc, argv, short_opts, long_opts, &long_idx); + + if (optc < 0) + break; + + switch (optc) + { + case '?': + // Unrecognized option. getopt_long already printed a + // message about that, so we will just print the usage string + // and exit. + usage (); + break; + + case 'H': + read_history_file = false; + break; + + case 'V': + verbose_flag = true; + break; + + case 'd': + // This is the same as yydebug in parse.y. + octave_debug++; + break; + + case 'f': + read_init_files = false; + read_site_files = false; + break; + + case 'h': + verbose_usage (); + break; + + case 'i': + forced_interactive = true; + break; + + case 'p': + if (optarg) + command_line_path = optarg; + break; + + case 'q': + inhibit_startup_message = true; + break; + + case 'x': + echo_executing_commands + = (ECHO_SCRIPTS | ECHO_FUNCTIONS | ECHO_CMD_LINE); + break; + + case 'v': + print_version_and_exit (); + break; + + case DOC_CACHE_FILE_OPTION: + if (optarg) + doc_cache_file = optarg; + break; + + case EVAL_OPTION: + if (optarg) + { + if (code_to_eval.empty ()) + code_to_eval = optarg; + else + code_to_eval += std::string (" ") + optarg; + } + break; + + case EXEC_PATH_OPTION: + if (optarg) + exec_path = optarg; + break; + + case FORCE_GUI_OPTION: + force_gui_option = true; + break; + + case IMAGE_PATH_OPTION: + if (optarg) + image_path = optarg; + break; + + case INFO_FILE_OPTION: + if (optarg) + info_file = optarg; + break; + + case INFO_PROG_OPTION: + if (optarg) + info_program = optarg; + break; + + case LINE_EDITING_OPTION: + forced_line_editing = true; + break; + + case NO_INIT_FILE_OPTION: + read_init_files = false; + break; + + case NO_GUI_OPTION: + no_gui_option = true; + break; + + case NO_INIT_PATH_OPTION: + set_initial_path = false; + break; + + case NO_LINE_EDITING_OPTION: + line_editing = false; + break; + + case NO_SITE_FILE_OPTION: + read_site_files = 0; + break; + + case NO_WINDOW_SYSTEM_OPTION: + no_window_system = true; + break; + + case PERSIST_OPTION: + persist = true; + break; + + case TEXI_MACROS_FILE_OPTION: + if (optarg) + texi_macros_file = optarg; + break; + + case TRADITIONAL_OPTION: + traditional = true; + break; + + default: + // getopt_long should print a message about unrecognized + // options and return '?', which is handled above. So if we + // end up here, it is because there was an option but we + // forgot to handle it. That should be fatal. + panic_impossible (); + break; + } + } + + if (force_gui_option && no_gui_option) + { + error ("error: only one of --force-gui and --no-gui may be used"); + usage (); + } +} + // EMBEDDED is declared int instead of bool because this function is // declared extern "C". void octave_initialize_interpreter (int argc, char **argv, int embedded) { - octave_cmdline_argc = argc; - octave_cmdline_argv = argv; octave_embedded = embedded; octave_env::set_program_name (argv[0]); @@ -718,170 +928,36 @@ install_builtins (); - bool forced_line_editing = false; - - bool read_history_file = true; - - while (true) - { - int long_idx; - - int optc = getopt_long (argc, argv, short_opts, long_opts, &long_idx); - - if (optc < 0) - break; + if (! read_history_file) + bind_internal_variable ("saving_history", false); - switch (optc) - { - case '?': - // Unrecognized option. getopt_long already printed a - // message about that, so we will just print the usage string - // and exit. - usage (); - break; - - case 'H': - read_history_file = false; - bind_internal_variable ("saving_history", false); - break; - - case 'V': - verbose_flag = true; - break; - - case 'd': - // This is the same as yydebug in parse.y. - octave_debug++; - break; + if (! command_line_path.empty ()) + load_path::set_command_line_path (command_line_path); - case 'f': - read_init_files = false; - read_site_files = false; - break; - - case 'h': - verbose_usage (); - break; - - case 'i': - forced_interactive = true; - break; - - case 'p': - if (optarg) - load_path::set_command_line_path (optarg); - break; + if (echo_executing_commands) + bind_internal_variable ("echo_executing_commands", + echo_executing_commands); - case 'q': - inhibit_startup_message = true; - break; - - case 'x': - { - double tmp = (ECHO_SCRIPTS | ECHO_FUNCTIONS | ECHO_CMD_LINE); - bind_internal_variable ("echo_executing_commands", tmp); - } - break; - - case 'v': - print_version_and_exit (); - break; - - case DOC_CACHE_FILE_OPTION: - if (optarg) - bind_internal_variable ("doc_cache_file", optarg); - break; + if (! doc_cache_file.empty ()) + bind_internal_variable ("doc_cache_file", doc_cache_file); - case EVAL_OPTION: - if (optarg) - { - if (code_to_eval.empty ()) - code_to_eval = optarg; - else - code_to_eval += std::string (" ") + optarg; - } - break; - - case EXEC_PATH_OPTION: - if (optarg) - set_exec_path (optarg); - break; - - case FORCE_GUI_OPTION: - force_gui_option = true; - break; + if (! exec_path.empty ()) + set_exec_path (exec_path); - case IMAGE_PATH_OPTION: - if (optarg) - set_image_path (optarg); - break; - - case INFO_FILE_OPTION: - if (optarg) - bind_internal_variable ("info_file", optarg); - break; + if (! image_path.empty ()) + set_exec_path (image_path); - case INFO_PROG_OPTION: - if (optarg) - bind_internal_variable ("info_program", optarg); - break; - - case LINE_EDITING_OPTION: - forced_line_editing = true; - break; - - case NO_INIT_FILE_OPTION: - read_init_files = false; - break; + if (! info_file.empty ()) + bind_internal_variable ("info_file", info_file); - case NO_GUI_OPTION: - no_gui_option = true; - break; - - case NO_INIT_PATH_OPTION: - set_initial_path = false; - break; - - case NO_LINE_EDITING_OPTION: - line_editing = false; - break; - - case NO_SITE_FILE_OPTION: - read_site_files = 0; - break; - - case NO_WINDOW_SYSTEM_OPTION: - display_info::no_window_system (); - break; - - case PERSIST_OPTION: - persist = true; - break; + if (! info_program.empty ()) + bind_internal_variable ("info_program", info_program); - case TEXI_MACROS_FILE_OPTION: - if (optarg) - bind_internal_variable ("texi_macros_file", optarg); - break; - - case TRADITIONAL_OPTION: - traditional = true; - break; + if (no_window_system) + display_info::no_window_system (); - default: - // getopt_long should print a message about unrecognized - // options and return '?', which is handled above. So if we - // end up here, it is because there was an option but we - // forgot to handle it. That should be fatal. - panic_impossible (); - break; - } - } - - if (force_gui_option && no_gui_option) - { - error ("error: only one of --force-gui and --no-gui may be used"); - usage (); - } + if (! texi_macros_file.empty ()) + bind_internal_variable ("texi_macros_file", texi_macros_file); // Make sure we clean up when we exit. Also allow users to register // functions. If we don't have atexit or on_exit, we're going to @@ -1034,7 +1110,13 @@ if (persist) return true; - if (! (interactive || forced_interactive)) + // If stdin is not a tty, then assume we are reading commands from a + // pipe or a redirected file and the GUI should not start. If this is + // not the case (for example, starting from a desktop "launcher" with + // no terminal) and you want to start the GUI, you may use the + // --force-gui option to start the GUI. + + if (! gnulib::isatty (fileno (stdin))) return false; // If we have code to eval or execute from a file, and we are going to diff -r 6ec6ddebb1a6 -r a44e4a08fc55 libinterp/octave.h --- a/libinterp/octave.h Thu Aug 23 15:08:19 2012 -0400 +++ b/libinterp/octave.h Thu Aug 23 17:53:42 2012 -0400 @@ -29,6 +29,8 @@ extern OCTINTERP_API int octave_main (int argc, char **argv, int embedded); +extern OCTINTERP_API void octave_process_command_line (int argc, char **argv); + extern OCTINTERP_API void octave_initialize_interpreter (int argc, char **argv, int embedded); diff -r 6ec6ddebb1a6 -r a44e4a08fc55 src/main-cli.cc --- a/src/main-cli.cc Thu Aug 23 15:08:19 2012 -0400 +++ b/src/main-cli.cc Thu Aug 23 17:53:42 2012 -0400 @@ -29,6 +29,8 @@ int main (int argc, char **argv) { + octave_process_command_line (argc, argv); + octave_initialize_interpreter (argc, argv, 0); return octave_execute_interpreter (); diff -r 6ec6ddebb1a6 -r a44e4a08fc55 src/main.cc --- a/src/main.cc Thu Aug 23 15:08:19 2012 -0400 +++ b/src/main.cc Thu Aug 23 17:53:42 2012 -0400 @@ -30,10 +30,18 @@ int main (int argc, char **argv) { - octave_initialize_interpreter (argc, argv, 0); + int retval = 0; + + octave_process_command_line (argc, argv); if (octave_starting_gui ()) - return octave_start_gui (argc, argv); + retval = octave_start_gui (argc, argv); + else + { + octave_initialize_interpreter (argc, argv, 0); - return octave_execute_interpreter (); + retval = octave_execute_interpreter (); + } + + return retval; }