Changeset 3613 in kBuild for trunk/src/sed/lib/strverscmp.c
- Timestamp:
- Sep 19, 2024 12:34:43 AM (7 months ago)
- Location:
- trunk/src/sed
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/sed
-
Property svn:mergeinfo
set to
/vendor/sed/current merged eligible
-
Property svn:mergeinfo
set to
-
trunk/src/sed/lib/strverscmp.c
r599 r3613 1 1 /* Compare strings while treating digits characters numerically. 2 Copyright (C) 1997 , 2000, 2002 Free Software Foundation, Inc.2 Copyright (C) 1997-2022 Free Software Foundation, Inc. 3 3 This file is part of the GNU C Library. 4 4 Contributed by Jean-François Bignolles <[email protected]>, 1997. 5 5 6 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU L ibrary General Public License as8 published by the Free Software Foundation; either version 2 of the9 License, or (at your option) any later version.7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 10 11 11 The GNU C Library is distributed in the hope that it will be useful, 12 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 L ibraryGeneral Public License for more details.14 Lesser General Public License for more details. 15 15 16 You should have received a copy of the GNU Library General Public 17 License along with the GNU C Library; see the file COPYING.LIB. If not, 18 write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 Boston, MA 02110-1301, USA. */ 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <https://www.gnu.org/licenses/>. */ 20 19 21 #if HAVE_CONFIG_H 22 # include <config.h> 20 #ifndef _LIBC 21 # include <libc-config.h> 22 # define __strverscmp strverscmp 23 23 #endif 24 24 25 #include <stdint.h> 25 26 #include <string.h> 26 27 #include <ctype.h> … … 28 29 /* states: S_N: normal, S_I: comparing integral part, S_F: comparing 29 30 fractional parts, S_Z: idem but with leading Zeroes only */ 30 #define S_N 0x031 #define S_I 0x432 #define S_F 0x833 #define S_Z 0xC31 #define S_N 0x0 32 #define S_I 0x3 33 #define S_F 0x6 34 #define S_Z 0x9 34 35 35 36 /* result_type: CMP: return diff; LEN: compare using len_diff/diff */ 36 #define CMP 237 #define LEN 337 #define CMP 2 38 #define LEN 3 38 39 39 40 /* ISDIGIT differs from isdigit, as follows:41 - Its arg may be any int or unsigned int; it need not be an unsigned char.42 - It's guaranteed to evaluate its argument exactly once.43 - It's typically faster.44 POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to45 ISDIGIT_LOCALE unless it's important to use the locale's definition46 of `digit' even when the host does not conform to POSIX. */47 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)48 49 #undef __strverscmp50 #undef strverscmp51 52 #ifndef weak_alias53 # define __strverscmp strverscmp54 #endif55 40 56 41 /* Compare S1 and S2 as strings holding indices/version numbers, … … 64 49 const unsigned char *p1 = (const unsigned char *) s1; 65 50 const unsigned char *p2 = (const unsigned char *) s2; 66 unsigned char c1, c2;67 int state;68 int diff;69 51 70 /* Symbol(s) 0 [1-9] others (padding)71 Transition (10) 0 (01) d (00) x (11) -*/72 static const u nsigned int next_state[] =52 /* Symbol(s) 0 [1-9] others 53 Transition (10) 0 (01) d (00) x */ 54 static const uint_least8_t next_state[] = 73 55 { 74 /* state x d 0 -*/75 /* S_N */ S_N, S_I, S_Z, S_N,76 /* S_I */ S_N, S_I, S_I, S_I,77 /* S_F */ S_N, S_F, S_F, S_F,78 /* S_Z */ S_N, S_F, S_Z , S_Z56 /* state x d 0 */ 57 /* S_N */ S_N, S_I, S_Z, 58 /* S_I */ S_N, S_I, S_I, 59 /* S_F */ S_N, S_F, S_F, 60 /* S_Z */ S_N, S_F, S_Z 79 61 }; 80 62 81 static const int result_type[] =63 static const int_least8_t result_type[] = 82 64 { 83 /* state x/x x/d x/0 x/- d/x d/d d/0 d/- 84 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */ 65 /* state x/x x/d x/0 d/x d/d d/0 0/x 0/d 0/0 */ 85 66 86 /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, 87 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, 88 /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP, 89 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP, 90 /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, 91 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, 92 /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP, 93 -1, CMP, CMP, CMP 67 /* S_N */ CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP, 68 /* S_I */ CMP, -1, -1, +1, LEN, LEN, +1, LEN, LEN, 69 /* S_F */ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, 70 /* S_Z */ CMP, +1, +1, -1, CMP, CMP, -1, CMP, CMP 94 71 }; 95 72 … … 97 74 return 0; 98 75 99 c1 = *p1++;100 c2 = *p2++;76 unsigned char c1 = *p1++; 77 unsigned char c2 = *p2++; 101 78 /* Hint: '0' is a digit too. */ 102 state = S_N | ((c1 == '0') + (ISDIGIT(c1) != 0));79 int state = S_N + ((c1 == '0') + (isdigit (c1) != 0)); 103 80 104 while ((diff = c1 - c2) == 0 && c1 != '\0') 81 int diff; 82 while ((diff = c1 - c2) == 0) 105 83 { 84 if (c1 == '\0') 85 return diff; 86 106 87 state = next_state[state]; 107 88 c1 = *p1++; 108 89 c2 = *p2++; 109 state |= (c1 == '0') + (ISDIGIT(c1) != 0);90 state += (c1 == '0') + (isdigit (c1) != 0); 110 91 } 111 92 112 state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];93 state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))]; 113 94 114 95 switch (state) 115 96 { 116 97 case CMP: 117 98 return diff; 118 99 119 100 case LEN: 120 while ( ISDIGIT(*p1++))121 if (! ISDIGIT(*p2++))101 while (isdigit (*p1++)) 102 if (!isdigit (*p2++)) 122 103 return 1; 123 104 124 return ISDIGIT(*p2) ? -1 : diff;105 return isdigit (*p2) ? -1 : diff; 125 106 126 107 default: 127 108 return state; 128 109 } 129 110 } 130 #ifdef weak_alias 111 libc_hidden_def (__strverscmp) 131 112 weak_alias (__strverscmp, strverscmp) 132 #endif
Note:
See TracChangeset
for help on using the changeset viewer.