summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2020-11-11 08:19:31 +0100
committerAkim Demaille <akim.demaille@gmail.com>2020-11-11 08:47:23 +0100
commitd8b49e2b7360aa805297e110e9adb4c0b7f2f956 (patch)
tree7c8bcd712adadbf7ca3040ced07eb8d165929c8c
parent14c65a35f085acf2ae62bec29208f8de33aad66d (diff)
downloadbison-d8b49e2b7360aa805297e110e9adb4c0b7f2f956.tar.gz
style: make conversion of version string to int public
* src/parse-gram.y (str_to_version): Rename as/move to... * src/strversion.h, src/strversion.c (strversion_to_int): these new files.
-rw-r--r--src/local.mk2
-rw-r--r--src/parse-gram.y50
-rw-r--r--src/strversion.c67
-rw-r--r--src/strversion.h28
4 files changed, 99 insertions, 48 deletions
diff --git a/src/local.mk b/src/local.mk
index 32d09d10..08ff62be 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -103,6 +103,8 @@ src_bison_SOURCES = \
src/state.h \
src/state-item.c \
src/state-item.h \
+ src/strversion.c \
+ src/strversion.h \
src/symlist.c \
src/symlist.h \
src/symtab.c \
diff --git a/src/parse-gram.y b/src/parse-gram.y
index dc776130..7c146ea3 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -42,8 +42,6 @@
#include "system.h"
#include <c-ctype.h>
- #include <errno.h>
- #include <intprops.h>
#include <quotearg.h>
#include <vasnprintf.h>
#include <xmemdup0.h>
@@ -57,6 +55,7 @@
#include "reader.h"
#include "scan-code.h"
#include "scan-gram.h"
+ #include "strversion.h"
/* Pretend to be at least that version, to check features published
in that version while developping it. */
@@ -1043,56 +1042,11 @@ handle_pure_parser (location const *loc, char const *directive)
}
-/* Convert VERSION into an int (MAJOR * 10000 + MINOR * 100 + MICRO).
- E.g., "3.7.4" => 30704, "3.8" => 30800.
- Return -1 on errors. */
-static int
-str_to_version (char const *version)
-{
- IGNORE_TYPE_LIMITS_BEGIN
- int res = 0;
- errno = 0;
- char *cp = NULL;
-
- {
- long major = strtol (version, &cp, 10);
- if (errno || cp == version || *cp != '.' || major < 0
- || INT_MULTIPLY_WRAPV (major, 10000, &res))
- return -1;
- }
-
- {
- ++cp;
- char *prev = cp;
- long minor = strtol (cp, &cp, 10);
- if (errno || cp == prev || (*cp != '\0' && *cp != '.')
- || ! (0 <= minor && minor < 100)
- || INT_MULTIPLY_WRAPV (minor, 100, &minor)
- || INT_ADD_WRAPV (minor, res, &res))
- return -1;
- }
-
- if (*cp == '.')
- {
- ++cp;
- char *prev = cp;
- long micro = strtol (cp, &cp, 10);
- if (errno || cp == prev || (*cp != '\0' && *cp != '.')
- || ! (0 <= micro && micro < 100)
- || INT_ADD_WRAPV (micro, res, &res))
- return -1;
- }
-
- IGNORE_TYPE_LIMITS_END
- return res;
-}
-
-
static void
handle_require (location const *loc, char const *version_quoted)
{
char *version = unquote (version_quoted);
- required_version = str_to_version (version);
+ required_version = strversion_to_int (version);
if (required_version == -1)
{
complain (loc, complaint, _("invalid version requirement: %s"),
diff --git a/src/strversion.c b/src/strversion.c
new file mode 100644
index 00000000..27c71d34
--- /dev/null
+++ b/src/strversion.c
@@ -0,0 +1,67 @@
+/* Convert version string to int.
+
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ This file is part of Bison, the GNU Compiler Compiler.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include "system.h"
+
+#include "strversion.h"
+
+#include <errno.h>
+#include <intprops.h>
+
+int
+strversion_to_int (char const *version)
+{
+ IGNORE_TYPE_LIMITS_BEGIN
+ int res = 0;
+ errno = 0;
+ char *cp = NULL;
+
+ {
+ long major = strtol (version, &cp, 10);
+ if (errno || cp == version || *cp != '.' || major < 0
+ || INT_MULTIPLY_WRAPV (major, 10000, &res))
+ return -1;
+ }
+
+ {
+ ++cp;
+ char *prev = cp;
+ long minor = strtol (cp, &cp, 10);
+ if (errno || cp == prev || (*cp != '\0' && *cp != '.')
+ || ! (0 <= minor && minor < 100)
+ || INT_MULTIPLY_WRAPV (minor, 100, &minor)
+ || INT_ADD_WRAPV (minor, res, &res))
+ return -1;
+ }
+
+ if (*cp == '.')
+ {
+ ++cp;
+ char *prev = cp;
+ long micro = strtol (cp, &cp, 10);
+ if (errno || cp == prev || (*cp != '\0' && *cp != '.')
+ || ! (0 <= micro && micro < 100)
+ || INT_ADD_WRAPV (micro, res, &res))
+ return -1;
+ }
+
+ IGNORE_TYPE_LIMITS_END
+ return res;
+}
diff --git a/src/strversion.h b/src/strversion.h
new file mode 100644
index 00000000..6d8d6235
--- /dev/null
+++ b/src/strversion.h
@@ -0,0 +1,28 @@
+/* Convert version string to int.
+
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ This file is part of Bison, the GNU Compiler Compiler.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef STRVERSION_H_
+# define STRVERSION_H_
+
+/* Convert VERSION into an int (MAJOR * 10000 + MINOR * 100 + MICRO).
+ E.g., "3.7.4" => 30704, "3.8" => 30800.
+ Return -1 on errors. */
+int strversion_to_int (char const *version);
+
+#endif