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