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.
......
/* 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