annotate lib/strverscmp.c @ 2162:f791c89a9a49

(ISDIGIT): Define. (strverscmp): Use ISDIGIT, not isdigit.
author Jim Meyering <jim@meyering.net>
date Sat, 22 Jan 2000 09:43:23 +0000
parents 38fd8f5d359d
children 9b7ce618e1fb
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.
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
2 Copyright (C) 1997, 2000 Free Software Foundation, Inc.
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3 This file is part of the GNU C Library.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 Contributed by Jean-Francois Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 The GNU C Library is free software; you can redistribute it and/or
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 modify it under the terms of the GNU Library General Public License as
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8 published by the Free Software Foundation; either version 2 of the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 License, or (at your option) any later version.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 The GNU C Library is distributed in the hope that it will be useful,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 Library General Public License for more details.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 You should have received a copy of the GNU Library General Public
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17 License along with the GNU C Library; see the file COPYING.LIB. If not,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20
1019
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
21 #if HAVE_CONFIG_H
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
22 # include <config.h>
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
23 #endif
6fc478cbf47d [HAVE_CONFIG_H]: Include config.h.
Jim Meyering <jim@meyering.net>
parents: 977
diff changeset
24
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <string.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #include <ctype.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 /* states: S_N: normal, S_I: comparing integral part, S_F: comparing
975
20bc58ea77fe fix typo in comment
Jim Meyering <jim@meyering.net>
parents: 974
diff changeset
29 Fractional parts, S_Z: idem but with leading Zeroes only */
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 #define S_N 0x0
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 #define S_I 0x4
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 #define S_F 0x8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 #define S_Z 0xC
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 /* result_type: CMP: return diff; LEN: compare using len_diff/diff */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 #define CMP 2
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 #define LEN 3
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
39 /* ISDIGIT differs from isdigit, as follows:
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
40 - Its arg may be any int or unsigned int; it need not be an unsigned char.
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
41 - It's guaranteed to evaluate its argument exactly once.
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
42 - It's typically faster.
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
43 Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
44 only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
45 it's important to use the locale's definition of `digit' even when the
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
46 host does not conform to Posix. */
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
47 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 /* Compare S1 and S2 as strings holding indices/version numbers,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 returning less than, equal to or greater than zero if S1 is less than,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 equal to or greater than S2 (for more info, see the texinfo doc).
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 int
1557
38fd8f5d359d ansideclify
Jim Meyering <jim@meyering.net>
parents: 1020
diff changeset
55 strverscmp (const char *s1, const char *s2)
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 const unsigned char *p1 = (const unsigned char *) s1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 const unsigned char *p2 = (const unsigned char *) s2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 unsigned char c1, c2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 int state;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 int diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 /* Symbol(s) 0 [1-9] others (padding)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 Transition (10) 0 (01) d (00) x (11) - */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 static const unsigned int next_state[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 /* state x d 0 - */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 /* S_N */ S_N, S_I, S_Z, S_N,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 /* S_I */ S_N, S_I, S_I, S_I,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 /* S_F */ S_N, S_F, S_F, S_F,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 /* S_Z */ S_N, S_F, S_Z, S_Z
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 static const int result_type[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 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
81 /* 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
82 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 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
85 /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP,
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 -1, CMP, CMP, CMP
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 if (p1 == p2)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 return 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 c1 = *p1++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 c2 = *p2++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 /* Hint: '0' is a digit too. */
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
95 state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0));
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 while ((diff = c1 - c2) == 0 && c1 != '\0')
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 state = next_state[state];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 c1 = *p1++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 c2 = *p2++;
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
102 state |= (c1 == '0') + (ISDIGIT (c1) != 0);
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
105 state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 switch (state)
976
Jim Meyering <jim@meyering.net>
parents: 975
diff changeset
108 {
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 case CMP:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 return diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 case LEN:
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
113 while (ISDIGIT (*p1++))
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
114 if (!ISDIGIT (*p2++))
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 return 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116
2162
f791c89a9a49 (ISDIGIT): Define.
Jim Meyering <jim@meyering.net>
parents: 1557
diff changeset
117 return ISDIGIT (*p2) ? -1 : diff;
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 return state;
976
Jim Meyering <jim@meyering.net>
parents: 975
diff changeset
121 }
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 }