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 }