OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [linux/] [strverscmp.c] - Blame information for rev 816

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/* Compare strings while treating digits characters numerically.
2
   Copyright (C) 1997 Free Software Foundation, Inc.
3
   This file is part of the GNU C Library.
4
   Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
5
 
6
   The GNU C Library is free software; you can redistribute it and/or
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
 
11
   The GNU C Library is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
   Lesser General Public License for more details.
15
 
16
   You should have received a copy of the GNU Lesser General Public
17
   License along with the GNU C Library; if not, write to the Free
18
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19
   02111-1307 USA.  */
20
 
21
#include <string.h>
22
#include <ctype.h>
23
#include <machine/weakalias.h>
24
 
25
/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
26
           fractionnal parts, S_Z: idem but with leading Zeroes only */
27
#define  S_N    0x0
28
#define  S_I    0x4
29
#define  S_F    0x8
30
#define  S_Z    0xC
31
 
32
/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
33
#define  CMP    2
34
#define  LEN    3
35
 
36
 
37
/* Compare S1 and S2 as strings holding indices/version numbers,
38
   returning less than, equal to or greater than zero if S1 is less than,
39
   equal to or greater than S2 (for more info, see the texinfo doc).
40
*/
41
 
42
int
43
__strverscmp (s1, s2)
44
     const char *s1;
45
     const char *s2;
46
{
47
  const unsigned char *p1 = (const unsigned char *) s1;
48
  const unsigned char *p2 = (const unsigned char *) s2;
49
  unsigned char c1, c2;
50
  int state;
51
  int diff;
52
 
53
  /* Symbol(s)    0       [1-9]   others  (padding)
54
     Transition   (10) 0  (01) d  (00) x  (11) -   */
55
  static const unsigned int next_state[] =
56
  {
57
      /* state    x    d    0    - */
58
      /* S_N */  S_N, S_I, S_Z, S_N,
59
      /* S_I */  S_N, S_I, S_I, S_I,
60
      /* S_F */  S_N, S_F, S_F, S_F,
61
      /* S_Z */  S_N, S_F, S_Z, S_Z
62
  };
63
 
64
  static const int result_type[] =
65
  {
66
      /* state   x/x  x/d  x/0  x/-  d/x  d/d  d/0  d/-
67
                 0/x  0/d  0/0  0/-  -/x  -/d  -/0  -/- */
68
 
69
      /* S_N */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
70
                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
71
      /* S_I */  CMP, -1,  -1,  CMP, +1,  LEN, LEN, CMP,
72
                 +1,  LEN, LEN, CMP, CMP, CMP, CMP, CMP,
73
      /* S_F */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
74
                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
75
      /* S_Z */  CMP, +1,  +1,  CMP, -1,  CMP, CMP, CMP,
76
                 -1,  CMP, CMP, CMP
77
  };
78
 
79
  if (p1 == p2)
80
    return 0;
81
 
82
  c1 = *p1++;
83
  c2 = *p2++;
84
  /* Hint: '0' is a digit too.  */
85
  state = S_N | ((c1 == '0') + (isdigit (c1) != 0));
86
 
87
  while ((diff = c1 - c2) == 0 && c1 != '\0')
88
    {
89
      state = next_state[state];
90
      c1 = *p1++;
91
      c2 = *p2++;
92
      state |= (c1 == '0') + (isdigit (c1) != 0);
93
    }
94
 
95
  state = result_type[state << 2 | (((c2 == '0') + (isdigit (c2) != 0)))];
96
 
97
  switch (state)
98
  {
99
    case CMP:
100
      return diff;
101
 
102
    case LEN:
103
      while (isdigit (*p1++))
104
        if (!isdigit (*p2++))
105
          return 1;
106
 
107
      return isdigit (*p2) ? -1 : diff;
108
 
109
    default:
110
      return state;
111
  }
112
}
113
weak_alias (__strverscmp, strverscmp)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.