+2015-01-13 Daiki Ueno <ueno@gnu.org>
+
+ c++: Differentiate scanning logic from C
+ To enable raw string literals only in C++, add a flag indicating
+ the current source language is C++.
+ Suggested by Vaclav Slavik at:
+ <https://savannah.gnu.org/bugs/?43970>.
+ * x-c.h (extract_cxx): New declaration.
+ (SCANNERS_C): Use extract_cxx for "C++".
+ * x-c.c (cxx_extensions): New variable.
+ (phase5_get): Respect cxx_extensions and recognize raw string
+ literals only when it is set.
+ (extract_cxx): New function.
+ (extract_c, extract_objc): Reset cxx_extensions.
+
2014-12-24 Daiki Ueno <ueno@gnu.org>
* gettext 0.19.4 released.
/* True if ObjectiveC extensions are recognized. */
static bool objc_extensions;
+/* True if C++ extensions are recognized. */
+static bool cxx_extensions;
+
enum token_type_ty
{
token_type_character_constant, /* 'x' */
int bufpos;
int c;
int last_was_backslash;
- bool raw_expected = false;
+ bool raw_expected;
if (phase5_pushback_length)
{
continue;
default:
- /* Recognize C++ string literals prefixed by R, u8, u8R,
- u, uR, U, UR, L, or LR. It is defined in ISO/IEC
- 9899:2011 2.14.5. Since gettext's argument is a byte
- sequence, we are only interested in u8, R, and u8R. */
+ /* Recognize string literals prefixed by R, u8, u8R, u,
+ uR, U, UR, L, or LR. It is defined in the C standard
+ ISO/IEC 9899:201x and the C++ standard ISO/IEC
+ 14882:2011. The raw string literals prefixed by R,
+ u8R, uR, UR, or LR are only valid in C++.
+
+ Since gettext's argument is a byte sequence, we are
+ only interested in u8, R, and u8R. */
if (c == '"')
{
bool is_prefix = false;
switch (buffer[0])
{
case 'R':
- if (bufpos == 1)
- is_prefix = true;
+ if (cxx_extensions && bufpos == 1)
+ {
+ is_prefix = true;
+ raw_expected = true;
+ }
break;
case 'u':
if (bufpos == 1)
- is_prefix = true;
+ {
+ is_prefix = true;
+ raw_expected = false;
+ }
else
switch (buffer[1])
{
case 'R':
- if (bufpos == 2)
- is_prefix = true;
+ if (cxx_extensions && bufpos == 2)
+ {
+ is_prefix = true;
+ raw_expected = true;
+ }
break;
case '8':
- if (bufpos == 2
- || (bufpos == 3 && buffer[2] == 'R'))
- is_prefix = true;
+ if (bufpos == 2)
+ {
+ is_prefix = true;
+ raw_expected = false;
+ }
+ else if (cxx_extensions
+ && bufpos == 3 && buffer[2] == 'R')
+ {
+ is_prefix = true;
+ raw_expected = true;
+ }
break;
}
break;
case 'U':
case 'L':
- if (bufpos == 1
- || (bufpos == 2 && buffer[1] == 'R'))
- is_prefix = true;
+ if (bufpos == 1)
+ {
+ is_prefix = true;
+ raw_expected = false;
+ }
+ else if (cxx_extensions
+ && bufpos == 2 && buffer[1] == 'R')
+ {
+ is_prefix = true;
+ raw_expected = true;
+ }
break;
}
if (is_prefix)
{
- raw_expected = buffer[bufpos - 1] == 'R';
bufpos = 0;
goto string;
}
msgdomain_list_ty *mdlp)
{
objc_extensions = false;
+ cxx_extensions = false;
+ extract_whole_file (f, real_filename, logical_filename, flag_table, mdlp);
+}
+
+void
+extract_cxx (FILE *f,
+ const char *real_filename, const char *logical_filename,
+ flag_context_list_table_ty *flag_table,
+ msgdomain_list_ty *mdlp)
+{
+ objc_extensions = false;
+ cxx_extensions = true;
extract_whole_file (f, real_filename, logical_filename, flag_table, mdlp);
}
msgdomain_list_ty *mdlp)
{
objc_extensions = true;
+ cxx_extensions = false;
extract_whole_file (f, real_filename, logical_filename, flag_table, mdlp);
}
&flag_table_c, \
&formatstring_c, NULL, \
&literalstring_c }, \
- { "C++", extract_c, \
+ { "C++", extract_cxx, \
&flag_table_c, \
&formatstring_c, NULL, \
&literalstring_c }, \
&formatstring_gcc_internal, &formatstring_gfc_internal, \
&literalstring_c }, \
-/* Scan a C/C++ file and add its translatable strings to mdlp. */
+/* Scan a C file and add its translatable strings to mdlp. */
extern void extract_c (FILE *fp, const char *real_filename,
const char *logical_filename,
flag_context_list_table_ty *flag_table,
msgdomain_list_ty *mdlp);
+/* Scan a C++ file and add its translatable strings to mdlp. */
+extern void extract_cxx (FILE *fp, const char *real_filename,
+ const char *logical_filename,
+ flag_context_list_table_ty *flag_table,
+ msgdomain_list_ty *mdlp);
/* Scan an ObjectiveC file and add its translatable strings to mdlp. */
extern void extract_objc (FILE *fp, const char *real_filename,
const char *logical_filename,