annotate lib/strverscmp.c @ 975:20bc58ea77fe

fix typo in comment
author Jim Meyering <jim@meyering.net>
date Wed, 09 Jul 1997 15:33:27 +0000 (1997-07-09)
parents 02953a589bfd
children 405614c08e52
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.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 Copyright (C) 1997 Free Software Foundation, Inc.
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
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 #include <string.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 #include <ctype.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 /* 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
25 Fractional parts, S_Z: idem but with leading Zeroes only */
974
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #define S_N 0x0
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 #define S_I 0x4
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 #define S_F 0x8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 #define S_Z 0xC
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 /* result_type: CMP: return diff; LEN: compare using len_diff/diff */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 #define CMP 2
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 #define LEN 3
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 /* Compare S1 and S2 as strings holding indices/version numbers,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 returning less than, equal to or greater than zero if S1 is less than,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 equal to or greater than S2 (for more info, see the texinfo doc).
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 int
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 strverscmp (s1, s2)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 const char *s1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 const char *s2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 const unsigned char *p1 = (const unsigned char *) s1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 const unsigned char *p2 = (const unsigned char *) s2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 unsigned char c1, c2;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 int state;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 int diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 /* Symbol(s) 0 [1-9] others (padding)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 Transition (10) 0 (01) d (00) x (11) - */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 static const unsigned int next_state[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 /* state x d 0 - */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 /* S_N */ S_N, S_I, S_Z, S_N,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 /* S_I */ S_N, S_I, S_I, S_I,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 /* S_F */ S_N, S_F, S_F, S_F,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 /* S_Z */ S_N, S_F, S_Z, S_Z
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 static const int result_type[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 /* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 +1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 /* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 -1, CMP, CMP, CMP
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 if (p1 == p2)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 return 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 c1 = *p1++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 c2 = *p2++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 /* Hint: '0' is a digit too. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 state = S_N | (c1 == '0') + (isdigit (c1) != 0);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 while ((diff = c1 - c2) == 0 && c1 != '\0')
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 state = next_state[state];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 c1 = *p1++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 c2 = *p2++;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91 state |= (c1 == '0') + (isdigit (c1) != 0);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 state = result_type[state << 2 | ((c2 == '0') + (isdigit (c2) != 0))];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 switch (state)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 case CMP:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 return diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 case LEN:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 while (isdigit (*p1++))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 if (!isdigit (*p2++))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 return 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 return isdigit (*p2) ? -1 : diff;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 return state;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 }