1 /* Various declarations for language-independent pretty-print subroutines.
2 Copyright (C) 2003-2014 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
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
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/>. */
23 #include "coretypes.h"
25 #include "pretty-print.h"
26 #include "diagnostic-color.h"
28 #include <new> // For placement-new.
34 // Default construct an output buffer.
36 output_buffer::output_buffer ()
37 : formatted_obstack (),
39 obstack (&formatted_obstack),
46 obstack_init (&formatted_obstack);
47 obstack_init (&chunk_obstack);
50 // Release resources owned by an output buffer at the end of lifetime.
52 output_buffer::~output_buffer ()
54 obstack_free (&chunk_obstack, NULL);
55 obstack_free (&formatted_obstack, NULL);
58 /* A pointer to the formatted diagnostic message. */
59 #define pp_formatted_text_data(PP) \
60 ((const char *) obstack_base (pp_buffer (PP)->obstack))
62 /* Format an integer given by va_arg (ARG, type-specifier T) where
63 type-specifier is a precision modifier as indicated by PREC. F is
64 a string used to construct the appropriate format-specifier. */
65 #define pp_integer_with_precision(PP, ARG, PREC, T, F) \
70 pp_scalar (PP, "%" F, va_arg (ARG, T)); \
74 pp_scalar (PP, "%l" F, va_arg (ARG, long T)); \
78 pp_scalar (PP, "%" HOST_LONG_LONG_FORMAT F, va_arg (ARG, long long T)); \
87 /* Subroutine of pp_set_maximum_length. Set up PRETTY-PRINTER's
88 internal maximum characters per line. */
90 pp_set_real_maximum_length (pretty_printer *pp)
92 /* If we're told not to wrap lines then do the obvious thing. In case
93 we'll emit prefix only once per message, it is appropriate
94 not to increase unnecessarily the line-length cut-off. */
95 if (!pp_is_wrapping_line (pp)
96 || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_ONCE
97 || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_NEVER)
98 pp->maximum_length = pp_line_cutoff (pp);
101 int prefix_length = pp->prefix ? strlen (pp->prefix) : 0;
102 /* If the prefix is ridiculously too long, output at least
104 if (pp_line_cutoff (pp) - prefix_length < 32)
105 pp->maximum_length = pp_line_cutoff (pp) + 32;
107 pp->maximum_length = pp_line_cutoff (pp);
111 /* Clear PRETTY-PRINTER's output state. */
113 pp_clear_state (pretty_printer *pp)
115 pp->emitted_prefix = false;
116 pp_indentation (pp) = 0;
119 /* Flush the formatted text of PRETTY-PRINTER onto the attached stream. */
121 pp_write_text_to_stream (pretty_printer *pp)
123 const char *text = pp_formatted_text (pp);
124 fputs (text, pp_buffer (pp)->stream);
125 pp_clear_output_area (pp);
128 /* As pp_write_text_to_stream, but for GraphViz label output.
130 Flush the formatted text of pretty-printer PP onto the attached stream.
131 Replace characters in PPF that have special meaning in a GraphViz .dot
134 This routine is not very fast, but it doesn't have to be as this is only
135 be used by routines dumping intermediate representations in graph form. */
138 pp_write_text_as_dot_label_to_stream (pretty_printer *pp, bool for_record)
140 const char *text = pp_formatted_text (pp);
141 const char *p = text;
142 FILE *fp = pp_buffer (pp)->stream;
148 /* Print newlines as a left-aligned newline. */
150 fputs ("\\l\\\n", fp);
153 /* A pipe is only special for record-shape nodes. */
160 /* The following characters always have to be escaped
161 for use in labels. */
177 pp_clear_output_area (pp);
180 /* Wrap a text delimited by START and END into PRETTY-PRINTER. */
182 pp_wrap_text (pretty_printer *pp, const char *start, const char *end)
184 bool wrapping_line = pp_is_wrapping_line (pp);
188 /* Dump anything bordered by whitespaces. */
190 const char *p = start;
191 while (p != end && !ISBLANK (*p) && *p != '\n')
194 && p - start >= pp_remaining_character_count_for_line (pp))
196 pp_append_text (pp, start, p);
200 if (start != end && ISBLANK (*start))
205 if (start != end && *start == '\n')
213 /* Same as pp_wrap_text but wrap text only when in line-wrapping mode. */
215 pp_maybe_wrap_text (pretty_printer *pp, const char *start, const char *end)
217 if (pp_is_wrapping_line (pp))
218 pp_wrap_text (pp, start, end);
220 pp_append_text (pp, start, end);
223 /* Append to the output area of PRETTY-PRINTER a string specified by its
224 STARTing character and LENGTH. */
226 pp_append_r (pretty_printer *pp, const char *start, int length)
228 obstack_grow (pp_buffer (pp)->obstack, start, length);
229 pp_buffer (pp)->line_length += length;
232 /* Insert enough spaces into the output area of PRETTY-PRINTER to bring
233 the column position to the current indentation level, assuming that a
234 newline has just been written to the buffer. */
236 pp_indent (pretty_printer *pp)
238 int n = pp_indentation (pp);
241 for (i = 0; i < n; ++i)
245 /* The following format specifiers are recognized as being client independent:
246 %d, %i: (signed) integer in base ten.
247 %u: unsigned integer in base ten.
248 %o: unsigned integer in base eight.
249 %x: unsigned integer in base sixteen.
250 %ld, %li, %lo, %lu, %lx: long versions of the above.
251 %lld, %lli, %llo, %llu, %llx: long long versions.
252 %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions.
256 %r: if pp_show_color(pp), switch to color identified by const char *.
257 %R: if pp_show_color(pp), reset color.
258 %m: strerror(text->err_no) - does not consume a value from args_ptr.
262 %': apostrophe (should only be used in untranslated messages;
263 translations should use appropriate punctuation directly).
264 %.*s: a substring the length of which is specified by an argument
266 %Ns: likewise, but length specified as constant in the format string.
267 Flag 'q': quote formatted text (must come immediately after '%').
269 Arguments can be used sequentially, or through %N$ resp. *N$
270 notation Nth argument after the format string. If %N$ / *N$
271 notation is used, it must be used for all arguments, except %m, %%,
272 %<, %> and %', which may not have a number, as they do not consume
273 an argument. When %M$.*N$s is used, M must be N + 1. (This may
274 also be written %M$.*s, provided N is not otherwise used.) The
275 format string must have conversion specifiers with argument numbers
276 1 up to highest argument; each argument may only be used once.
277 A format string can have at most 30 arguments. */
279 /* Formatting phases 1 and 2: render TEXT->format_spec plus
280 TEXT->args_ptr into a series of chunks in pp_buffer (PP)->args[].
281 Phase 3 is in pp_format_text. */
284 pp_format (pretty_printer *pp, text_info *text)
286 output_buffer *buffer = pp_buffer (pp);
289 struct chunk_info *new_chunk_array;
291 unsigned int curarg = 0, chunk = 0, argno;
292 pp_wrapping_mode_t old_wrapping_mode;
293 bool any_unnumbered = false, any_numbered = false;
294 const char **formatters[PP_NL_ARGMAX];
296 /* Allocate a new chunk structure. */
297 new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info);
298 new_chunk_array->prev = buffer->cur_chunk_array;
299 buffer->cur_chunk_array = new_chunk_array;
300 args = new_chunk_array->args;
302 /* Formatting phase 1: split up TEXT->format_spec into chunks in
303 pp_buffer (PP)->args[]. Even-numbered chunks are to be output
304 verbatim, odd-numbered chunks are format specifiers.
305 %m, %%, %<, %>, and %' are replaced with the appropriate text at
308 memset (formatters, 0, sizeof formatters);
310 for (p = text->format_spec; *p; )
312 while (*p != '\0' && *p != '%')
314 obstack_1grow (&buffer->chunk_obstack, *p);
327 obstack_1grow (&buffer->chunk_obstack, '%');
333 obstack_grow (&buffer->chunk_obstack,
334 open_quote, strlen (open_quote));
336 = colorize_start (pp_show_color (pp), "quote");
337 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
344 const char *colorstr = colorize_stop (pp_show_color (pp));
345 obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
349 obstack_grow (&buffer->chunk_obstack,
350 close_quote, strlen (close_quote));
356 const char *colorstr = colorize_stop (pp_show_color (pp));
357 obstack_grow (&buffer->chunk_obstack, colorstr,
365 const char *errstr = xstrerror (text->err_no);
366 obstack_grow (&buffer->chunk_obstack, errstr, strlen (errstr));
372 /* Handled in phase 2. Terminate the plain chunk here. */
373 obstack_1grow (&buffer->chunk_obstack, '\0');
374 gcc_assert (chunk < PP_NL_ARGMAX * 2);
375 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
382 argno = strtoul (p, &end, 10) - 1;
384 gcc_assert (*p == '$');
388 gcc_assert (!any_unnumbered);
393 any_unnumbered = true;
394 gcc_assert (!any_numbered);
396 gcc_assert (argno < PP_NL_ARGMAX);
397 gcc_assert (!formatters[argno]);
398 formatters[argno] = &args[chunk];
401 obstack_1grow (&buffer->chunk_obstack, *p);
404 while (strchr ("qwl+#", p[-1]));
408 /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
409 (where M == N + 1). */
414 obstack_1grow (&buffer->chunk_obstack, *p);
417 while (ISDIGIT (p[-1]));
418 gcc_assert (p[-1] == 's');
422 gcc_assert (*p == '*');
423 obstack_1grow (&buffer->chunk_obstack, '*');
429 unsigned int argno2 = strtoul (p, &end, 10) - 1;
431 gcc_assert (argno2 == argno - 1);
432 gcc_assert (!any_unnumbered);
433 gcc_assert (*p == '$');
436 formatters[argno2] = formatters[argno];
440 gcc_assert (!any_numbered);
441 formatters[argno+1] = formatters[argno];
444 gcc_assert (*p == 's');
445 obstack_1grow (&buffer->chunk_obstack, 's');
452 obstack_1grow (&buffer->chunk_obstack, '\0');
453 gcc_assert (chunk < PP_NL_ARGMAX * 2);
454 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
457 obstack_1grow (&buffer->chunk_obstack, '\0');
458 gcc_assert (chunk < PP_NL_ARGMAX * 2);
459 args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
462 /* Set output to the argument obstack, and switch line-wrapping and
464 buffer->obstack = &buffer->chunk_obstack;
465 old_wrapping_mode = pp_set_verbatim_wrapping (pp);
467 /* Second phase. Replace each formatter with the formatted text it
470 for (argno = 0; formatters[argno]; argno++)
478 /* We do not attempt to enforce any ordering on the modifier
481 for (p = *formatters[argno];; p++)
506 /* We don't support precision beyond that of "long long". */
507 gcc_assert (precision < 2);
514 gcc_assert (!wide || precision == 0);
518 pp_string (pp, open_quote);
519 pp_string (pp, colorize_start (pp_show_color (pp), "quote"));
525 pp_string (pp, colorize_start (pp_show_color (pp),
526 va_arg (*text->args_ptr,
531 pp_character (pp, va_arg (*text->args_ptr, int));
537 pp_wide_integer (pp, va_arg (*text->args_ptr, HOST_WIDE_INT));
539 pp_integer_with_precision
540 (pp, *text->args_ptr, precision, int, "d");
545 pp_scalar (pp, "%" HOST_WIDE_INT_PRINT "o",
546 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
548 pp_integer_with_precision
549 (pp, *text->args_ptr, precision, unsigned, "o");
553 pp_string (pp, va_arg (*text->args_ptr, const char *));
557 pp_pointer (pp, va_arg (*text->args_ptr, void *));
562 pp_scalar (pp, HOST_WIDE_INT_PRINT_UNSIGNED,
563 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
565 pp_integer_with_precision
566 (pp, *text->args_ptr, precision, unsigned, "u");
571 pp_scalar (pp, HOST_WIDE_INT_PRINT_HEX,
572 va_arg (*text->args_ptr, unsigned HOST_WIDE_INT));
574 pp_integer_with_precision
575 (pp, *text->args_ptr, precision, unsigned, "x");
583 /* We handle '%.Ns' and '%.*s' or '%M$.*N$s'
584 (where M == N + 1). The format string should be verified
585 already from the first phase. */
590 n = strtoul (p, &end, 10);
592 gcc_assert (*p == 's');
596 gcc_assert (*p == '*');
598 gcc_assert (*p == 's');
599 n = va_arg (*text->args_ptr, int);
601 /* This consumes a second entry in the formatters array. */
602 gcc_assert (formatters[argno] == formatters[argno+1]);
606 s = va_arg (*text->args_ptr, const char *);
607 pp_append_text (pp, s, s + n);
615 gcc_assert (pp_format_decoder (pp));
616 ok = pp_format_decoder (pp) (pp, text, p,
617 precision, wide, plus, hash);
624 pp_string (pp, colorize_stop (pp_show_color (pp)));
625 pp_string (pp, close_quote);
628 obstack_1grow (&buffer->chunk_obstack, '\0');
629 *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
632 #ifdef ENABLE_CHECKING
633 for (; argno < PP_NL_ARGMAX; argno++)
634 gcc_assert (!formatters[argno]);
637 /* Revert to normal obstack and wrapping mode. */
638 buffer->obstack = &buffer->formatted_obstack;
639 buffer->line_length = 0;
640 pp_wrapping_mode (pp) = old_wrapping_mode;
644 /* Format of a message pointed to by TEXT. */
646 pp_output_formatted_text (pretty_printer *pp)
649 output_buffer *buffer = pp_buffer (pp);
650 struct chunk_info *chunk_array = buffer->cur_chunk_array;
651 const char **args = chunk_array->args;
653 gcc_assert (buffer->obstack == &buffer->formatted_obstack);
654 gcc_assert (buffer->line_length == 0);
656 /* This is a third phase, first 2 phases done in pp_format_args.
657 Now we actually print it. */
658 for (chunk = 0; args[chunk]; chunk++)
659 pp_string (pp, args[chunk]);
661 /* Deallocate the chunk structure and everything after it (i.e. the
662 associated series of formatted strings). */
663 buffer->cur_chunk_array = chunk_array->prev;
664 obstack_free (&buffer->chunk_obstack, chunk_array);
667 /* Helper subroutine of output_verbatim and verbatim. Do the appropriate
668 settings needed by BUFFER for a verbatim formatting. */
670 pp_format_verbatim (pretty_printer *pp, text_info *text)
672 /* Set verbatim mode. */
673 pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp);
675 /* Do the actual formatting. */
676 pp_format (pp, text);
677 pp_output_formatted_text (pp);
679 /* Restore previous settings. */
680 pp_wrapping_mode (pp) = oldmode;
683 /* Flush the content of BUFFER onto the attached stream. This
684 function does nothing unless pp->output_buffer->flush_p. */
686 pp_flush (pretty_printer *pp)
689 if (!pp->buffer->flush_p)
691 pp_write_text_to_stream (pp);
692 fflush (pp_buffer (pp)->stream);
695 /* Flush the content of BUFFER onto the attached stream independently
696 of the value of pp->output_buffer->flush_p. */
698 pp_really_flush (pretty_printer *pp)
701 pp_write_text_to_stream (pp);
702 fflush (pp_buffer (pp)->stream);
705 /* Sets the number of maximum characters per line PRETTY-PRINTER can
706 output in line-wrapping mode. A LENGTH value 0 suppresses
709 pp_set_line_maximum_length (pretty_printer *pp, int length)
711 pp_line_cutoff (pp) = length;
712 pp_set_real_maximum_length (pp);
715 /* Clear PRETTY-PRINTER output area text info. */
717 pp_clear_output_area (pretty_printer *pp)
719 obstack_free (pp_buffer (pp)->obstack,
720 obstack_base (pp_buffer (pp)->obstack));
721 pp_buffer (pp)->line_length = 0;
724 /* Set PREFIX for PRETTY-PRINTER. */
726 pp_set_prefix (pretty_printer *pp, const char *prefix)
729 pp_set_real_maximum_length (pp);
730 pp->emitted_prefix = false;
731 pp_indentation (pp) = 0;
734 /* Free PRETTY-PRINTER's prefix, a previously malloc()'d string. */
736 pp_destroy_prefix (pretty_printer *pp)
738 if (pp->prefix != NULL)
740 free (CONST_CAST (char *, pp->prefix));
745 /* Write out PRETTY-PRINTER's prefix. */
747 pp_emit_prefix (pretty_printer *pp)
749 if (pp->prefix != NULL)
751 switch (pp_prefixing_rule (pp))
754 case DIAGNOSTICS_SHOW_PREFIX_NEVER:
757 case DIAGNOSTICS_SHOW_PREFIX_ONCE:
758 if (pp->emitted_prefix)
763 pp_indentation (pp) += 3;
766 case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
768 int prefix_length = strlen (pp->prefix);
769 pp_append_r (pp, pp->prefix, prefix_length);
770 pp->emitted_prefix = true;
777 /* Construct a PRETTY-PRINTER with PREFIX and of MAXIMUM_LENGTH
778 characters per line. */
780 pretty_printer::pretty_printer (const char *p, int l)
781 : buffer (new (XCNEW (output_buffer)) output_buffer ()),
790 translate_identifiers (true),
793 pp_line_cutoff (this) = l;
794 /* By default, we emit prefixes once per message. */
795 pp_prefixing_rule (this) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
796 pp_set_prefix (this, p);
799 pretty_printer::~pretty_printer ()
801 buffer->~output_buffer ();
805 /* Append a string delimited by START and END to the output area of
806 PRETTY-PRINTER. No line wrapping is done. However, if beginning a
807 new line then emit PRETTY-PRINTER's prefix and skip any leading
808 whitespace if appropriate. The caller must ensure that it is
811 pp_append_text (pretty_printer *pp, const char *start, const char *end)
813 /* Emit prefix and skip whitespace if we're starting a new line. */
814 if (pp_buffer (pp)->line_length == 0)
817 if (pp_is_wrapping_line (pp))
818 while (start != end && *start == ' ')
821 pp_append_r (pp, start, end - start);
824 /* Finishes constructing a NULL-terminated character string representing
825 the PRETTY-PRINTED text. */
827 pp_formatted_text (pretty_printer *pp)
829 obstack_1grow (pp_buffer (pp)->obstack, '\0');
830 return pp_formatted_text_data (pp);
833 /* Return a pointer to the last character emitted in PRETTY-PRINTER's
834 output area. A NULL pointer means no character available. */
836 pp_last_position_in_text (const pretty_printer *pp)
838 const char *p = NULL;
839 struct obstack *text = pp_buffer (pp)->obstack;
841 if (obstack_base (text) != obstack_next_free (text))
842 p = ((const char *) obstack_next_free (text)) - 1;
846 /* Return the amount of characters PRETTY-PRINTER can accept to
847 make a full line. Meaningful only in line-wrapping mode. */
849 pp_remaining_character_count_for_line (pretty_printer *pp)
851 return pp->maximum_length - pp_buffer (pp)->line_length;
855 /* Format a message into BUFFER a la printf. */
857 pp_printf (pretty_printer *pp, const char *msg, ...)
865 text.format_spec = msg;
867 pp_format (pp, &text);
868 pp_output_formatted_text (pp);
873 /* Output MESSAGE verbatim into BUFFER. */
875 pp_verbatim (pretty_printer *pp, const char *msg, ...)
883 text.format_spec = msg;
885 pp_format_verbatim (pp, &text);
891 /* Have PRETTY-PRINTER start a new line. */
893 pp_newline (pretty_printer *pp)
895 obstack_1grow (pp_buffer (pp)->obstack, '\n');
896 pp_needs_newline (pp) = false;
897 pp_buffer (pp)->line_length = 0;
900 /* Have PRETTY-PRINTER add a CHARACTER. */
902 pp_character (pretty_printer *pp, int c)
904 if (pp_is_wrapping_line (pp)
905 && pp_remaining_character_count_for_line (pp) <= 0)
911 obstack_1grow (pp_buffer (pp)->obstack, c);
912 ++pp_buffer (pp)->line_length;
915 /* Append a STRING to the output area of PRETTY-PRINTER; the STRING may
916 be line-wrapped if in appropriate mode. */
918 pp_string (pretty_printer *pp, const char *str)
920 pp_maybe_wrap_text (pp, str, str + (str ? strlen (str) : 0));
923 /* Maybe print out a whitespace if needed. */
926 pp_maybe_space (pretty_printer *pp)
928 if (pp->padding != pp_none)
931 pp->padding = pp_none;
935 // Add a newline to the pretty printer PP and flush formatted text.
938 pp_newline_and_flush (pretty_printer *pp)
942 pp_needs_newline (pp) = false;
945 // Add a newline to the pretty printer PP, followed by indentation.
948 pp_newline_and_indent (pretty_printer *pp, int n)
950 pp_indentation (pp) += n;
953 pp_needs_newline (pp) = false;
956 // Add separator C, followed by a single whitespace.
959 pp_separate_with (pretty_printer *pp, char c)
961 pp_character (pp, c);
966 /* The string starting at P has LEN (at least 1) bytes left; if they
967 start with a valid UTF-8 sequence, return the length of that
968 sequence and set *VALUE to the value of that sequence, and
969 otherwise return 0 and set *VALUE to (unsigned int) -1. */
972 decode_utf8_char (const unsigned char *p, size_t len, unsigned int *value)
983 for (t = *p; t & 0x80; t <<= 1)
986 if (utf8_len > len || utf8_len < 2 || utf8_len > 6)
988 *value = (unsigned int) -1;
991 ch = *p & ((1 << (7 - utf8_len)) - 1);
992 for (i = 1; i < utf8_len; i++)
994 unsigned int u = p[i];
995 if ((u & 0xC0) != 0x80)
997 *value = (unsigned int) -1;
1000 ch = (ch << 6) | (u & 0x3F);
1002 if ( (ch <= 0x7F && utf8_len > 1)
1003 || (ch <= 0x7FF && utf8_len > 2)
1004 || (ch <= 0xFFFF && utf8_len > 3)
1005 || (ch <= 0x1FFFFF && utf8_len > 4)
1006 || (ch <= 0x3FFFFFF && utf8_len > 5)
1007 || (ch >= 0xD800 && ch <= 0xDFFF))
1009 *value = (unsigned int) -1;
1022 /* Allocator for identifier_to_locale and corresponding function to
1025 void *(*identifier_to_locale_alloc) (size_t) = xmalloc;
1026 void (*identifier_to_locale_free) (void *) = free;
1028 /* Given IDENT, an identifier in the internal encoding, return a
1029 version of IDENT suitable for diagnostics in the locale character
1030 set: either IDENT itself, or a string, allocated using
1031 identifier_to_locale_alloc, converted to the locale character set
1032 and using escape sequences if not representable in the locale
1033 character set or containing control characters or invalid byte
1034 sequences. Existing backslashes in IDENT are not doubled, so the
1035 result may not uniquely specify the contents of an arbitrary byte
1036 sequence identifier. */
1039 identifier_to_locale (const char *ident)
1041 const unsigned char *uid = (const unsigned char *) ident;
1042 size_t idlen = strlen (ident);
1043 bool valid_printable_utf8 = true;
1044 bool all_ascii = true;
1047 for (i = 0; i < idlen;)
1050 size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1051 if (utf8_len == 0 || c <= 0x1F || (c >= 0x7F && c <= 0x9F))
1053 valid_printable_utf8 = false;
1061 /* If IDENT contains invalid UTF-8 sequences (which may occur with
1062 attributes putting arbitrary byte sequences in identifiers), or
1063 control characters, we use octal escape sequences for all bytes
1064 outside printable ASCII. */
1065 if (!valid_printable_utf8)
1067 char *ret = (char *) identifier_to_locale_alloc (4 * idlen + 1);
1069 for (i = 0; i < idlen; i++)
1071 if (uid[i] > 0x1F && uid[i] < 0x7F)
1075 sprintf (p, "\\%03o", uid[i]);
1083 /* Otherwise, if it is valid printable ASCII, or printable UTF-8
1084 with the locale character set being UTF-8, IDENT is used. */
1085 if (all_ascii || locale_utf8)
1088 /* Otherwise IDENT is converted to the locale character set if
1090 #if defined ENABLE_NLS && defined HAVE_LANGINFO_CODESET && HAVE_ICONV
1091 if (locale_encoding != NULL)
1093 iconv_t cd = iconv_open (locale_encoding, "UTF-8");
1094 bool conversion_ok = true;
1096 if (cd != (iconv_t) -1)
1098 size_t ret_alloc = 4 * idlen + 1;
1101 /* Repeat the whole conversion process as needed with
1102 larger buffers so non-reversible transformations can
1103 always be detected. */
1104 ICONV_CONST char *inbuf = CONST_CAST (char *, ident);
1106 size_t inbytesleft = idlen;
1107 size_t outbytesleft = ret_alloc - 1;
1110 ret = (char *) identifier_to_locale_alloc (ret_alloc);
1113 if (iconv (cd, 0, 0, 0, 0) == (size_t) -1)
1115 conversion_ok = false;
1119 iconv_ret = iconv (cd, &inbuf, &inbytesleft,
1120 &outbuf, &outbytesleft);
1121 if (iconv_ret == (size_t) -1 || inbytesleft != 0)
1126 identifier_to_locale_free (ret);
1132 conversion_ok = false;
1136 else if (iconv_ret != 0)
1138 conversion_ok = false;
1141 /* Return to initial shift state. */
1142 if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t) -1)
1147 identifier_to_locale_free (ret);
1153 conversion_ok = false;
1167 /* Otherwise, convert non-ASCII characters in IDENT to UCNs. */
1169 char *ret = (char *) identifier_to_locale_alloc (10 * idlen + 1);
1171 for (i = 0; i < idlen;)
1174 size_t utf8_len = decode_utf8_char (&uid[i], idlen - i, &c);
1179 sprintf (p, "\\U%08x", c);