428
|
1 /* This file is part of XEmacs.
|
|
2
|
|
3 XEmacs is free software; you can redistribute it and/or modify it
|
|
4 under the terms of the GNU General Public License as published by the
|
|
5 Free Software Foundation; either version 2, or (at your option) any
|
|
6 later version.
|
|
7
|
|
8 XEmacs is distributed in the hope that it will be useful, but WITHOUT
|
|
9 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
10 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
11 for more details.
|
|
12
|
|
13 You should have received a copy of the GNU General Public License
|
|
14 along with XEmacs; see the file COPYING. If not, write to
|
|
15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
16 Boston, MA 02111-1307, USA. */
|
|
17
|
|
18 /* Synched up with: Not in FSF. */
|
|
19
|
|
20 /* In SunOS 4.1.1 the strcmp and strncmp functions reference memory
|
|
21 past the last byte of the string! This will core dump if the memory
|
|
22 following the last byte is not mapped.
|
|
23
|
|
24 Here are correct versions by hbs@lucid.com.
|
|
25 */
|
|
26
|
|
27 # include <config.h>
|
|
28 # ifndef REGISTER /* Strictly enforced in 20.3 */
|
|
29 # define REGISTER
|
|
30 # endif
|
|
31
|
|
32 #include <string.h>
|
|
33 #define ALIGNED(x) (!(((unsigned long) (x)) & (sizeof (unsigned long) - 1)))
|
|
34
|
|
35 #define MAGIC 0x7efefeff
|
|
36 #define HIGH_BIT_P(c) ((c) & hi_bit)
|
|
37 #define HAS_ZERO(c) (((((c) + magic) ^ (c)) & not_magic) != not_magic)
|
|
38
|
|
39 int
|
|
40 strcmp (const char *x, const char *y)
|
|
41 {
|
|
42 if (x == y)
|
|
43 return 0;
|
|
44 else if (ALIGNED (x) && ALIGNED (y))
|
|
45 {
|
442
|
46 const unsigned long *x1 = (const unsigned long *) x;
|
|
47 const unsigned long *y1 = (const unsigned long *) y;
|
428
|
48 unsigned long c;
|
|
49 unsigned long magic = MAGIC;
|
|
50 unsigned long not_magic = ~magic;
|
|
51 unsigned long hi_bit = 0x80000000;
|
|
52
|
|
53 while ((c = *x1) == *y1)
|
|
54 {
|
|
55 if (HAS_ZERO(c))
|
|
56 {
|
|
57 if (!HIGH_BIT_P (c))
|
|
58 return 0;
|
|
59 else
|
|
60 {
|
442
|
61 x = (const char *) x1;
|
|
62 y = (const char *) y1;
|
428
|
63 goto slow_loop;
|
|
64 }
|
|
65 }
|
|
66
|
|
67 x1++;
|
|
68 y1++;
|
|
69 }
|
|
70
|
442
|
71 x = (const char *) x1;
|
|
72 y = (const char *) y1;
|
428
|
73 goto slow_loop;
|
|
74 }
|
|
75 else
|
|
76 {
|
|
77 char c;
|
|
78
|
|
79 slow_loop:
|
|
80
|
|
81 while ((c = *x) == *y)
|
|
82 {
|
|
83 if (c == (char) 0) return 0;
|
|
84 x++;
|
|
85 y++;
|
|
86 }
|
|
87 return (*x - *y);
|
|
88 }
|
|
89 }
|
|
90
|
|
91
|
|
92 int
|
442
|
93 strncmp (const char *x, const char *y, size_t n)
|
428
|
94 {
|
|
95 if ((x == y) || (n <= 0))
|
|
96 return 0;
|
|
97 else if (ALIGNED (x) && ALIGNED (y))
|
|
98 {
|
442
|
99 const unsigned long *x1 = (const unsigned long *) x;
|
|
100 const unsigned long *y1 = (const unsigned long *) y;
|
428
|
101 unsigned long c;
|
|
102 unsigned long magic = MAGIC;
|
|
103 unsigned long not_magic = ~magic;
|
|
104 unsigned long hi_bit = 0x80000000;
|
|
105
|
|
106 while ((c = *x1) == *y1)
|
|
107 {
|
|
108 n -= sizeof (unsigned long);
|
|
109 if (n <= 0)
|
|
110 return 0;
|
|
111
|
|
112 if (HAS_ZERO(c))
|
|
113 {
|
|
114 if (!HIGH_BIT_P (c))
|
|
115 return 0;
|
|
116 else
|
|
117 {
|
442
|
118 x = (const char *) x1;
|
|
119 y = (const char *) y1;
|
428
|
120 goto slow_loop;
|
|
121 }
|
|
122 }
|
|
123
|
|
124 x1++;
|
|
125 y1++;
|
|
126 }
|
|
127
|
442
|
128 x = (const char *) x1;
|
|
129 y = (const char *) y1;
|
428
|
130 goto slow_loop;
|
|
131 }
|
|
132 else
|
|
133 {
|
|
134 char c;
|
|
135
|
|
136 slow_loop:
|
|
137
|
|
138 while ((c = *x) == *y)
|
|
139 {
|
|
140 n--;
|
|
141 if (n <= 0)
|
|
142 return 0;
|
|
143 if (c == (char) 0)
|
|
144 return 0;
|
|
145 x++;
|
|
146 y++;
|
|
147 }
|
|
148 return (*x - *y);
|
|
149 }
|
|
150 }
|