VirtualBox

Changeset 3613 in kBuild for trunk/src/sed/lib/strverscmp.c


Ignore:
Timestamp:
Sep 19, 2024 12:34:43 AM (7 months ago)
Author:
bird
Message:

src/sed: Merged in changes between 4.1.5 and 4.9 from the vendor branch. (svn merge /vendor/sed/4.1.5 /vendor/sed/current .)

Location:
trunk/src/sed
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sed

  • trunk/src/sed/lib/strverscmp.c

    r599 r3613  
    11/* 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.
    33   This file is part of the GNU C Library.
    44   Contributed by Jean-François Bignolles <[email protected]>, 1997.
    55
    66   The GNU C Library is free software; you can redistribute it and/or
    7    modify it under the terms of the GNU Library General Public License as
    8    published by the Free Software Foundation; either version 2 of the
    9    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.
    1010
    1111   The GNU C Library is distributed in the hope that it will be useful,
    1212   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1313   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    14    Library General Public License for more details.
     14   Lesser General Public License for more details.
    1515
    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/>.  */
    2019
    21 #if HAVE_CONFIG_H
    22 # include <config.h>
     20#ifndef _LIBC
     21# include <libc-config.h>
     22# define __strverscmp strverscmp
    2323#endif
    2424
     25#include <stdint.h>
    2526#include <string.h>
    2627#include <ctype.h>
     
    2829/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
    2930           fractional parts, S_Z: idem but with leading Zeroes only */
    30 #define S_N    0x0
    31 #define S_I    0x4
    32 #define S_F    0x8
    33 #define S_Z    0xC
     31#define  S_N    0x0
     32#define  S_I    0x3
     33#define  S_F    0x6
     34#define  S_Z    0x9
    3435
    3536/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
    36 #define CMP    2
    37 #define LEN    3
     37#define  CMP    2
     38#define  LEN    3
    3839
    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 to
    45    ISDIGIT_LOCALE unless it's important to use the locale's definition
    46    of `digit' even when the host does not conform to POSIX.  */
    47 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
    48 
    49 #undef __strverscmp
    50 #undef strverscmp
    51 
    52 #ifndef weak_alias
    53 # define __strverscmp strverscmp
    54 #endif
    5540
    5641/* Compare S1 and S2 as strings holding indices/version numbers,
     
    6449  const unsigned char *p1 = (const unsigned char *) s1;
    6550  const unsigned char *p2 = (const unsigned char *) s2;
    66   unsigned char c1, c2;
    67   int state;
    68   int diff;
    6951
    70   /* Symbol(s)    0       [1-9]   others  (padding)
    71      Transition   (10) 0  (01) d  (00) x  (11) -  */
    72   static const unsigned 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[] =
    7355  {
    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_Z
     56      /* 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
    7961  };
    8062
    81   static const int result_type[] =
     63  static const int_least8_t result_type[] =
    8264  {
    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  */
    8566
    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
    9471  };
    9572
     
    9774    return 0;
    9875
    99   c1 = *p1++;
    100   c2 = *p2++;
     76  unsigned char c1 = *p1++;
     77  unsigned char c2 = *p2++;
    10178  /* 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));
    10380
    104   while ((diff = c1 - c2) == 0 && c1 != '\0')
     81  int diff;
     82  while ((diff = c1 - c2) == 0)
    10583    {
     84      if (c1 == '\0')
     85        return diff;
     86
    10687      state = next_state[state];
    10788      c1 = *p1++;
    10889      c2 = *p2++;
    109       state |= (c1 == '0') + (ISDIGIT (c1) != 0);
     90      state += (c1 == '0') + (isdigit (c1) != 0);
    11091    }
    11192
    112   state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];
     93  state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))];
    11394
    11495  switch (state)
    115     {
     96  {
    11697    case CMP:
    11798      return diff;
    11899
    119100    case LEN:
    120       while (ISDIGIT (*p1++))
    121         if (!ISDIGIT (*p2++))
     101      while (isdigit (*p1++))
     102        if (!isdigit (*p2++))
    122103          return 1;
    123104
    124       return ISDIGIT (*p2) ? -1 : diff;
     105      return isdigit (*p2) ? -1 : diff;
    125106
    126107    default:
    127108      return state;
    128     }
     109  }
    129110}
    130 #ifdef weak_alias
     111libc_hidden_def (__strverscmp)
    131112weak_alias (__strverscmp, strverscmp)
    132 #endif
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette