This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

PATCH to diagnostic.[hc]: Improve output_buffer interface (1/2)


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) = &ap;
    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) = &ap;
    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) = &ap;
    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) = &ap;
            output_do_printf (&buffer, p);
          }
        else
          vfprintf (stderr, p, ap);
*************** warning VPARAMS ((const char *msgid, ...
*** 1726,1761 ****
    va_end (ap);
  }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]