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