]> granicus.if.org Git - re2c/commitdiff
Rewrote version-to-vernum converter in RE2C; added more unit tests.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 30 Aug 2018 21:38:42 +0000 (22:38 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 30 Aug 2018 21:38:42 +0000 (22:38 +0100)
re2c/Makefile.am
re2c/bootstrap/src/conf/ver_to_vernum.cc [new file with mode: 0644]
re2c/src/conf/msg.cc
re2c/src/conf/ver_to_vernum.cc [deleted file]
re2c/src/conf/ver_to_vernum.h
re2c/src/conf/ver_to_vernum.re [new file with mode: 0644]
re2c/src/test/ver_to_vernum/test.cc

index b6fceace746ab42e8c91f877726f13cb6d9f4b17..73da515dc5e2cdd5ef11b8f5625a3111b7b24fb8 100644 (file)
@@ -84,7 +84,6 @@ SRC = \
        src/code/print.cc \
        src/conf/msg.cc \
        src/conf/opt.cc \
-       src/conf/ver_to_vernum.cc \
        src/conf/warn.cc \
        src/nfa/dump.cc \
        src/nfa/estimate_size.cc \
@@ -155,6 +154,7 @@ re2c_SOURCES = \
 AUTOGEN_LEX = src/ast/lex.cc
 AUTOGEN_LEX_CONF = src/ast/lex_conf.cc
 AUTOGEN_PARSEOPT = src/conf/parse_opts.cc
+AUTOGEN_VERTOVERNUM = src/conf/ver_to_vernum.cc
 AUTOGEN_PARSER = src/ast/parser.cc
 AUTOGEN_PARSER_HDR = src/ast/y.tab.h
 AUTOGEN_HELP = src/conf/help.cc
@@ -164,6 +164,7 @@ AUTOGEN = \
        $(AUTOGEN_PARSER) \
        $(AUTOGEN_PARSER_HDR) \
        $(AUTOGEN_PARSEOPT)\
+       $(AUTOGEN_VERTOVERNUM)\
        $(AUTOGEN_HELP)
 nodist_re2c_SOURCES = $(AUTOGEN)
 
@@ -171,6 +172,7 @@ nodist_re2c_SOURCES = $(AUTOGEN)
 BOOTSTRAP_LEX = bootstrap/src/ast/lex.cc
 BOOTSTRAP_LEX_CONF = bootstrap/src/ast/lex_conf.cc
 BOOTSTRAP_PARSEOPT = bootstrap/src/conf/parse_opts.cc
+BOOTSTRAP_VERTOVERNUM = bootstrap/src/conf/ver_to_vernum.cc
 BOOTSTRAP_PARSER = bootstrap/src/ast/parser.cc
 BOOTSTRAP_PARSER_HDR = bootstrap/src/ast/y.tab.h
 BOOTSTRAP_DOC = bootstrap/doc/re2c.1
@@ -182,12 +184,14 @@ BOOTSTRAP = \
        $(BOOTSTRAP_HELP) \
        $(BOOTSTRAP_PARSER) \
        $(BOOTSTRAP_PARSER_HDR) \
-       $(BOOTSTRAP_PARSEOPT)
+       $(BOOTSTRAP_PARSEOPT) \
+       $(BOOTSTRAP_VERTOVERNUM)
 
 # custom sources
 CUSTOM_LEX = src/ast/lex.re
 CUSTOM_LEX_CONF = src/ast/lex_conf.re
 CUSTOM_PARSEOPT = src/conf/parse_opts.re
+CUSTOM_VERTOVERNUM = src/conf/ver_to_vernum.re
 CUSTOM_PARSER = src/ast/parser.ypp
 CUSTOM_HELP = doc/help.rst
 CUSTOM = \
@@ -195,6 +199,7 @@ CUSTOM = \
        $(CUSTOM_LEX_CONF) \
        $(CUSTOM_PARSER) \
        $(CUSTOM_PARSEOPT) \
+       $(CUSTOM_VERTOVERNUM) \
        $(CUSTOM_HELP)
 
 # docs
@@ -331,14 +336,14 @@ testston32unsafe_SOURCES = \
        src/test/s_to_n32_unsafe/test.cc \
        src/util/s_to_n32_unsafe.cc
 
-TST_VER_TO_VERNUM = testvertovernum
+TST_VERTOVERNUM = testvertovernum
 testvertovernum_SOURCES = \
        src/test/ver_to_vernum/test.cc \
-       src/conf/ver_to_vernum.cc
+       $(AUTOGEN_VERTOVERNUM)
 
 check_PROGRAMS = \
        $(TST_RANGE) \
        $(TST_S_TO_N32_UNSAFE) \
-       $(TST_VER_TO_VERNUM)
+       $(TST_VERTOVERNUM)
 
 TESTS = $(TST_SUITE) $(check_PROGRAMS)
diff --git a/re2c/bootstrap/src/conf/ver_to_vernum.cc b/re2c/bootstrap/src/conf/ver_to_vernum.cc
new file mode 100644 (file)
index 0000000..0e67d1c
--- /dev/null
@@ -0,0 +1,245 @@
+/* Generated by re2c 1.1 on Thu Aug 30 22:35:53 2018 */
+#line 1 "../src/conf/ver_to_vernum.re"
+#include "src/util/c99_stdint.h"
+#include <string>
+
+#include "config.h"
+#include "src/conf/ver_to_vernum.h"
+
+namespace re2c {
+
+std::string ver_to_vernum(const char *ver)
+{
+#define YYCTYPE char
+    const char *YYCURSOR = ver, *YYMARKER,
+        *p1, *p2, *p3, *e1, *e2, *e3;
+
+#line 15 "../src/conf/ver_to_vernum.re"
+
+const char *yyt1;
+const char *yyt2;
+const char *yyt3;
+const char *yyt4;
+const char *yyt5;
+const char *yyt6;
+
+
+#line 28 "src/conf/ver_to_vernum.cc"
+{
+       YYCTYPE yych;
+       static const unsigned char yybm[] = {
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+                 0,   0,   0,   0,   0,   0,   0,   0, 
+       };
+       yych = *YYCURSOR;
+       if (yych <= '/') goto yy2;
+       if (yych <= '9') {
+               yyt1 = YYCURSOR;
+               goto yy4;
+       }
+yy2:
+       ++YYCURSOR;
+yy3:
+#line 49 "../src/conf/ver_to_vernum.re"
+       { return std::string(); }
+#line 76 "src/conf/ver_to_vernum.cc"
+yy4:
+       yych = *(YYMARKER = ++YYCURSOR);
+       if (yych <= '.') {
+               if (yych <= 0x00) {
+                       yyt3 = yyt4 = yyt5 = yyt6 = NULL;
+                       yyt2 = YYCURSOR;
+                       goto yy5;
+               }
+               if (yych <= '-') goto yy3;
+               yyt3 = yyt4 = yyt5 = yyt6 = NULL;
+               yyt2 = YYCURSOR;
+               goto yy7;
+       } else {
+               if (yych <= '/') goto yy3;
+               if (yych <= '9') goto yy9;
+               goto yy3;
+       }
+yy5:
+       ++YYCURSOR;
+       p1 = yyt1;
+       e1 = yyt2;
+       p2 = yyt3;
+       e2 = yyt4;
+       p3 = yyt5;
+       e3 = yyt6;
+#line 31 "../src/conf/ver_to_vernum.re"
+       {
+
+        static const uint32_t PARTS = 3, WIDTH = 2, SIZE = PARTS * WIDTH;
+        char buffer[SIZE], *q, *q0;
+        const char * bounds[] = {p1, e1, p2, e2, p3, e3}, *p, *p0;
+
+        for (uint32_t i = 0; i < PARTS; ++i) {
+            q0 = buffer + 2 * i;
+            q  = buffer + 2 * (i + 1);
+            p0 = bounds[2 * i];
+            p  = bounds[2 * i + 1];
+            while (p > p0) *--q = *--p;
+            while (q > q0) *--q = '0';
+        }
+
+        return std::string(buffer, SIZE);
+    }
+#line 120 "src/conf/ver_to_vernum.cc"
+yy7:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) goto yy8;
+       if (yych <= '/') goto yy12;
+       if (yych <= '9') {
+               yyt3 = YYCURSOR;
+               goto yy10;
+       }
+       goto yy12;
+yy8:
+       YYCURSOR = YYMARKER;
+       goto yy3;
+yy9:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) {
+               yyt3 = yyt4 = yyt5 = yyt6 = NULL;
+               yyt2 = YYCURSOR;
+               goto yy5;
+       }
+       if (yych == '.') {
+               yyt3 = yyt4 = yyt5 = yyt6 = NULL;
+               yyt2 = YYCURSOR;
+               goto yy7;
+       }
+       goto yy8;
+yy10:
+       yych = *++YYCURSOR;
+       if (yych <= '.') {
+               if (yych <= 0x00) {
+                       yyt5 = yyt6 = NULL;
+                       yyt4 = YYCURSOR;
+                       goto yy5;
+               }
+               if (yych <= '-') goto yy8;
+               yyt5 = yyt6 = NULL;
+               yyt4 = YYCURSOR;
+               goto yy13;
+       } else {
+               if (yych <= '/') goto yy8;
+               if (yych <= '9') goto yy14;
+               goto yy8;
+       }
+yy11:
+       yych = *++YYCURSOR;
+yy12:
+       if (yybm[0+yych] & 128) {
+               goto yy11;
+       }
+       if (yych <= 0x00) goto yy5;
+       goto yy8;
+yy13:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) goto yy8;
+       if (yych <= '/') goto yy12;
+       if (yych <= '9') {
+               yyt5 = YYCURSOR;
+               goto yy15;
+       }
+       goto yy12;
+yy14:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) {
+               yyt5 = yyt6 = NULL;
+               yyt4 = YYCURSOR;
+               goto yy5;
+       }
+       if (yych == '.') {
+               yyt5 = yyt6 = NULL;
+               yyt4 = YYCURSOR;
+               goto yy13;
+       }
+       goto yy8;
+yy15:
+       yych = *++YYCURSOR;
+       if (yych <= '.') {
+               if (yych <= 0x00) {
+                       yyt6 = YYCURSOR;
+                       goto yy5;
+               }
+               if (yych <= '-') goto yy8;
+               yyt6 = YYCURSOR;
+       } else {
+               if (yych <= '/') goto yy8;
+               if (yych <= '9') goto yy17;
+               goto yy8;
+       }
+yy16:
+       yych = *++YYCURSOR;
+       if (yybm[0+yych] & 128) {
+               goto yy11;
+       }
+       if (yych <= '/') goto yy8;
+       if (yych <= '9') goto yy18;
+       goto yy8;
+yy17:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) {
+               yyt6 = YYCURSOR;
+               goto yy5;
+       }
+       if (yych == '.') {
+               yyt6 = YYCURSOR;
+               goto yy16;
+       }
+       goto yy8;
+yy18:
+       yych = *++YYCURSOR;
+       if (yych <= '.') {
+               if (yych <= 0x00) goto yy5;
+               if (yych <= '-') goto yy8;
+               goto yy16;
+       } else {
+               if (yych <= '/') goto yy8;
+               if (yych >= ':') goto yy8;
+       }
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) goto yy5;
+       if (yych == '.') goto yy16;
+       goto yy8;
+}
+#line 50 "../src/conf/ver_to_vernum.re"
+
+#undef YYCTYPE
+}
+
+} // namespace re2c
index 4d5fd64b6da277e217382cb1645842ea98db262c..b21e4ffc669deb5b1558d6c9f48e798425a0f2be 100644 (file)
@@ -102,7 +102,12 @@ void usage()
 
 void vernum ()
 {
-    printf ("%s\n", ver_to_vernum(PACKAGE_VERSION).c_str ());
+    const std::string vn = ver_to_vernum(PACKAGE_VERSION);
+    if (vn.empty()) {
+        error("failed to convert version to vernum");
+        exit(1);
+    }
+    printf ("%s\n", vn.c_str ());
 }
 
 void version ()
diff --git a/re2c/src/conf/ver_to_vernum.cc b/re2c/src/conf/ver_to_vernum.cc
deleted file mode 100644 (file)
index 6d0f675..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdio.h> /* fprintf() */
-#include <string>
-
-#include "config.h"
-#include "src/conf/ver_to_vernum.h"
-
-namespace re2c {
-
-std::string ver_to_vernum(const std::string & ver)
-{
-    std::string parts[3];
-    unsigned p = 0;
-
-    for (unsigned i = 0; p < 3 && i < ver.length (); i++)
-    {
-        if (ver[i] == '.')
-            p++;
-        else
-            parts[p].push_back (ver[i]);
-    }
-
-    for (p = 0; p < 3; p++)
-        while (parts[p].length () < 2)
-            parts[p].insert (0, 1, '0');
-
-    return parts[0] + parts[1] + parts[2];
-}
-
-} // namespace re2c
index 43bac2b56ce3b950c72aac89221cbd33256cc14e..00e8ecb863af1e4bf36ed133d85ee589e4922d78 100644 (file)
@@ -5,7 +5,7 @@
 
 namespace re2c {
 
-std::string ver_to_vernum(const std::string & ver);
+std::string ver_to_vernum(const char *ver);
 
 } // namespace re2c
 
diff --git a/re2c/src/conf/ver_to_vernum.re b/re2c/src/conf/ver_to_vernum.re
new file mode 100644 (file)
index 0000000..e8ad32f
--- /dev/null
@@ -0,0 +1,54 @@
+#include "src/util/c99_stdint.h"
+#include <string>
+
+#include "config.h"
+#include "src/conf/ver_to_vernum.h"
+
+namespace re2c {
+
+std::string ver_to_vernum(const char *ver)
+{
+#define YYCTYPE char
+    const char *YYCURSOR = ver, *YYMARKER,
+        *p1, *p2, *p3, *e1, *e2, *e3;
+
+/*!re2c re2c:flags:tags = 1; */
+/*!stags:re2c format = "const char *@@;\n"; */
+/*!re2c
+    re2c:yyfill:enable = 0;
+
+    dot = [.];
+    num = [0-9]{1,2};
+    end = [\x00];
+    sfx = [a-z]+;
+
+    @p1 num @e1
+        (dot @p2 num @e2
+            (dot @p3 num @e3
+                (dot num)*
+            )?
+        )?
+    (dot sfx)? end {
+
+        static const uint32_t PARTS = 3, WIDTH = 2, SIZE = PARTS * WIDTH;
+        char buffer[SIZE], *q, *q0;
+        const char * bounds[] = {p1, e1, p2, e2, p3, e3}, *p, *p0;
+
+        for (uint32_t i = 0; i < PARTS; ++i) {
+            q0 = buffer + 2 * i;
+            q  = buffer + 2 * (i + 1);
+            p0 = bounds[2 * i];
+            p  = bounds[2 * i + 1];
+            while (p > p0) *--q = *--p;
+            while (q > q0) *--q = '0';
+        }
+
+        return std::string(buffer, SIZE);
+    }
+
+    * { return std::string(); }
+*/
+#undef YYCTYPE
+}
+
+} // namespace re2c
index 9e0ee3b4743c5fe66131a46b665e18f97c2eb161..f24a274247edaf83d67f6418d98ec0207cd503da 100644 (file)
@@ -11,34 +11,122 @@ struct examples_t {
 
 static const examples_t EXAMPLES[] =
 {
-    { "0.14",      "001400", },
-    { "0.14.1",    "001401", },
-    { "1",         "010000", },
-    { "1.1",       "010100", },
-    // Those used to exist. Should be supported?
-    //{ "1.1.dev",   "010100", },
-    { "1.1.1",     "010101", },
-    { "1.1.1.1",   "010101", },
+    { "",            "", },
+    { "1",           "010000", },
+    { "1.1",         "010100", },
+    { "1.1",         "010100", },
+    { "1.1.1",       "010101", },
+    { "1.1.1.1",     "010101", },
+    { "12",          "120000", },
+    { "1.12",        "011200", },
+    { "12.1",        "120100", },
+    { "1.1.12",      "010112", },
+    { "1.12.1",      "011201", },
+    { "12.1.1",      "120101", },
+    { "1.1.1.12",    "010101", },
+    { "1.1.12.1",    "010112", },
+    { "1.12.1.1",    "011201", },
+    { "12.1.1.1",    "120101", },
+
+    // more than 2-digit components not supported
+    { "123",         "", },
+    { "1.123",       "", },
+    { "123.1",       "", },
+    { "1.1.123",     "", },
+    { "1.123.1",     "", },
+    { "123.1.1",     "", },
+    { "1.1.1.123",   "", },
+    { "1.1.123.1",   "", },
+    { "1.123.1.1",   "", },
+    { "123.1.1.1",   "", },
+
+    // occasional versions with suffix
+    { "dev",         "", },
+    { "1.dev",       "010000", },
+    { "1.1.dev",     "010100", },
+    { "1.1.1.dev",   "010101", },
+    { "1.1.1.1.dev", "010101", },
+
+    // old re2c versions
+    { "1.1",      "010100" },
+    { "1.0.3",    "010003" },
+    { "1.0.2",    "010002" },
+    { "1.0.1",    "010001" },
+    { "1.0",      "010000" },
+    { "0.16",     "001600" },
+    { "0.15.3",   "001503" },
+    { "0.15.2",   "001502" },
+    { "0.15.1",   "001501" },
+    { "0.15",     "001500" },
+    { "0.14.3",   "001403" },
+    { "0.14.2",   "001402" },
+    { "0.14.1",   "001401" },
+    { "0.14",     "001400" },
+    { "0.13.7.5", "001307" },
+    { "0.13.7.4", "001307" },
+    { "0.13.7.3", "001307" },
+    { "0.13.7.2", "001307" },
+    { "0.13.7.1", "001307" },
+    { "0.13.7",   "001307" },
+    { "0.13.6",   "001306" },
+    { "0.13.5",   "001305" },
+    { "0.13.4",   "001304" },
+    { "0.13.3",   "001303" },
+    { "0.13.2",   "001302" },
+    { "0.13.1",   "001301" },
+    { "0.13.0",   "001300" },
+    { "0.12.3",   "001203" },
+    { "0.12.2",   "001202" },
+    { "0.12.1",   "001201" },
+    { "0.12.0",   "001200" },
+    { "0.11.3",   "001103" },
+    { "0.11.2",   "001102" },
+    { "0.11.1",   "001101" },
+    { "0.11.0",   "001100" },
+    { "0.10.8",   "001008" },
+    { "0.10.7",   "001007" },
+    { "0.10.6",   "001006" },
+    { "0.10.5",   "001005" },
+    { "0.10.4",   "001004" },
+    { "0.10.3",   "001003" },
+    { "0.10.2",   "001002" },
+    { "0.10.1",   "001001" },
+    { "0.10.0",   "001000" },
+    { "0.9.12",   "000912" },
+    { "0.9.11",   "000911" },
+    { "0.9.10",   "000910" },
+    { "0.9.9",    "000909" },
+    { "0.9.8",    "000908" },
+    { "0.9.7",    "000907" },
+    { "0.9.6",    "000906" },
+    { "0.9.5",    "000905" },
+    { "0.9.4",    "000904" },
+    { "0.9.3",    "000903" },
+    { "0.9.2",    "000902" },
+    { "0.9.1",    "000901" }
 };
 
 int test ()
 {
     int failures = 0;
 
-    for (size_t i = 0; i < sizeof (EXAMPLES) / sizeof (EXAMPLES[0]); ++i)
-    {
+    for (size_t i = 0; i < sizeof (EXAMPLES) / sizeof (EXAMPLES[0]); ++i) {
         const examples_t & e = EXAMPLES[i];
 
-        std::string got = re2c::ver_to_vernum (e.in);
-        if (got != e.expected)
-        {
-            ++failures;
-            fprintf (stderr, "FAIL: re2c::ver_to_vernum('%s') = '%s', expected '%s'\n",
-                     e.in.c_str(), got.c_str(), e.expected.c_str());
+        const std::string got = re2c::ver_to_vernum(e.in.c_str());
+        if (got == e.expected) {
+            fprintf (stderr, "PASS: re2c::ver_to_vernum('%s') = '%s'\n", e.in.c_str(), got.c_str());
         }
-        else
-        {
-            fprintf (stderr, "PASS: re2c::ver_to_vernum('%s') = '%s\n", e.in.c_str(), got.c_str());
+        else {
+            ++failures;
+            if (got.empty()) {
+                fprintf (stderr, "FAIL: re2c::ver_to_vernum('%s') returned error\n",
+                    e.in.c_str());
+            }
+            else {
+                fprintf (stderr, "FAIL: re2c::ver_to_vernum('%s') = '%s', expected '%s'\n",
+                    e.in.c_str(), got.c_str(), e.expected.c_str());
+            }
         }
     }