]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/pretty-print.c
gcc.c (process_command): Update copyright notice dates.
[thirdparty/gcc.git] / gcc / pretty-print.c
CommitLineData
b6fe0bb8 1/* Various declarations for language-independent pretty-print subroutines.
5624e564 2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
b6fe0bb8
GDR
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
b6fe0bb8
GDR
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
b6fe0bb8
GDR
20
21#include "config.h"
b6fe0bb8
GDR
22#include "system.h"
23#include "coretypes.h"
a668adb2 24#include "intl.h"
b6fe0bb8 25#include "pretty-print.h"
4b84d650 26#include "diagnostic-color.h"
a3af5087 27
da6ca2b5
GDR
28#include <new> // For placement-new.
29
a3af5087
JM
30#if HAVE_ICONV
31#include <iconv.h>
32#endif
b6fe0bb8 33
f79520bb 34/* Overwrite the given location/range within this text_info's rich_location.
8a645150
DM
35 For use e.g. when implementing "+" in client format decoders. */
36
37void
f79520bb 38text_info::set_location (unsigned int idx, location_t loc, bool show_caret_p)
8a645150
DM
39{
40 gcc_checking_assert (m_richloc);
f79520bb 41 m_richloc->set_range (line_table, idx, loc, show_caret_p);
8a645150
DM
42}
43
44location_t
45text_info::get_location (unsigned int index_of_location) const
46{
47 gcc_checking_assert (m_richloc);
48
49 if (index_of_location == 0)
50 return m_richloc->get_loc ();
51 else
52 return UNKNOWN_LOCATION;
53}
54
da6ca2b5
GDR
55// Default construct an output buffer.
56
57output_buffer::output_buffer ()
58 : formatted_obstack (),
59 chunk_obstack (),
60 obstack (&formatted_obstack),
61 cur_chunk_array (),
62 stream (stderr),
63 line_length (),
48749dbc
MLI
64 digit_buffer (),
65 flush_p (true)
da6ca2b5
GDR
66{
67 obstack_init (&formatted_obstack);
68 obstack_init (&chunk_obstack);
69}
70
025311c4
GDR
71// Release resources owned by an output buffer at the end of lifetime.
72
73output_buffer::~output_buffer ()
74{
65f5c720
RB
75 obstack_free (&chunk_obstack, NULL);
76 obstack_free (&formatted_obstack, NULL);
025311c4
GDR
77}
78
b6fe0bb8
GDR
79
80/* Format an integer given by va_arg (ARG, type-specifier T) where
81 type-specifier is a precision modifier as indicated by PREC. F is
82 a string used to construct the appropriate format-specifier. */
83#define pp_integer_with_precision(PP, ARG, PREC, T, F) \
84 do \
85 switch (PREC) \
86 { \
87 case 0: \
88 pp_scalar (PP, "%" F, va_arg (ARG, T)); \
89 break; \
90 \
91 case 1: \
92 pp_scalar (PP, "%l" F, va_arg (ARG, long T)); \
93 break; \
94 \
95 case 2: \
2a157700 96 pp_scalar (PP, "%" HOST_LONG_LONG_FORMAT F, va_arg (ARG, long long T)); \
b6fe0bb8
GDR
97 break; \
98 \
99 default: \
100 break; \
101 } \
102 while (0)
103
104
105/* Subroutine of pp_set_maximum_length. Set up PRETTY-PRINTER's
106 internal maximum characters per line. */
107static void
108pp_set_real_maximum_length (pretty_printer *pp)
109{
110 /* If we're told not to wrap lines then do the obvious thing. In case
111 we'll emit prefix only once per message, it is appropriate
112 not to increase unnecessarily the line-length cut-off. */
113 if (!pp_is_wrapping_line (pp)
114 || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_ONCE
115 || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_NEVER)
116 pp->maximum_length = pp_line_cutoff (pp);
117 else
118 {
119 int prefix_length = pp->prefix ? strlen (pp->prefix) : 0;
120 /* If the prefix is ridiculously too long, output at least
121 32 characters. */
122 if (pp_line_cutoff (pp) - prefix_length < 32)
123 pp->maximum_length = pp_line_cutoff (pp) + 32;
124 else
125 pp->maximum_length = pp_line_cutoff (pp);
126 }
127}
128
129/* Clear PRETTY-PRINTER's output state. */
130static inline void
131pp_clear_state (pretty_printer *pp)
132{
133 pp->emitted_prefix = false;
134 pp_indentation (pp) = 0;
135}
136
b6fe0bb8 137/* Flush the formatted text of PRETTY-PRINTER onto the attached stream. */
6de9cd9a 138void
b6fe0bb8
GDR
139pp_write_text_to_stream (pretty_printer *pp)
140{
141 const char *text = pp_formatted_text (pp);
025311c4 142 fputs (text, pp_buffer (pp)->stream);
b6fe0bb8
GDR
143 pp_clear_output_area (pp);
144}
145
7eba871a
SB
146/* As pp_write_text_to_stream, but for GraphViz label output.
147
148 Flush the formatted text of pretty-printer PP onto the attached stream.
149 Replace characters in PPF that have special meaning in a GraphViz .dot
150 file.
151
152 This routine is not very fast, but it doesn't have to be as this is only
153 be used by routines dumping intermediate representations in graph form. */
154
155void
156pp_write_text_as_dot_label_to_stream (pretty_printer *pp, bool for_record)
157{
158 const char *text = pp_formatted_text (pp);
159 const char *p = text;
025311c4 160 FILE *fp = pp_buffer (pp)->stream;
7eba871a
SB
161
162 while (*p)
163 {
164 switch (*p)
165 {
166 /* Print newlines as a left-aligned newline. */
167 case '\n':
168 fputs ("\\l\\\n", fp);
169 break;
170
171 /* A pipe is only special for record-shape nodes. */
172 case '|':
173 if (for_record)
174 fputc ('\\', fp);
175 fputc (*p, fp);
176 break;
177
178 /* The following characters always have to be escaped
179 for use in labels. */
180 case '{':
181 case '}':
182 case '<':
183 case '>':
184 case '"':
185 case ' ':
186 fputc ('\\', fp);
187 /* fall through */
188 default:
189 fputc (*p, fp);
190 break;
191 }
192 p++;
193 }
194
195 pp_clear_output_area (pp);
196}
197
b6fe0bb8
GDR
198/* Wrap a text delimited by START and END into PRETTY-PRINTER. */
199static void
200pp_wrap_text (pretty_printer *pp, const char *start, const char *end)
201{
202 bool wrapping_line = pp_is_wrapping_line (pp);
203
204 while (start != end)
205 {
206 /* Dump anything bordered by whitespaces. */
207 {
208 const char *p = start;
209 while (p != end && !ISBLANK (*p) && *p != '\n')
210 ++p;
211 if (wrapping_line
212 && p - start >= pp_remaining_character_count_for_line (pp))
213 pp_newline (pp);
214 pp_append_text (pp, start, p);
215 start = p;
216 }
217
218 if (start != end && ISBLANK (*start))
219 {
220 pp_space (pp);
221 ++start;
222 }
223 if (start != end && *start == '\n')
224 {
225 pp_newline (pp);
226 ++start;
227 }
228 }
229}
230
231/* Same as pp_wrap_text but wrap text only when in line-wrapping mode. */
232static inline void
233pp_maybe_wrap_text (pretty_printer *pp, const char *start, const char *end)
234{
235 if (pp_is_wrapping_line (pp))
236 pp_wrap_text (pp, start, end);
237 else
238 pp_append_text (pp, start, end);
239}
240
241/* Append to the output area of PRETTY-PRINTER a string specified by its
242 STARTing character and LENGTH. */
243static inline void
244pp_append_r (pretty_printer *pp, const char *start, int length)
245{
c4100eae 246 output_buffer_append_r (pp_buffer (pp), start, length);
b6fe0bb8
GDR
247}
248
4b780675
GDR
249/* Insert enough spaces into the output area of PRETTY-PRINTER to bring
250 the column position to the current indentation level, assuming that a
251 newline has just been written to the buffer. */
252void
b066401f 253pp_indent (pretty_printer *pp)
4b780675
GDR
254{
255 int n = pp_indentation (pp);
256 int i;
257
258 for (i = 0; i < n; ++i)
259 pp_space (pp);
260}
261
39ce81c9 262/* The following format specifiers are recognized as being client independent:
b6fe0bb8
GDR
263 %d, %i: (signed) integer in base ten.
264 %u: unsigned integer in base ten.
265 %o: unsigned integer in base eight.
266 %x: unsigned integer in base sixteen.
267 %ld, %li, %lo, %lu, %lx: long versions of the above.
268 %lld, %lli, %llo, %llu, %llx: long long versions.
269 %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions.
270 %c: character.
271 %s: string.
272 %p: pointer.
4b84d650
JJ
273 %r: if pp_show_color(pp), switch to color identified by const char *.
274 %R: if pp_show_color(pp), reset color.
b6fe0bb8 275 %m: strerror(text->err_no) - does not consume a value from args_ptr.
a668adb2 276 %%: '%'.
ca09cd34
JM
277 %<: opening quote.
278 %>: closing quote.
279 %': apostrophe (should only be used in untranslated messages;
280 translations should use appropriate punctuation directly).
39ce81c9
ZW
281 %.*s: a substring the length of which is specified by an argument
282 integer.
283 %Ns: likewise, but length specified as constant in the format string.
39ce81c9
ZW
284 Flag 'q': quote formatted text (must come immediately after '%').
285
286 Arguments can be used sequentially, or through %N$ resp. *N$
287 notation Nth argument after the format string. If %N$ / *N$
288 notation is used, it must be used for all arguments, except %m, %%,
289 %<, %> and %', which may not have a number, as they do not consume
290 an argument. When %M$.*N$s is used, M must be N + 1. (This may
291 also be written %M$.*s, provided N is not otherwise used.) The
292 format string must have conversion specifiers with argument numbers
293 1 up to highest argument; each argument may only be used once.
294 A format string can have at most 30 arguments. */
295
296/* Formatting phases 1 and 2: render TEXT->format_spec plus
025311c4 297 TEXT->args_ptr into a series of chunks in pp_buffer (PP)->args[].
b066401f 298 Phase 3 is in pp_format_text. */
39ce81c9 299
b6fe0bb8 300void
b066401f 301pp_format (pretty_printer *pp, text_info *text)
b6fe0bb8 302{
025311c4 303 output_buffer *buffer = pp_buffer (pp);
39ce81c9
ZW
304 const char *p;
305 const char **args;
306 struct chunk_info *new_chunk_array;
307
308 unsigned int curarg = 0, chunk = 0, argno;
309 pp_wrapping_mode_t old_wrapping_mode;
310 bool any_unnumbered = false, any_numbered = false;
311 const char **formatters[PP_NL_ARGMAX];
312
313 /* Allocate a new chunk structure. */
314 new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info);
315 new_chunk_array->prev = buffer->cur_chunk_array;
316 buffer->cur_chunk_array = new_chunk_array;
317 args = new_chunk_array->args;
318
319 /* Formatting phase 1: split up TEXT->format_spec into chunks in
025311c4 320 pp_buffer (PP)->args[]. Even-numbered chunks are to be output
39ce81c9
ZW
321 verbatim, odd-numbered chunks are format specifiers.
322 %m, %%, %<, %>, and %' are replaced with the appropriate text at
323 this point. */
324
325 memset (formatters, 0, sizeof formatters);
b8698a0f 326
39ce81c9 327 for (p = text->format_spec; *p; )
b6fe0bb8 328 {
39ce81c9
ZW
329 while (*p != '\0' && *p != '%')
330 {
331 obstack_1grow (&buffer->chunk_obstack, *p);
332 p++;
333 }
b6fe0bb8 334
39ce81c9
ZW
335 if (*p == '\0')
336 break;
337
338 switch (*++p)
339 {
340 case '\0':
341 gcc_unreachable ();
b8698a0f 342
39ce81c9
ZW
343 case '%':
344 obstack_1grow (&buffer->chunk_obstack, '%');
345 p++;
346 continue;
b6fe0bb8 347
39ce81c9 348 case '<':
4b84d650
JJ
349 {
350 obstack_grow (&buffer->chunk_obstack,
351 open_quote, strlen (open_quote));
352 const char *colorstr
353 = colorize_start (pp_show_color (pp), "quote");
354 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
355 p++;
356 continue;
357 }
39ce81c9
ZW
358
359 case '>':
4b84d650
JJ
360 {
361 const char *colorstr = colorize_stop (pp_show_color (pp));
362 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
363 }
364 /* FALLTHRU */
39ce81c9
ZW
365 case '\'':
366 obstack_grow (&buffer->chunk_obstack,
241de8a0 367 close_quote, strlen (close_quote));
39ce81c9
ZW
368 p++;
369 continue;
370
4b84d650
JJ
371 case 'R':
372 {
373 const char *colorstr = colorize_stop (pp_show_color (pp));
374 obstack_grow (&buffer->chunk_obstack, colorstr,
375 strlen (colorstr));
376 p++;
377 continue;
378 }
379
39ce81c9
ZW
380 case 'm':
381 {
382 const char *errstr = xstrerror (text->err_no);
383 obstack_grow (&buffer->chunk_obstack, errstr, strlen (errstr));
384 }
385 p++;
386 continue;
387
388 default:
389 /* Handled in phase 2. Terminate the plain chunk here. */
390 obstack_1grow (&buffer->chunk_obstack, '\0');
391 gcc_assert (chunk < PP_NL_ARGMAX * 2);
392 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
393 break;
394 }
395
396 if (ISDIGIT (*p))
397 {
398 char *end;
399 argno = strtoul (p, &end, 10) - 1;
400 p = end;
401 gcc_assert (*p == '$');
402 p++;
403
404 any_numbered = true;
405 gcc_assert (!any_unnumbered);
406 }
407 else
408 {
409 argno = curarg++;
410 any_unnumbered = true;
411 gcc_assert (!any_numbered);
412 }
413 gcc_assert (argno < PP_NL_ARGMAX);
414 gcc_assert (!formatters[argno]);
415 formatters[argno] = &args[chunk];
416 do
417 {
418 obstack_1grow (&buffer->chunk_obstack, *p);
419 p++;
420 }
421 while (strchr ("qwl+#", p[-1]));
422
423 if (p[-1] == '.')
424 {
425 /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
426 (where M == N + 1). */
427 if (ISDIGIT (*p))
428 {
429 do
430 {
431 obstack_1grow (&buffer->chunk_obstack, *p);
432 p++;
433 }
434 while (ISDIGIT (p[-1]));
435 gcc_assert (p[-1] == 's');
436 }
437 else
438 {
439 gcc_assert (*p == '*');
440 obstack_1grow (&buffer->chunk_obstack, '*');
441 p++;
442
443 if (ISDIGIT (*p))
444 {
445 char *end;
446 unsigned int argno2 = strtoul (p, &end, 10) - 1;
447 p = end;
448 gcc_assert (argno2 == argno - 1);
449 gcc_assert (!any_unnumbered);
450 gcc_assert (*p == '$');
451
452 p++;
453 formatters[argno2] = formatters[argno];
454 }
455 else
456 {
457 gcc_assert (!any_numbered);
458 formatters[argno+1] = formatters[argno];
459 curarg++;
460 }
461 gcc_assert (*p == 's');
462 obstack_1grow (&buffer->chunk_obstack, 's');
463 p++;
464 }
465 }
466 if (*p == '\0')
b6fe0bb8
GDR
467 break;
468
39ce81c9
ZW
469 obstack_1grow (&buffer->chunk_obstack, '\0');
470 gcc_assert (chunk < PP_NL_ARGMAX * 2);
471 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
472 }
473
474 obstack_1grow (&buffer->chunk_obstack, '\0');
475 gcc_assert (chunk < PP_NL_ARGMAX * 2);
476 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
477 args[chunk] = 0;
b8698a0f 478
39ce81c9
ZW
479 /* Set output to the argument obstack, and switch line-wrapping and
480 prefixing off. */
481 buffer->obstack = &buffer->chunk_obstack;
482 old_wrapping_mode = pp_set_verbatim_wrapping (pp);
483
484 /* Second phase. Replace each formatter with the formatted text it
485 corresponds to. */
486
487 for (argno = 0; formatters[argno]; argno++)
488 {
489 int precision = 0;
490 bool wide = false;
491 bool plus = false;
492 bool hash = false;
493 bool quote = false;
494
495 /* We do not attempt to enforce any ordering on the modifier
496 characters. */
497
498 for (p = *formatters[argno];; p++)
a668adb2 499 {
39ce81c9
ZW
500 switch (*p)
501 {
502 case 'q':
503 gcc_assert (!quote);
504 quote = true;
505 continue;
506
507 case '+':
508 gcc_assert (!plus);
509 plus = true;
510 continue;
511
512 case '#':
513 gcc_assert (!hash);
514 hash = true;
515 continue;
516
517 case 'w':
518 gcc_assert (!wide);
519 wide = true;
520 continue;
521
522 case 'l':
523 /* We don't support precision beyond that of "long long". */
524 gcc_assert (precision < 2);
525 precision++;
526 continue;
527 }
528 break;
a668adb2 529 }
39ce81c9
ZW
530
531 gcc_assert (!wide || precision == 0);
532
533 if (quote)
4b84d650
JJ
534 {
535 pp_string (pp, open_quote);
536 pp_string (pp, colorize_start (pp_show_color (pp), "quote"));
537 }
39ce81c9
ZW
538
539 switch (*p)
b6fe0bb8 540 {
4b84d650
JJ
541 case 'r':
542 pp_string (pp, colorize_start (pp_show_color (pp),
543 va_arg (*text->args_ptr,
544 const char *)));
545 break;
546
b6fe0bb8
GDR
547 case 'c':
548 pp_character (pp, va_arg (*text->args_ptr, int));
549 break;
550
551 case 'd':
552 case 'i':
39ce81c9
ZW
553 if (wide)
554 pp_wide_integer (pp, va_arg (*text->args_ptr, HOST_WIDE_INT));
555 else
556 pp_integer_with_precision
557 (pp, *text->args_ptr, precision, int, "d");
b6fe0bb8
GDR
558 break;
559
560 case 'o':
39ce81c9
ZW
561 if (wide)
562 pp_scalar (pp, "%" HOST_WIDE_INT_PRINT "o",
563 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
564 else
565 pp_integer_with_precision
566 (pp, *text->args_ptr, precision, unsigned, "o");
b6fe0bb8
GDR
567 break;
568
569 case 's':
570 pp_string (pp, va_arg (*text->args_ptr, const char *));
571 break;
572
39ce81c9
ZW
573 case 'p':
574 pp_pointer (pp, va_arg (*text->args_ptr, void *));
575 break;
b6fe0bb8
GDR
576
577 case 'u':
39ce81c9
ZW
578 if (wide)
579 pp_scalar (pp, HOST_WIDE_INT_PRINT_UNSIGNED,
580 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
581 else
582 pp_integer_with_precision
583 (pp, *text->args_ptr, precision, unsigned, "u");
b6fe0bb8
GDR
584 break;
585
586 case 'x':
39ce81c9
ZW
587 if (wide)
588 pp_scalar (pp, HOST_WIDE_INT_PRINT_HEX,
589 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
590 else
591 pp_integer_with_precision
592 (pp, *text->args_ptr, precision, unsigned, "x");
b6fe0bb8
GDR
593 break;
594
b6fe0bb8
GDR
595 case '.':
596 {
597 int n;
598 const char *s;
d5706a1e 599
39ce81c9
ZW
600 /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
601 (where M == N + 1). The format string should be verified
602 already from the first phase. */
603 p++;
604 if (ISDIGIT (*p))
605 {
606 char *end;
607 n = strtoul (p, &end, 10);
608 p = end;
609 gcc_assert (*p == 's');
610 }
611 else
612 {
613 gcc_assert (*p == '*');
614 p++;
615 gcc_assert (*p == 's');
616 n = va_arg (*text->args_ptr, int);
617
618 /* This consumes a second entry in the formatters array. */
619 gcc_assert (formatters[argno] == formatters[argno+1]);
620 argno++;
621 }
622
b6fe0bb8
GDR
623 s = va_arg (*text->args_ptr, const char *);
624 pp_append_text (pp, s, s + n);
625 }
626 break;
627
628 default:
0e61db61
NS
629 {
630 bool ok;
39ce81c9 631
0e61db61 632 gcc_assert (pp_format_decoder (pp));
39ce81c9
ZW
633 ok = pp_format_decoder (pp) (pp, text, p,
634 precision, wide, plus, hash);
0e61db61
NS
635 gcc_assert (ok);
636 }
b6fe0bb8 637 }
39ce81c9
ZW
638
639 if (quote)
4b84d650
JJ
640 {
641 pp_string (pp, colorize_stop (pp_show_color (pp)));
642 pp_string (pp, close_quote);
643 }
39ce81c9
ZW
644
645 obstack_1grow (&buffer->chunk_obstack, '\0');
646 *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
b6fe0bb8 647 }
39ce81c9 648
b2b29377
MM
649 if (CHECKING_P)
650 for (; argno < PP_NL_ARGMAX; argno++)
651 gcc_assert (!formatters[argno]);
39ce81c9
ZW
652
653 /* Revert to normal obstack and wrapping mode. */
654 buffer->obstack = &buffer->formatted_obstack;
655 buffer->line_length = 0;
656 pp_wrapping_mode (pp) = old_wrapping_mode;
657 pp_clear_state (pp);
658}
659
660/* Format of a message pointed to by TEXT. */
661void
b066401f 662pp_output_formatted_text (pretty_printer *pp)
39ce81c9
ZW
663{
664 unsigned int chunk;
665 output_buffer *buffer = pp_buffer (pp);
666 struct chunk_info *chunk_array = buffer->cur_chunk_array;
667 const char **args = chunk_array->args;
668
669 gcc_assert (buffer->obstack == &buffer->formatted_obstack);
670 gcc_assert (buffer->line_length == 0);
671
b066401f 672 /* This is a third phase, first 2 phases done in pp_format_args.
39ce81c9
ZW
673 Now we actually print it. */
674 for (chunk = 0; args[chunk]; chunk++)
675 pp_string (pp, args[chunk]);
676
677 /* Deallocate the chunk structure and everything after it (i.e. the
678 associated series of formatted strings). */
679 buffer->cur_chunk_array = chunk_array->prev;
680 obstack_free (&buffer->chunk_obstack, chunk_array);
b6fe0bb8
GDR
681}
682
683/* Helper subroutine of output_verbatim and verbatim. Do the appropriate
684 settings needed by BUFFER for a verbatim formatting. */
685void
b066401f 686pp_format_verbatim (pretty_printer *pp, text_info *text)
b6fe0bb8 687{
b6fe0bb8 688 /* Set verbatim mode. */
39ce81c9
ZW
689 pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp);
690
b6fe0bb8 691 /* Do the actual formatting. */
39ce81c9
ZW
692 pp_format (pp, text);
693 pp_output_formatted_text (pp);
694
b6fe0bb8 695 /* Restore previous settings. */
39ce81c9 696 pp_wrapping_mode (pp) = oldmode;
b6fe0bb8
GDR
697}
698
48749dbc
MLI
699/* Flush the content of BUFFER onto the attached stream. This
700 function does nothing unless pp->output_buffer->flush_p. */
b6fe0bb8 701void
b066401f 702pp_flush (pretty_printer *pp)
b6fe0bb8 703{
48749dbc
MLI
704 pp_clear_state (pp);
705 if (!pp->buffer->flush_p)
706 return;
b6fe0bb8 707 pp_write_text_to_stream (pp);
48749dbc
MLI
708 fflush (pp_buffer (pp)->stream);
709}
710
711/* Flush the content of BUFFER onto the attached stream independently
712 of the value of pp->output_buffer->flush_p. */
713void
714pp_really_flush (pretty_printer *pp)
715{
b6fe0bb8 716 pp_clear_state (pp);
48749dbc 717 pp_write_text_to_stream (pp);
025311c4 718 fflush (pp_buffer (pp)->stream);
b6fe0bb8
GDR
719}
720
721/* Sets the number of maximum characters per line PRETTY-PRINTER can
722 output in line-wrapping mode. A LENGTH value 0 suppresses
723 line-wrapping. */
724void
b066401f 725pp_set_line_maximum_length (pretty_printer *pp, int length)
b6fe0bb8
GDR
726{
727 pp_line_cutoff (pp) = length;
728 pp_set_real_maximum_length (pp);
729}
730
731/* Clear PRETTY-PRINTER output area text info. */
732void
b066401f 733pp_clear_output_area (pretty_printer *pp)
b6fe0bb8 734{
025311c4
GDR
735 obstack_free (pp_buffer (pp)->obstack,
736 obstack_base (pp_buffer (pp)->obstack));
737 pp_buffer (pp)->line_length = 0;
b6fe0bb8
GDR
738}
739
740/* Set PREFIX for PRETTY-PRINTER. */
741void
b066401f 742pp_set_prefix (pretty_printer *pp, const char *prefix)
b6fe0bb8
GDR
743{
744 pp->prefix = prefix;
745 pp_set_real_maximum_length (pp);
746 pp->emitted_prefix = false;
747 pp_indentation (pp) = 0;
748}
749
750/* Free PRETTY-PRINTER's prefix, a previously malloc()'d string. */
751void
b066401f 752pp_destroy_prefix (pretty_printer *pp)
b6fe0bb8
GDR
753{
754 if (pp->prefix != NULL)
755 {
b1d5455a 756 free (CONST_CAST (char *, pp->prefix));
b6fe0bb8
GDR
757 pp->prefix = NULL;
758 }
759}
760
761/* Write out PRETTY-PRINTER's prefix. */
762void
b066401f 763pp_emit_prefix (pretty_printer *pp)
b6fe0bb8
GDR
764{
765 if (pp->prefix != NULL)
766 {
767 switch (pp_prefixing_rule (pp))
768 {
769 default:
770 case DIAGNOSTICS_SHOW_PREFIX_NEVER:
771 break;
772
773 case DIAGNOSTICS_SHOW_PREFIX_ONCE:
774 if (pp->emitted_prefix)
775 {
b066401f 776 pp_indent (pp);
b6fe0bb8
GDR
777 break;
778 }
779 pp_indentation (pp) += 3;
780 /* Fall through. */
781
782 case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
783 {
784 int prefix_length = strlen (pp->prefix);
785 pp_append_r (pp, pp->prefix, prefix_length);
786 pp->emitted_prefix = true;
787 }
788 break;
789 }
790 }
791}
792
793/* Construct a PRETTY-PRINTER with PREFIX and of MAXIMUM_LENGTH
794 characters per line. */
da6ca2b5
GDR
795
796pretty_printer::pretty_printer (const char *p, int l)
797 : buffer (new (XCNEW (output_buffer)) output_buffer ()),
798 prefix (),
799 padding (pp_none),
800 maximum_length (),
801 indent_skip (),
802 wrapping (),
803 format_decoder (),
804 emitted_prefix (),
805 need_newline (),
c3284718 806 translate_identifiers (true),
da6ca2b5 807 show_color ()
b6fe0bb8 808{
da6ca2b5
GDR
809 pp_line_cutoff (this) = l;
810 /* By default, we emit prefixes once per message. */
811 pp_prefixing_rule (this) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
812 pp_set_prefix (this, p);
b6fe0bb8
GDR
813}
814
025311c4
GDR
815pretty_printer::~pretty_printer ()
816{
817 buffer->~output_buffer ();
818 XDELETE (buffer);
819}
820
b6fe0bb8
GDR
821/* Append a string delimited by START and END to the output area of
822 PRETTY-PRINTER. No line wrapping is done. However, if beginning a
823 new line then emit PRETTY-PRINTER's prefix and skip any leading
824 whitespace if appropriate. The caller must ensure that it is
825 safe to do so. */
826void
b066401f 827pp_append_text (pretty_printer *pp, const char *start, const char *end)
b6fe0bb8
GDR
828{
829 /* Emit prefix and skip whitespace if we're starting a new line. */
025311c4 830 if (pp_buffer (pp)->line_length == 0)
b6fe0bb8
GDR
831 {
832 pp_emit_prefix (pp);
833 if (pp_is_wrapping_line (pp))
834 while (start != end && *start == ' ')
835 ++start;
836 }
837 pp_append_r (pp, start, end - start);
838}
839
840/* Finishes constructing a NULL-terminated character string representing
841 the PRETTY-PRINTED text. */
842const char *
b066401f 843pp_formatted_text (pretty_printer *pp)
b6fe0bb8 844{
c4100eae 845 return output_buffer_formatted_text (pp_buffer (pp));
b6fe0bb8
GDR
846}
847
848/* Return a pointer to the last character emitted in PRETTY-PRINTER's
849 output area. A NULL pointer means no character available. */
850const char *
b066401f 851pp_last_position_in_text (const pretty_printer *pp)
b6fe0bb8 852{
c4100eae 853 return output_buffer_last_position_in_text (pp_buffer (pp));
b6fe0bb8
GDR
854}
855
856/* Return the amount of characters PRETTY-PRINTER can accept to
ba228239 857 make a full line. Meaningful only in line-wrapping mode. */
b6fe0bb8 858int
b066401f 859pp_remaining_character_count_for_line (pretty_printer *pp)
b6fe0bb8 860{
025311c4 861 return pp->maximum_length - pp_buffer (pp)->line_length;
b6fe0bb8
GDR
862}
863
864
865/* Format a message into BUFFER a la printf. */
866void
867pp_printf (pretty_printer *pp, const char *msg, ...)
868{
869 text_info text;
870 va_list ap;
871
872 va_start (ap, msg);
873 text.err_no = errno;
874 text.args_ptr = &ap;
875 text.format_spec = msg;
39ce81c9
ZW
876 pp_format (pp, &text);
877 pp_output_formatted_text (pp);
b6fe0bb8
GDR
878 va_end (ap);
879}
880
881
882/* Output MESSAGE verbatim into BUFFER. */
883void
884pp_verbatim (pretty_printer *pp, const char *msg, ...)
885{
886 text_info text;
887 va_list ap;
888
889 va_start (ap, msg);
890 text.err_no = errno;
891 text.args_ptr = &ap;
892 text.format_spec = msg;
893 pp_format_verbatim (pp, &text);
894 va_end (ap);
895}
896
897
898
899/* Have PRETTY-PRINTER start a new line. */
900void
b066401f 901pp_newline (pretty_printer *pp)
b6fe0bb8 902{
025311c4 903 obstack_1grow (pp_buffer (pp)->obstack, '\n');
c4669594 904 pp_needs_newline (pp) = false;
025311c4 905 pp_buffer (pp)->line_length = 0;
b6fe0bb8
GDR
906}
907
908/* Have PRETTY-PRINTER add a CHARACTER. */
909void
b066401f 910pp_character (pretty_printer *pp, int c)
b6fe0bb8
GDR
911{
912 if (pp_is_wrapping_line (pp)
913 && pp_remaining_character_count_for_line (pp) <= 0)
914 {
915 pp_newline (pp);
916 if (ISSPACE (c))
917 return;
918 }
025311c4
GDR
919 obstack_1grow (pp_buffer (pp)->obstack, c);
920 ++pp_buffer (pp)->line_length;
b6fe0bb8
GDR
921}
922
923/* Append a STRING to the output area of PRETTY-PRINTER; the STRING may
924 be line-wrapped if in appropriate mode. */
925void
b066401f 926pp_string (pretty_printer *pp, const char *str)
b6fe0bb8 927{
41d9f1e0
MLI
928 gcc_checking_assert (str);
929 pp_maybe_wrap_text (pp, str, str + strlen (str));
b6fe0bb8
GDR
930}
931
471854f8 932/* Maybe print out a whitespace if needed. */
b6fe0bb8 933
b9b44fb9 934void
b066401f 935pp_maybe_space (pretty_printer *pp)
b9b44fb9 936{
b066401f 937 if (pp->padding != pp_none)
b9b44fb9
GDR
938 {
939 pp_space (pp);
b066401f 940 pp->padding = pp_none;
b9b44fb9
GDR
941 }
942}
0fc80001
GDR
943
944// Add a newline to the pretty printer PP and flush formatted text.
945
946void
947pp_newline_and_flush (pretty_printer *pp)
948{
949 pp_newline (pp);
950 pp_flush (pp);
951 pp_needs_newline (pp) = false;
952}
953
954// Add a newline to the pretty printer PP, followed by indentation.
955
956void
957pp_newline_and_indent (pretty_printer *pp, int n)
958{
959 pp_indentation (pp) += n;
960 pp_newline (pp);
961 pp_indent (pp);
962 pp_needs_newline (pp) = false;
963}
964
965// Add separator C, followed by a single whitespace.
966
967void
968pp_separate_with (pretty_printer *pp, char c)
969{
970 pp_character (pp, c);
971 pp_space (pp);
972}
973
a3af5087
JM
974\f
975/* The string starting at P has LEN (at least 1) bytes left; if they
976 start with a valid UTF-8 sequence, return the length of that
977 sequence and set *VALUE to the value of that sequence, and
978 otherwise return 0 and set *VALUE to (unsigned int) -1. */
979
980static int
981decode_utf8_char (const unsigned char *p, size_t len, unsigned int *value)
982{
983 unsigned int t = *p;
984
985 if (len == 0)
986 abort ();
987 if (t & 0x80)
988 {
989 size_t utf8_len = 0;
990 unsigned int ch;
991 size_t i;
992 for (t = *p; t & 0x80; t <<= 1)
993 utf8_len++;
994
995 if (utf8_len > len || utf8_len < 2 || utf8_len > 6)
996 {
997 *value = (unsigned int) -1;
998 return 0;
999 }
1000 ch = *p & ((1 << (7 - utf8_len)) - 1);
1001 for (i = 1; i < utf8_len; i++)
1002 {
1003 unsigned int u = p[i];
1004 if ((u & 0xC0) != 0x80)
1005 {
1006 *value = (unsigned int) -1;
1007 return 0;
1008 }
1009 ch = (ch << 6) | (u & 0x3F);
1010 }
1011 if ( (ch <= 0x7F && utf8_len > 1)
1012 || (ch <= 0x7FF && utf8_len > 2)
1013 || (ch <= 0xFFFF && utf8_len > 3)
1014 || (ch <= 0x1FFFFF && utf8_len > 4)
1015 || (ch <= 0x3FFFFFF && utf8_len > 5)
1016 || (ch >= 0xD800 && ch <= 0xDFFF))
1017 {
1018 *value = (unsigned int) -1;
1019 return 0;
1020 }
1021 *value = ch;
1022 return utf8_len;
1023 }
1024 else
1025 {
1026 *value = t;
1027 return 1;
1028 }
1029}
1030
ab9b814d
JM
1031/* Allocator for identifier_to_locale and corresponding function to
1032 free memory. */
1033
1034void *(*identifier_to_locale_alloc) (size_t) = xmalloc;
1035void (*identifier_to_locale_free) (void *) = free;
1036
a3af5087
JM
1037/* Given IDENT, an identifier in the internal encoding, return a
1038 version of IDENT suitable for diagnostics in the locale character
ab9b814d
JM
1039 set: either IDENT itself, or a string, allocated using
1040 identifier_to_locale_alloc, converted to the locale character set
1041 and using escape sequences if not representable in the locale
1042 character set or containing control characters or invalid byte
1043 sequences. Existing backslashes in IDENT are not doubled, so the
1044 result may not uniquely specify the contents of an arbitrary byte
1045 sequence identifier. */
a3af5087
JM
1046
1047const char *
1048identifier_to_locale (const char *ident)
1049{
1050 const unsigned char *uid = (const unsigned char *) ident;
1051 size_t idlen = strlen (ident);
1052 bool valid_printable_utf8 = true;
1053 bool all_ascii = true;
1054 size_t i;
1055
1056 for (i = 0; i < idlen;)
1057 {
1058 unsigned int c;
1059 size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1060 if (utf8_len == 0 || c <= 0x1F || (c >= 0x7F && c <= 0x9F))
1061 {
1062 valid_printable_utf8 = false;
1063 break;
1064 }
1065 if (utf8_len > 1)
1066 all_ascii = false;
1067 i += utf8_len;
1068 }
1069
1070 /* If IDENT contains invalid UTF-8 sequences (which may occur with
1071 attributes putting arbitrary byte sequences in identifiers), or
1072 control characters, we use octal escape sequences for all bytes
1073 outside printable ASCII. */
1074 if (!valid_printable_utf8)
1075 {
ab9b814d 1076 char *ret = (char *) identifier_to_locale_alloc (4 * idlen + 1);
a3af5087
JM
1077 char *p = ret;
1078 for (i = 0; i < idlen; i++)
1079 {
1080 if (uid[i] > 0x1F && uid[i] < 0x7F)
1081 *p++ = uid[i];
1082 else
1083 {
1084 sprintf (p, "\\%03o", uid[i]);
1085 p += 4;
1086 }
1087 }
1088 *p = 0;
1089 return ret;
1090 }
1091
1092 /* Otherwise, if it is valid printable ASCII, or printable UTF-8
1093 with the locale character set being UTF-8, IDENT is used. */
1094 if (all_ascii || locale_utf8)
1095 return ident;
1096
1097 /* Otherwise IDENT is converted to the locale character set if
1098 possible. */
1099#if defined ENABLE_NLS && defined HAVE_LANGINFO_CODESET && HAVE_ICONV
1100 if (locale_encoding != NULL)
1101 {
1102 iconv_t cd = iconv_open (locale_encoding, "UTF-8");
1103 bool conversion_ok = true;
1104 char *ret = NULL;
1105 if (cd != (iconv_t) -1)
1106 {
1107 size_t ret_alloc = 4 * idlen + 1;
1108 for (;;)
1109 {
1110 /* Repeat the whole conversion process as needed with
1111 larger buffers so non-reversible transformations can
1112 always be detected. */
1113 ICONV_CONST char *inbuf = CONST_CAST (char *, ident);
1114 char *outbuf;
1115 size_t inbytesleft = idlen;
1116 size_t outbytesleft = ret_alloc - 1;
1117 size_t iconv_ret;
1118
ab9b814d 1119 ret = (char *) identifier_to_locale_alloc (ret_alloc);
a3af5087
JM
1120 outbuf = ret;
1121
1122 if (iconv (cd, 0, 0, 0, 0) == (size_t) -1)
1123 {
1124 conversion_ok = false;
1125 break;
1126 }
1127
1128 iconv_ret = iconv (cd, &inbuf, &inbytesleft,
1129 &outbuf, &outbytesleft);
1130 if (iconv_ret == (size_t) -1 || inbytesleft != 0)
1131 {
1132 if (errno == E2BIG)
1133 {
1134 ret_alloc *= 2;
ab9b814d 1135 identifier_to_locale_free (ret);
a3af5087
JM
1136 ret = NULL;
1137 continue;
1138 }
1139 else
1140 {
1141 conversion_ok = false;
1142 break;
1143 }
1144 }
1145 else if (iconv_ret != 0)
1146 {
1147 conversion_ok = false;
1148 break;
1149 }
1150 /* Return to initial shift state. */
1151 if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t) -1)
1152 {
1153 if (errno == E2BIG)
1154 {
1155 ret_alloc *= 2;
ab9b814d 1156 identifier_to_locale_free (ret);
a3af5087
JM
1157 ret = NULL;
1158 continue;
1159 }
1160 else
1161 {
1162 conversion_ok = false;
1163 break;
1164 }
1165 }
1166 *outbuf = 0;
1167 break;
1168 }
1169 iconv_close (cd);
1170 if (conversion_ok)
1171 return ret;
1172 }
1173 }
1174#endif
1175
1176 /* Otherwise, convert non-ASCII characters in IDENT to UCNs. */
1177 {
ab9b814d 1178 char *ret = (char *) identifier_to_locale_alloc (10 * idlen + 1);
a3af5087
JM
1179 char *p = ret;
1180 for (i = 0; i < idlen;)
1181 {
1182 unsigned int c;
1183 size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1184 if (utf8_len == 1)
1185 *p++ = uid[i];
1186 else
1187 {
1188 sprintf (p, "\\U%08x", c);
1189 p += 10;
1190 }
1191 i += utf8_len;
1192 }
1193 *p = 0;
1194 return ret;
1195 }
1196}