binutils-gdb/gdb/pager.h
Tom Tromey c269d90a49 Introduce wrapped_file
Simon pointed out that timestamped_file probably needed to implement a
few more methods.  This patch introduces a new file-wrapping file that
forwards most of its calls, making it simpler to implement new such
files.  It also converts timestamped_file and pager_file to use it.

Regression tested on x86-64 Fedora 34.
2022-04-05 14:46:14 -06:00

92 lines
2.4 KiB
C++

/* Output pager for gdb
Copyright (C) 2021, 2022 Free Software Foundation, Inc.
This file is part of GDB.
This program 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 3 of the License, or
(at your option) any later version.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */
#ifndef GDB_PAGER_H
#define GDB_PAGER_H
#include "ui-file.h"
/* A ui_file that implements output paging and unfiltered output. */
class pager_file : public wrapped_file
{
public:
/* Create a new pager_file. The new object takes ownership of
STREAM. */
explicit pager_file (ui_file *stream)
: wrapped_file (stream)
{
}
~pager_file ()
{
delete m_stream;
}
DISABLE_COPY_AND_ASSIGN (pager_file);
void write (const char *buf, long length_buf) override;
void puts (const char *str) override;
void write_async_safe (const char *buf, long length_buf) override
{
m_stream->write_async_safe (buf, length_buf);
}
void emit_style_escape (const ui_file_style &style) override;
void reset_style () override;
void flush () override;
void wrap_here (int indent) override;
void puts_unfiltered (const char *str) override
{
flush_wrap_buffer ();
m_stream->puts_unfiltered (str);
}
private:
void prompt_for_continue ();
/* Flush the wrap buffer to STREAM, if necessary. */
void flush_wrap_buffer ();
/* Contains characters which are waiting to be output (they have
already been counted in chars_printed). */
std::string m_wrap_buffer;
/* Amount to indent by if the wrap occurs. */
int m_wrap_indent = 0;
/* Column number on the screen where wrap_buffer begins, or 0 if
wrapping is not in effect. */
int m_wrap_column = 0;
/* The style applied at the time that wrap_here was called. */
ui_file_style m_wrap_style;
/* This is temporarily set when paging. This will cause some
methods to change their behavior to ignore the wrap buffer. */
bool m_paging = false;
};
#endif /* GDB_PAGER_H */