annotate lib/strverscmp.c @ 12421:e8d2c6fc33ad

Use spaces for indentation, not tabs.
author Bruno Haible <bruno@clisp.org>
date Thu, 10 Dec 2009 20:28:30 +0100
parents 8a1a9361108c
children b5e42ef33b49
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* Compare strings while treating digits characters numerically.
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6932
diff changeset
2 Copyright (C) 1997, 2000, 2002, 2004, 2006 Free Software Foundation, Inc.
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3 This file is part of the GNU C Library.
5184
ffc7a08ca08b Convert to UTF-8.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
4 Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
4422
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
6 This program is free software; you can redistribute it and/or modify
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
7 it under the terms of the GNU General Public License as published by
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
9 any later version.
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10
4422
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
11 This program is distributed in the hope that it will be useful,
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
4422
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
14 GNU General Public License for more details.
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
4422
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
16 You should have received a copy of the GNU General Public License along
d82316ffe803 Switch from LGPL to GPL.
Paul Eggert <eggert@cs.ucla.edu>
parents: 3700
diff changeset
17 with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5184
diff changeset
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6932
diff changeset
20 #if !_LIBC
1019
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
21 # include <config.h>
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
22 #endif
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
23
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 #include <string.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <ctype.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 /* states: S_N: normal, S_I: comparing integral part, S_F: comparing
2986
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
28 fractional parts, S_Z: idem but with leading Zeroes only */
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 #define S_N 0x0
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 #define S_I 0x4
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 #define S_F 0x8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 #define S_Z 0xC
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 /* result_type: CMP: return diff; LEN: compare using len_diff/diff */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 #define CMP 2
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 #define LEN 3
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37
2986
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
38
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
39 /* ISDIGIT differs from isdigit, as follows:
6932
6aeb4d6c28d9 * lib/.cppi-disable: Add wcwidth.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
40 - Its arg may be any int or unsigned int; it need not be an unsigned char
6aeb4d6c28d9 * lib/.cppi-disable: Add wcwidth.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
41 or EOF.
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
42 - It's typically faster.
3699
48781102544a (ISDIGIT): Comment fix.
Jim Meyering <jim@meyering.net>
parents: 2986
diff changeset
43 POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
6932
6aeb4d6c28d9 * lib/.cppi-disable: Add wcwidth.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
44 isdigit unless it's important to use the locale's definition
3699
48781102544a (ISDIGIT): Comment fix.
Jim Meyering <jim@meyering.net>
parents: 2986
diff changeset
45 of `digit' even when the host does not conform to POSIX. */
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4422
diff changeset
46 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47
2986
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
48 #undef __strverscmp
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
49 #undef strverscmp
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
50
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
51 #ifndef weak_alias
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
52 # define __strverscmp strverscmp
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
53 #endif
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
54
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 /* Compare S1 and S2 as strings holding indices/version numbers,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 returning less than, equal to or greater than zero if S1 is less than,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 equal to or greater than S2 (for more info, see the texinfo doc).
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 int
2986
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
61 __strverscmp (const char *s1, const char *s2)
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 const unsigned char *p1 = (const unsigned char *) s1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 const unsigned char *p2 = (const unsigned char *) s2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 unsigned char c1, c2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 int state;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 int diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 /* Symbol(s) 0 [1-9] others (padding)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 Transition (10) 0 (01) d (00) x (11) - */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 static const unsigned int next_state[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 /* state x d 0 - */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 /* S_N */ S_N, S_I, S_Z, S_N,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 /* S_I */ S_N, S_I, S_I, S_I,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 /* S_F */ S_N, S_F, S_F, S_F,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 /* S_Z */ S_N, S_F, S_Z, S_Z
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 static const int result_type[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
1020
7a11651fb4a6 Use `1' not `+1' -- some compilers (sunos' cc) can't parse it.
Jim Meyering <jim@meyering.net>
parents: 1019
diff changeset
87 /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP,
7a11651fb4a6 Use `1' not `+1' -- some compilers (sunos' cc) can't parse it.
Jim Meyering <jim@meyering.net>
parents: 1019
diff changeset
88 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
1020
7a11651fb4a6 Use `1' not `+1' -- some compilers (sunos' cc) can't parse it.
Jim Meyering <jim@meyering.net>
parents: 1019
diff changeset
91 /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP,
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 -1, CMP, CMP, CMP
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 if (p1 == p2)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 return 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 c1 = *p1++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 c2 = *p2++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 /* Hint: '0' is a digit too. */
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
101 state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0));
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 while ((diff = c1 - c2) == 0 && c1 != '\0')
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 state = next_state[state];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 c1 = *p1++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 c2 = *p2++;
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
108 state |= (c1 == '0') + (ISDIGIT (c1) != 0);
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
111 state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 switch (state)
976
Jim Meyering <jim@meyering.net>
parents: 975
diff changeset
114 {
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 case CMP:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 return diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 case LEN:
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
119 while (ISDIGIT (*p1++))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
120 if (!ISDIGIT (*p2++))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 7302
diff changeset
121 return 1;
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
123 return ISDIGIT (*p2) ? -1 : diff;
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126 return state;
976
Jim Meyering <jim@meyering.net>
parents: 975
diff changeset
127 }
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 }
2986
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
129 #ifdef weak_alias
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
130 weak_alias (__strverscmp, strverscmp)
f15c2a52acf6 Incorporate weak-alias-related changes from glibc.
Jim Meyering <jim@meyering.net>
parents: 2287
diff changeset
131 #endif