obstack_init (&chunk_obstack);
}
+// Release resources owned by an output buffer at the end of lifetime.
+
+output_buffer::~output_buffer ()
+{
+ obstack_free (&chunk_obstack, obstack_finish (&chunk_obstack));
+ obstack_free (&formatted_obstack, obstack_finish (&formatted_obstack));
+}
+
/* A pointer to the formatted diagnostic message. */
#define pp_formatted_text_data(PP) \
- ((const char *) obstack_base ((PP)->buffer->obstack))
+ ((const char *) obstack_base (pp_buffer (PP)->obstack))
/* Format an integer given by va_arg (ARG, type-specifier T) where
type-specifier is a precision modifier as indicated by PREC. F is
pp_write_text_to_stream (pretty_printer *pp)
{
const char *text = pp_formatted_text (pp);
- fputs (text, pp->buffer->stream);
+ fputs (text, pp_buffer (pp)->stream);
pp_clear_output_area (pp);
}
{
const char *text = pp_formatted_text (pp);
const char *p = text;
- FILE *fp = pp->buffer->stream;
+ FILE *fp = pp_buffer (pp)->stream;
while (*p)
{
static inline void
pp_append_r (pretty_printer *pp, const char *start, int length)
{
- obstack_grow (pp->buffer->obstack, start, length);
- pp->buffer->line_length += length;
+ obstack_grow (pp_buffer (pp)->obstack, start, length);
+ pp_buffer (pp)->line_length += length;
}
/* Insert enough spaces into the output area of PRETTY-PRINTER to bring
A format string can have at most 30 arguments. */
/* Formatting phases 1 and 2: render TEXT->format_spec plus
- TEXT->args_ptr into a series of chunks in PP->buffer->args[].
+ TEXT->args_ptr into a series of chunks in pp_buffer (PP)->args[].
Phase 3 is in pp_format_text. */
void
pp_format (pretty_printer *pp, text_info *text)
{
- output_buffer *buffer = pp->buffer;
+ output_buffer *buffer = pp_buffer (pp);
const char *p;
const char **args;
struct chunk_info *new_chunk_array;
args = new_chunk_array->args;
/* Formatting phase 1: split up TEXT->format_spec into chunks in
- PP->buffer->args[]. Even-numbered chunks are to be output
+ pp_buffer (PP)->args[]. Even-numbered chunks are to be output
verbatim, odd-numbered chunks are format specifiers.
%m, %%, %<, %>, and %' are replaced with the appropriate text at
this point. */
{
pp_write_text_to_stream (pp);
pp_clear_state (pp);
- fflush (pp->buffer->stream);
+ fflush (pp_buffer (pp)->stream);
}
/* Sets the number of maximum characters per line PRETTY-PRINTER can
void
pp_clear_output_area (pretty_printer *pp)
{
- obstack_free (pp->buffer->obstack, obstack_base (pp->buffer->obstack));
- pp->buffer->line_length = 0;
+ obstack_free (pp_buffer (pp)->obstack,
+ obstack_base (pp_buffer (pp)->obstack));
+ pp_buffer (pp)->line_length = 0;
}
/* Set PREFIX for PRETTY-PRINTER. */
pp_set_prefix (this, p);
}
+pretty_printer::~pretty_printer ()
+{
+ buffer->~output_buffer ();
+ XDELETE (buffer);
+}
+
/* Append a string delimited by START and END to the output area of
PRETTY-PRINTER. No line wrapping is done. However, if beginning a
new line then emit PRETTY-PRINTER's prefix and skip any leading
pp_append_text (pretty_printer *pp, const char *start, const char *end)
{
/* Emit prefix and skip whitespace if we're starting a new line. */
- if (pp->buffer->line_length == 0)
+ if (pp_buffer (pp)->line_length == 0)
{
pp_emit_prefix (pp);
if (pp_is_wrapping_line (pp))
const char *
pp_formatted_text (pretty_printer *pp)
{
- obstack_1grow (pp->buffer->obstack, '\0');
+ obstack_1grow (pp_buffer (pp)->obstack, '\0');
return pp_formatted_text_data (pp);
}
pp_last_position_in_text (const pretty_printer *pp)
{
const char *p = NULL;
- struct obstack *text = pp->buffer->obstack;
+ struct obstack *text = pp_buffer (pp)->obstack;
if (obstack_base (text) != obstack_next_free (text))
p = ((const char *) obstack_next_free (text)) - 1;
int
pp_remaining_character_count_for_line (pretty_printer *pp)
{
- return pp->maximum_length - pp->buffer->line_length;
+ return pp->maximum_length - pp_buffer (pp)->line_length;
}
void
pp_newline (pretty_printer *pp)
{
- obstack_1grow (pp->buffer->obstack, '\n');
+ obstack_1grow (pp_buffer (pp)->obstack, '\n');
pp_needs_newline (pp) = false;
- pp->buffer->line_length = 0;
+ pp_buffer (pp)->line_length = 0;
}
/* Have PRETTY-PRINTER add a CHARACTER. */
if (ISSPACE (c))
return;
}
- obstack_1grow (pp->buffer->obstack, c);
- ++pp->buffer->line_length;
+ obstack_1grow (pp_buffer (pp)->obstack, c);
+ ++pp_buffer (pp)->line_length;
}
/* Append a STRING to the output area of PRETTY-PRINTER; the STRING may