diagnostic.c (wrap_text): New function.

2000-07-10  Gabriel Dos Reis  <gdr@codesourcery.com>

	* diagnostic.c (wrap_text): New function.
	(maybe_wrap_text): Likewise.
	(output_add_string): Use it.
	(output_format): Likewise.
	(count_error): Use verbatim instead of notice.
	(report_error_function): Likewise. Don't use plain fprintf.
	(finish_diagnostic): New function.
	(output_do_verbatim): Tweak.  Commonalize functionalities in
	output_verbatim and verbatim.
	(output_verbatim): Adjust.
	(verbatim): Likewise.
	(report_diagnostic): Define.

	* diagnostic.h (report_diagnostic): Prototype.

From-SVN: r34935
This commit is contained in:
Gabriel Dos Reis 2000-07-09 22:51:25 +00:00 committed by Gabriel Dos Reis
parent 66267cdb85
commit 93d87cb15d
3 changed files with 144 additions and 54 deletions

View File

@ -1,3 +1,20 @@
2000-07-10 Gabriel Dos Reis <gdr@codesourcery.com>
* diagnostic.c (wrap_text): New function.
(maybe_wrap_text): Likewise.
(output_add_string): Use it.
(output_format): Likewise.
(count_error): Use verbatim instead of notice.
(report_error_function): Likewise. Don't use plain fprintf.
(finish_diagnostic): New function.
(output_do_verbatim): Tweak. Commonalize functionalities in
output_verbatim and verbatim.
(output_verbatim): Adjust.
(verbatim): Likewise.
(report_diagnostic): Define.
* diagnostic.h (report_diagnostic): Prototype.
2000-07-09 Zack Weinberg <zack@wolery.cumb.org> 2000-07-09 Zack Weinberg <zack@wolery.cumb.org>
* cppexp.c (_cpp_parse_expr): Don't use unary plus. * cppexp.c (_cpp_parse_expr): Don't use unary plus.

View File

@ -67,7 +67,9 @@ typedef struct
/* Prototypes. */ /* Prototypes. */
static int doing_line_wrapping PARAMS ((void)); static int doing_line_wrapping PARAMS ((void));
static void output_do_verbatim PARAMS ((output_buffer *)); static void finish_diagnostic PARAMS ((void));
static void output_do_verbatim PARAMS ((output_buffer *,
const char *, va_list));
static void output_to_stream PARAMS ((output_buffer *, FILE *)); static void output_to_stream PARAMS ((output_buffer *, FILE *));
static void output_format PARAMS ((output_buffer *)); static void output_format PARAMS ((output_buffer *));
@ -116,6 +118,9 @@ static void output_long_octal PARAMS ((output_buffer *, long int));
static void output_hexadecimal PARAMS ((output_buffer *, int)); static void output_hexadecimal PARAMS ((output_buffer *, int));
static void output_long_hexadecimal PARAMS ((output_buffer *, long int)); static void output_long_hexadecimal PARAMS ((output_buffer *, long int));
static void output_append_r PARAMS ((output_buffer *, const char *, int)); static void output_append_r PARAMS ((output_buffer *, const char *, int));
static void wrap_text PARAMS ((output_buffer *, const char *, const char *));
static void maybe_wrap_text PARAMS ((output_buffer *, const char *,
const char *));
extern int rtl_dump_and_exit; extern int rtl_dump_and_exit;
extern int inhibit_warnings; extern int inhibit_warnings;
@ -488,38 +493,62 @@ output_append (buffer, start, end)
output_append_r (buffer, start, end - start); output_append_r (buffer, start, end - start);
} }
/* Wrap a STRing into BUFFER. */ /* Wrap a text delimited by START and END into BUFFER. */
static void
wrap_text (buffer, start, end)
output_buffer *buffer;
const char *start;
const char *end;
{
while (start != end)
{
/* Dump anything bodered by whitespaces. */
{
const char *p = start;
while (p != end && *p != ' ' && *p != '\n')
++p;
if (p - start >= output_space_left (buffer))
output_add_newline (buffer);
output_append (buffer, start, p);
start = p;
}
if (start != end && *start == ' ')
{
output_add_space (buffer);
++start;
}
if (start != end && *start == '\n')
{
output_add_newline (buffer);
++start;
}
}
}
/* Same as wrap_text but wrap text only when in line-wrapping mode. */
static void
maybe_wrap_text (buffer, start, end)
output_buffer *buffer;
const char *start;
const char *end;
{
if (output_is_line_wrapping (buffer))
wrap_text (buffer, start, end);
else
output_append (buffer, start, end);
}
/* Append a STRING to BUFFER; the STRING maybe be line-wrapped if in
appropriate mode. */
void void
output_add_string (buffer, str) output_add_string (buffer, str)
output_buffer *buffer; output_buffer *buffer;
const char *str; const char *str;
{ {
const char *p = str; maybe_wrap_text (buffer, str, str + (str ? strlen (str) : 0));
if (!output_is_line_wrapping (buffer))
output_append (buffer, str, str + strlen (str));
else while (*str)
{
while (*p && *p != ' ' && *p != '\n')
++p;
if (p - str < output_space_left (buffer))
output_append (buffer, str, p);
else
{
output_add_newline (buffer);
output_append (buffer, str, p);
}
while (*p && *p == '\n')
{
output_add_newline (buffer);
++p;
}
str = p++;
}
} }
/* Flush the content of BUFFER onto FILE and reinitialize BUFFER. */ /* Flush the content of BUFFER onto FILE and reinitialize BUFFER. */
@ -555,11 +584,15 @@ output_format (buffer)
{ {
int long_integer = 0; int long_integer = 0;
/* Ignore text. */ /* Ignore text. */
if (*buffer->cursor != '%')
{ {
output_add_character (buffer, *buffer->cursor); const char *p = buffer->cursor;
continue; 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 /* We got a '%'. Let's see what happens. Record whether we're
parsing a long integer format specifier. */ parsing a long integer format specifier. */
@ -643,7 +676,6 @@ output_format (buffer)
} }
} }
} }
output_finish (buffer);
} }
static char * static char *
@ -1221,7 +1253,7 @@ count_error (warningp)
if (warningp && !warning_message) if (warningp && !warning_message)
{ {
notice ("%s: warnings being treated as errors\n", progname); verbatim ("%s: warnings being treated as errors\n", progname);
warning_message = 1; warning_message = 1;
} }
errorcount++; errorcount++;
@ -1456,7 +1488,7 @@ report_error_function (file)
if (need_error_newline) if (need_error_newline)
{ {
fprintf (stderr, "\n"); verbatim ("\n");
need_error_newline = 0; need_error_newline = 0;
} }
@ -1465,10 +1497,10 @@ report_error_function (file)
{ {
for (p = input_file_stack->next; p; p = p->next) for (p = input_file_stack->next; p; p = p->next)
if (p == input_file_stack->next) if (p == input_file_stack->next)
notice ("In file included from %s:%d", p->name, p->line); verbatim ("In file included from %s:%d", p->name, p->line);
else else
notice (",\n from %s:%d", p->name, p->line); verbatim (",\n from %s:%d", p->name, p->line);
fprintf (stderr, ":\n"); verbatim (":\n");
last_error_tick = input_file_stack_tick; last_error_tick = input_file_stack_tick;
} }
@ -1721,16 +1753,34 @@ restore_output_state (state, buffer)
va_copy (buffer->format_args, state->format_args); va_copy (buffer->format_args, state->format_args);
} }
/* Flush diagnostic_buffer content on stderr. */
static void
finish_diagnostic ()
{
output_to_stream (diagnostic_buffer, stderr);
fputc ('\n', stderr);
fflush (stderr);
}
/* Helper subroutine of output_verbatim and verbatim. Do the approriate /* Helper subroutine of output_verbatim and verbatim. Do the approriate
settings needed by BUFFER for a verbatim formatting. */ settings needed by BUFFER for a verbatim formatting. */
static void static void
output_do_verbatim (buffer) output_do_verbatim (buffer, msg, args)
output_buffer *buffer; output_buffer *buffer;
const char *msg;
va_list args;
{ {
output_state os;
save_output_state (buffer, &os);
buffer->prefix = NULL; buffer->prefix = NULL;
buffer->prefixing_rule = DIAGNOSTICS_SHOW_PREFIX_NEVER; buffer->prefixing_rule = DIAGNOSTICS_SHOW_PREFIX_NEVER;
buffer->cursor = msg;
va_copy (buffer->format_args, args);
output_set_maximum_length (buffer, 0); output_set_maximum_length (buffer, 0);
output_format (buffer); output_format (buffer);
va_end (buffer->format_args);
restore_output_state (&os, buffer);
} }
/* Output MESSAGE verbatim into BUFFER. */ /* Output MESSAGE verbatim into BUFFER. */
@ -1741,7 +1791,6 @@ output_verbatim VPARAMS ((output_buffer *buffer, const char *msg, ...))
output_buffer *buffer; output_buffer *buffer;
const char *msg; const char *msg;
#endif #endif
output_state previous_state;
va_list ap; va_list ap;
VA_START (ap, msg); VA_START (ap, msg);
@ -1749,12 +1798,7 @@ output_verbatim VPARAMS ((output_buffer *buffer, const char *msg, ...))
buffer = va_arg (ap, output_buffer *); buffer = va_arg (ap, output_buffer *);
msg = va_arg (ap, const char *); msg = va_arg (ap, const char *);
#endif #endif
save_output_state (buffer, &previous_state); output_do_verbatim (buffer, msg, ap);
buffer->cursor = msg;
va_copy (buffer->format_args, ap);
output_do_verbatim(buffer);
va_end (buffer->format_args);
restore_output_state (&previous_state, buffer);
} }
/* Same as above but use diagnostic_buffer. */ /* Same as above but use diagnostic_buffer. */
@ -1764,15 +1808,42 @@ verbatim VPARAMS ((const char *msg, ...))
#ifndef ANSI_PROTOTYPES #ifndef ANSI_PROTOTYPES
const char *msg; const char *msg;
#endif #endif
output_state previous_state; va_list ap;
save_output_state (diagnostic_buffer, &previous_state);
VA_START (diagnostic_args, msg); VA_START (ap, msg);
#ifndef ANSI_PROTOTYPES #ifndef ANSI_PROTOTYPES
msg = va_arg (diagnostic_args, const char *); msg = va_arg (ap, const char *);
#endif #endif
diagnostic_msg = msg; output_do_verbatim (diagnostic_buffer, msg, ap);
output_do_verbatim (diagnostic_buffer);
output_to_stream (diagnostic_buffer, stderr); output_to_stream (diagnostic_buffer, stderr);
va_end (diagnostic_args); }
restore_output_state (&previous_state, diagnostic_buffer);
/* Report a diagnostic MESSAGE (an error or a WARNING) involving
entities in ARGUMENTS. FILE and LINE indicate where the diagnostic
occurs. This function is *the* subroutine in terms of which front-ends
should implement their specific diagnostic handling modules. */
void
report_diagnostic (msg, args, file, line, warn)
const char *msg;
va_list args;
const char *file;
int line;
int warn;
{
output_state os;
save_output_state (diagnostic_buffer, &os);
diagnostic_msg = msg;
va_copy (diagnostic_args, args);
if (count_error (warn))
{
report_error_function (file);
output_set_prefix
(diagnostic_buffer, context_as_prefix (file, line, warn));
output_format (diagnostic_buffer);
finish_diagnostic();
output_destroy_prefix (diagnostic_buffer);
}
va_end (diagnostic_args);
restore_output_state (&os, diagnostic_buffer);
} }

View File

@ -94,6 +94,8 @@ extern int diagnostic_message_length_per_line;
extern output_buffer *diagnostic_buffer; extern output_buffer *diagnostic_buffer;
/* Prototypes */ /* Prototypes */
void report_diagnostic PARAMS ((const char *, va_list,
const char *, int, int));
void initialize_diagnostics PARAMS ((void)); void initialize_diagnostics PARAMS ((void));
void reshape_diagnostic_buffer PARAMS ((void)); void reshape_diagnostic_buffer PARAMS ((void));
void default_initialize_buffer PARAMS ((output_buffer *)); void default_initialize_buffer PARAMS ((output_buffer *));