]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/pretty-print.c
2d2541048f8ef6956d2966c549cce7ee6d222046
[thirdparty/gcc.git] / gcc / pretty-print.c
1 /* Various declarations for language-independent pretty-print subroutines.
2 Copyright (C) 2003-2013 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "intl.h"
25 #include "pretty-print.h"
26 #include "diagnostic-color.h"
27
28 #include <new> // For placement-new.
29
30 #if HAVE_ICONV
31 #include <iconv.h>
32 #endif
33
34 // Default construct an output buffer.
35
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 {
45 obstack_init (&formatted_obstack);
46 obstack_init (&chunk_obstack);
47 }
48
49 /* A pointer to the formatted diagnostic message. */
50 #define pp_formatted_text_data(PP) \
51 ((const char *) obstack_base ((PP)->buffer->obstack))
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: \
69 pp_scalar (PP, "%" HOST_LONG_LONG_FORMAT F, va_arg (ARG, long long T)); \
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. */
80 static void
81 pp_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. */
103 static inline void
104 pp_clear_state (pretty_printer *pp)
105 {
106 pp->emitted_prefix = false;
107 pp_indentation (pp) = 0;
108 }
109
110 /* Flush the formatted text of PRETTY-PRINTER onto the attached stream. */
111 void
112 pp_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
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
128 void
129 pp_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
171 /* Wrap a text delimited by START and END into PRETTY-PRINTER. */
172 static void
173 pp_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. */
205 static inline void
206 pp_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. */
216 static inline void
217 pp_append_r (pretty_printer *pp, const char *start, int length)
218 {
219 obstack_grow (pp->buffer->obstack, start, length);
220 pp->buffer->line_length += length;
221 }
222
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. */
226 void
227 pp_indent (pretty_printer *pp)
228 {
229 int n = pp_indentation (pp);
230 int i;
231
232 for (i = 0; i < n; ++i)
233 pp_space (pp);
234 }
235
236 /* The following format specifiers are recognized as being client independent:
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.
247 %r: if pp_show_color(pp), switch to color identified by const char *.
248 %R: if pp_show_color(pp), reset color.
249 %m: strerror(text->err_no) - does not consume a value from args_ptr.
250 %%: '%'.
251 %<: opening quote.
252 %>: closing quote.
253 %': apostrophe (should only be used in untranslated messages;
254 translations should use appropriate punctuation directly).
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.
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[].
272 Phase 3 is in pp_format_text. */
273
274 void
275 pp_format (pretty_printer *pp, text_info *text)
276 {
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);
300
301 for (p = text->format_spec; *p; )
302 {
303 while (*p != '\0' && *p != '%')
304 {
305 obstack_1grow (&buffer->chunk_obstack, *p);
306 p++;
307 }
308
309 if (*p == '\0')
310 break;
311
312 switch (*++p)
313 {
314 case '\0':
315 gcc_unreachable ();
316
317 case '%':
318 obstack_1grow (&buffer->chunk_obstack, '%');
319 p++;
320 continue;
321
322 case '<':
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 }
332
333 case '>':
334 {
335 const char *colorstr = colorize_stop (pp_show_color (pp));
336 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
337 }
338 /* FALLTHRU */
339 case '\'':
340 obstack_grow (&buffer->chunk_obstack,
341 close_quote, strlen (close_quote));
342 p++;
343 continue;
344
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
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')
441 break;
442
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;
452
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++)
473 {
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;
503 }
504
505 gcc_assert (!wide || precision == 0);
506
507 if (quote)
508 {
509 pp_string (pp, open_quote);
510 pp_string (pp, colorize_start (pp_show_color (pp), "quote"));
511 }
512
513 switch (*p)
514 {
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
521 case 'c':
522 pp_character (pp, va_arg (*text->args_ptr, int));
523 break;
524
525 case 'd':
526 case 'i':
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");
532 break;
533
534 case 'o':
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");
541 break;
542
543 case 's':
544 pp_string (pp, va_arg (*text->args_ptr, const char *));
545 break;
546
547 case 'p':
548 pp_pointer (pp, va_arg (*text->args_ptr, void *));
549 break;
550
551 case 'u':
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");
558 break;
559
560 case 'x':
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");
567 break;
568
569 case '.':
570 {
571 int n;
572 const char *s;
573
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
597 s = va_arg (*text->args_ptr, const char *);
598 pp_append_text (pp, s, s + n);
599 }
600 break;
601
602 default:
603 {
604 bool ok;
605
606 gcc_assert (pp_format_decoder (pp));
607 ok = pp_format_decoder (pp) (pp, text, p,
608 precision, wide, plus, hash);
609 gcc_assert (ok);
610 }
611 }
612
613 if (quote)
614 {
615 pp_string (pp, colorize_stop (pp_show_color (pp)));
616 pp_string (pp, close_quote);
617 }
618
619 obstack_1grow (&buffer->chunk_obstack, '\0');
620 *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
621 }
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. */
636 void
637 pp_output_formatted_text (pretty_printer *pp)
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
647 /* This is a third phase, first 2 phases done in pp_format_args.
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);
656 }
657
658 /* Helper subroutine of output_verbatim and verbatim. Do the appropriate
659 settings needed by BUFFER for a verbatim formatting. */
660 void
661 pp_format_verbatim (pretty_printer *pp, text_info *text)
662 {
663 /* Set verbatim mode. */
664 pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp);
665
666 /* Do the actual formatting. */
667 pp_format (pp, text);
668 pp_output_formatted_text (pp);
669
670 /* Restore previous settings. */
671 pp_wrapping_mode (pp) = oldmode;
672 }
673
674 /* Flush the content of BUFFER onto the attached stream. */
675 void
676 pp_flush (pretty_printer *pp)
677 {
678 pp_write_text_to_stream (pp);
679 pp_clear_state (pp);
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. */
686 void
687 pp_set_line_maximum_length (pretty_printer *pp, int length)
688 {
689 pp_line_cutoff (pp) = length;
690 pp_set_real_maximum_length (pp);
691 }
692
693 /* Clear PRETTY-PRINTER output area text info. */
694 void
695 pp_clear_output_area (pretty_printer *pp)
696 {
697 obstack_free (pp->buffer->obstack, obstack_base (pp->buffer->obstack));
698 pp->buffer->line_length = 0;
699 }
700
701 /* Set PREFIX for PRETTY-PRINTER. */
702 void
703 pp_set_prefix (pretty_printer *pp, const char *prefix)
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. */
712 void
713 pp_destroy_prefix (pretty_printer *pp)
714 {
715 if (pp->prefix != NULL)
716 {
717 free (CONST_CAST (char *, pp->prefix));
718 pp->prefix = NULL;
719 }
720 }
721
722 /* Write out PRETTY-PRINTER's prefix. */
723 void
724 pp_emit_prefix (pretty_printer *pp)
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 {
737 pp_indent (pp);
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. */
756
757 pretty_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 ()
769 {
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);
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. */
781 void
782 pp_append_text (pretty_printer *pp, const char *start, const char *end)
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. */
797 const char *
798 pp_formatted_text (pretty_printer *pp)
799 {
800 obstack_1grow (pp->buffer->obstack, '\0');
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. */
806 const char *
807 pp_last_position_in_text (const pretty_printer *pp)
808 {
809 const char *p = NULL;
810 struct obstack *text = pp->buffer->obstack;
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
818 make a full line. Meaningful only in line-wrapping mode. */
819 int
820 pp_remaining_character_count_for_line (pretty_printer *pp)
821 {
822 return pp->maximum_length - pp->buffer->line_length;
823 }
824
825
826 /* Format a message into BUFFER a la printf. */
827 void
828 pp_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;
837 text.locus = NULL;
838 pp_format (pp, &text);
839 pp_output_formatted_text (pp);
840 va_end (ap);
841 }
842
843
844 /* Output MESSAGE verbatim into BUFFER. */
845 void
846 pp_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;
855 text.locus = NULL;
856 pp_format_verbatim (pp, &text);
857 va_end (ap);
858 }
859
860
861
862 /* Have PRETTY-PRINTER start a new line. */
863 void
864 pp_newline (pretty_printer *pp)
865 {
866 obstack_1grow (pp->buffer->obstack, '\n');
867 pp_needs_newline (pp) = false;
868 pp->buffer->line_length = 0;
869 }
870
871 /* Have PRETTY-PRINTER add a CHARACTER. */
872 void
873 pp_character (pretty_printer *pp, int c)
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 }
882 obstack_1grow (pp->buffer->obstack, c);
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. */
888 void
889 pp_string (pretty_printer *pp, const char *str)
890 {
891 pp_maybe_wrap_text (pp, str, str + (str ? strlen (str) : 0));
892 }
893
894 /* Maybe print out a whitespace if needed. */
895
896 void
897 pp_maybe_space (pretty_printer *pp)
898 {
899 if (pp->padding != pp_none)
900 {
901 pp_space (pp);
902 pp->padding = pp_none;
903 }
904 }
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
911 static int
912 decode_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
962 /* Allocator for identifier_to_locale and corresponding function to
963 free memory. */
964
965 void *(*identifier_to_locale_alloc) (size_t) = xmalloc;
966 void (*identifier_to_locale_free) (void *) = free;
967
968 /* Given IDENT, an identifier in the internal encoding, return a
969 version of IDENT suitable for diagnostics in the locale character
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. */
977
978 const char *
979 identifier_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 {
1007 char *ret = (char *) identifier_to_locale_alloc (4 * idlen + 1);
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
1050 ret = (char *) identifier_to_locale_alloc (ret_alloc);
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;
1066 identifier_to_locale_free (ret);
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;
1087 identifier_to_locale_free (ret);
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 {
1109 char *ret = (char *) identifier_to_locale_alloc (10 * idlen + 1);
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 }