Reimplement diagnostic_show_locus, introducing rich_location classes
[platform/upstream/linaro-gcc.git] / gcc / pretty-print.c
1 /* Various declarations for language-independent pretty-print subroutines.
2    Copyright (C) 2003-2015 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 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_range (unsigned int idx, source_range range, bool caret_p)
39 {
40   gcc_checking_assert (m_richloc);
41   m_richloc->set_range (idx, range, caret_p, true);
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   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
198 /* Wrap a text delimited by START and END into PRETTY-PRINTER.  */
199 static void
200 pp_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.  */
232 static inline void
233 pp_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.  */
243 static inline void
244 pp_append_r (pretty_printer *pp, const char *start, int length)
245 {
246   output_buffer_append_r (pp_buffer (pp), start, length);
247 }
248
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.  */
252 void
253 pp_indent (pretty_printer *pp)
254 {
255   int n = pp_indentation (pp);
256   int i;
257
258   for (i = 0; i < n; ++i)
259     pp_space (pp);
260 }
261
262 /* The following format specifiers are recognized as being client independent:
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.
273    %r: if pp_show_color(pp), switch to color identified by const char *.
274    %R: if pp_show_color(pp), reset color.
275    %m: strerror(text->err_no) - does not consume a value from args_ptr.
276    %%: '%'.
277    %<: opening quote.
278    %>: closing quote.
279    %': apostrophe (should only be used in untranslated messages;
280        translations should use appropriate punctuation directly).
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.
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
297    TEXT->args_ptr into a series of chunks in pp_buffer (PP)->args[].
298    Phase 3 is in pp_format_text.  */
299
300 void
301 pp_format (pretty_printer *pp, text_info *text)
302 {
303   output_buffer *buffer = pp_buffer (pp);
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
320      pp_buffer (PP)->args[].  Even-numbered chunks are to be output
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);
326
327   for (p = text->format_spec; *p; )
328     {
329       while (*p != '\0' && *p != '%')
330         {
331           obstack_1grow (&buffer->chunk_obstack, *p);
332           p++;
333         }
334
335       if (*p == '\0')
336         break;
337
338       switch (*++p)
339         {
340         case '\0':
341           gcc_unreachable ();
342
343         case '%':
344           obstack_1grow (&buffer->chunk_obstack, '%');
345           p++;
346           continue;
347
348         case '<':
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           }
358
359         case '>':
360           {
361             const char *colorstr = colorize_stop (pp_show_color (pp));
362             obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
363           }
364           /* FALLTHRU */
365         case '\'':
366           obstack_grow (&buffer->chunk_obstack,
367                         close_quote, strlen (close_quote));
368           p++;
369           continue;
370
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
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')
467         break;
468
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;
478
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++)
499         {
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;
529         }
530
531       gcc_assert (!wide || precision == 0);
532
533       if (quote)
534         {
535           pp_string (pp, open_quote);
536           pp_string (pp, colorize_start (pp_show_color (pp), "quote"));
537         }
538
539       switch (*p)
540         {
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
547         case 'c':
548           pp_character (pp, va_arg (*text->args_ptr, int));
549           break;
550
551         case 'd':
552         case 'i':
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");
558           break;
559
560         case 'o':
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");
567           break;
568
569         case 's':
570           pp_string (pp, va_arg (*text->args_ptr, const char *));
571           break;
572
573         case 'p':
574           pp_pointer (pp, va_arg (*text->args_ptr, void *));
575           break;
576
577         case 'u':
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");
584           break;
585
586         case 'x':
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");
593           break;
594
595         case '.':
596           {
597             int n;
598             const char *s;
599
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
623             s = va_arg (*text->args_ptr, const char *);
624             pp_append_text (pp, s, s + n);
625           }
626           break;
627
628         default:
629           {
630             bool ok;
631
632             gcc_assert (pp_format_decoder (pp));
633             ok = pp_format_decoder (pp) (pp, text, p,
634                                          precision, wide, plus, hash);
635             gcc_assert (ok);
636           }
637         }
638
639       if (quote)
640         {
641           pp_string (pp, colorize_stop (pp_show_color (pp)));
642           pp_string (pp, close_quote);
643         }
644
645       obstack_1grow (&buffer->chunk_obstack, '\0');
646       *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
647     }
648
649   if (CHECKING_P)
650     for (; argno < PP_NL_ARGMAX; argno++)
651       gcc_assert (!formatters[argno]);
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.  */
661 void
662 pp_output_formatted_text (pretty_printer *pp)
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
672   /* This is a third phase, first 2 phases done in pp_format_args.
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);
681 }
682
683 /* Helper subroutine of output_verbatim and verbatim. Do the appropriate
684    settings needed by BUFFER for a verbatim formatting.  */
685 void
686 pp_format_verbatim (pretty_printer *pp, text_info *text)
687 {
688   /* Set verbatim mode.  */
689   pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp);
690
691   /* Do the actual formatting.  */
692   pp_format (pp, text);
693   pp_output_formatted_text (pp);
694
695   /* Restore previous settings.  */
696   pp_wrapping_mode (pp) = oldmode;
697 }
698
699 /* Flush the content of BUFFER onto the attached stream.  This
700    function does nothing unless pp->output_buffer->flush_p.  */
701 void
702 pp_flush (pretty_printer *pp)
703 {
704   pp_clear_state (pp);
705   if (!pp->buffer->flush_p)
706     return;
707   pp_write_text_to_stream (pp);
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.  */
713 void
714 pp_really_flush (pretty_printer *pp)
715 {
716   pp_clear_state (pp);
717   pp_write_text_to_stream (pp);
718   fflush (pp_buffer (pp)->stream);
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.  */
724 void
725 pp_set_line_maximum_length (pretty_printer *pp, int length)
726 {
727   pp_line_cutoff (pp) = length;
728   pp_set_real_maximum_length (pp);
729 }
730
731 /* Clear PRETTY-PRINTER output area text info.  */
732 void
733 pp_clear_output_area (pretty_printer *pp)
734 {
735   obstack_free (pp_buffer (pp)->obstack,
736                 obstack_base (pp_buffer (pp)->obstack));
737   pp_buffer (pp)->line_length = 0;
738 }
739
740 /* Set PREFIX for PRETTY-PRINTER.  */
741 void
742 pp_set_prefix (pretty_printer *pp, const char *prefix)
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.  */
751 void
752 pp_destroy_prefix (pretty_printer *pp)
753 {
754   if (pp->prefix != NULL)
755     {
756       free (CONST_CAST (char *, pp->prefix));
757       pp->prefix = NULL;
758     }
759 }
760
761 /* Write out PRETTY-PRINTER's prefix.  */
762 void
763 pp_emit_prefix (pretty_printer *pp)
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             {
776               pp_indent (pp);
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.  */
795
796 pretty_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 (),
806     translate_identifiers (true),
807     show_color ()
808 {
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);
813 }
814
815 pretty_printer::~pretty_printer ()
816 {
817   buffer->~output_buffer ();
818   XDELETE (buffer);
819 }
820
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.  */
826 void
827 pp_append_text (pretty_printer *pp, const char *start, const char *end)
828 {
829   /* Emit prefix and skip whitespace if we're starting a new line.  */
830   if (pp_buffer (pp)->line_length == 0)
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.  */
842 const char *
843 pp_formatted_text (pretty_printer *pp)
844 {
845   return output_buffer_formatted_text (pp_buffer (pp));
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.  */
850 const char *
851 pp_last_position_in_text (const pretty_printer *pp)
852 {
853   return output_buffer_last_position_in_text (pp_buffer (pp));
854 }
855
856 /* Return the amount of characters PRETTY-PRINTER can accept to
857    make a full line.  Meaningful only in line-wrapping mode.  */
858 int
859 pp_remaining_character_count_for_line (pretty_printer *pp)
860 {
861   return pp->maximum_length - pp_buffer (pp)->line_length;
862 }
863
864
865 /* Format a message into BUFFER a la printf.  */
866 void
867 pp_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;
876   pp_format (pp, &text);
877   pp_output_formatted_text (pp);
878   va_end (ap);
879 }
880
881
882 /* Output MESSAGE verbatim into BUFFER.  */
883 void
884 pp_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.  */
900 void
901 pp_newline (pretty_printer *pp)
902 {
903   obstack_1grow (pp_buffer (pp)->obstack, '\n');
904   pp_needs_newline (pp) = false;
905   pp_buffer (pp)->line_length = 0;
906 }
907
908 /* Have PRETTY-PRINTER add a CHARACTER.  */
909 void
910 pp_character (pretty_printer *pp, int c)
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     }
919   obstack_1grow (pp_buffer (pp)->obstack, c);
920   ++pp_buffer (pp)->line_length;
921 }
922
923 /* Append a STRING to the output area of PRETTY-PRINTER; the STRING may
924    be line-wrapped if in appropriate mode.  */
925 void
926 pp_string (pretty_printer *pp, const char *str)
927 {
928   gcc_checking_assert (str);
929   pp_maybe_wrap_text (pp, str, str + strlen (str));
930 }
931
932 /* Maybe print out a whitespace if needed.  */
933
934 void
935 pp_maybe_space (pretty_printer *pp)
936 {
937   if (pp->padding != pp_none)
938     {
939       pp_space (pp);
940       pp->padding = pp_none;
941     }
942 }
943
944 // Add a newline to the pretty printer PP and flush formatted text.
945
946 void
947 pp_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
956 void
957 pp_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
967 void
968 pp_separate_with (pretty_printer *pp, char c)
969 {
970   pp_character (pp, c);
971   pp_space (pp);
972 }
973
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
980 static int
981 decode_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
1031 /* Allocator for identifier_to_locale and corresponding function to
1032    free memory.  */
1033
1034 void *(*identifier_to_locale_alloc) (size_t) = xmalloc;
1035 void (*identifier_to_locale_free) (void *) = free;
1036
1037 /* Given IDENT, an identifier in the internal encoding, return a
1038    version of IDENT suitable for diagnostics in the locale character
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.  */
1046
1047 const char *
1048 identifier_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     {
1076       char *ret = (char *) identifier_to_locale_alloc (4 * idlen + 1);
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
1119               ret = (char *) identifier_to_locale_alloc (ret_alloc);
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;
1135                       identifier_to_locale_free (ret);
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;
1156                       identifier_to_locale_free (ret);
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   {
1178     char *ret = (char *) identifier_to_locale_alloc (10 * idlen + 1);
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 }