[llvm-commits] [llvm] r50821 - /llvm/trunk/include/llvm/ADT/StringExtras.h

Ted Kremenek kremenek at apple.com
Wed May 7 12:17:40 PDT 2008


On May 7, 2008, at 11:45 AM, Bill Wendling wrote:

> On Wed, May 7, 2008 at 11:35 AM, Ted Kremenek <kremenek at apple.com>  
> wrote:
>> +/// CStrInCStrNoCase - Portable version of strcasestr.  Locates  
>> the first
>> +///  occurance of c-string 's1' in string 's2', ignoring case.   
>> Returns
>> +///  NULL if 's1' cannot be found.
>> +static inline const char* CStrInCStrNoCase(const char *s1, const  
>> char *s2) {
>> +
>> +  // Are either strings NULL?
>> +  if (!s1 || !s2)
>> +    return 0;
>> +
>
> Should there be an early return for when s1 and s2 are the same value?

Yes.  Good idea.
>>

>> +  const char *I1=s1, *I2=s2;
>> +
>> +  while (*I1 != '\0' || *I2 != '\0' )
>> +    if (tolower(*I1) != tolower(*I2)) { // No match.  Start over.
>> +      ++s1; I1 = s1; I2 = s2;
>
> If you increment s1 here, then the function's comment is wrong. Do you
> mean to increment s2 instead?

Good catch.  I was thinking of strcasestr, which looks for s2 in s1,  
not s1 in s2.  I need to fix this by incrementing s2 instead.

>> +    }
>> +    else { // Character match.  Advance to the next character.
>> +      ++I1; ++I2;
>> +    }
>> +
>> +  // If we exhausted all of the characters in 's2', then 's1' does  
>> not occur
>> +  // in it.
>> +  return *I2 == '\0' ? 0 : I1;
>
> Is this correct? If we have something like:
>
> s1 = "bar"
> s2 = "foobar"
>
> then I2 will be \0 here, but we still found s1 in there.

Yeah this looks completely wrong.  What about (assuming we increment  
s2 instead of s1):

   return *I1 == '\0' ? s2 : 0;






More information about the llvm-commits mailing list