X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmemchr2.c;h=8b105b7f2783d6c83a076ce542dc560d80d47f0a;hb=v0.0-8062-g6b24f60;hp=2e3c7cda6211beb920e6ab3af87a5846cd70f502;hpb=d60f3b0c6b0f93a601acd1cfd3923f94ca05abb0;p=gnulib.git diff --git a/lib/memchr2.c b/lib/memchr2.c index 2e3c7cda6..8b105b7f2 100644 --- a/lib/memchr2.c +++ b/lib/memchr2.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2011 +/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2013 Free Software Foundation, Inc. Based on strlen implementation by Torbjorn Granlund (tege@sics.se), @@ -43,6 +43,7 @@ memchr2 (void const *s, int c1_in, int c2_in, size_t n) typedef unsigned long int longword; const unsigned char *char_ptr; + void const *void_ptr; const longword *longword_ptr; longword repeated_one; longword repeated_c1; @@ -57,14 +58,18 @@ memchr2 (void const *s, int c1_in, int c2_in, size_t n) return memchr (s, c1, n); /* Handle the first few bytes by reading one byte at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s; - n > 0 && (size_t) char_ptr % sizeof (longword) != 0; - --n, ++char_ptr) - if (*char_ptr == c1 || *char_ptr == c2) - return (void *) char_ptr; + Do this until VOID_PTR is aligned on a longword boundary. */ + for (void_ptr = s; + n > 0 && (uintptr_t) void_ptr % sizeof (longword) != 0; + --n) + { + char_ptr = void_ptr; + if (*char_ptr == c1 || *char_ptr == c2) + return (void *) void_ptr; + void_ptr = char_ptr + 1; + } - longword_ptr = (const longword *) char_ptr; + longword_ptr = void_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to any size longwords. */ @@ -125,7 +130,7 @@ memchr2 (void const *s, int c1_in, int c2_in, size_t n) significant bytes (positions j+1..3), but it does not matter since we already have a non-zero bit at position 8*j+7. - Similary, we compute tmp2 = + Similarly, we compute tmp2 = ((longword2 - repeated_one) & ~longword2) & (repeated_one << 7). The test whether any byte in longword1 or longword2 is zero is equivalent