# HG changeset patch # User jwe # Date 811568991 0 # Node ID df589c97e14011a4f967a357630cbc54eed8503b # Parent 067f11a467427c247d41a55066988de290d7b1ab [project @ 1995-09-20 03:49:51 by jwe] diff -r 067f11a46742 -r df589c97e140 src/dirfns.cc --- a/src/dirfns.cc Wed Sep 20 03:41:58 1995 +0000 +++ b/src/dirfns.cc Wed Sep 20 03:49:51 1995 +0000 @@ -62,6 +62,7 @@ #include "sysdir.h" #include "tree-const.h" #include "tree-plot.h" +#include "unwind-prot.h" #include "utils.h" extern "C" @@ -427,21 +428,27 @@ } ls_buf << ends; + char *ls_command = ls_buf.str (); + delete [] ls_command; - char *ls_command = ls_buf.str (); + iprocstream *cmd = new iprocstream (ls_command); - iprocstream cmd (ls_command); + add_unwind_protect (cleanup_iprocstream, cmd); - char ch; - ostrstream output_buf; - while (cmd.get (ch)) - output_buf.put (ch); + if (cmd && *cmd) + { + int ch; + ostrstream output_buf; + while ((ch = cmd->get ()) != EOF) + output_buf << (char) ch; + output_buf << ends; - output_buf << ends; + maybe_page_output (output_buf); + } + else + error ("couldn't start process for ls!"); - maybe_page_output (output_buf); - - delete [] ls_command; + run_unwind_protect (); DELETE_ARGV; diff -r 067f11a46742 -r df589c97e140 src/octave.cc --- a/src/octave.cc Wed Sep 20 03:41:58 1995 +0000 +++ b/src/octave.cc Wed Sep 20 03:49:51 1995 +0000 @@ -1024,38 +1024,47 @@ } else { - iprocstream cmd (tmp_str); + iprocstream *cmd = new iprocstream (tmp_str); - ostrstream output_buf; + add_unwind_protect (cleanup_iprocstream, cmd); + + int status = 127; - char ch; - while (cmd.get (ch)) - output_buf.put (ch); + if (cmd && *cmd) + { + ostrstream output_buf; - output_buf << ends; + char ch; + while (cmd->get (ch)) + output_buf.put (ch); - int status = cmd.close (); + output_buf << ends; + + status = cmd->close (); - // The value in status is as returned by waitpid. If the - // process exited normally, extract the actual exit status of - // the command. Otherwise, return 127 as a failure code. + // The value in status is as returned by waitpid. If the + // process exited normally, extract the actual exit status of + // the command. Otherwise, return 127 as a failure code. - if ((status & 0xff) == 0) - status = (status & 0xff00) >> 8; - else - status = 127; + if ((status & 0xff) == 0) + status = (status & 0xff00) >> 8; - if (nargout > 0 || nargin > 1) - { - char *msg = output_buf.str (); + if (nargout > 0 || nargin > 1) + { + char *msg = output_buf.str (); - retval(1) = (double) status; - retval(0) = msg; + retval(1) = (double) status; + retval(0) = msg; - delete [] msg; + delete [] msg; + } + else + maybe_page_output (output_buf); } else - maybe_page_output (output_buf); + error ("unable to start subprocess for `%s'", tmp_str); + + run_unwind_protect (); } return retval; diff -r 067f11a46742 -r df589c97e140 src/pager.cc --- a/src/pager.cc Wed Sep 20 03:41:58 1995 +0000 +++ b/src/pager.cc Wed Sep 20 03:49:51 1995 +0000 @@ -42,6 +42,7 @@ #include "pager.h" #include "sighandlers.h" #include "tree-const.h" +#include "unwind-prot.h" #include "user-prefs.h" #include "utils.h" #include "variables.h" @@ -146,21 +147,29 @@ char *pgr = user_pref.pager_binary; if (pgr) { - oprocstream pager_stream (pgr); - if (pager_stream) + volatile sig_handler *old_sigint_handler; + old_sigint_handler = octave_set_signal_handler (SIGINT, SIG_IGN); + + oprocstream *pager_stream = new oprocstream (pgr); + + add_unwind_protect (cleanup_oprocstream, pager_stream); + + int output_paged = 0; + if (pager_stream && *pager_stream) { - volatile sig_handler *old_sigint_handler; - old_sigint_handler = octave_set_signal_handler (SIGINT, SIG_IGN); - - pager_stream << message; + output_paged = 1; + *pager_stream << message; delete [] message; - pager_stream.flush (); - pager_stream.close (); + pager_stream->flush (); + pager_stream->close (); + } - octave_set_signal_handler (SIGINT, old_sigint_handler); + run_unwind_protect (); - return; - } + octave_set_signal_handler (SIGINT, old_sigint_handler); + + if (output_paged) + return; } } diff -r 067f11a46742 -r df589c97e140 src/pt-plot.cc --- a/src/pt-plot.cc Wed Sep 20 03:41:58 1995 +0000 +++ b/src/pt-plot.cc Wed Sep 20 03:49:51 1995 +0000 @@ -77,7 +77,7 @@ static SLStack tmp_files; // Pipe to gnuplot. -static oprocstream plot_stream; +static oprocstream *plot_stream = 0; // Use shortest possible abbreviations to minimize trouble caused by // gnuplot's fixed-length command line buffer. @@ -111,7 +111,13 @@ { static int initialized = 0; - if (! plot_stream.is_open ()) + if (plot_stream && ! *plot_stream) + { + delete plot_stream; + plot_stream = 0; + } + + if (! plot_stream) { initialized = 0; @@ -120,8 +126,15 @@ char *plot_prog = user_pref.gnuplot_binary; if (plot_prog) { - plot_stream.open (plot_prog); - if (! plot_stream.is_open ()) + plot_stream = new oprocstream (plot_prog); + + if (plot_stream && ! *plot_stream) + { + delete plot_stream; + plot_stream = 0; + } + + if (! plot_stream) { warning ("plot: unable to open pipe to `%s'", plot_prog); @@ -138,20 +151,26 @@ { last_chance: - plot_stream.open ("gnuplot"); + plot_stream = new oprocstream ("gnuplot"); - if (! plot_stream.is_open ()) + if (plot_stream && ! *plot_stream) + { + delete plot_stream; + plot_stream = 0; + } + + if (! plot_stream) error ("plot: unable to open pipe to `%s'", plot_prog); } } - if (! initialized) + if (! error_state && plot_stream && *plot_stream && ! initialized) { initialized = 1; - plot_stream << "set data style lines\n"; + *plot_stream << "set data style lines\n"; if (gnuplot_terminal_type) - plot_stream << "set term " << gnuplot_terminal_type << "\n"; + *plot_stream << "set term " << gnuplot_terminal_type << "\n"; } } @@ -162,7 +181,7 @@ extern int pipe_handler_error_count; - if (! plot_stream.is_open ()) + if (! (plot_stream && *plot_stream)) { open_plot_stream (); @@ -182,14 +201,14 @@ error ("replot: no previous plot"); else { - plot_stream << cmd; + *plot_stream << cmd; if (! (is_replot || is_splot || is_plot) && plot_line_count > 0 && user_pref.automatic_replot) - plot_stream << GNUPLOT_COMMAND_REPLOT << "\n"; + *plot_stream << GNUPLOT_COMMAND_REPLOT << "\n"; - plot_stream.flush (); + plot_stream->flush (); pipe_handler_error_count = 0; } @@ -1071,8 +1090,11 @@ void close_plot_stream (void) { - if (plot_stream.is_open ()) - plot_stream.close (); + if (plot_stream) + { + delete plot_stream; + plot_stream = 0; + } plot_line_count = 0; } @@ -1080,7 +1102,7 @@ void do_external_plotter_cd (const char *newdir) { - if (plot_stream.is_open ()) + if (plot_stream && *plot_stream) { ostrstream plot_buf; plot_buf << "cd \"" << newdir << "\"\n" << ends;