This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH to diagnostic.[hc]: Improve output_buffer interface (1/2)
- To: gcc-patches at gcc dot gnu dot org
- Subject: PATCH to diagnostic.[hc]: Improve output_buffer interface (1/2)
- From: Gabriel Dos Reis <gdr at codesourcery dot com>
- Date: 12 Jul 2000 04:52:47 +0200
To: gcc-patches@gcc.gnu.org
Subject: PATCH to diagnostic.[hc]: Improve output_buffer interface
From: Gabriel Dos Reis <gdr@merlin.codesourcery.com>
Date: 12 Jul 2000 04:48:14 +0200
Message-ID: <m3em50hxn5.fsf@merlin.codesourcery.com>
Mime-Version: 1.0 (generated by tm-edit 7.106)
Content-Type: text/plain; charset=US-ASCII
This patch defines macros to manipulate output_buffers. It is no
longer necessary to copy format specifiers argument list from there to
there.
Bootstrapped and tested on an i686-pc-linux. Installed.
-- Gaby
CodeSourcery, LLC http://www.codesourcery.com
2000-07-12 Gabriel Dos Reis <gdr@codesourcery.com>
* diagnostic.c (save_output_state): Remove.
(restore_output_state): Likewise.
(clear_text_info): New function.
(clear_diagnostic_info): Likewise.
(output_text_length, is_starting_newline, output_prefix,
line_wrap_cutoff, ideal_line_wrap_cutoff, prefix_was_emitted_for,
prefixing_policy, output_buffer_ptr_to_format_args): New macros
(set_real_maximum_length, output_set_maximum_length,
output_set_prefix, output_get_prefix, output_set_maximum_length,
output_destroy_prefix, init_output_buffer,
reshape_diagnostic_buffer, output_space_left, output_emit_prefix,
output_add_newline, output_add_character, output_add_space,
output_append_r, output_append, wrap_text, output_format,
output_do_printf, output_printf, output_do_verbatim,
output_verbatim, verbatim): Use them.
(output_clear): Split into cleat_text_info and
clear_diagnostic_info.
(struct output_state): Move to...
* diagnostic.h: ...Here
(struct output_buffer): Adjust.
Index: diagnostic.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/diagnostic.h,v
retrieving revision 1.6
diff -p -r1.6 diagnostic.h
*** diagnostic.h 2000/07/09 22:51:25 1.6
--- diagnostic.h 2000/07/12 00:34:47
*************** typedef struct output_buffer output_buff
*** 36,53 ****
everything goes well. */
typedef int (*printer_fn) PARAMS ((output_buffer *));
! /* The output buffer datatype. This is best seen as an abstract datatype. */
! struct output_buffer
{
- /* Internal data. These fields should not be accessed directly by
- front-ends. */
-
- /* The obstack where the text is built up. */
- struct obstack obstack;
/* The prefix for each new line. */
const char *prefix;
- /* The amount of characters output so far. */
- int line_length;
/* The real upper bound of number of characters per line, taking into
accompt the case of a very very looong prefix. */
int maximum_length;
--- 36,46 ----
everything goes well. */
typedef int (*printer_fn) PARAMS ((output_buffer *));
! /* This data structure encapulates an output_buffer's state. */
! typedef struct
{
/* The prefix for each new line. */
const char *prefix;
/* The real upper bound of number of characters per line, taking into
accompt the case of a very very looong prefix. */
int maximum_length;
*************** struct output_buffer
*** 62,86 ****
o DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: emit current PREFIX each time
a physical line is started. */
int prefixing_rule;
-
- /* Public fields. These are used by front-ends to extract formats and
- arguments from the variable argument-list passed to output_format. */
-
/* The current char to output. Updated by front-end (*format_map) when
it is called to report front-end printer for a specified format. */
const char *cursor;
! /* Variable argument-list for formatting. */
! va_list format_args;
};
! /* If non-NULL, this function formats data in the BUFFER.
! BUFFER->CURSOR points to a format code. LANG_PRINTER should
! call output_add_string (and related functions) to add data to
the BUFFER. LANG_PRINTER can read arguments from
! BUFFER->FORMAT_ARGS using VA_ARG. If the BUFFER needs
additional characters from the format string, it should advance
! the BUFFER->CURSOR as it goes. When LANG_PRINTER returns,
! BUFFER->CURSOR should point to the last character processed. */
extern printer_fn lang_printer;
--- 55,93 ----
o DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: emit current PREFIX each time
a physical line is started. */
int prefixing_rule;
/* The current char to output. Updated by front-end (*format_map) when
it is called to report front-end printer for a specified format. */
const char *cursor;
! /* A pointer to the variable argument-list for formatting. */
! va_list *format_args;
! } output_state;
!
! /* The output buffer datatype. This is best seen as an abstract datatype. */
! struct output_buffer
! {
! /* Internal data. These fields should not be accessed directly by
! front-ends. */
!
! /* The obstack where the text is built up. */
! struct obstack obstack;
! /* The amount of characters output so far. */
! int line_length;
! /* The current state of the buffer. */
! output_state state;
};
+
+ #define output_buffer_text_cursor(BUFFER) (BUFFER)->state.cursor
+ #define output_buffer_format_args(BUFFER) *((BUFFER)->state.format_args)
! /* If non-NULL, this function formats data in the BUFFER. When called,
! output_buffer_text_cursor (BUFFER) points to a format code. LANG_PRINTER
! should call output_add_string (and related functions) to add data to
the BUFFER. LANG_PRINTER can read arguments from
! output_buffer_format_args (BUFFER) using VA_ARG. If the BUFFER needs
additional characters from the format string, it should advance
! the output_buffer_text_cursor (BUFFER) as it goes. When LANG_PRINTER
! returns, output_buffer_text_cursor (BUFFER) should point to the last
! character processed. */
extern printer_fn lang_printer;
Index: diagnostic.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/diagnostic.c,v
retrieving revision 1.21
diff -p -r1.21 diagnostic.c
*** diagnostic.c 2000/07/10 17:14:25 1.21
--- diagnostic.c 2000/07/12 00:34:47
***************
*** 1,5 ****
--- 1,6 ----
/* Language-independent diagnostic subroutines for the GNU C compiler
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
This file is part of GNU CC.
*************** Boston, MA 02111-1307, USA. */
*** 42,68 ****
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
- #define diagnostic_args diagnostic_buffer->format_args
- #define diagnostic_msg diagnostic_buffer->cursor
-
#define output_formatted_integer(BUFFER, FORMAT, INTEGER) \
do { \
sprintf (digit_buffer, FORMAT, INTEGER); \
output_add_string (BUFFER, digit_buffer); \
} while (0)
! /* This data structure serves to save/restore an output_buffer state. */
! typedef struct
! {
! const char *prefix;
! int maximum_length;
! int ideal_maximum_length;
! int emitted_prefix_p;
! int prefixing_rule;
! const char *cursor;
! va_list format_args;
! } output_state;
/* Prototypes. */
static int doing_line_wrapping PARAMS ((void));
--- 43,65 ----
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
#define output_formatted_integer(BUFFER, FORMAT, INTEGER) \
do { \
sprintf (digit_buffer, FORMAT, INTEGER); \
output_add_string (BUFFER, digit_buffer); \
} while (0)
! #define output_text_length(BUFFER) (BUFFER)->line_length
! #define is_starting_newline(BUFFER) (output_text_length (BUFFER) == 0)
! #define output_prefix(BUFFER) (BUFFER)->state.prefix
! #define line_wrap_cutoff(BUFFER) (BUFFER)->state.maximum_length
! #define ideal_line_wrap_cutoff(BUFFER) (BUFFER)->state.ideal_maximum_length
! #define prefix_was_emitted_for(BUFFER) (BUFFER)->state.emitted_prefix_p
! #define prefixing_policy(BUFFER) (BUFFER)->state.prefixing_rule
! #define output_buffer_ptr_to_format_args(BUFFER) (BUFFER)->state.format_args
+ #define diagnostic_args output_buffer_ptr_to_format_args (diagnostic_buffer)
+ #define diagnostic_msg output_buffer_text_cursor (diagnostic_buffer)
/* Prototypes. */
static int doing_line_wrapping PARAMS ((void));
*************** static void vsorry PARAMS ((const char *
*** 104,113 ****
static void report_file_and_line PARAMS ((const char *, int, int));
static void vnotice PARAMS ((FILE *, const char *, va_list));
static void set_real_maximum_length PARAMS ((output_buffer *));
-
- static void save_output_state PARAMS ((const output_buffer *, output_state *));
- static void restore_output_state PARAMS ((const output_state *,
- output_buffer *));
static void output_unsigned_decimal PARAMS ((output_buffer *, unsigned int));
static void output_long_decimal PARAMS ((output_buffer *, long int));
--- 101,106 ----
*************** static void output_append_r PARAMS ((out
*** 122,127 ****
--- 115,122 ----
static void wrap_text PARAMS ((output_buffer *, const char *, const char *));
static void maybe_wrap_text PARAMS ((output_buffer *, const char *,
const char *));
+ static void clear_text_info PARAMS ((output_buffer *));
+ static void clear_diagnostic_info PARAMS ((output_buffer *));
extern int rtl_dump_and_exit;
extern int inhibit_warnings;
*************** int
*** 197,203 ****
output_is_line_wrapping (buffer)
output_buffer *buffer;
{
! return buffer->ideal_maximum_length > 0;
}
/* Return BUFFER's prefix. */
--- 192,198 ----
output_is_line_wrapping (buffer)
output_buffer *buffer;
{
! return ideal_line_wrap_cutoff (buffer) > 0;
}
/* Return BUFFER's prefix. */
*************** const char *
*** 205,211 ****
output_get_prefix (buffer)
const output_buffer *buffer;
{
! return buffer->prefix;
}
/* Subroutine of output_set_maximum_length. Set up BUFFER's
--- 200,206 ----
output_get_prefix (buffer)
const output_buffer *buffer;
{
! return output_prefix (buffer);
}
/* Subroutine of output_set_maximum_length. Set up BUFFER's
*************** set_real_maximum_length (buffer)
*** 216,231 ****
{
/* If we're told not to wrap lines then do the obvious thing. */
if (! output_is_line_wrapping (buffer))
! buffer->maximum_length = buffer->ideal_maximum_length;
else
{
! int prefix_length = buffer->prefix ? strlen (buffer->prefix) : 0;
/* If the prefix is ridiculously too long, output at least
32 characters. */
! if (buffer->ideal_maximum_length - prefix_length < 32)
! buffer->maximum_length = buffer->ideal_maximum_length + 32;
else
! buffer->maximum_length = buffer->ideal_maximum_length;
}
}
--- 211,227 ----
{
/* If we're told not to wrap lines then do the obvious thing. */
if (! output_is_line_wrapping (buffer))
! line_wrap_cutoff (buffer) = ideal_line_wrap_cutoff (buffer);
else
{
! int prefix_length =
! output_prefix (buffer) ? strlen (output_prefix (buffer)) : 0;
/* If the prefix is ridiculously too long, output at least
32 characters. */
! if (ideal_line_wrap_cutoff (buffer) - prefix_length < 32)
! line_wrap_cutoff (buffer) = ideal_line_wrap_cutoff (buffer) + 32;
else
! line_wrap_cutoff (buffer) = ideal_line_wrap_cutoff (buffer);
}
}
*************** output_set_maximum_length (buffer, lengt
*** 236,242 ****
output_buffer *buffer;
int length;
{
! buffer->ideal_maximum_length = length;
set_real_maximum_length (buffer);
}
--- 232,238 ----
output_buffer *buffer;
int length;
{
! ideal_line_wrap_cutoff (buffer) = length;
set_real_maximum_length (buffer);
}
*************** output_set_prefix (buffer, prefix)
*** 246,254 ****
output_buffer *buffer;
const char *prefix;
{
! buffer->prefix = prefix;
set_real_maximum_length (buffer);
! buffer->emitted_prefix_p = 0;
}
/* Free BUFFER's prefix, a previously malloc()'d string. */
--- 242,250 ----
output_buffer *buffer;
const char *prefix;
{
! output_prefix (buffer) = prefix;
set_real_maximum_length (buffer);
! prefix_was_emitted_for (buffer) = 0;
}
/* Free BUFFER's prefix, a previously malloc()'d string. */
*************** void
*** 257,269 ****
output_destroy_prefix (buffer)
output_buffer *buffer;
{
! if (buffer->prefix)
{
! free ((char *) buffer->prefix);
! buffer->prefix = NULL;
}
}
/* Construct an output BUFFER with PREFIX and of MAXIMUM_LENGTH
characters per line. */
void
--- 253,284 ----
output_destroy_prefix (buffer)
output_buffer *buffer;
{
! if (output_prefix (buffer) != NULL)
{
! free ((char *) output_prefix (buffer));
! output_prefix (buffer) = NULL;
}
}
+ /* Zero out any text output so far in BUFFER. */
+ static void
+ clear_text_info (buffer)
+ output_buffer *buffer;
+ {
+ obstack_free (&buffer->obstack, obstack_base (&buffer->obstack));
+ output_text_length (buffer) = 0;
+ }
+
+ /* Zero out any diagnostic data used so far by BUFFER. */
+ static void
+ clear_diagnostic_info (buffer)
+ output_buffer *buffer;
+ {
+ output_buffer_text_cursor (buffer) = NULL;
+ output_buffer_ptr_to_format_args (buffer) = NULL;
+ prefix_was_emitted_for (buffer) = 0;
+ }
+
/* Construct an output BUFFER with PREFIX and of MAXIMUM_LENGTH
characters per line. */
void
*************** init_output_buffer (buffer, prefix, maxi
*** 273,285 ****
int maximum_length;
{
obstack_init (&buffer->obstack);
! buffer->ideal_maximum_length = maximum_length;
! buffer->line_length = 0;
output_set_prefix (buffer, prefix);
! buffer->emitted_prefix_p = 0;
! buffer->prefixing_rule = current_prefixing_rule;
!
! buffer->cursor = NULL;
}
/* Initialize BUFFER with a NULL prefix and current diagnostic message
--- 288,298 ----
int maximum_length;
{
obstack_init (&buffer->obstack);
! ideal_line_wrap_cutoff (buffer) = maximum_length;
! prefixing_policy (buffer) = current_prefixing_rule;
output_set_prefix (buffer, prefix);
! output_text_length (buffer) = 0;
! clear_diagnostic_info (buffer);
}
/* Initialize BUFFER with a NULL prefix and current diagnostic message
*************** default_initialize_buffer (buffer)
*** 296,303 ****
void
reshape_diagnostic_buffer ()
{
! diagnostic_buffer->ideal_maximum_length = diagnostic_message_length_per_line;
! diagnostic_buffer->prefixing_rule = current_prefixing_rule;
set_real_maximum_length (diagnostic_buffer);
}
--- 309,317 ----
void
reshape_diagnostic_buffer ()
{
! ideal_line_wrap_cutoff (diagnostic_buffer) =
! diagnostic_message_length_per_line;
! prefixing_policy (diagnostic_buffer) = current_prefixing_rule;
set_real_maximum_length (diagnostic_buffer);
}
*************** void
*** 306,315 ****
output_clear (buffer)
output_buffer *buffer;
{
! obstack_free (&buffer->obstack, obstack_base (&buffer->obstack));
! buffer->line_length = 0;
! buffer->cursor = NULL;
! buffer->emitted_prefix_p = 0;
}
/* Finishes to construct a NULL-terminated character string representing
--- 320,327 ----
output_clear (buffer)
output_buffer *buffer;
{
! clear_text_info (buffer);
! clear_diagnostic_info (buffer);
}
/* Finishes to construct a NULL-terminated character string representing
*************** int
*** 328,334 ****
output_space_left (buffer)
const output_buffer *buffer;
{
! return buffer->maximum_length - buffer->line_length;
}
/* Write out BUFFER's prefix. */
--- 340,346 ----
output_space_left (buffer)
const output_buffer *buffer;
{
! return line_wrap_cutoff (buffer) - output_text_length (buffer);
}
/* Write out BUFFER's prefix. */
*************** void
*** 336,360 ****
output_emit_prefix (buffer)
output_buffer *buffer;
{
! if (buffer->prefix)
{
! switch (buffer->prefixing_rule)
{
default:
case DIAGNOSTICS_SHOW_PREFIX_NEVER:
break;
case DIAGNOSTICS_SHOW_PREFIX_ONCE:
! if (buffer->emitted_prefix_p)
break;
! else
! buffer->emitted_prefix_p = 1;
! /* Fall through. */
case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
! buffer->line_length += strlen (buffer->prefix);
! obstack_grow
! (&buffer->obstack, buffer->prefix, buffer->line_length);
break;
}
}
--- 348,372 ----
output_emit_prefix (buffer)
output_buffer *buffer;
{
! if (output_prefix (buffer) != NULL)
{
! switch (prefixing_policy (buffer))
{
default:
case DIAGNOSTICS_SHOW_PREFIX_NEVER:
break;
case DIAGNOSTICS_SHOW_PREFIX_ONCE:
! if (prefix_was_emitted_for (buffer))
break;
! /* Else fall through. */
case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
! {
! int prefix_length = strlen (output_prefix (buffer));
! output_append_r (buffer, output_prefix (buffer), prefix_length);
! prefix_was_emitted_for (buffer) = 1;
! }
break;
}
}
*************** output_add_newline (buffer)
*** 366,372 ****
output_buffer *buffer;
{
obstack_1grow (&buffer->obstack, '\n');
! buffer->line_length = 0;
}
/* Appends a character to BUFFER. */
--- 378,384 ----
output_buffer *buffer;
{
obstack_1grow (&buffer->obstack, '\n');
! output_text_length (buffer) = 0;
}
/* Appends a character to BUFFER. */
*************** output_add_character (buffer, c)
*** 378,384 ****
if (output_is_line_wrapping (buffer) && output_space_left (buffer) <= 0)
output_add_newline (buffer);
obstack_1grow (&buffer->obstack, c);
! ++buffer->line_length;
}
/* Adds a space to BUFFER. */
--- 390,396 ----
if (output_is_line_wrapping (buffer) && output_space_left (buffer) <= 0)
output_add_newline (buffer);
obstack_1grow (&buffer->obstack, c);
! ++output_text_length (buffer);
}
/* Adds a space to BUFFER. */
*************** output_add_space (buffer)
*** 392,398 ****
return;
}
obstack_1grow (&buffer->obstack, ' ');
! ++buffer->line_length;
}
/* These functions format an INTEGER into BUFFER as suggested by their
--- 404,410 ----
return;
}
obstack_1grow (&buffer->obstack, ' ');
! ++output_text_length (buffer);
}
/* These functions format an INTEGER into BUFFER as suggested by their
*************** output_append_r (buffer, start, length)
*** 470,481 ****
int length;
{
obstack_grow (&buffer->obstack, start, length);
! buffer->line_length += length;
}
/* Append a string deliminated by START and END to BUFFER. No wrapping is
! done. However, if beginning a new line then emit BUFFER->PREFIX and
! skip any leading whitespace if appropriate. The caller must ensure
that it is safe to do so. */
void
output_append (buffer, start, end)
--- 482,493 ----
int length;
{
obstack_grow (&buffer->obstack, start, length);
! output_text_length (buffer) += length;
}
/* Append a string deliminated by START and END to BUFFER. No wrapping is
! done. However, if beginning a new line then emit output_prefix (BUFFER)
! and skip any leading whitespace if appropriate. The caller must ensure
that it is safe to do so. */
void
output_append (buffer, start, end)
*************** output_append (buffer, start, end)
*** 484,490 ****
const char *end;
{
/* Emit prefix and skip whitespace if we're starting a new line. */
! if (buffer->line_length == 0)
{
output_emit_prefix (buffer);
if (output_is_line_wrapping (buffer))
--- 496,502 ----
const char *end;
{
/* Emit prefix and skip whitespace if we're starting a new line. */
! if (is_starting_newline (buffer))
{
output_emit_prefix (buffer);
if (output_is_line_wrapping (buffer))
*************** output_to_stream (buffer, file)
*** 561,572 ****
{
const char *text = output_finish (buffer);
fputs (text, file);
! output_clear (buffer);
}
! /* Format a message pointed to by BUFFER->CURSOR using BUFFER->CURSOR
! as appropriate. The following format specifiers are recognized as
! being language independent:
%d, %i: (signed) integer in base ten.
%u: unsigned integer in base ten.
%o: (signed) integer in base eight.
--- 573,584 ----
{
const char *text = output_finish (buffer);
fputs (text, file);
! clear_text_info (buffer);
}
! /* Format a message pointed to by output_buffer_text_cursor (BUFFER) using
! output_buffer_format_args (BUFFER) as appropriate. The following format
! specifiers are recognized as being language independent:
%d, %i: (signed) integer in base ten.
%u: unsigned integer in base ten.
%o: (signed) integer in base eight.
*************** static void
*** 580,654 ****
output_format (buffer)
output_buffer *buffer;
{
! for (; *buffer->cursor; ++buffer->cursor)
{
int long_integer = 0;
/* Ignore text. */
{
! const char *p = buffer->cursor;
while (*p && *p != '%')
++p;
! maybe_wrap_text (buffer, buffer->cursor, p);
! buffer->cursor = p;
}
! if (!*buffer->cursor)
break;
/* We got a '%'. Let's see what happens. Record whether we're
parsing a long integer format specifier. */
! if (*++buffer->cursor == 'l')
{
long_integer = 1;
! ++buffer->cursor;
}
/* Handle %c, %d, %i, %ld, %li, %lo, %lu, %lx, %o, %s, %u,
%x, %.*s; %%. And nothing else. Front-ends should install
printers to grok language specific format specifiers. */
! switch (*buffer->cursor)
{
case 'c':
output_add_character
! (buffer, va_arg (buffer->format_args, int));
break;
case 'd':
case 'i':
if (long_integer)
output_long_decimal
! (buffer, va_arg (buffer->format_args, long int));
else
! output_decimal (buffer, va_arg (buffer->format_args, int));
break;
case 'o':
if (long_integer)
! output_long_octal
! (buffer, va_arg (buffer->format_args, unsigned long int));
else
! output_octal (buffer, va_arg (buffer->format_args, unsigned int));
break;
case 's':
! output_add_string
! (buffer, va_arg (buffer->format_args, const char *));
break;
case 'u':
if (long_integer)
output_long_unsigned_decimal
! (buffer, va_arg (buffer->format_args, long unsigned int));
else
output_unsigned_decimal
! (buffer, va_arg (buffer->format_args, unsigned int));
case 'x':
if (long_integer)
output_long_hexadecimal
! (buffer, va_arg (buffer->format_args, unsigned long int));
else
output_hexadecimal
! (buffer, va_arg (buffer->format_args, unsigned int));
break;
case '%':
--- 592,676 ----
output_format (buffer)
output_buffer *buffer;
{
! for (; *output_buffer_text_cursor (buffer);
! ++output_buffer_text_cursor (buffer))
{
int long_integer = 0;
/* Ignore text. */
{
! const char *p = output_buffer_text_cursor (buffer);
while (*p && *p != '%')
++p;
! maybe_wrap_text (buffer, output_buffer_text_cursor (buffer), p);
! output_buffer_text_cursor (buffer) = p;
}
! if (!*output_buffer_text_cursor (buffer))
break;
/* We got a '%'. Let's see what happens. Record whether we're
parsing a long integer format specifier. */
! if (*++output_buffer_text_cursor (buffer) == 'l')
{
long_integer = 1;
! ++output_buffer_text_cursor (buffer);
}
/* Handle %c, %d, %i, %ld, %li, %lo, %lu, %lx, %o, %s, %u,
%x, %.*s; %%. And nothing else. Front-ends should install
printers to grok language specific format specifiers. */
! switch (*output_buffer_text_cursor (buffer))
{
case 'c':
output_add_character
! (buffer, va_arg (output_buffer_format_args (buffer), int));
break;
case 'd':
case 'i':
if (long_integer)
output_long_decimal
! (buffer, va_arg (output_buffer_format_args (buffer), long int));
else
! output_decimal
! (buffer, va_arg (output_buffer_format_args (buffer), int));
break;
case 'o':
if (long_integer)
! output_long_octal (buffer,
! va_arg (output_buffer_format_args (buffer),
! unsigned long int));
else
! output_octal (buffer,
! va_arg (output_buffer_format_args (buffer),
! unsigned int));
break;
case 's':
! output_add_string (buffer,
! va_arg (output_buffer_format_args (buffer),
! const char *));
break;
case 'u':
if (long_integer)
output_long_unsigned_decimal
! (buffer, va_arg (output_buffer_format_args (buffer),
! long unsigned int));
else
output_unsigned_decimal
! (buffer, va_arg (output_buffer_format_args (buffer),
! unsigned int));
case 'x':
if (long_integer)
output_long_hexadecimal
! (buffer, va_arg (output_buffer_format_args (buffer),
! unsigned long int));
else
output_hexadecimal
! (buffer, va_arg (output_buffer_format_args (buffer),
! unsigned int));
break;
case '%':
*************** output_format (buffer)
*** 660,671 ****
int n;
const char *s;
/* We handle no precision specifier but `%.*s'. */
! if (*++buffer->cursor != '*')
abort ();
! else if (*++buffer->cursor != 's')
abort();
! n = va_arg (buffer->format_args, int);
! s = va_arg (buffer->format_args, const char *);
output_append (buffer, s, s + n);
}
break;
--- 682,693 ----
int n;
const char *s;
/* We handle no precision specifier but `%.*s'. */
! if (*++output_buffer_text_cursor (buffer) != '*')
abort ();
! else if (*++output_buffer_text_cursor (buffer) != 's')
abort();
! n = va_arg (output_buffer_format_args (buffer), int);
! s = va_arg (output_buffer_format_args (buffer), const char *);
output_append (buffer, s, s + n);
}
break;
*************** output_do_printf (buffer, msgid)
*** 750,756 ****
output_buffer *buffer;
const char *msgid;
{
! char *message = vbuild_message_string (msgid, buffer->format_args);
output_add_string (buffer, message);
free (message);
--- 772,779 ----
output_buffer *buffer;
const char *msgid;
{
! char *message = vbuild_message_string (msgid,
! output_buffer_format_args (buffer));
output_add_string (buffer, message);
free (message);
*************** output_printf VPARAMS ((struct output_bu
*** 767,786 ****
const char *msgid;
#endif
va_list ap;
! va_list old_args;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
! buffer = va_arg (ap, struct output_buffer *);
msgid = va_arg (ap, const char *);
#endif
! va_copy (old_args, buffer->format_args);
!
! va_copy (buffer->format_args, ap);
output_do_printf (buffer, msgid);
! va_end (buffer->format_args);
!
! va_copy (buffer->format_args, old_args);
}
--- 790,807 ----
const char *msgid;
#endif
va_list ap;
! va_list *old_args;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
! buffer = va_arg (ap, output_buffer *);
msgid = va_arg (ap, const char *);
#endif
! old_args = output_buffer_ptr_to_format_args (buffer);
! output_buffer_ptr_to_format_args (buffer) = ≈
output_do_printf (buffer, msgid);
! output_buffer_ptr_to_format_args (buffer) = old_args;
! va_end (ap);
}
*************** line_wrapper_printf VPARAMS ((FILE *file
*** 794,813 ****
FILE *file;
const char *msgid;
#endif
output_buffer buffer;
-
- default_initialize_buffer (&buffer);
- VA_START (buffer.format_args, msgid);
#ifndef ANSI_PROTOTYPES
! file = va_arg (buffer.format_args, FILE *);
! msgid = va_arg (buffer.format_args, const char *);
#endif
!
output_do_printf (&buffer, msgid);
output_to_stream (&buffer, file);
!
! va_end (buffer.format_args);
}
--- 815,834 ----
FILE *file;
const char *msgid;
#endif
+ va_list ap;
output_buffer buffer;
+ VA_START (ap, msgid);
+
#ifndef ANSI_PROTOTYPES
! file = va_arg (ap, FILE *);
! msgid = va_arg (ap, const char *);
#endif
! default_initialize_buffer (&buffer);
! output_buffer_ptr_to_format_args (&buffer) = ≈
output_do_printf (&buffer, msgid);
output_to_stream (&buffer, file);
! va_end (ap);
}
*************** vline_wrapper_message_with_location (fil
*** 823,834 ****
init_output_buffer (&buffer, context_as_prefix (file, line, warn),
diagnostic_message_length_per_line);
! va_copy (buffer.format_args, ap);
output_do_printf (&buffer, msgid);
output_to_stream (&buffer, stderr);
-
- output_destroy_prefix (&buffer);
fputc ('\n', stderr);
}
--- 844,854 ----
init_output_buffer (&buffer, context_as_prefix (file, line, warn),
diagnostic_message_length_per_line);
! output_buffer_ptr_to_format_args (&buffer) = ≈
output_do_printf (&buffer, msgid);
output_to_stream (&buffer, stderr);
fputc ('\n', stderr);
+ output_destroy_prefix (&buffer);
}
*************** v_message_with_decl (decl, warn, msgid,
*** 964,972 ****
{
if (doing_line_wrapping ())
{
! va_copy (buffer.format_args, ap);
output_do_printf (&buffer, p);
- va_copy (ap, buffer.format_args);
}
else
vfprintf (stderr, p, ap);
--- 984,991 ----
{
if (doing_line_wrapping ())
{
! output_buffer_ptr_to_format_args (&buffer) = ≈
output_do_printf (&buffer, p);
}
else
vfprintf (stderr, p, ap);
*************** warning VPARAMS ((const char *msgid, ...
*** 1726,1761 ****
va_end (ap);
}