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 \
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
$(AUTOGEN_PARSER) \
$(AUTOGEN_PARSER_HDR) \
$(AUTOGEN_PARSEOPT)\
+ $(AUTOGEN_VERTOVERNUM)\
$(AUTOGEN_HELP)
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
$(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 = \
$(CUSTOM_LEX_CONF) \
$(CUSTOM_PARSER) \
$(CUSTOM_PARSEOPT) \
+ $(CUSTOM_VERTOVERNUM) \
$(CUSTOM_HELP)
# docs
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)
--- /dev/null
+/* 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
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 ()
+++ /dev/null
-#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
namespace re2c {
-std::string ver_to_vernum(const std::string & ver);
+std::string ver_to_vernum(const char *ver);
} // namespace re2c
--- /dev/null
+#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
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());
+ }
}
}