summaryrefslogtreecommitdiff
path: root/lib/memchr.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1995-05-28 01:55:00 +0000
committerJim Meyering <jim@meyering.net>1995-05-28 01:55:00 +0000
commit4fb3e0f061fbb49ada0463a125bd68a152105358 (patch)
tree9847291d35171d17aeae61d7739a45105fecbf27 /lib/memchr.c
parenta528bd5d9f309442440c5d189adb57e0cbae3e5e (diff)
downloadcoreutils-4fb3e0f061fbb49ada0463a125bd68a152105358.tar.xz
merge with 1.11.4a
Diffstat (limited to 'lib/memchr.c')
-rw-r--r--lib/memchr.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/memchr.c b/lib/memchr.c
index 5114869ea..dc3bec7c8 100644
--- a/lib/memchr.c
+++ b/lib/memchr.c
@@ -33,6 +33,10 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
# define __ptr_t char *
#endif /* C++ or ANSI C. */
+#if defined (_LIBC)
+# include <string.h>
+#endif
+
#if defined (HAVE_LIMITS_H) || defined (_LIBC)
# include <limits.h>
#endif
@@ -62,8 +66,9 @@ memchr (s, c, n)
/* Handle the first few characters by reading one character at a time.
Do this until CHAR_PTR is aligned on a longword boundary. */
- for (char_ptr = s; n > 0 && ((unsigned long int) char_ptr
- & (sizeof (longword) - 1)) != 0;
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && ((unsigned long int) char_ptr
+ & (sizeof (longword) - 1)) != 0;
--n, ++char_ptr)
if (*char_ptr == c)
return (__ptr_t) char_ptr;
@@ -76,9 +81,9 @@ memchr (s, c, n)
/* Bits 31, 24, 16, and 8 of this number are zero. Call these bits
the "holes." Note that there is a hole just to the left of
each byte, with an extra at the end:
-
+
bits: 01111110 11111110 11111110 11111111
- bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
+ bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
The 1-bits make sure that carries propagate to the next 0-bit.
The 0-bits provide holes for carries to fall into. */
@@ -142,10 +147,10 @@ memchr (s, c, n)
/* Add MAGIC_BITS to LONGWORD. */
if ((((longword + magic_bits)
-
+
/* Set those bits that were unchanged by the addition. */
^ ~longword)
-
+
/* Look at only the hole bits. If any of the hole bits
are unchanged, most likely one of the bytes was a
zero. */