Mercurial > octave-nkf
diff src/pager.cc @ 1:78fd87e624cb
[project @ 1993-08-08 01:13:40 by jwe]
Initial revision
author | jwe |
---|---|
date | Sun, 08 Aug 1993 01:13:40 +0000 |
parents | |
children | b6b4d8c513fe |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pager.cc Sun Aug 08 01:13:40 1993 +0000 @@ -0,0 +1,150 @@ +// pager.cc -*- C++ -*- +/* + +Copyright (C) 1992, 1993 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include <iostream.h> +#include <strstream.h> +#include <stdlib.h> + +#include "procstream.h" + +#include "user-prefs.h" +#include "input.h" +#include "pager.h" + +// Where we stash output headed for the screen. +static ostrstream *pager_buf; + +static int +line_count (char *s) +{ + int count = 0; + if (s != (char *) NULL) + { + char c; + while ((c = *s++) != '\0') + if (c == '\n') + count++; + } + return count; +} + +/* + * For now, use the variables from readline. It already handles + * SIGWINCH, so these values have a good chance of being correct even + * if the window changes size (they will be wrong if, for example, the + * luser changes the window size while the pager is running, and the + * signal is handled by the pager instead of us. + */ +int +terminal_columns (void) +{ + extern int screenwidth; + return screenwidth > 0 ? screenwidth : 80; +} + +int +terminal_rows (void) +{ + extern int screenheight; + return screenheight > 0 ? screenheight : 24; +} + +void +initialize_pager (void) +{ + delete pager_buf; + pager_buf = new ostrstream (); +} + +void +maybe_page_output (ostrstream& msg_buf) +{ + msg_buf << ends; + + char *message = msg_buf.str (); + + if (interactive + && user_pref.page_screen_output + && user_pref.pager_binary != (char *) NULL) + { + *pager_buf << message; + delete [] message; + } + else + { + cout << message; + cout.flush (); + delete [] message; + } +} + +void +flush_output_to_pager (void) +{ + *pager_buf << ends; + + char *message = pager_buf->str (); + + if (message == (char *) NULL || *message == '\0') + { + delete [] message; + initialize_pager (); + return; + } + + int nlines = line_count (message); + + if (nlines > terminal_rows () - 2) + { + char *pgr = user_pref.pager_binary; + if (pgr != (char *) NULL) + { + oprocstream pager_stream (pgr); + if (pager_stream) + { + pager_stream << message; + pager_stream.flush (); + + delete [] message; + initialize_pager (); + return; + } + } + } + + cout << message; + cout.flush (); + delete [] message; + initialize_pager (); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; page-delimiter: "^/\\*" *** +;;; End: *** +*/