]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Add support for new C++ preprocessing number tokens.
authorBruno Haible <bruno@clisp.org>
Sat, 6 Jan 2018 17:45:22 +0000 (18:45 +0100)
committerBruno Haible <bruno@clisp.org>
Sat, 6 Jan 2018 17:47:41 +0000 (18:47 +0100)
Reported by Moritz Bunkus <moritz@bunkus.org>
at <https://savannah.gnu.org/bugs/?50117>.

* gettext-tools/src/x-c.c (phase5_get): Recognize C++14 and C++17 extensions of
preprocessing number tokens.
* gettext-tools/tests/xgettext-c-22: New file.
* gettext-tools/tests/Makefile.am (TESTS): Add it.
* NEWS: Mention the change.

NEWS
gettext-tools/src/x-c.c
gettext-tools/tests/Makefile.am
gettext-tools/tests/xgettext-c-22 [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index ffbb141c16ddd68321546182e3031d8d95f8d4e1..bdfb2689e4980cbc21c4f98000a4662a3a5378c8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,8 +2,11 @@
   - update-po target in Makefile.in.in now uses msgfmt --previous.
 
 * Programming languages support:
+  - C++:
+    xgettext now supports single-quotes and 'p'/'P' exponent markers in
+    number tokens, as specified in C++14 and C++17, respectively.
   - Java:
-    xgettext now support UTF-8 encoded .properties files (a new feature
+    xgettext now supports UTF-8 encoded .properties files (a new feature
     of Java 9).
   - Perl:
     o Native support for context functions (pgettext, dpgettext, dcpgettext,
index 1844a5df707f7c7e508f1d1f04b5a275206c6494..8debf01cf913104703e293bd85b2b37a695b22a2 100644 (file)
@@ -1,5 +1,5 @@
 /* xgettext C/C++/ObjectiveC backend.
-   Copyright (C) 1995-1998, 2000-2009, 2012, 2015-2016 Free Software
+   Copyright (C) 1995-1998, 2000-2009, 2012, 2015-2016, 2018 Free Software
    Foundation, Inc.
 
    This file was written by Peter Miller <millerp@canb.auug.org.au>
@@ -1402,6 +1402,12 @@ phase5_get (token_ty *tp)
           c = phase4_getc ();
           switch (c)
             {
+            case 'p':
+            case 'P':
+              if (!cxx_extensions)
+                continue;
+              /* In C++17, 'p' and 'P' can be used as an exponent marker.  */
+              /* FALLTHROUGH */
             case 'e':
             case 'E':
               if (bufpos >= bufmax)
@@ -1420,12 +1426,12 @@ phase5_get (token_ty *tp)
 
             case 'A': case 'B': case 'C': case 'D':           case 'F':
             case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
-            case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+            case 'M': case 'N': case 'O':           case 'Q': case 'R':
             case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
             case 'Y': case 'Z':
             case 'a': case 'b': case 'c': case 'd':           case 'f':
             case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
-            case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+            case 'm': case 'n': case 'o':           case 'q': case 'r':
             case 's': case 't': case 'u': case 'v': case 'w': case 'x':
             case 'y': case 'z':
             case '0': case '1': case '2': case '3': case '4':
@@ -1433,6 +1439,45 @@ phase5_get (token_ty *tp)
             case '.':
               continue;
 
+            case '\'':
+              if (cxx_extensions)
+                {
+                  /* In C++14, a single-quote followed by a digit, ASCII letter,
+                     or underscore can be part of a preprocessing number token.  */
+                  int c1 = phase4_getc ();
+                  switch (c1)
+                    {
+                    case '0': case '1': case '2': case '3': case '4':
+                    case '5': case '6': case '7': case '8': case '9':
+                    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+                    case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+                    case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+                    case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+                    case 'Y': case 'Z':
+                    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+                    case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+                    case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+                    case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+                    case 'y': case 'z':
+                    case '_':
+                      if (bufpos >= bufmax)
+                        {
+                          bufmax = 2 * bufmax + 10;
+                          buffer = xrealloc (buffer, bufmax);
+                        }
+                      buffer[bufpos++] = c;
+                      c = c1;
+                      continue;
+                    default:
+                      /* The two phase4_getc() calls that returned c and c1 did
+                         nothing more than to call phase3_getc(), without any
+                         lookahead.  Therefore 2 pushback characters are
+                         supported in this case.  */
+                      phase4_ungetc (c1);
+                      break;
+                    }
+                }
+              /* FALLTHROUGH */
             default:
               phase4_ungetc (c);
               break;
index 75542358ee99fb2a95a7e9803c1b817802a70128..720268a2ebbd00a8ece5682fae61651cb2846630 100644 (file)
@@ -80,7 +80,7 @@ TESTS = gettext-1 gettext-2 gettext-3 gettext-4 gettext-5 gettext-6 gettext-7 \
        xgettext-c-6 xgettext-c-7 xgettext-c-8 xgettext-c-9 xgettext-c-10 \
        xgettext-c-11 xgettext-c-12 xgettext-c-13 xgettext-c-14 xgettext-c-15 \
        xgettext-c-16 xgettext-c-17 xgettext-c-18 xgettext-c-19 xgettext-c-20 \
-       xgettext-c-21 \
+       xgettext-c-21 xgettext-c-22 \
        xgettext-csharp-1 xgettext-csharp-2 xgettext-csharp-3 \
        xgettext-csharp-4 xgettext-csharp-5 xgettext-csharp-6 \
        xgettext-csharp-7 xgettext-csharp-8 \
diff --git a/gettext-tools/tests/xgettext-c-22 b/gettext-tools/tests/xgettext-c-22
new file mode 100644 (file)
index 0000000..566800b
--- /dev/null
@@ -0,0 +1,22 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test C++ support: C++14 preprocessing number tokens.
+
+: ${XGETTEXT=xgettext}
+
+cat <<\EOF > xg-c-22.cc
+auto i = 1'234; gettext ("hello");
+EOF
+
+: ${XGETTEXT=xgettext}
+${XGETTEXT} --omit-header --no-location -d xg-c-22.tmp xg-c-22.cc || Exit 1
+LC_ALL=C tr -d '\r' < xg-c-22.tmp.po > xg-c-22.po || Exit 1
+
+cat <<\EOF > xg-c-22.ok
+msgid "hello"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-c-22.ok xg-c-22.po || Exit 1