diff options
Diffstat (limited to 'lib/strnumcmp-in.h')
-rw-r--r-- | lib/strnumcmp-in.h | 162 |
1 files changed, 80 insertions, 82 deletions
diff --git a/lib/strnumcmp-in.h b/lib/strnumcmp-in.h index 9b968cb..2187af4 100644 --- a/lib/strnumcmp-in.h +++ b/lib/strnumcmp-in.h @@ -1,12 +1,11 @@ /* Compare numeric strings. This is an internal include file. - Copyright (C) 1988, 1991, 1992, 1993, 1995, 1996, 1998, 1999, 2000, - 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1988-2016 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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 2, or (at your option) - any later version. + 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 @@ -14,8 +13,7 @@ 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, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Written by Mike Haertel. */ @@ -35,7 +33,7 @@ - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless it's important to use the locale's definition - of `digit' even when the host does not conform to POSIX. */ + of 'digit' even when the host does not conform to POSIX. */ # define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) @@ -72,34 +70,34 @@ if digit return -1, else 0 return 0 */ -static inline int +static inline int _GL_ATTRIBUTE_PURE fraccompare (char const *a, char const *b, char decimal_point) { if (*a == decimal_point && *b == decimal_point) { while (*++a == *++b) - if (! ISDIGIT (*a)) - return 0; + if (! ISDIGIT (*a)) + return 0; if (ISDIGIT (*a) && ISDIGIT (*b)) - return *a - *b; + return *a - *b; if (ISDIGIT (*a)) - goto a_trailing_nonzero; + goto a_trailing_nonzero; if (ISDIGIT (*b)) - goto b_trailing_nonzero; + goto b_trailing_nonzero; return 0; } else if (*a++ == decimal_point) { a_trailing_nonzero: while (*a == NUMERIC_ZERO) - a++; + a++; return ISDIGIT (*a); } else if (*b++ == decimal_point) { b_trailing_nonzero: while (*b == NUMERIC_ZERO) - b++; + b++; return - ISDIGIT (*b); } return 0; @@ -112,9 +110,9 @@ fraccompare (char const *a, char const *b, char decimal_point) causes comparisons to act as if there is no decimal point character, and likewise for THOUSANDS_SEP. */ -static inline int +static inline int _GL_ATTRIBUTE_PURE numcompare (char const *a, char const *b, - int decimal_point, int thousands_sep) + int decimal_point, int thousands_sep) { unsigned char tmpa = *a; unsigned char tmpb = *b; @@ -125,119 +123,119 @@ numcompare (char const *a, char const *b, if (tmpa == NEGATION_SIGN) { do - tmpa = *++a; + tmpa = *++a; while (tmpa == NUMERIC_ZERO || tmpa == thousands_sep); if (tmpb != NEGATION_SIGN) - { - if (tmpa == decimal_point) - do - tmpa = *++a; - while (tmpa == NUMERIC_ZERO); - if (ISDIGIT (tmpa)) - return -1; - while (tmpb == NUMERIC_ZERO || tmpb == thousands_sep) - tmpb = *++b; - if (tmpb == decimal_point) - do - tmpb = *++b; - while (tmpb == NUMERIC_ZERO); - return - ISDIGIT (tmpb); - } + { + if (tmpa == decimal_point) + do + tmpa = *++a; + while (tmpa == NUMERIC_ZERO); + if (ISDIGIT (tmpa)) + return -1; + while (tmpb == NUMERIC_ZERO || tmpb == thousands_sep) + tmpb = *++b; + if (tmpb == decimal_point) + do + tmpb = *++b; + while (tmpb == NUMERIC_ZERO); + return - ISDIGIT (tmpb); + } do - tmpb = *++b; + tmpb = *++b; while (tmpb == NUMERIC_ZERO || tmpb == thousands_sep); while (tmpa == tmpb && ISDIGIT (tmpa)) - { - do - tmpa = *++a; - while (tmpa == thousands_sep); - do - tmpb = *++b; - while (tmpb == thousands_sep); - } + { + do + tmpa = *++a; + while (tmpa == thousands_sep); + do + tmpb = *++b; + while (tmpb == thousands_sep); + } if ((tmpa == decimal_point && !ISDIGIT (tmpb)) - || (tmpb == decimal_point && !ISDIGIT (tmpa))) - return fraccompare (b, a, decimal_point); + || (tmpb == decimal_point && !ISDIGIT (tmpa))) + return fraccompare (b, a, decimal_point); tmp = tmpb - tmpa; for (log_a = 0; ISDIGIT (tmpa); ++log_a) - do - tmpa = *++a; - while (tmpa == thousands_sep); + do + tmpa = *++a; + while (tmpa == thousands_sep); for (log_b = 0; ISDIGIT (tmpb); ++log_b) - do - tmpb = *++b; - while (tmpb == thousands_sep); + do + tmpb = *++b; + while (tmpb == thousands_sep); if (log_a != log_b) - return log_a < log_b ? 1 : -1; + return log_a < log_b ? 1 : -1; if (!log_a) - return 0; + return 0; return tmp; } else if (tmpb == NEGATION_SIGN) { do - tmpb = *++b; + tmpb = *++b; while (tmpb == NUMERIC_ZERO || tmpb == thousands_sep); if (tmpb == decimal_point) - do - tmpb = *++b; - while (tmpb == NUMERIC_ZERO); + do + tmpb = *++b; + while (tmpb == NUMERIC_ZERO); if (ISDIGIT (tmpb)) - return 1; + return 1; while (tmpa == NUMERIC_ZERO || tmpa == thousands_sep) - tmpa = *++a; + tmpa = *++a; if (tmpa == decimal_point) - do - tmpa = *++a; - while (tmpa == NUMERIC_ZERO); + do + tmpa = *++a; + while (tmpa == NUMERIC_ZERO); return ISDIGIT (tmpa); } else { while (tmpa == NUMERIC_ZERO || tmpa == thousands_sep) - tmpa = *++a; + tmpa = *++a; while (tmpb == NUMERIC_ZERO || tmpb == thousands_sep) - tmpb = *++b; + tmpb = *++b; while (tmpa == tmpb && ISDIGIT (tmpa)) - { - do - tmpa = *++a; - while (tmpa == thousands_sep); - do - tmpb = *++b; - while (tmpb == thousands_sep); - } + { + do + tmpa = *++a; + while (tmpa == thousands_sep); + do + tmpb = *++b; + while (tmpb == thousands_sep); + } if ((tmpa == decimal_point && !ISDIGIT (tmpb)) - || (tmpb == decimal_point && !ISDIGIT (tmpa))) - return fraccompare (a, b, decimal_point); + || (tmpb == decimal_point && !ISDIGIT (tmpa))) + return fraccompare (a, b, decimal_point); tmp = tmpa - tmpb; for (log_a = 0; ISDIGIT (tmpa); ++log_a) - do - tmpa = *++a; - while (tmpa == thousands_sep); + do + tmpa = *++a; + while (tmpa == thousands_sep); for (log_b = 0; ISDIGIT (tmpb); ++log_b) - do - tmpb = *++b; - while (tmpb == thousands_sep); + do + tmpb = *++b; + while (tmpb == thousands_sep); if (log_a != log_b) - return log_a < log_b ? -1 : 1; + return log_a < log_b ? -1 : 1; if (!log_a) - return 0; + return 0; return tmp; } |