bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/4] %require: accept version numbers with three parts ("3.7.4")


From: Akim Demaille
Subject: [PATCH 1/4] %require: accept version numbers with three parts ("3.7.4")
Date: Wed, 11 Nov 2020 09:06:00 +0100

* src/parse-gram.y (str_to_version): Support three parts.
* data/skeletons/location.cc, data/skeletons/stack.hh:
Adjust.
---
 data/skeletons/location.cc |  2 +-
 data/skeletons/stack.hh    |  2 +-
 src/parse-gram.c           | 47 +++++++++++++++++++++++++-------------
 src/parse-gram.y           | 47 +++++++++++++++++++++++++-------------
 4 files changed, 64 insertions(+), 34 deletions(-)

diff --git a/data/skeletons/location.cc b/data/skeletons/location.cc
index 33c9e50d..c96381e9 100644
--- a/data/skeletons/location.cc
+++ b/data/skeletons/location.cc
@@ -22,7 +22,7 @@ m4_pushdef([b4_copyright_years],
 # b4_position_file
 # ----------------
 # Name of the file containing the position class, if we want this file.
-b4_defines_if([b4_required_version_if([302], [],
+b4_defines_if([b4_required_version_if([30200], [],
                                       [m4_define([b4_position_file], 
[position.hh])])])])
 
 
diff --git a/data/skeletons/stack.hh b/data/skeletons/stack.hh
index 0fd36258..38bff8ba 100644
--- a/data/skeletons/stack.hh
+++ b/data/skeletons/stack.hh
@@ -19,7 +19,7 @@
 # b4_stack_file
 # -------------
 # Name of the file containing the stack class, if we want this file.
-b4_defines_if([b4_required_version_if([302], [],
+b4_defines_if([b4_required_version_if([30200], [],
                                       [m4_define([b4_stack_file], 
[stack.hh])])])
 
 
diff --git a/src/parse-gram.c b/src/parse-gram.c
index d8eb81cc..917fb35a 100644
--- a/src/parse-gram.c
+++ b/src/parse-gram.c
@@ -3032,11 +3032,9 @@ handle_pure_parser (location const *loc, char const 
*directive)
 }
 
 
-/* Convert VERSION into an int (MAJOR * 100 + MINOR).  Return -1 on
-   errors.
-
-   Changes of behavior are only on minor version changes, so "3.0.5"
-   is the same as "3.0": 300. */
+/* 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)
 {
@@ -3044,18 +3042,35 @@ str_to_version (char const *version)
   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, 100, &res))
-    return -1;
 
-  ++cp;
-  char *cp1 = NULL;
-  long minor = strtol (cp, &cp1, 10);
-  if (errno || cp1 == cp || (*cp1 != '\0' && *cp1 != '.')
-      || ! (0 <= minor && minor < 100)
-      || INT_ADD_WRAPV (minor, res, &res))
-    return -1;
+  {
+    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/parse-gram.y b/src/parse-gram.y
index 925e0773..dc776130 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -1043,11 +1043,9 @@ handle_pure_parser (location const *loc, char const 
*directive)
 }
 
 
-/* Convert VERSION into an int (MAJOR * 100 + MINOR).  Return -1 on
-   errors.
-
-   Changes of behavior are only on minor version changes, so "3.0.5"
-   is the same as "3.0": 300. */
+/* 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)
 {
@@ -1055,18 +1053,35 @@ str_to_version (char const *version)
   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, 100, &res))
-    return -1;
 
-  ++cp;
-  char *cp1 = NULL;
-  long minor = strtol (cp, &cp1, 10);
-  if (errno || cp1 == cp || (*cp1 != '\0' && *cp1 != '.')
-      || ! (0 <= minor && minor < 100)
-      || INT_ADD_WRAPV (minor, res, &res))
-    return -1;
+  {
+    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;
-- 
2.29.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]