Messages in this thread | | | Date | Wed, 7 May 2008 23:53:17 +0400 | From | Alexey Dobriyan <> | Subject | Re: [PATCH]: improved strnicmp in lib/string.c |
| |
On Wed, May 07, 2008 at 11:51:09PM +0530, Soumyadip Das Mahapatra wrote: > This is somewhat improved version of strnicmp() function in lib/string.c.
Familiarize youself with coding style before sending patches, see kernel/sched.c , fs/dcache.c for good examples.
>I have implemented binary > comparison rather than linear one(which was in the older version).
Obviously buggy.
> --- 2.6.25-vanilla/lib/string.c > +++ 2.6.25-hacked/lib/string.c > @@ -31,32 +10,43 @@ > * @s2: The other string > * @len: the maximum number of characters to compare > */ > +/* This is somewhat faster > + * method compared to the > + * olderone (in case of a large string) > + */ > int strnicmp(const char *s1, const char *s2, size_t len) > { > - /* Yes, Virginia, it had better be unsigned */ > - unsigned char c1, c2; > - > - c1 = c2 = 0; > - if (len) { > - do { > - c1 = *s1; > - c2 = *s2; > - s1++; > - s2++; > - if (!c1) > - break; > - if (!c2) > - break; > - if (c1 == c2) > - continue; > - c1 = tolower(c1); > - c2 = tolower(c2); > - if (c1 != c2) > + /* Yes, i am keeping 'em unsigned too */ > + unsigned char c1, c2, c3, c4; > + unsigned count = 0; > + int flag = -1; > + > + c1 = c2 = c3 = c4 = 0; > + > + if(len > 0) > + { > + for(; count <= len/2; count++) > + { > + c1 = tolower(s1[count]); // well, we > + c2 = tolower(s2[count]); // are ignoring > + c3 = tolower(s1[len-count-1]); // cases > + c4 = tolower(s2[len-count-1]); // thats why
Buggy.
> + > + if(c1 == c2) > + { > + if(c3 != c4) > + { > + flag = 1; > + break; > + } > + } > + else > break; > - } while (--len); > + flag = 0; > + } > } > - return (int)c1 - (int)c2; > -} > + return flag; // return 0 for matching and > +} // nonzero for mismatch > EXPORT_SYMBOL(strnicmp); > #endif
And this function is called at most ~100 character strings, so nobody cares about its performance.
| |