2015-08-31 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / pretty-print.c
blobfdc7b4da34f79ea6b975b76da27f3966f1445bef
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>
5 This file is part of GCC.
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.
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.
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/>. */
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"
28 #include <new> // For placement-new.
30 #if HAVE_ICONV
31 #include <iconv.h>
32 #endif
34 // Default construct an output buffer.
36 output_buffer::output_buffer ()
37 : formatted_obstack (),
38 chunk_obstack (),
39 obstack (&formatted_obstack),
40 cur_chunk_array (),
41 stream (stderr),
42 line_length (),
43 digit_buffer (),
44 flush_p (true)
46 obstack_init (&formatted_obstack);
47 obstack_init (&chunk_obstack);
50 // Release resources owned by an output buffer at the end of lifetime.
52 output_buffer::~output_buffer ()
54 obstack_free (&chunk_obstack, NULL);
55 obstack_free (&formatted_obstack, NULL);
59 /* Format an integer given by va_arg (ARG, type-specifier T) where
60 type-specifier is a precision modifier as indicated by PREC. F is
61 a string used to construct the appropriate format-specifier. */
62 #define pp_integer_with_precision(PP, ARG, PREC, T, F) \
63 do \
64 switch (PREC) \
65 { \
66 case 0: \
67 pp_scalar (PP, "%" F, va_arg (ARG, T)); \
68 break; \
70 case 1: \
71 pp_scalar (PP, "%l" F, va_arg (ARG, long T)); \
72 break; \
74 case 2: \
75 pp_scalar (PP, "%" HOST_LONG_LONG_FORMAT F, va_arg (ARG, long long T)); \
76 break; \
78 default: \
79 break; \
80 } \
81 while (0)
84 /* Subroutine of pp_set_maximum_length. Set up PRETTY-PRINTER's
85 internal maximum characters per line. */
86 static void
87 pp_set_real_maximum_length (pretty_printer *pp)
89 /* If we're told not to wrap lines then do the obvious thing. In case
90 we'll emit prefix only once per message, it is appropriate
91 not to increase unnecessarily the line-length cut-off. */
92 if (!pp_is_wrapping_line (pp)
93 || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_ONCE
94 || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_NEVER)
95 pp->maximum_length = pp_line_cutoff (pp);
96 else
98 int prefix_length = pp->prefix ? strlen (pp->prefix) : 0;
99 /* If the prefix is ridiculously too long, output at least
100 32 characters. */
101 if (pp_line_cutoff (pp) - prefix_length < 32)
102 pp->maximum_length = pp_line_cutoff (pp) + 32;
103 else
104 pp->maximum_length = pp_line_cutoff (pp);
108 /* Clear PRETTY-PRINTER's output state. */
109 static inline void
110 pp_clear_state (pretty_printer *pp)
112 pp->emitted_prefix = false;
113 pp_indentation (pp) = 0;
116 /* Flush the formatted text of PRETTY-PRINTER onto the attached stream. */
117 void
118 pp_write_text_to_stream (pretty_printer *pp)
120 const char *text = pp_formatted_text (pp);
121 fputs (text, pp_buffer (pp)->stream);
122 pp_clear_output_area (pp);
125 /* As pp_write_text_to_stream, but for GraphViz label output.
127 Flush the formatted text of pretty-printer PP onto the attached stream.
128 Replace characters in PPF that have special meaning in a GraphViz .dot
129 file.
131 This routine is not very fast, but it doesn't have to be as this is only
132 be used by routines dumping intermediate representations in graph form. */
134 void
135 pp_write_text_as_dot_label_to_stream (pretty_printer *pp, bool for_record)
137 const char *text = pp_formatted_text (pp);
138 const char *p = text;
139 FILE *fp = pp_buffer (pp)->stream;
141 while (*p)
143 switch (*p)
145 /* Print newlines as a left-aligned newline. */
146 case '\n':
147 fputs ("\\l\\\n", fp);
148 break;
150 /* A pipe is only special for record-shape nodes. */
151 case '|':
152 if (for_record)
153 fputc ('\\', fp);
154 fputc (*p, fp);
155 break;
157 /* The following characters always have to be escaped
158 for use in labels. */
159 case '{':
160 case '}':
161 case '<':
162 case '>':
163 case '"':
164 case ' ':
165 fputc ('\\', fp);
166 /* fall through */
167 default:
168 fputc (*p, fp);
169 break;
171 p++;
174 pp_clear_output_area (pp);
177 /* Wrap a text delimited by START and END into PRETTY-PRINTER. */
178 static void
179 pp_wrap_text (pretty_printer *pp, const char *start, const char *end)
181 bool wrapping_line = pp_is_wrapping_line (pp);
183 while (start != end)
185 /* Dump anything bordered by whitespaces. */
187 const char *p = start;
188 while (p != end && !ISBLANK (*p) && *p != '\n')
189 ++p;
190 if (wrapping_line
191 && p - start >= pp_remaining_character_count_for_line (pp))
192 pp_newline (pp);
193 pp_append_text (pp, start, p);
194 start = p;
197 if (start != end && ISBLANK (*start))
199 pp_space (pp);
200 ++start;
202 if (start != end && *start == '\n')
204 pp_newline (pp);
205 ++start;
210 /* Same as pp_wrap_text but wrap text only when in line-wrapping mode. */
211 static inline void
212 pp_maybe_wrap_text (pretty_printer *pp, const char *start, const char *end)
214 if (pp_is_wrapping_line (pp))
215 pp_wrap_text (pp, start, end);
216 else
217 pp_append_text (pp, start, end);
220 /* Append to the output area of PRETTY-PRINTER a string specified by its
221 STARTing character and LENGTH. */
222 static inline void
223 pp_append_r (pretty_printer *pp, const char *start, int length)
225 output_buffer_append_r (pp_buffer (pp), start, length);
228 /* Insert enough spaces into the output area of PRETTY-PRINTER to bring
229 the column position to the current indentation level, assuming that a
230 newline has just been written to the buffer. */
231 void
232 pp_indent (pretty_printer *pp)
234 int n = pp_indentation (pp);
235 int i;
237 for (i = 0; i < n; ++i)
238 pp_space (pp);
241 /* The following format specifiers are recognized as being client independent:
242 %d, %i: (signed) integer in base ten.
243 %u: unsigned integer in base ten.
244 %o: unsigned integer in base eight.
245 %x: unsigned integer in base sixteen.
246 %ld, %li, %lo, %lu, %lx: long versions of the above.
247 %lld, %lli, %llo, %llu, %llx: long long versions.
248 %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions.
249 %c: character.
250 %s: string.
251 %p: pointer.
252 %r: if pp_show_color(pp), switch to color identified by const char *.
253 %R: if pp_show_color(pp), reset color.
254 %m: strerror(text->err_no) - does not consume a value from args_ptr.
255 %%: '%'.
256 %<: opening quote.
257 %>: closing quote.
258 %': apostrophe (should only be used in untranslated messages;
259 translations should use appropriate punctuation directly).
260 %.*s: a substring the length of which is specified by an argument
261 integer.
262 %Ns: likewise, but length specified as constant in the format string.
263 Flag 'q': quote formatted text (must come immediately after '%').
265 Arguments can be used sequentially, or through %N$ resp. *N$
266 notation Nth argument after the format string. If %N$ / *N$
267 notation is used, it must be used for all arguments, except %m, %%,
268 %<, %> and %', which may not have a number, as they do not consume
269 an argument. When %M$.*N$s is used, M must be N + 1. (This may
270 also be written %M$.*s, provided N is not otherwise used.) The
271 format string must have conversion specifiers with argument numbers
272 1 up to highest argument; each argument may only be used once.
273 A format string can have at most 30 arguments. */
275 /* Formatting phases 1 and 2: render TEXT->format_spec plus
276 TEXT->args_ptr into a series of chunks in pp_buffer (PP)->args[].
277 Phase 3 is in pp_format_text. */
279 void
280 pp_format (pretty_printer *pp, text_info *text)
282 output_buffer *buffer = pp_buffer (pp);
283 const char *p;
284 const char **args;
285 struct chunk_info *new_chunk_array;
287 unsigned int curarg = 0, chunk = 0, argno;
288 pp_wrapping_mode_t old_wrapping_mode;
289 bool any_unnumbered = false, any_numbered = false;
290 const char **formatters[PP_NL_ARGMAX];
292 /* Allocate a new chunk structure. */
293 new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info);
294 new_chunk_array->prev = buffer->cur_chunk_array;
295 buffer->cur_chunk_array = new_chunk_array;
296 args = new_chunk_array->args;
298 /* Formatting phase 1: split up TEXT->format_spec into chunks in
299 pp_buffer (PP)->args[]. Even-numbered chunks are to be output
300 verbatim, odd-numbered chunks are format specifiers.
301 %m, %%, %<, %>, and %' are replaced with the appropriate text at
302 this point. */
304 memset (formatters, 0, sizeof formatters);
306 for (p = text->format_spec; *p; )
308 while (*p != '\0' && *p != '%')
310 obstack_1grow (&buffer->chunk_obstack, *p);
311 p++;
314 if (*p == '\0')
315 break;
317 switch (*++p)
319 case '\0':
320 gcc_unreachable ();
322 case '%':
323 obstack_1grow (&buffer->chunk_obstack, '%');
324 p++;
325 continue;
327 case '<':
329 obstack_grow (&buffer->chunk_obstack,
330 open_quote, strlen (open_quote));
331 const char *colorstr
332 = colorize_start (pp_show_color (pp), "quote");
333 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
334 p++;
335 continue;
338 case '>':
340 const char *colorstr = colorize_stop (pp_show_color (pp));
341 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
343 /* FALLTHRU */
344 case '\'':
345 obstack_grow (&buffer->chunk_obstack,
346 close_quote, strlen (close_quote));
347 p++;
348 continue;
350 case 'R':
352 const char *colorstr = colorize_stop (pp_show_color (pp));
353 obstack_grow (&buffer->chunk_obstack, colorstr,
354 strlen (colorstr));
355 p++;
356 continue;
359 case 'm':
361 const char *errstr = xstrerror (text->err_no);
362 obstack_grow (&buffer->chunk_obstack, errstr, strlen (errstr));
364 p++;
365 continue;
367 default:
368 /* Handled in phase 2. Terminate the plain chunk here. */
369 obstack_1grow (&buffer->chunk_obstack, '\0');
370 gcc_assert (chunk < PP_NL_ARGMAX * 2);
371 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
372 break;
375 if (ISDIGIT (*p))
377 char *end;
378 argno = strtoul (p, &end, 10) - 1;
379 p = end;
380 gcc_assert (*p == '$');
381 p++;
383 any_numbered = true;
384 gcc_assert (!any_unnumbered);
386 else
388 argno = curarg++;
389 any_unnumbered = true;
390 gcc_assert (!any_numbered);
392 gcc_assert (argno < PP_NL_ARGMAX);
393 gcc_assert (!formatters[argno]);
394 formatters[argno] = &args[chunk];
397 obstack_1grow (&buffer->chunk_obstack, *p);
398 p++;
400 while (strchr ("qwl+#", p[-1]));
402 if (p[-1] == '.')
404 /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
405 (where M == N + 1). */
406 if (ISDIGIT (*p))
410 obstack_1grow (&buffer->chunk_obstack, *p);
411 p++;
413 while (ISDIGIT (p[-1]));
414 gcc_assert (p[-1] == 's');
416 else
418 gcc_assert (*p == '*');
419 obstack_1grow (&buffer->chunk_obstack, '*');
420 p++;
422 if (ISDIGIT (*p))
424 char *end;
425 unsigned int argno2 = strtoul (p, &end, 10) - 1;
426 p = end;
427 gcc_assert (argno2 == argno - 1);
428 gcc_assert (!any_unnumbered);
429 gcc_assert (*p == '$');
431 p++;
432 formatters[argno2] = formatters[argno];
434 else
436 gcc_assert (!any_numbered);
437 formatters[argno+1] = formatters[argno];
438 curarg++;
440 gcc_assert (*p == 's');
441 obstack_1grow (&buffer->chunk_obstack, 's');
442 p++;
445 if (*p == '\0')
446 break;
448 obstack_1grow (&buffer->chunk_obstack, '\0');
449 gcc_assert (chunk < PP_NL_ARGMAX * 2);
450 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
453 obstack_1grow (&buffer->chunk_obstack, '\0');
454 gcc_assert (chunk < PP_NL_ARGMAX * 2);
455 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
456 args[chunk] = 0;
458 /* Set output to the argument obstack, and switch line-wrapping and
459 prefixing off. */
460 buffer->obstack = &buffer->chunk_obstack;
461 old_wrapping_mode = pp_set_verbatim_wrapping (pp);
463 /* Second phase. Replace each formatter with the formatted text it
464 corresponds to. */
466 for (argno = 0; formatters[argno]; argno++)
468 int precision = 0;
469 bool wide = false;
470 bool plus = false;
471 bool hash = false;
472 bool quote = false;
474 /* We do not attempt to enforce any ordering on the modifier
475 characters. */
477 for (p = *formatters[argno];; p++)
479 switch (*p)
481 case 'q':
482 gcc_assert (!quote);
483 quote = true;
484 continue;
486 case '+':
487 gcc_assert (!plus);
488 plus = true;
489 continue;
491 case '#':
492 gcc_assert (!hash);
493 hash = true;
494 continue;
496 case 'w':
497 gcc_assert (!wide);
498 wide = true;
499 continue;
501 case 'l':
502 /* We don't support precision beyond that of "long long". */
503 gcc_assert (precision < 2);
504 precision++;
505 continue;
507 break;
510 gcc_assert (!wide || precision == 0);
512 if (quote)
514 pp_string (pp, open_quote);
515 pp_string (pp, colorize_start (pp_show_color (pp), "quote"));
518 switch (*p)
520 case 'r':
521 pp_string (pp, colorize_start (pp_show_color (pp),
522 va_arg (*text->args_ptr,
523 const char *)));
524 break;
526 case 'c':
527 pp_character (pp, va_arg (*text->args_ptr, int));
528 break;
530 case 'd':
531 case 'i':
532 if (wide)
533 pp_wide_integer (pp, va_arg (*text->args_ptr, HOST_WIDE_INT));
534 else
535 pp_integer_with_precision
536 (pp, *text->args_ptr, precision, int, "d");
537 break;
539 case 'o':
540 if (wide)
541 pp_scalar (pp, "%" HOST_WIDE_INT_PRINT "o",
542 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
543 else
544 pp_integer_with_precision
545 (pp, *text->args_ptr, precision, unsigned, "o");
546 break;
548 case 's':
549 pp_string (pp, va_arg (*text->args_ptr, const char *));
550 break;
552 case 'p':
553 pp_pointer (pp, va_arg (*text->args_ptr, void *));
554 break;
556 case 'u':
557 if (wide)
558 pp_scalar (pp, HOST_WIDE_INT_PRINT_UNSIGNED,
559 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
560 else
561 pp_integer_with_precision
562 (pp, *text->args_ptr, precision, unsigned, "u");
563 break;
565 case 'x':
566 if (wide)
567 pp_scalar (pp, HOST_WIDE_INT_PRINT_HEX,
568 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
569 else
570 pp_integer_with_precision
571 (pp, *text->args_ptr, precision, unsigned, "x");
572 break;
574 case '.':
576 int n;
577 const char *s;
579 /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
580 (where M == N + 1). The format string should be verified
581 already from the first phase. */
582 p++;
583 if (ISDIGIT (*p))
585 char *end;
586 n = strtoul (p, &end, 10);
587 p = end;
588 gcc_assert (*p == 's');
590 else
592 gcc_assert (*p == '*');
593 p++;
594 gcc_assert (*p == 's');
595 n = va_arg (*text->args_ptr, int);
597 /* This consumes a second entry in the formatters array. */
598 gcc_assert (formatters[argno] == formatters[argno+1]);
599 argno++;
602 s = va_arg (*text->args_ptr, const char *);
603 pp_append_text (pp, s, s + n);
605 break;
607 default:
609 bool ok;
611 gcc_assert (pp_format_decoder (pp));
612 ok = pp_format_decoder (pp) (pp, text, p,
613 precision, wide, plus, hash);
614 gcc_assert (ok);
618 if (quote)
620 pp_string (pp, colorize_stop (pp_show_color (pp)));
621 pp_string (pp, close_quote);
624 obstack_1grow (&buffer->chunk_obstack, '\0');
625 *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
628 #ifdef ENABLE_CHECKING
629 for (; argno < PP_NL_ARGMAX; argno++)
630 gcc_assert (!formatters[argno]);
631 #endif
633 /* Revert to normal obstack and wrapping mode. */
634 buffer->obstack = &buffer->formatted_obstack;
635 buffer->line_length = 0;
636 pp_wrapping_mode (pp) = old_wrapping_mode;
637 pp_clear_state (pp);
640 /* Format of a message pointed to by TEXT. */
641 void
642 pp_output_formatted_text (pretty_printer *pp)
644 unsigned int chunk;
645 output_buffer *buffer = pp_buffer (pp);
646 struct chunk_info *chunk_array = buffer->cur_chunk_array;
647 const char **args = chunk_array->args;
649 gcc_assert (buffer->obstack == &buffer->formatted_obstack);
650 gcc_assert (buffer->line_length == 0);
652 /* This is a third phase, first 2 phases done in pp_format_args.
653 Now we actually print it. */
654 for (chunk = 0; args[chunk]; chunk++)
655 pp_string (pp, args[chunk]);
657 /* Deallocate the chunk structure and everything after it (i.e. the
658 associated series of formatted strings). */
659 buffer->cur_chunk_array = chunk_array->prev;
660 obstack_free (&buffer->chunk_obstack, chunk_array);
663 /* Helper subroutine of output_verbatim and verbatim. Do the appropriate
664 settings needed by BUFFER for a verbatim formatting. */
665 void
666 pp_format_verbatim (pretty_printer *pp, text_info *text)
668 /* Set verbatim mode. */
669 pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp);
671 /* Do the actual formatting. */
672 pp_format (pp, text);
673 pp_output_formatted_text (pp);
675 /* Restore previous settings. */
676 pp_wrapping_mode (pp) = oldmode;
679 /* Flush the content of BUFFER onto the attached stream. This
680 function does nothing unless pp->output_buffer->flush_p. */
681 void
682 pp_flush (pretty_printer *pp)
684 pp_clear_state (pp);
685 if (!pp->buffer->flush_p)
686 return;
687 pp_write_text_to_stream (pp);
688 fflush (pp_buffer (pp)->stream);
691 /* Flush the content of BUFFER onto the attached stream independently
692 of the value of pp->output_buffer->flush_p. */
693 void
694 pp_really_flush (pretty_printer *pp)
696 pp_clear_state (pp);
697 pp_write_text_to_stream (pp);
698 fflush (pp_buffer (pp)->stream);
701 /* Sets the number of maximum characters per line PRETTY-PRINTER can
702 output in line-wrapping mode. A LENGTH value 0 suppresses
703 line-wrapping. */
704 void
705 pp_set_line_maximum_length (pretty_printer *pp, int length)
707 pp_line_cutoff (pp) = length;
708 pp_set_real_maximum_length (pp);
711 /* Clear PRETTY-PRINTER output area text info. */
712 void
713 pp_clear_output_area (pretty_printer *pp)
715 obstack_free (pp_buffer (pp)->obstack,
716 obstack_base (pp_buffer (pp)->obstack));
717 pp_buffer (pp)->line_length = 0;
720 /* Set PREFIX for PRETTY-PRINTER. */
721 void
722 pp_set_prefix (pretty_printer *pp, const char *prefix)
724 pp->prefix = prefix;
725 pp_set_real_maximum_length (pp);
726 pp->emitted_prefix = false;
727 pp_indentation (pp) = 0;
730 /* Free PRETTY-PRINTER's prefix, a previously malloc()'d string. */
731 void
732 pp_destroy_prefix (pretty_printer *pp)
734 if (pp->prefix != NULL)
736 free (CONST_CAST (char *, pp->prefix));
737 pp->prefix = NULL;
741 /* Write out PRETTY-PRINTER's prefix. */
742 void
743 pp_emit_prefix (pretty_printer *pp)
745 if (pp->prefix != NULL)
747 switch (pp_prefixing_rule (pp))
749 default:
750 case DIAGNOSTICS_SHOW_PREFIX_NEVER:
751 break;
753 case DIAGNOSTICS_SHOW_PREFIX_ONCE:
754 if (pp->emitted_prefix)
756 pp_indent (pp);
757 break;
759 pp_indentation (pp) += 3;
760 /* Fall through. */
762 case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
764 int prefix_length = strlen (pp->prefix);
765 pp_append_r (pp, pp->prefix, prefix_length);
766 pp->emitted_prefix = true;
768 break;
773 /* Construct a PRETTY-PRINTER with PREFIX and of MAXIMUM_LENGTH
774 characters per line. */
776 pretty_printer::pretty_printer (const char *p, int l)
777 : buffer (new (XCNEW (output_buffer)) output_buffer ()),
778 prefix (),
779 padding (pp_none),
780 maximum_length (),
781 indent_skip (),
782 wrapping (),
783 format_decoder (),
784 emitted_prefix (),
785 need_newline (),
786 translate_identifiers (true),
787 show_color ()
789 pp_line_cutoff (this) = l;
790 /* By default, we emit prefixes once per message. */
791 pp_prefixing_rule (this) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
792 pp_set_prefix (this, p);
795 pretty_printer::~pretty_printer ()
797 buffer->~output_buffer ();
798 XDELETE (buffer);
801 /* Append a string delimited by START and END to the output area of
802 PRETTY-PRINTER. No line wrapping is done. However, if beginning a
803 new line then emit PRETTY-PRINTER's prefix and skip any leading
804 whitespace if appropriate. The caller must ensure that it is
805 safe to do so. */
806 void
807 pp_append_text (pretty_printer *pp, const char *start, const char *end)
809 /* Emit prefix and skip whitespace if we're starting a new line. */
810 if (pp_buffer (pp)->line_length == 0)
812 pp_emit_prefix (pp);
813 if (pp_is_wrapping_line (pp))
814 while (start != end && *start == ' ')
815 ++start;
817 pp_append_r (pp, start, end - start);
820 /* Finishes constructing a NULL-terminated character string representing
821 the PRETTY-PRINTED text. */
822 const char *
823 pp_formatted_text (pretty_printer *pp)
825 return output_buffer_formatted_text (pp_buffer (pp));
828 /* Return a pointer to the last character emitted in PRETTY-PRINTER's
829 output area. A NULL pointer means no character available. */
830 const char *
831 pp_last_position_in_text (const pretty_printer *pp)
833 return output_buffer_last_position_in_text (pp_buffer (pp));
836 /* Return the amount of characters PRETTY-PRINTER can accept to
837 make a full line. Meaningful only in line-wrapping mode. */
839 pp_remaining_character_count_for_line (pretty_printer *pp)
841 return pp->maximum_length - pp_buffer (pp)->line_length;
845 /* Format a message into BUFFER a la printf. */
846 void
847 pp_printf (pretty_printer *pp, const char *msg, ...)
849 text_info text;
850 va_list ap;
852 va_start (ap, msg);
853 text.err_no = errno;
854 text.args_ptr = &ap;
855 text.format_spec = msg;
856 pp_format (pp, &text);
857 pp_output_formatted_text (pp);
858 va_end (ap);
862 /* Output MESSAGE verbatim into BUFFER. */
863 void
864 pp_verbatim (pretty_printer *pp, const char *msg, ...)
866 text_info text;
867 va_list ap;
869 va_start (ap, msg);
870 text.err_no = errno;
871 text.args_ptr = &ap;
872 text.format_spec = msg;
873 pp_format_verbatim (pp, &text);
874 va_end (ap);
879 /* Have PRETTY-PRINTER start a new line. */
880 void
881 pp_newline (pretty_printer *pp)
883 obstack_1grow (pp_buffer (pp)->obstack, '\n');
884 pp_needs_newline (pp) = false;
885 pp_buffer (pp)->line_length = 0;
888 /* Have PRETTY-PRINTER add a CHARACTER. */
889 void
890 pp_character (pretty_printer *pp, int c)
892 if (pp_is_wrapping_line (pp)
893 && pp_remaining_character_count_for_line (pp) <= 0)
895 pp_newline (pp);
896 if (ISSPACE (c))
897 return;
899 obstack_1grow (pp_buffer (pp)->obstack, c);
900 ++pp_buffer (pp)->line_length;
903 /* Append a STRING to the output area of PRETTY-PRINTER; the STRING may
904 be line-wrapped if in appropriate mode. */
905 void
906 pp_string (pretty_printer *pp, const char *str)
908 pp_maybe_wrap_text (pp, str, str + (str ? strlen (str) : 0));
911 /* Maybe print out a whitespace if needed. */
913 void
914 pp_maybe_space (pretty_printer *pp)
916 if (pp->padding != pp_none)
918 pp_space (pp);
919 pp->padding = pp_none;
923 // Add a newline to the pretty printer PP and flush formatted text.
925 void
926 pp_newline_and_flush (pretty_printer *pp)
928 pp_newline (pp);
929 pp_flush (pp);
930 pp_needs_newline (pp) = false;
933 // Add a newline to the pretty printer PP, followed by indentation.
935 void
936 pp_newline_and_indent (pretty_printer *pp, int n)
938 pp_indentation (pp) += n;
939 pp_newline (pp);
940 pp_indent (pp);
941 pp_needs_newline (pp) = false;
944 // Add separator C, followed by a single whitespace.
946 void
947 pp_separate_with (pretty_printer *pp, char c)
949 pp_character (pp, c);
950 pp_space (pp);
954 /* The string starting at P has LEN (at least 1) bytes left; if they
955 start with a valid UTF-8 sequence, return the length of that
956 sequence and set *VALUE to the value of that sequence, and
957 otherwise return 0 and set *VALUE to (unsigned int) -1. */
959 static int
960 decode_utf8_char (const unsigned char *p, size_t len, unsigned int *value)
962 unsigned int t = *p;
964 if (len == 0)
965 abort ();
966 if (t & 0x80)
968 size_t utf8_len = 0;
969 unsigned int ch;
970 size_t i;
971 for (t = *p; t & 0x80; t <<= 1)
972 utf8_len++;
974 if (utf8_len > len || utf8_len < 2 || utf8_len > 6)
976 *value = (unsigned int) -1;
977 return 0;
979 ch = *p & ((1 << (7 - utf8_len)) - 1);
980 for (i = 1; i < utf8_len; i++)
982 unsigned int u = p[i];
983 if ((u & 0xC0) != 0x80)
985 *value = (unsigned int) -1;
986 return 0;
988 ch = (ch << 6) | (u & 0x3F);
990 if ( (ch <= 0x7F && utf8_len > 1)
991 || (ch <= 0x7FF && utf8_len > 2)
992 || (ch <= 0xFFFF && utf8_len > 3)
993 || (ch <= 0x1FFFFF && utf8_len > 4)
994 || (ch <= 0x3FFFFFF && utf8_len > 5)
995 || (ch >= 0xD800 && ch <= 0xDFFF))
997 *value = (unsigned int) -1;
998 return 0;
1000 *value = ch;
1001 return utf8_len;
1003 else
1005 *value = t;
1006 return 1;
1010 /* Allocator for identifier_to_locale and corresponding function to
1011 free memory. */
1013 void *(*identifier_to_locale_alloc) (size_t) = xmalloc;
1014 void (*identifier_to_locale_free) (void *) = free;
1016 /* Given IDENT, an identifier in the internal encoding, return a
1017 version of IDENT suitable for diagnostics in the locale character
1018 set: either IDENT itself, or a string, allocated using
1019 identifier_to_locale_alloc, converted to the locale character set
1020 and using escape sequences if not representable in the locale
1021 character set or containing control characters or invalid byte
1022 sequences. Existing backslashes in IDENT are not doubled, so the
1023 result may not uniquely specify the contents of an arbitrary byte
1024 sequence identifier. */
1026 const char *
1027 identifier_to_locale (const char *ident)
1029 const unsigned char *uid = (const unsigned char *) ident;
1030 size_t idlen = strlen (ident);
1031 bool valid_printable_utf8 = true;
1032 bool all_ascii = true;
1033 size_t i;
1035 for (i = 0; i < idlen;)
1037 unsigned int c;
1038 size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1039 if (utf8_len == 0 || c <= 0x1F || (c >= 0x7F && c <= 0x9F))
1041 valid_printable_utf8 = false;
1042 break;
1044 if (utf8_len > 1)
1045 all_ascii = false;
1046 i += utf8_len;
1049 /* If IDENT contains invalid UTF-8 sequences (which may occur with
1050 attributes putting arbitrary byte sequences in identifiers), or
1051 control characters, we use octal escape sequences for all bytes
1052 outside printable ASCII. */
1053 if (!valid_printable_utf8)
1055 char *ret = (char *) identifier_to_locale_alloc (4 * idlen + 1);
1056 char *p = ret;
1057 for (i = 0; i < idlen; i++)
1059 if (uid[i] > 0x1F && uid[i] < 0x7F)
1060 *p++ = uid[i];
1061 else
1063 sprintf (p, "\\%03o", uid[i]);
1064 p += 4;
1067 *p = 0;
1068 return ret;
1071 /* Otherwise, if it is valid printable ASCII, or printable UTF-8
1072 with the locale character set being UTF-8, IDENT is used. */
1073 if (all_ascii || locale_utf8)
1074 return ident;
1076 /* Otherwise IDENT is converted to the locale character set if
1077 possible. */
1078 #if defined ENABLE_NLS && defined HAVE_LANGINFO_CODESET && HAVE_ICONV
1079 if (locale_encoding != NULL)
1081 iconv_t cd = iconv_open (locale_encoding, "UTF-8");
1082 bool conversion_ok = true;
1083 char *ret = NULL;
1084 if (cd != (iconv_t) -1)
1086 size_t ret_alloc = 4 * idlen + 1;
1087 for (;;)
1089 /* Repeat the whole conversion process as needed with
1090 larger buffers so non-reversible transformations can
1091 always be detected. */
1092 ICONV_CONST char *inbuf = CONST_CAST (char *, ident);
1093 char *outbuf;
1094 size_t inbytesleft = idlen;
1095 size_t outbytesleft = ret_alloc - 1;
1096 size_t iconv_ret;
1098 ret = (char *) identifier_to_locale_alloc (ret_alloc);
1099 outbuf = ret;
1101 if (iconv (cd, 0, 0, 0, 0) == (size_t) -1)
1103 conversion_ok = false;
1104 break;
1107 iconv_ret = iconv (cd, &inbuf, &inbytesleft,
1108 &outbuf, &outbytesleft);
1109 if (iconv_ret == (size_t) -1 || inbytesleft != 0)
1111 if (errno == E2BIG)
1113 ret_alloc *= 2;
1114 identifier_to_locale_free (ret);
1115 ret = NULL;
1116 continue;
1118 else
1120 conversion_ok = false;
1121 break;
1124 else if (iconv_ret != 0)
1126 conversion_ok = false;
1127 break;
1129 /* Return to initial shift state. */
1130 if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t) -1)
1132 if (errno == E2BIG)
1134 ret_alloc *= 2;
1135 identifier_to_locale_free (ret);
1136 ret = NULL;
1137 continue;
1139 else
1141 conversion_ok = false;
1142 break;
1145 *outbuf = 0;
1146 break;
1148 iconv_close (cd);
1149 if (conversion_ok)
1150 return ret;
1153 #endif
1155 /* Otherwise, convert non-ASCII characters in IDENT to UCNs. */
1157 char *ret = (char *) identifier_to_locale_alloc (10 * idlen + 1);
1158 char *p = ret;
1159 for (i = 0; i < idlen;)
1161 unsigned int c;
1162 size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1163 if (utf8_len == 1)
1164 *p++ = uid[i];
1165 else
1167 sprintf (p, "\\U%08x", c);
1168 p += 10;
1170 i += utf8_len;
1172 *p = 0;
1173 return ret;