Commit a668adb2 by Joseph Myers Committed by Joseph Myers

intl.h (open_quote, [...]): New.

	* intl.h (open_quote, close_quote): New.
	* intl.c (open_quote, close_quote): New.
	(gcc_init_libintl): Set them.
	* pretty-print.c: Include "intl.h".
	(pp_base_format_text): Support 'q' format flag and %` and %'
	formats.  Use ' instead of ` in comments.
	* c-format.c (gcc_diag_flag_specs, gcc_cxxdiag_flag_specs,
	gcc_diag_char_table, gcc_cdiag_char_table, gcc_cxxdiag_char_table,
	foramt_types_orig): Describe these new formats.
	(decode_format_attr, check_function_format,
	check_format_info_main): Use these new formats.
	(status_warning): Use ATTRIBUTE_GCC_DIAG.
	* toplev.c (ATTRIBUTE_GCC_DIAG): Increase required GCC version to
	check these formats to 3.5.

From-SVN: r82215
parent 1bfc8f67
2004-05-24 Joseph S. Myers <jsm@polyomino.org.uk>
* intl.h (open_quote, close_quote): New.
* intl.c (open_quote, close_quote): New.
(gcc_init_libintl): Set them.
* pretty-print.c: Include "intl.h".
(pp_base_format_text): Support 'q' format flag and %` and %'
formats. Use ' instead of ` in comments.
* c-format.c (gcc_diag_flag_specs, gcc_cxxdiag_flag_specs,
gcc_diag_char_table, gcc_cdiag_char_table, gcc_cxxdiag_char_table,
foramt_types_orig): Describe these new formats.
(decode_format_attr, check_function_format,
check_format_info_main): Use these new formats.
(status_warning): Use ATTRIBUTE_GCC_DIAG.
* toplev.c (ATTRIBUTE_GCC_DIAG): Increase required GCC version to
check these formats to 3.5.
2004-05-24 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> 2004-05-24 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* Makefile.in (CPPLIBS): Renamed to CPPLIB. * Makefile.in (CPPLIBS): Renamed to CPPLIB.
......
...@@ -200,7 +200,7 @@ decode_format_attr (tree args, function_format_info *info, int validated_p) ...@@ -200,7 +200,7 @@ decode_format_attr (tree args, function_format_info *info, int validated_p)
{ {
if (validated_p) if (validated_p)
abort (); abort ();
warning ("`%s' is an unrecognized format function type", p); warning ("%qs is an unrecognized format function type", p);
return false; return false;
} }
} }
...@@ -615,6 +615,7 @@ static const format_flag_pair gcc_diag_flag_pairs[] = ...@@ -615,6 +615,7 @@ static const format_flag_pair gcc_diag_flag_pairs[] =
static const format_flag_spec gcc_diag_flag_specs[] = static const format_flag_spec gcc_diag_flag_specs[] =
{ {
{ 'q', 0, 0, N_("`q' flag"), N_("the `q' diagnostic flag"), STD_C89 },
{ 'p', 0, 0, N_("precision"), N_("precision in printf format"), STD_C89 }, { 'p', 0, 0, N_("precision"), N_("precision in printf format"), STD_C89 },
{ 'L', 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 }, { 'L', 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
{ 0, 0, 0, NULL, NULL, 0 } { 0, 0, 0, NULL, NULL, 0 }
...@@ -626,6 +627,7 @@ static const format_flag_spec gcc_cxxdiag_flag_specs[] = ...@@ -626,6 +627,7 @@ static const format_flag_spec gcc_cxxdiag_flag_specs[] =
{ {
{ '+', 0, 0, N_("`+' flag"), N_("the `+' printf flag"), STD_C89 }, { '+', 0, 0, N_("`+' flag"), N_("the `+' printf flag"), STD_C89 },
{ '#', 0, 0, N_("`#' flag"), N_("the `#' printf flag"), STD_C89 }, { '#', 0, 0, N_("`#' flag"), N_("the `#' printf flag"), STD_C89 },
{ 'q', 0, 0, N_("`q' flag"), N_("the `q' diagnostic flag"), STD_C89 },
{ 'p', 0, 0, N_("precision"), N_("precision in printf format"), STD_C89 }, { 'p', 0, 0, N_("precision"), N_("precision in printf format"), STD_C89 },
{ 'L', 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 }, { 'L', 0, 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
{ 0, 0, 0, NULL, NULL, 0 } { 0, 0, 0, NULL, NULL, 0 }
...@@ -798,69 +800,75 @@ static const format_char_info asm_fprintf_char_table[] = ...@@ -798,69 +800,75 @@ static const format_char_info asm_fprintf_char_table[] =
static const format_char_info gcc_diag_char_table[] = static const format_char_info gcc_diag_char_table[] =
{ {
/* C89 conversion specifiers. */ /* C89 conversion specifiers. */
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "p", "cR" }, { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR" },
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "c" }, { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c" },
/* Custom conversion specifiers. */ /* Custom conversion specifiers. */
/* %H will require "location_t" at runtime. */ /* %H will require "location_t" at runtime. */
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
/* These will require a "tree" at runtime. */ /* These will require a "tree" at runtime. */
{ "J", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "J", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "m", 0, STD_C89, NOARGUMENTS, "", "" }, { "`", 0, STD_C89, NOARGUMENTS, "", "" },
{ "'", 0, STD_C89, NOARGUMENTS, "", "" },
{ "m", 0, STD_C89, NOARGUMENTS, "q", "" },
{ NULL, 0, 0, NOLENGTHS, NULL, NULL } { NULL, 0, 0, NOLENGTHS, NULL, NULL }
}; };
static const format_char_info gcc_cdiag_char_table[] = static const format_char_info gcc_cdiag_char_table[] =
{ {
/* C89 conversion specifiers. */ /* C89 conversion specifiers. */
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "p", "cR" }, { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR" },
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "c" }, { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c" },
/* Custom conversion specifiers. */ /* Custom conversion specifiers. */
/* %H will require "location_t" at runtime. */ /* %H will require "location_t" at runtime. */
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
/* These will require a "tree" at runtime. */ /* These will require a "tree" at runtime. */
{ "DEFJT", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "DEFJT", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "m", 0, STD_C89, NOARGUMENTS, "", "" }, { "`", 0, STD_C89, NOARGUMENTS, "", "" },
{ "'", 0, STD_C89, NOARGUMENTS, "", "" },
{ "m", 0, STD_C89, NOARGUMENTS, "q", "" },
{ NULL, 0, 0, NOLENGTHS, NULL, NULL } { NULL, 0, 0, NOLENGTHS, NULL, NULL }
}; };
static const format_char_info gcc_cxxdiag_char_table[] = static const format_char_info gcc_cxxdiag_char_table[] =
{ {
/* C89 conversion specifiers. */ /* C89 conversion specifiers. */
{ "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "p", "cR" }, { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR" },
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "c" }, { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c" },
/* Custom conversion specifiers. */ /* Custom conversion specifiers. */
/* %H will require "location_t" at runtime. */ /* %H will require "location_t" at runtime. */
{ "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "H", 0, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
/* These will require a "tree" at runtime. */ /* These will require a "tree" at runtime. */
{ "ADEFJTV",0,STD_C89,{ T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "+#", "" }, { "ADEFJTV",0,STD_C89,{ T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q+#", "" },
/* These accept either an `int' or an `enum tree_code' (which is handled as an `int'.) */ /* These accept either an `int' or an `enum tree_code' (which is handled as an `int'.) */
{ "CLOPQ",0,STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "" }, { "CLOPQ",0,STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "" },
{ "m", 0, STD_C89, NOARGUMENTS, "", "" }, { "`", 0, STD_C89, NOARGUMENTS, "", "" },
{ "'", 0, STD_C89, NOARGUMENTS, "", "" },
{ "m", 0, STD_C89, NOARGUMENTS, "q", "" },
{ NULL, 0, 0, NOLENGTHS, NULL, NULL } { NULL, 0, 0, NOLENGTHS, NULL, NULL }
}; };
...@@ -933,19 +941,19 @@ static const format_kind_info format_types_orig[] = ...@@ -933,19 +941,19 @@ static const format_kind_info format_types_orig[] =
'w', 0, 'p', 0, 'L', 'w', 0, 'p', 0, 'L',
NULL, NULL NULL, NULL
}, },
{ "gcc_diag", gcc_diag_length_specs, gcc_diag_char_table, "", NULL, { "gcc_diag", gcc_diag_length_specs, gcc_diag_char_table, "q", NULL,
gcc_diag_flag_specs, gcc_diag_flag_pairs, gcc_diag_flag_specs, gcc_diag_flag_pairs,
FMT_FLAG_ARG_CONVERT, FMT_FLAG_ARG_CONVERT,
0, 0, 'p', 0, 'L', 0, 0, 'p', 0, 'L',
NULL, &integer_type_node NULL, &integer_type_node
}, },
{ "gcc_cdiag", gcc_cdiag_length_specs, gcc_cdiag_char_table, "", NULL, { "gcc_cdiag", gcc_cdiag_length_specs, gcc_cdiag_char_table, "q", NULL,
gcc_cdiag_flag_specs, gcc_cdiag_flag_pairs, gcc_cdiag_flag_specs, gcc_cdiag_flag_pairs,
FMT_FLAG_ARG_CONVERT, FMT_FLAG_ARG_CONVERT,
0, 0, 'p', 0, 'L', 0, 0, 'p', 0, 'L',
NULL, &integer_type_node NULL, &integer_type_node
}, },
{ "gcc_cxxdiag", gcc_cxxdiag_length_specs, gcc_cxxdiag_char_table, "+#", NULL, { "gcc_cxxdiag", gcc_cxxdiag_length_specs, gcc_cxxdiag_char_table, "q+#", NULL,
gcc_cxxdiag_flag_specs, gcc_cxxdiag_flag_pairs, gcc_cxxdiag_flag_specs, gcc_cxxdiag_flag_pairs,
FMT_FLAG_ARG_CONVERT, FMT_FLAG_ARG_CONVERT,
0, 0, 'p', 0, 'L', 0, 0, 'p', 0, 'L',
...@@ -1018,7 +1026,7 @@ static void check_format_info_main (int *, format_check_results *, ...@@ -1018,7 +1026,7 @@ static void check_format_info_main (int *, format_check_results *,
const char *, int, tree, const char *, int, tree,
unsigned HOST_WIDE_INT); unsigned HOST_WIDE_INT);
static void status_warning (int *, const char *, ...) static void status_warning (int *, const char *, ...)
ATTRIBUTE_PRINTF_2; ATTRIBUTE_GCC_DIAG(2, 3);
static void init_dollar_format_checking (int, tree); static void init_dollar_format_checking (int, tree);
static int maybe_read_dollar_number (int *, const char **, int, static int maybe_read_dollar_number (int *, const char **, int,
...@@ -1105,7 +1113,7 @@ check_function_format (int *status, tree attrs, tree params) ...@@ -1105,7 +1113,7 @@ check_function_format (int *status, tree attrs, tree params)
break; break;
} }
if (args != 0) if (args != 0)
warning ("function might be possible candidate for `%s' format attribute", warning ("function might be possible candidate for %qs format attribute",
format_types[info.format_type].name); format_types[info.format_type].name);
} }
} }
...@@ -1699,7 +1707,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -1699,7 +1707,7 @@ check_format_info_main (int *status, format_check_results *res,
if (*format_chars == 0) if (*format_chars == 0)
{ {
if (format_chars - orig_format_chars != format_length) if (format_chars - orig_format_chars != format_length)
status_warning (status, "embedded `\\0' in format"); status_warning (status, "embedded %`\\0%' in format");
if (info->first_arg_num != 0 && params != 0 if (info->first_arg_num != 0 && params != 0
&& has_operand_number <= 0) && has_operand_number <= 0)
{ {
...@@ -1714,7 +1722,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -1714,7 +1722,7 @@ check_format_info_main (int *status, format_check_results *res,
continue; continue;
if (*format_chars == 0) if (*format_chars == 0)
{ {
status_warning (status, "spurious trailing `%%' in format"); status_warning (status, "spurious trailing %`%%%' in format");
continue; continue;
} }
if (*format_chars == '%') if (*format_chars == '%')
...@@ -1989,7 +1997,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -1989,7 +1997,7 @@ check_format_info_main (int *status, format_check_results *res,
{ {
/* Warn if the length modifier is non-standard. */ /* Warn if the length modifier is non-standard. */
if (ADJ_STD (length_chars_std) > C_STD_VER) if (ADJ_STD (length_chars_std) > C_STD_VER)
status_warning (status, "%s does not support the `%s' %s length modifier", status_warning (status, "%s does not support the %qs %s length modifier",
C_STD_NAME (length_chars_std), length_chars, C_STD_NAME (length_chars_std), length_chars,
fki->name); fki->name);
} }
...@@ -2050,7 +2058,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2050,7 +2058,7 @@ check_format_info_main (int *status, format_check_results *res,
if (fci->format_chars == 0) if (fci->format_chars == 0)
{ {
if (ISGRAPH(format_char)) if (ISGRAPH(format_char))
status_warning (status, "unknown conversion type character `%c' in format", status_warning (status, "unknown conversion type character %qc in format",
format_char); format_char);
else else
status_warning (status, "unknown conversion type character 0x%x in format", status_warning (status, "unknown conversion type character 0x%x in format",
...@@ -2060,7 +2068,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2060,7 +2068,7 @@ check_format_info_main (int *status, format_check_results *res,
if (pedantic) if (pedantic)
{ {
if (ADJ_STD (fci->std) > C_STD_VER) if (ADJ_STD (fci->std) > C_STD_VER)
status_warning (status, "%s does not support the `%%%c' %s format", status_warning (status, "%s does not support the %`%%%c%' %s format",
C_STD_NAME (fci->std), format_char, fki->name); C_STD_NAME (fci->std), format_char, fki->name);
} }
...@@ -2076,7 +2084,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2076,7 +2084,7 @@ check_format_info_main (int *status, format_check_results *res,
continue; continue;
if (strchr (fci->flag_chars, flag_chars[i]) == 0) if (strchr (fci->flag_chars, flag_chars[i]) == 0)
{ {
status_warning (status, "%s used with `%%%c' %s format", status_warning (status, "%s used with %`%%%c%' %s format",
_(s->name), format_char, fki->name); _(s->name), format_char, fki->name);
d++; d++;
continue; continue;
...@@ -2094,7 +2102,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2094,7 +2102,7 @@ check_format_info_main (int *status, format_check_results *res,
? t->long_name ? t->long_name
: s->long_name); : s->long_name);
if (ADJ_STD (t->std) > C_STD_VER) if (ADJ_STD (t->std) > C_STD_VER)
status_warning (status, "%s does not support %s with the `%%%c' %s format", status_warning (status, "%s does not support %s with the %`%%%c%' %s format",
C_STD_NAME (t->std), _(long_name), C_STD_NAME (t->std), _(long_name),
format_char, fki->name); format_char, fki->name);
} }
...@@ -2127,7 +2135,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2127,7 +2135,7 @@ check_format_info_main (int *status, format_check_results *res,
if (bad_flag_pairs[i].ignored) if (bad_flag_pairs[i].ignored)
{ {
if (bad_flag_pairs[i].predicate != 0) if (bad_flag_pairs[i].predicate != 0)
status_warning (status, "%s ignored with %s and `%%%c' %s format", status_warning (status, "%s ignored with %s and %`%%%c%' %s format",
_(s->name), _(t->name), format_char, _(s->name), _(t->name), format_char,
fki->name); fki->name);
else else
...@@ -2137,7 +2145,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2137,7 +2145,7 @@ check_format_info_main (int *status, format_check_results *res,
else else
{ {
if (bad_flag_pairs[i].predicate != 0) if (bad_flag_pairs[i].predicate != 0)
status_warning (status, "use of %s and %s together with `%%%c' %s format", status_warning (status, "use of %s and %s together with %`%%%c%' %s format",
_(s->name), _(t->name), format_char, _(s->name), _(t->name), format_char,
fki->name); fki->name);
else else
...@@ -2160,10 +2168,10 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2160,10 +2168,10 @@ check_format_info_main (int *status, format_check_results *res,
else if (strchr (fci->flags2, '2') != 0) else if (strchr (fci->flags2, '2') != 0)
y2k_level = 2; y2k_level = 2;
if (y2k_level == 3) if (y2k_level == 3)
status_warning (status, "`%%%c' yields only last 2 digits of year in some locales", status_warning (status, "%`%%%c%' yields only last 2 digits of year in some locales",
format_char); format_char);
else if (y2k_level == 2) else if (y2k_level == 2)
status_warning (status, "`%%%c' yields only last 2 digits of year", format_char); status_warning (status, "%`%%%c%' yields only last 2 digits of year", format_char);
} }
if (strchr (fci->flags2, '[') != 0) if (strchr (fci->flags2, '[') != 0)
...@@ -2179,7 +2187,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2179,7 +2187,7 @@ check_format_info_main (int *status, format_check_results *res,
++format_chars; ++format_chars;
if (*format_chars != ']') if (*format_chars != ']')
/* The end of the format string was reached. */ /* The end of the format string was reached. */
status_warning (status, "no closing `]' for `%%[' format"); status_warning (status, "no closing %`]%' for %`%%[%' format");
} }
wanted_type = 0; wanted_type = 0;
...@@ -2192,7 +2200,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2192,7 +2200,7 @@ check_format_info_main (int *status, format_check_results *res,
wanted_type_std = fci->types[length_chars_val].std; wanted_type_std = fci->types[length_chars_val].std;
if (wanted_type == 0) if (wanted_type == 0)
{ {
status_warning (status, "use of `%s' length modifier with `%c' type character", status_warning (status, "use of %qs length modifier with %qc type character",
length_chars, format_char); length_chars, format_char);
/* Heuristic: skip one argument when an invalid length/type /* Heuristic: skip one argument when an invalid length/type
combination is encountered. */ combination is encountered. */
...@@ -2213,7 +2221,7 @@ check_format_info_main (int *status, format_check_results *res, ...@@ -2213,7 +2221,7 @@ check_format_info_main (int *status, format_check_results *res,
&& ADJ_STD (wanted_type_std) > ADJ_STD (fci->std)) && ADJ_STD (wanted_type_std) > ADJ_STD (fci->std))
{ {
if (ADJ_STD (wanted_type_std) > C_STD_VER) if (ADJ_STD (wanted_type_std) > C_STD_VER)
status_warning (status, "%s does not support the `%%%s%c' %s format", status_warning (status, "%s does not support the %`%%%s%c%' %s format",
C_STD_NAME (wanted_type_std), length_chars, C_STD_NAME (wanted_type_std), length_chars,
format_char, fki->name); format_char, fki->name);
} }
......
/* Message translation utilities. /* Message translation utilities.
Copyright (C) 2001, 2003 Free Software Foundation, Inc. Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -24,6 +24,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -24,6 +24,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tm.h" #include "tm.h"
#include "intl.h" #include "intl.h"
#ifdef HAVE_LANGINFO_CODESET
#include <langinfo.h>
#endif
/* Opening quotation mark for diagnostics. */
const char *open_quote = "'";
/* Closing quotation mark for diagnostics. */
const char *close_quote = "'";
#ifdef ENABLE_NLS #ifdef ENABLE_NLS
/* Initialize the translation library for GCC. This performs the /* Initialize the translation library for GCC. This performs the
...@@ -43,6 +53,33 @@ gcc_init_libintl (void) ...@@ -43,6 +53,33 @@ gcc_init_libintl (void)
(void) bindtextdomain ("gcc", LOCALEDIR); (void) bindtextdomain ("gcc", LOCALEDIR);
(void) textdomain ("gcc"); (void) textdomain ("gcc");
/* Opening quotation mark. */
open_quote = _("`");
/* Closing quotation mark. */
close_quote = _("'");
if (!strcmp (open_quote, "`") && !strcmp (close_quote, "'"))
{
#if defined HAVE_LANGINFO_CODESET
const char *encoding;
#endif
/* Untranslated quotes that it may be possible to replace with
U+2018 and U+2019; but otherwise use "'" instead of "`" as
opening quote. */
open_quote = "'";
#if defined HAVE_LANGINFO_CODESET
encoding = nl_langinfo (CODESET);
if (encoding != NULL
&& (!strcasecmp (encoding, "utf-8")
|| !strcasecmp (encoding, "utf8")))
{
open_quote = "\xe2\x80\x98";
close_quote = "\xe2\x80\x99";
}
#endif
}
} }
#if defined HAVE_WCHAR_H && defined HAVE_WORKING_MBSTOWCS && defined HAVE_WCSWIDTH #if defined HAVE_WCHAR_H && defined HAVE_WORKING_MBSTOWCS && defined HAVE_WCSWIDTH
......
/* intl.h - internationalization /* intl.h - internationalization
Copyright 1998, 2001, 2003 Free Software Foundation, Inc. Copyright 1998, 2001, 2003, 2004 Free Software Foundation, Inc.
GCC is free software; you can redistribute it and/or modify GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -51,4 +51,7 @@ extern size_t gcc_gettext_width (const char *); ...@@ -51,4 +51,7 @@ extern size_t gcc_gettext_width (const char *);
# define N_(msgid) msgid # define N_(msgid) msgid
#endif #endif
extern const char *open_quote;
extern const char *close_quote;
#endif /* intl.h */ #endif /* intl.h */
...@@ -24,6 +24,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -24,6 +24,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#undef FFS /* Some systems define this in param.h. */ #undef FFS /* Some systems define this in param.h. */
#include "system.h" #include "system.h"
#include "coretypes.h" #include "coretypes.h"
#include "intl.h"
#include "pretty-print.h" #include "pretty-print.h"
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
...@@ -177,9 +178,12 @@ pp_base_indent (pretty_printer *pp) ...@@ -177,9 +178,12 @@ pp_base_indent (pretty_printer *pp)
%s: string. %s: string.
%p: pointer. %p: pointer.
%m: strerror(text->err_no) - does not consume a value from args_ptr. %m: strerror(text->err_no) - does not consume a value from args_ptr.
%%: `%'. %%: '%'.
%`: opening quote.
%': closing quote.
%.*s: a substring the length of which is specified by an integer. %.*s: a substring the length of which is specified by an integer.
%H: location_t. */ %H: location_t.
Flag 'q': quote formatted text (must come immediately after '%'). */
void void
pp_base_format_text (pretty_printer *pp, text_info *text) pp_base_format_text (pretty_printer *pp, text_info *text)
{ {
...@@ -187,6 +191,7 @@ pp_base_format_text (pretty_printer *pp, text_info *text) ...@@ -187,6 +191,7 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
{ {
int precision = 0; int precision = 0;
bool wide = false; bool wide = false;
bool quoted = false;
/* Ignore text. */ /* Ignore text. */
{ {
...@@ -200,8 +205,14 @@ pp_base_format_text (pretty_printer *pp, text_info *text) ...@@ -200,8 +205,14 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
if (*text->format_spec == '\0') if (*text->format_spec == '\0')
break; break;
/* We got a '%'. Parse precision modifiers, if any. */ /* We got a '%'. Check for 'q', then parse precision modifiers,
switch (*++text->format_spec) if any. */
if (*++text->format_spec == 'q')
{
quoted = true;
++text->format_spec;
}
switch (*text->format_spec)
{ {
case 'w': case 'w':
wide = true; wide = true;
...@@ -221,6 +232,8 @@ pp_base_format_text (pretty_printer *pp, text_info *text) ...@@ -221,6 +232,8 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
if (precision > 2) if (precision > 2)
abort(); abort();
if (quoted)
pp_string (pp, open_quote);
switch (*text->format_spec) switch (*text->format_spec)
{ {
case 'c': case 'c':
...@@ -279,6 +292,14 @@ pp_base_format_text (pretty_printer *pp, text_info *text) ...@@ -279,6 +292,14 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
pp_character (pp, '%'); pp_character (pp, '%');
break; break;
case '`':
pp_string (pp, open_quote);
break;
case '\'':
pp_string (pp, close_quote);
break;
case 'H': case 'H':
{ {
const location_t *locus = va_arg (*text->args_ptr, location_t *); const location_t *locus = va_arg (*text->args_ptr, location_t *);
...@@ -293,7 +314,7 @@ pp_base_format_text (pretty_printer *pp, text_info *text) ...@@ -293,7 +314,7 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
{ {
int n; int n;
const char *s; const char *s;
/* We handle no precision specifier but `%.*s'. */ /* We handle no precision specifier but '%.*s'. */
if (*++text->format_spec != '*') if (*++text->format_spec != '*')
abort (); abort ();
else if (*++text->format_spec != 's') else if (*++text->format_spec != 's')
...@@ -314,6 +335,8 @@ pp_base_format_text (pretty_printer *pp, text_info *text) ...@@ -314,6 +335,8 @@ pp_base_format_text (pretty_printer *pp, text_info *text)
abort (); abort ();
} }
} }
if (quoted)
pp_string (pp, close_quote);
} }
} }
......
...@@ -49,7 +49,7 @@ extern void _fatal_insn (const char *, rtx, const char *, int, const char *) ...@@ -49,7 +49,7 @@ extern void _fatal_insn (const char *, rtx, const char *, int, const char *)
/* None of these functions are suitable for ATTRIBUTE_PRINTF, because /* None of these functions are suitable for ATTRIBUTE_PRINTF, because
each language front end can extend them with its own set of format each language front end can extend them with its own set of format
specifiers. We must use custom format checks. */ specifiers. We must use custom format checks. */
#if GCC_VERSION >= 3004 #if GCC_VERSION >= 3005
#define ATTRIBUTE_GCC_DIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m) #define ATTRIBUTE_GCC_DIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m)
#else #else
#define ATTRIBUTE_GCC_DIAG(m, n) ATTRIBUTE_NONNULL(m) #define ATTRIBUTE_GCC_DIAG(m, n) ATTRIBUTE_NONNULL(m)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment