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