From: Ulya Trofimovich Date: Thu, 30 Aug 2018 21:38:42 +0000 (+0100) Subject: Rewrote version-to-vernum converter in RE2C; added more unit tests. X-Git-Tag: 1.1.1~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9227fb189091ea6f7aebbaa1528d75d6c59b52b0;p=re2c Rewrote version-to-vernum converter in RE2C; added more unit tests. --- diff --git a/re2c/Makefile.am b/re2c/Makefile.am index b6fceace..73da515d 100644 --- a/re2c/Makefile.am +++ b/re2c/Makefile.am @@ -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 index 00000000..0e67d1c4 --- /dev/null +++ b/re2c/bootstrap/src/conf/ver_to_vernum.cc @@ -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 + +#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 diff --git a/re2c/src/conf/msg.cc b/re2c/src/conf/msg.cc index 4d5fd64b..b21e4ffc 100644 --- a/re2c/src/conf/msg.cc +++ b/re2c/src/conf/msg.cc @@ -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 index 6d0f6755..00000000 --- a/re2c/src/conf/ver_to_vernum.cc +++ /dev/null @@ -1,29 +0,0 @@ -#include /* fprintf() */ -#include - -#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 diff --git a/re2c/src/conf/ver_to_vernum.h b/re2c/src/conf/ver_to_vernum.h index 43bac2b5..00e8ecb8 100644 --- a/re2c/src/conf/ver_to_vernum.h +++ b/re2c/src/conf/ver_to_vernum.h @@ -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 index 00000000..e8ad32f9 --- /dev/null +++ b/re2c/src/conf/ver_to_vernum.re @@ -0,0 +1,54 @@ +#include "src/util/c99_stdint.h" +#include + +#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 diff --git a/re2c/src/test/ver_to_vernum/test.cc b/re2c/src/test/ver_to_vernum/test.cc index 9e0ee3b4..f24a2742 100644 --- a/re2c/src/test/ver_to_vernum/test.cc +++ b/re2c/src/test/ver_to_vernum/test.cc @@ -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()); + } } }