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