/* memrchr -- find the last occurrence of a byte in a memory block
- Copyright (C) 1991, 1993, 1996, 1997, 1999, 2000, 2003, 2004, 2005,
- 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2011 Free Software
+ Foundation, Inc.
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
with help from Dan Sahlin (dan@sics.se) and
#include <string.h>
#include <limits.h>
-#include "intprops.h"
-
#undef __memrchr
-#undef memrchr
+#ifdef _LIBC
+# undef memrchr
+#endif
#ifndef weak_alias
# define __memrchr memrchr
performance. On 64-bit hardware, unsigned long is generally 64
bits already. Change this typedef to experiment with
performance. */
- typedef unsigned long longword;
+ typedef unsigned long int longword;
const unsigned char *char_ptr;
const longword *longword_ptr;
repeated_one = 0x01010101;
repeated_c = c | (c << 8);
repeated_c |= repeated_c << 16;
- if (0xffffffffU < TYPE_MAXIMUM (longword))
+ if (0xffffffffU < (longword) -1)
{
repeated_one |= repeated_one << 31 << 1;
repeated_c |= repeated_c << 31 << 1;
if (8 < sizeof (longword))
- {
- size_t i;
-
- for (i = 64; i < sizeof (longword) * 8; i *= 2)
- {
- repeated_one |= repeated_one << i;
- repeated_c |= repeated_c << i;
- }
- }
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
}
/* Instead of the traditional loop which tests each byte, we will test a
longword longword1 = *--longword_ptr ^ repeated_c;
if ((((longword1 - repeated_one) & ~longword1)
- & (repeated_one << 7)) != 0)
- {
- longword_ptr++;
- break;
- }
+ & (repeated_one << 7)) != 0)
+ {
+ longword_ptr++;
+ break;
+ }
n -= sizeof (longword);
}
while (n-- > 0)
{
if (*--char_ptr == c)
- return (void *) char_ptr;
+ return (void *) char_ptr;
}
return NULL;