| /* Convert version string to int. |
| |
| Copyright (C) 2020-2022 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 <https://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; |
| } |