OSDN Git Service

* c-common.c (c_common_reswords): Add _Static_assert for C.
[pf3gnuchains/gcc-fork.git] / gcc / pretty-print.c
1 /* Various declarations for language-independent pretty-print subroutines.
2    Copyright (C) 2003, 2004, 2005, 2007, 2008 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 #undef FLOAT /* This is for hpux. They should change hpux.  */
23 #undef FFS  /* Some systems define this in param.h.  */
24 #include "system.h"
25 #include "coretypes.h"
26 #include "intl.h"
27 #include "pretty-print.h"
28 #include "tree.h"
29 #include "ggc.h"
30
31 #if HAVE_ICONV
32 #include <iconv.h>
33 #endif
34
35 #define obstack_chunk_alloc xmalloc
36 #define obstack_chunk_free  free
37
38 /* A pointer to the formatted diagnostic message.  */
39 #define pp_formatted_text_data(PP) \
40    ((const char *) obstack_base (pp_base (PP)->buffer->obstack))
41
42 /* Format an integer given by va_arg (ARG, type-specifier T) where
43    type-specifier is a precision modifier as indicated by PREC.  F is
44    a string used to construct the appropriate format-specifier.  */
45 #define pp_integer_with_precision(PP, ARG, PREC, T, F)       \
46   do                                                         \
47     switch (PREC)                                            \
48       {                                                      \
49       case 0:                                                \
50         pp_scalar (PP, "%" F, va_arg (ARG, T));              \
51         break;                                               \
52                                                              \
53       case 1:                                                \
54         pp_scalar (PP, "%l" F, va_arg (ARG, long T));        \
55         break;                                               \
56                                                              \
57       case 2:                                                \
58         pp_scalar (PP, "%" HOST_LONG_LONG_FORMAT F, va_arg (ARG, long long T));  \
59         break;                                               \
60                                                              \
61       default:                                               \
62         break;                                               \
63       }                                                      \
64   while (0)
65
66
67 /* Subroutine of pp_set_maximum_length.  Set up PRETTY-PRINTER's
68    internal maximum characters per line.  */
69 static void
70 pp_set_real_maximum_length (pretty_printer *pp)
71 {
72   /* If we're told not to wrap lines then do the obvious thing.  In case
73      we'll emit prefix only once per message, it is appropriate
74      not to increase unnecessarily the line-length cut-off.  */
75   if (!pp_is_wrapping_line (pp)
76       || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_ONCE
77       || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_NEVER)
78     pp->maximum_length = pp_line_cutoff (pp);
79   else
80     {
81       int prefix_length = pp->prefix ? strlen (pp->prefix) : 0;
82       /* If the prefix is ridiculously too long, output at least
83          32 characters.  */
84       if (pp_line_cutoff (pp) - prefix_length < 32)
85         pp->maximum_length = pp_line_cutoff (pp) + 32;
86       else
87         pp->maximum_length = pp_line_cutoff (pp);
88     }
89 }
90
91 /* Clear PRETTY-PRINTER's output state.  */
92 static inline void
93 pp_clear_state (pretty_printer *pp)
94 {
95   pp->emitted_prefix = false;
96   pp_indentation (pp) = 0;
97 }
98
99 /* Flush the formatted text of PRETTY-PRINTER onto the attached stream.  */
100 void
101 pp_write_text_to_stream (pretty_printer *pp)
102 {
103   const char *text = pp_formatted_text (pp);
104   fputs (text, pp->buffer->stream);
105   pp_clear_output_area (pp);
106 }
107
108 /* Wrap a text delimited by START and END into PRETTY-PRINTER.  */
109 static void
110 pp_wrap_text (pretty_printer *pp, const char *start, const char *end)
111 {
112   bool wrapping_line = pp_is_wrapping_line (pp);
113
114   while (start != end)
115     {
116       /* Dump anything bordered by whitespaces.  */
117       {
118         const char *p = start;
119         while (p != end && !ISBLANK (*p) && *p != '\n')
120           ++p;
121         if (wrapping_line
122             && p - start >= pp_remaining_character_count_for_line (pp))
123           pp_newline (pp);
124         pp_append_text (pp, start, p);
125         start = p;
126       }
127
128       if (start != end && ISBLANK (*start))
129         {
130           pp_space (pp);
131           ++start;
132         }
133       if (start != end && *start == '\n')
134         {
135           pp_newline (pp);
136           ++start;
137         }
138     }
139 }
140
141 /* Same as pp_wrap_text but wrap text only when in line-wrapping mode.  */
142 static inline void
143 pp_maybe_wrap_text (pretty_printer *pp, const char *start, const char *end)
144 {
145   if (pp_is_wrapping_line (pp))
146     pp_wrap_text (pp, start, end);
147   else
148     pp_append_text (pp, start, end);
149 }
150
151 /* Append to the output area of PRETTY-PRINTER a string specified by its
152    STARTing character and LENGTH.  */
153 static inline void
154 pp_append_r (pretty_printer *pp, const char *start, int length)
155 {
156   obstack_grow (pp->buffer->obstack, start, length);
157   pp->buffer->line_length += length;
158 }
159
160 /* Insert enough spaces into the output area of PRETTY-PRINTER to bring
161    the column position to the current indentation level, assuming that a
162    newline has just been written to the buffer.  */
163 void
164 pp_base_indent (pretty_printer *pp)
165 {
166   int n = pp_indentation (pp);
167   int i;
168
169   for (i = 0; i < n; ++i)
170     pp_space (pp);
171 }
172
173 /* The following format specifiers are recognized as being client independent:
174    %d, %i: (signed) integer in base ten.
175    %u: unsigned integer in base ten.
176    %o: unsigned integer in base eight.
177    %x: unsigned integer in base sixteen.
178    %ld, %li, %lo, %lu, %lx: long versions of the above.
179    %lld, %lli, %llo, %llu, %llx: long long versions.
180    %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions.
181    %c: character.
182    %s: string.
183    %p: pointer.
184    %m: strerror(text->err_no) - does not consume a value from args_ptr.
185    %%: '%'.
186    %<: opening quote.
187    %>: closing quote.
188    %': apostrophe (should only be used in untranslated messages;
189        translations should use appropriate punctuation directly).
190    %.*s: a substring the length of which is specified by an argument
191          integer.
192    %Ns: likewise, but length specified as constant in the format string.
193    %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
194    Flag 'q': quote formatted text (must come immediately after '%').
195
196    Arguments can be used sequentially, or through %N$ resp. *N$
197    notation Nth argument after the format string.  If %N$ / *N$
198    notation is used, it must be used for all arguments, except %m, %%,
199    %<, %> and %', which may not have a number, as they do not consume
200    an argument.  When %M$.*N$s is used, M must be N + 1.  (This may
201    also be written %M$.*s, provided N is not otherwise used.)  The
202    format string must have conversion specifiers with argument numbers
203    1 up to highest argument; each argument may only be used once.
204    A format string can have at most 30 arguments.  */
205
206 /* Formatting phases 1 and 2: render TEXT->format_spec plus
207    TEXT->args_ptr into a series of chunks in PP->buffer->args[].
208    Phase 3 is in pp_base_format_text.  */
209
210 void
211 pp_base_format (pretty_printer *pp, text_info *text)
212 {
213   output_buffer *buffer = pp->buffer;
214   const char *p;
215   const char **args;
216   struct chunk_info *new_chunk_array;
217
218   unsigned int curarg = 0, chunk = 0, argno;
219   pp_wrapping_mode_t old_wrapping_mode;
220   bool any_unnumbered = false, any_numbered = false;
221   const char **formatters[PP_NL_ARGMAX];
222
223   /* Allocate a new chunk structure.  */
224   new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info);
225   new_chunk_array->prev = buffer->cur_chunk_array;
226   buffer->cur_chunk_array = new_chunk_array;
227   args = new_chunk_array->args;
228
229   /* Formatting phase 1: split up TEXT->format_spec into chunks in
230      PP->buffer->args[].  Even-numbered chunks are to be output
231      verbatim, odd-numbered chunks are format specifiers.
232      %m, %%, %<, %>, and %' are replaced with the appropriate text at
233      this point.  */
234
235   memset (formatters, 0, sizeof formatters);
236
237   for (p = text->format_spec; *p; )
238     {
239       while (*p != '\0' && *p != '%')
240         {
241           obstack_1grow (&buffer->chunk_obstack, *p);
242           p++;
243         }
244
245       if (*p == '\0')
246         break;
247
248       switch (*++p)
249         {
250         case '\0':
251           gcc_unreachable ();
252
253         case '%':
254           obstack_1grow (&buffer->chunk_obstack, '%');
255           p++;
256           continue;
257
258         case '<':
259           obstack_grow (&buffer->chunk_obstack,
260                         open_quote, strlen (open_quote));
261           p++;
262           continue;
263
264         case '>':
265         case '\'':
266           obstack_grow (&buffer->chunk_obstack,
267                         close_quote, strlen (close_quote));
268           p++;
269           continue;
270
271         case 'm':
272           {
273             const char *errstr = xstrerror (text->err_no);
274             obstack_grow (&buffer->chunk_obstack, errstr, strlen (errstr));
275           }
276           p++;
277           continue;
278
279         default:
280           /* Handled in phase 2.  Terminate the plain chunk here.  */
281           obstack_1grow (&buffer->chunk_obstack, '\0');
282           gcc_assert (chunk < PP_NL_ARGMAX * 2);
283           args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
284           break;
285         }
286
287       if (ISDIGIT (*p))
288         {
289           char *end;
290           argno = strtoul (p, &end, 10) - 1;
291           p = end;
292           gcc_assert (*p == '$');
293           p++;
294
295           any_numbered = true;
296           gcc_assert (!any_unnumbered);
297         }
298       else
299         {
300           argno = curarg++;
301           any_unnumbered = true;
302           gcc_assert (!any_numbered);
303         }
304       gcc_assert (argno < PP_NL_ARGMAX);
305       gcc_assert (!formatters[argno]);
306       formatters[argno] = &args[chunk];
307       do
308         {
309           obstack_1grow (&buffer->chunk_obstack, *p);
310           p++;
311         }
312       while (strchr ("qwl+#", p[-1]));
313
314       if (p[-1] == '.')
315         {
316           /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
317              (where M == N + 1).  */
318           if (ISDIGIT (*p))
319             {
320               do
321                 {
322                   obstack_1grow (&buffer->chunk_obstack, *p);
323                   p++;
324                 }
325               while (ISDIGIT (p[-1]));
326               gcc_assert (p[-1] == 's');
327             }
328           else
329             {
330               gcc_assert (*p == '*');
331               obstack_1grow (&buffer->chunk_obstack, '*');
332               p++;
333
334               if (ISDIGIT (*p))
335                 {
336                   char *end;
337                   unsigned int argno2 = strtoul (p, &end, 10) - 1;
338                   p = end;
339                   gcc_assert (argno2 == argno - 1);
340                   gcc_assert (!any_unnumbered);
341                   gcc_assert (*p == '$');
342
343                   p++;
344                   formatters[argno2] = formatters[argno];
345                 }
346               else
347                 {
348                   gcc_assert (!any_numbered);
349                   formatters[argno+1] = formatters[argno];
350                   curarg++;
351                 }
352               gcc_assert (*p == 's');
353               obstack_1grow (&buffer->chunk_obstack, 's');
354               p++;
355             }
356         }
357       if (*p == '\0')
358         break;
359
360       obstack_1grow (&buffer->chunk_obstack, '\0');
361       gcc_assert (chunk < PP_NL_ARGMAX * 2);
362       args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
363     }
364
365   obstack_1grow (&buffer->chunk_obstack, '\0');
366   gcc_assert (chunk < PP_NL_ARGMAX * 2);
367   args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
368   args[chunk] = 0;
369
370   /* Set output to the argument obstack, and switch line-wrapping and
371      prefixing off.  */
372   buffer->obstack = &buffer->chunk_obstack;
373   old_wrapping_mode = pp_set_verbatim_wrapping (pp);
374
375   /* Second phase.  Replace each formatter with the formatted text it
376      corresponds to.  */
377
378   for (argno = 0; formatters[argno]; argno++)
379     {
380       int precision = 0;
381       bool wide = false;
382       bool plus = false;
383       bool hash = false;
384       bool quote = false;
385
386       /* We do not attempt to enforce any ordering on the modifier
387          characters.  */
388
389       for (p = *formatters[argno];; p++)
390         {
391           switch (*p)
392             {
393             case 'q':
394               gcc_assert (!quote);
395               quote = true;
396               continue;
397
398             case '+':
399               gcc_assert (!plus);
400               plus = true;
401               continue;
402
403             case '#':
404               gcc_assert (!hash);
405               hash = true;
406               continue;
407
408             case 'w':
409               gcc_assert (!wide);
410               wide = true;
411               continue;
412
413             case 'l':
414               /* We don't support precision beyond that of "long long".  */
415               gcc_assert (precision < 2);
416               precision++;
417               continue;
418             }
419           break;
420         }
421
422       gcc_assert (!wide || precision == 0);
423
424       if (quote)
425         pp_string (pp, open_quote);
426
427       switch (*p)
428         {
429         case 'c':
430           pp_character (pp, va_arg (*text->args_ptr, int));
431           break;
432
433         case 'd':
434         case 'i':
435           if (wide)
436             pp_wide_integer (pp, va_arg (*text->args_ptr, HOST_WIDE_INT));
437           else
438             pp_integer_with_precision
439               (pp, *text->args_ptr, precision, int, "d");
440           break;
441
442         case 'o':
443           if (wide)
444             pp_scalar (pp, "%" HOST_WIDE_INT_PRINT "o",
445                        va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
446           else
447             pp_integer_with_precision
448               (pp, *text->args_ptr, precision, unsigned, "o");
449           break;
450
451         case 's':
452           pp_string (pp, va_arg (*text->args_ptr, const char *));
453           break;
454
455         case 'p':
456           pp_pointer (pp, va_arg (*text->args_ptr, void *));
457           break;
458
459         case 'u':
460           if (wide)
461             pp_scalar (pp, HOST_WIDE_INT_PRINT_UNSIGNED,
462                        va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
463           else
464             pp_integer_with_precision
465               (pp, *text->args_ptr, precision, unsigned, "u");
466           break;
467
468         case 'x':
469           if (wide)
470             pp_scalar (pp, HOST_WIDE_INT_PRINT_HEX,
471                        va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
472           else
473             pp_integer_with_precision
474               (pp, *text->args_ptr, precision, unsigned, "x");
475           break;
476
477         case 'K':
478           {
479             tree t = va_arg (*text->args_ptr, tree), block;
480             gcc_assert (text->locus != NULL);
481             *text->locus = EXPR_LOCATION (t);
482             gcc_assert (text->abstract_origin != NULL);
483             block = TREE_BLOCK (t);
484             *text->abstract_origin = NULL;
485             while (block
486                    && TREE_CODE (block) == BLOCK
487                    && BLOCK_ABSTRACT_ORIGIN (block))
488               {
489                 tree ao = BLOCK_ABSTRACT_ORIGIN (block);
490
491                 while (TREE_CODE (ao) == BLOCK
492                        && BLOCK_ABSTRACT_ORIGIN (ao)
493                        && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
494                   ao = BLOCK_ABSTRACT_ORIGIN (ao);
495
496                 if (TREE_CODE (ao) == FUNCTION_DECL)
497                   {
498                     *text->abstract_origin = block;
499                     break;
500                   }
501                 block = BLOCK_SUPERCONTEXT (block);
502               }
503           }
504           break;
505
506         case '.':
507           {
508             int n;
509             const char *s;
510
511             /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
512                (where M == N + 1).  The format string should be verified
513                already from the first phase.  */
514             p++;
515             if (ISDIGIT (*p))
516               {
517                 char *end;
518                 n = strtoul (p, &end, 10);
519                 p = end;
520                 gcc_assert (*p == 's');
521               }
522             else
523               {
524                 gcc_assert (*p == '*');
525                 p++;
526                 gcc_assert (*p == 's');
527                 n = va_arg (*text->args_ptr, int);
528
529                 /* This consumes a second entry in the formatters array.  */
530                 gcc_assert (formatters[argno] == formatters[argno+1]);
531                 argno++;
532               }
533
534             s = va_arg (*text->args_ptr, const char *);
535             pp_append_text (pp, s, s + n);
536           }
537           break;
538
539         default:
540           {
541             bool ok;
542
543             gcc_assert (pp_format_decoder (pp));
544             ok = pp_format_decoder (pp) (pp, text, p,
545                                          precision, wide, plus, hash);
546             gcc_assert (ok);
547           }
548         }
549
550       if (quote)
551         pp_string (pp, close_quote);
552
553       obstack_1grow (&buffer->chunk_obstack, '\0');
554       *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
555     }
556
557 #ifdef ENABLE_CHECKING
558   for (; argno < PP_NL_ARGMAX; argno++)
559     gcc_assert (!formatters[argno]);
560 #endif
561
562   /* Revert to normal obstack and wrapping mode.  */
563   buffer->obstack = &buffer->formatted_obstack;
564   buffer->line_length = 0;
565   pp_wrapping_mode (pp) = old_wrapping_mode;
566   pp_clear_state (pp);
567 }
568
569 /* Format of a message pointed to by TEXT.  */
570 void
571 pp_base_output_formatted_text (pretty_printer *pp)
572 {
573   unsigned int chunk;
574   output_buffer *buffer = pp_buffer (pp);
575   struct chunk_info *chunk_array = buffer->cur_chunk_array;
576   const char **args = chunk_array->args;
577
578   gcc_assert (buffer->obstack == &buffer->formatted_obstack);
579   gcc_assert (buffer->line_length == 0);
580
581   /* This is a third phase, first 2 phases done in pp_base_format_args.
582      Now we actually print it.  */
583   for (chunk = 0; args[chunk]; chunk++)
584     pp_string (pp, args[chunk]);
585
586   /* Deallocate the chunk structure and everything after it (i.e. the
587      associated series of formatted strings).  */
588   buffer->cur_chunk_array = chunk_array->prev;
589   obstack_free (&buffer->chunk_obstack, chunk_array);
590 }
591
592 /* Helper subroutine of output_verbatim and verbatim. Do the appropriate
593    settings needed by BUFFER for a verbatim formatting.  */
594 void
595 pp_base_format_verbatim (pretty_printer *pp, text_info *text)
596 {
597   /* Set verbatim mode.  */
598   pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp);
599
600   /* Do the actual formatting.  */
601   pp_format (pp, text);
602   pp_output_formatted_text (pp);
603
604   /* Restore previous settings.  */
605   pp_wrapping_mode (pp) = oldmode;
606 }
607
608 /* Flush the content of BUFFER onto the attached stream.  */
609 void
610 pp_base_flush (pretty_printer *pp)
611 {
612   pp_write_text_to_stream (pp);
613   pp_clear_state (pp);
614   fputc ('\n', pp->buffer->stream);
615   fflush (pp->buffer->stream);
616   pp_needs_newline (pp) = false;
617 }
618
619 /* Sets the number of maximum characters per line PRETTY-PRINTER can
620    output in line-wrapping mode.  A LENGTH value 0 suppresses
621    line-wrapping.  */
622 void
623 pp_base_set_line_maximum_length (pretty_printer *pp, int length)
624 {
625   pp_line_cutoff (pp) = length;
626   pp_set_real_maximum_length (pp);
627 }
628
629 /* Clear PRETTY-PRINTER output area text info.  */
630 void
631 pp_base_clear_output_area (pretty_printer *pp)
632 {
633   obstack_free (pp->buffer->obstack, obstack_base (pp->buffer->obstack));
634   pp->buffer->line_length = 0;
635 }
636
637 /* Set PREFIX for PRETTY-PRINTER.  */
638 void
639 pp_base_set_prefix (pretty_printer *pp, const char *prefix)
640 {
641   pp->prefix = prefix;
642   pp_set_real_maximum_length (pp);
643   pp->emitted_prefix = false;
644   pp_indentation (pp) = 0;
645 }
646
647 /* Free PRETTY-PRINTER's prefix, a previously malloc()'d string.  */
648 void
649 pp_base_destroy_prefix (pretty_printer *pp)
650 {
651   if (pp->prefix != NULL)
652     {
653       free (CONST_CAST (char *, pp->prefix));
654       pp->prefix = NULL;
655     }
656 }
657
658 /* Write out PRETTY-PRINTER's prefix.  */
659 void
660 pp_base_emit_prefix (pretty_printer *pp)
661 {
662   if (pp->prefix != NULL)
663     {
664       switch (pp_prefixing_rule (pp))
665         {
666         default:
667         case DIAGNOSTICS_SHOW_PREFIX_NEVER:
668           break;
669
670         case DIAGNOSTICS_SHOW_PREFIX_ONCE:
671           if (pp->emitted_prefix)
672             {
673               pp_base_indent (pp);
674               break;
675             }
676           pp_indentation (pp) += 3;
677           /* Fall through.  */
678
679         case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
680           {
681             int prefix_length = strlen (pp->prefix);
682             pp_append_r (pp, pp->prefix, prefix_length);
683             pp->emitted_prefix = true;
684           }
685           break;
686         }
687     }
688 }
689
690 /* Construct a PRETTY-PRINTER with PREFIX and of MAXIMUM_LENGTH
691    characters per line.  */
692 void
693 pp_construct (pretty_printer *pp, const char *prefix, int maximum_length)
694 {
695   memset (pp, 0, sizeof (pretty_printer));
696   pp->buffer = XCNEW (output_buffer);
697   obstack_init (&pp->buffer->chunk_obstack);
698   obstack_init (&pp->buffer->formatted_obstack);
699   pp->buffer->obstack = &pp->buffer->formatted_obstack;
700   pp->buffer->stream = stderr;
701   pp_line_cutoff (pp) = maximum_length;
702   pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
703   pp_set_prefix (pp, prefix);
704   pp_translate_identifiers (pp) = true;
705 }
706
707 /* Append a string delimited by START and END to the output area of
708    PRETTY-PRINTER.  No line wrapping is done.  However, if beginning a
709    new line then emit PRETTY-PRINTER's prefix and skip any leading
710    whitespace if appropriate.  The caller must ensure that it is
711    safe to do so.  */
712 void
713 pp_base_append_text (pretty_printer *pp, const char *start, const char *end)
714 {
715   /* Emit prefix and skip whitespace if we're starting a new line.  */
716   if (pp->buffer->line_length == 0)
717     {
718       pp_emit_prefix (pp);
719       if (pp_is_wrapping_line (pp))
720         while (start != end && *start == ' ')
721           ++start;
722     }
723   pp_append_r (pp, start, end - start);
724 }
725
726 /* Finishes constructing a NULL-terminated character string representing
727    the PRETTY-PRINTED text.  */
728 const char *
729 pp_base_formatted_text (pretty_printer *pp)
730 {
731   obstack_1grow (pp->buffer->obstack, '\0');
732   return pp_formatted_text_data (pp);
733 }
734
735 /*  Return a pointer to the last character emitted in PRETTY-PRINTER's
736     output area.  A NULL pointer means no character available.  */
737 const char *
738 pp_base_last_position_in_text (const pretty_printer *pp)
739 {
740   const char *p = NULL;
741   struct obstack *text = pp->buffer->obstack;
742
743   if (obstack_base (text) != obstack_next_free (text))
744     p = ((const char *) obstack_next_free (text)) - 1;
745   return p;
746 }
747
748 /* Return the amount of characters PRETTY-PRINTER can accept to
749    make a full line.  Meaningful only in line-wrapping mode.  */
750 int
751 pp_base_remaining_character_count_for_line (pretty_printer *pp)
752 {
753   return pp->maximum_length - pp->buffer->line_length;
754 }
755
756
757 /* Format a message into BUFFER a la printf.  */
758 void
759 pp_printf (pretty_printer *pp, const char *msg, ...)
760 {
761   text_info text;
762   va_list ap;
763
764   va_start (ap, msg);
765   text.err_no = errno;
766   text.args_ptr = &ap;
767   text.format_spec = msg;
768   text.locus = NULL;
769   pp_format (pp, &text);
770   pp_output_formatted_text (pp);
771   va_end (ap);
772 }
773
774
775 /* Output MESSAGE verbatim into BUFFER.  */
776 void
777 pp_verbatim (pretty_printer *pp, const char *msg, ...)
778 {
779   text_info text;
780   va_list ap;
781
782   va_start (ap, msg);
783   text.err_no = errno;
784   text.args_ptr = &ap;
785   text.format_spec = msg;
786   text.locus = NULL;
787   pp_format_verbatim (pp, &text);
788   va_end (ap);
789 }
790
791
792
793 /* Have PRETTY-PRINTER start a new line.  */
794 void
795 pp_base_newline (pretty_printer *pp)
796 {
797   obstack_1grow (pp->buffer->obstack, '\n');
798   pp->buffer->line_length = 0;
799 }
800
801 /* Have PRETTY-PRINTER add a CHARACTER.  */
802 void
803 pp_base_character (pretty_printer *pp, int c)
804 {
805   if (pp_is_wrapping_line (pp)
806       && pp_remaining_character_count_for_line (pp) <= 0)
807     {
808       pp_newline (pp);
809       if (ISSPACE (c))
810         return;
811     }
812   obstack_1grow (pp->buffer->obstack, c);
813   ++pp->buffer->line_length;
814 }
815
816 /* Append a STRING to the output area of PRETTY-PRINTER; the STRING may
817    be line-wrapped if in appropriate mode.  */
818 void
819 pp_base_string (pretty_printer *pp, const char *str)
820 {
821   pp_maybe_wrap_text (pp, str, str + (str ? strlen (str) : 0));
822 }
823
824 /* Maybe print out a whitespace if needed.  */
825
826 void
827 pp_base_maybe_space (pretty_printer *pp)
828 {
829   if (pp_base (pp)->padding != pp_none)
830     {
831       pp_space (pp);
832       pp_base (pp)->padding = pp_none;
833     }
834 }
835
836 /* Print the identifier ID to PRETTY-PRINTER.  */
837
838 void
839 pp_base_tree_identifier (pretty_printer *pp, tree id)
840 {
841   if (pp_translate_identifiers (pp))
842     {
843       const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
844       pp_append_text (pp, text, text + strlen (text));
845     }
846   else
847     pp_append_text (pp, IDENTIFIER_POINTER (id),
848                     IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
849 }
850 \f
851 /* The string starting at P has LEN (at least 1) bytes left; if they
852    start with a valid UTF-8 sequence, return the length of that
853    sequence and set *VALUE to the value of that sequence, and
854    otherwise return 0 and set *VALUE to (unsigned int) -1.  */
855
856 static int
857 decode_utf8_char (const unsigned char *p, size_t len, unsigned int *value)
858 {
859   unsigned int t = *p;
860
861   if (len == 0)
862     abort ();
863   if (t & 0x80)
864     {
865       size_t utf8_len = 0;
866       unsigned int ch;
867       size_t i;
868       for (t = *p; t & 0x80; t <<= 1)
869         utf8_len++;
870
871       if (utf8_len > len || utf8_len < 2 || utf8_len > 6)
872         {
873           *value = (unsigned int) -1;
874           return 0;
875         }
876       ch = *p & ((1 << (7 - utf8_len)) - 1);
877       for (i = 1; i < utf8_len; i++)
878         {
879           unsigned int u = p[i];
880           if ((u & 0xC0) != 0x80)
881             {
882               *value = (unsigned int) -1;
883               return 0;
884             }
885           ch = (ch << 6) | (u & 0x3F);
886         }
887       if (   (ch <=      0x7F && utf8_len > 1)
888           || (ch <=     0x7FF && utf8_len > 2)
889           || (ch <=    0xFFFF && utf8_len > 3)
890           || (ch <=  0x1FFFFF && utf8_len > 4)
891           || (ch <= 0x3FFFFFF && utf8_len > 5)
892           || (ch >= 0xD800 && ch <= 0xDFFF))
893         {
894           *value = (unsigned int) -1;
895           return 0;
896         }
897       *value = ch;
898       return utf8_len;
899     }
900   else
901     {
902       *value = t;
903       return 1;
904     }
905 }
906
907 /* Given IDENT, an identifier in the internal encoding, return a
908    version of IDENT suitable for diagnostics in the locale character
909    set: either IDENT itself, or a garbage-collected string converted
910    to the locale character set and using escape sequences if not
911    representable in the locale character set or containing control
912    characters or invalid byte sequences.  Existing backslashes in
913    IDENT are not doubled, so the result may not uniquely specify the
914    contents of an arbitrary byte sequence identifier.  */
915
916 const char *
917 identifier_to_locale (const char *ident)
918 {
919   const unsigned char *uid = (const unsigned char *) ident;
920   size_t idlen = strlen (ident);
921   bool valid_printable_utf8 = true;
922   bool all_ascii = true;
923   size_t i;
924
925   for (i = 0; i < idlen;)
926     {
927       unsigned int c;
928       size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
929       if (utf8_len == 0 || c <= 0x1F || (c >= 0x7F && c <= 0x9F))
930         {
931           valid_printable_utf8 = false;
932           break;
933         }
934       if (utf8_len > 1)
935         all_ascii = false;
936       i += utf8_len;
937     }
938
939   /* If IDENT contains invalid UTF-8 sequences (which may occur with
940      attributes putting arbitrary byte sequences in identifiers), or
941      control characters, we use octal escape sequences for all bytes
942      outside printable ASCII.  */
943   if (!valid_printable_utf8)
944     {
945       char *ret = GGC_NEWVEC (char, 4 * idlen + 1);
946       char *p = ret;
947       for (i = 0; i < idlen; i++)
948         {
949           if (uid[i] > 0x1F && uid[i] < 0x7F)
950             *p++ = uid[i];
951           else
952             {
953               sprintf (p, "\\%03o", uid[i]);
954               p += 4;
955             }
956         }
957       *p = 0;
958       return ret;
959     }
960
961   /* Otherwise, if it is valid printable ASCII, or printable UTF-8
962      with the locale character set being UTF-8, IDENT is used.  */
963   if (all_ascii || locale_utf8)
964     return ident;
965
966   /* Otherwise IDENT is converted to the locale character set if
967      possible.  */
968 #if defined ENABLE_NLS && defined HAVE_LANGINFO_CODESET && HAVE_ICONV
969   if (locale_encoding != NULL)
970     {
971       iconv_t cd = iconv_open (locale_encoding, "UTF-8");
972       bool conversion_ok = true;
973       char *ret = NULL;
974       if (cd != (iconv_t) -1)
975         {
976           size_t ret_alloc = 4 * idlen + 1;
977           for (;;)
978             {
979               /* Repeat the whole conversion process as needed with
980                  larger buffers so non-reversible transformations can
981                  always be detected.  */
982               ICONV_CONST char *inbuf = CONST_CAST (char *, ident);
983               char *outbuf;
984               size_t inbytesleft = idlen;
985               size_t outbytesleft = ret_alloc - 1;
986               size_t iconv_ret;
987
988               ret = GGC_NEWVEC (char, ret_alloc);
989               outbuf = ret;
990
991               if (iconv (cd, 0, 0, 0, 0) == (size_t) -1)
992                 {
993                   conversion_ok = false;
994                   break;
995                 }
996
997               iconv_ret = iconv (cd, &inbuf, &inbytesleft,
998                                  &outbuf, &outbytesleft);
999               if (iconv_ret == (size_t) -1 || inbytesleft != 0)
1000                 {
1001                   if (errno == E2BIG)
1002                     {
1003                       ret_alloc *= 2;
1004                       ggc_free (ret);
1005                       ret = NULL;
1006                       continue;
1007                     }
1008                   else
1009                     {
1010                       conversion_ok = false;
1011                       break;
1012                     }
1013                 }
1014               else if (iconv_ret != 0)
1015                 {
1016                   conversion_ok = false;
1017                   break;
1018                 }
1019               /* Return to initial shift state.  */
1020               if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t) -1)
1021                 {
1022                   if (errno == E2BIG)
1023                     {
1024                       ret_alloc *= 2;
1025                       ggc_free (ret);
1026                       ret = NULL;
1027                       continue;
1028                     }
1029                   else
1030                     {
1031                       conversion_ok = false;
1032                       break;
1033                     }
1034                 }
1035               *outbuf = 0;
1036               break;
1037             }
1038           iconv_close (cd);
1039           if (conversion_ok)
1040             return ret;
1041         }
1042     }
1043 #endif
1044
1045   /* Otherwise, convert non-ASCII characters in IDENT to UCNs.  */
1046   {
1047     char *ret = GGC_NEWVEC (char, 10 * idlen + 1);
1048     char *p = ret;
1049     for (i = 0; i < idlen;)
1050       {
1051         unsigned int c;
1052         size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1053         if (utf8_len == 1)
1054           *p++ = uid[i];
1055         else
1056           {
1057             sprintf (p, "\\U%08x", c);
1058             p += 10;
1059           }
1060         i += utf8_len;
1061       }
1062     *p = 0;
1063     return ret;
1064   }
1065 }