On Monday 16 June 2008 09:47:31 Bernhard Fischer wrote:
> On Mon, Jun 16, 2008 at 08:45:18AM +0200, Tito wrote:
> >On Monday 16 June 2008 06:33:35 you wrote:
>
> >There was one more reason to avoid strlen, but it was just my personal
> >stupid paranoia:
> >
> >as we don't know the lenght of the strings it was difficult to decide
> >the correct type for the result to avoid possible overflows
> >OTOH using the biggest looked like overkill,
> >so I decided to walk to the end of the string instead.
> >
> >> Mine version is:
> >>
> >> char* strrstr(const char *haystack, const char *needle)
> >> {
> >> char *r = NULL;
> >>
> >> if (!needle[0])
> >> return r;
> >> while (1) {
> >> char *p = strstr(haystack, needle);
> >> if (!p)
> >> return r;
> >> r = p;
> >> haystack = p + 1;
> >> }
> >> }
> >>
> >> # ./a.out
> >> 'baaabaaab' vs. 'aaa' : PASSED
> >> 'baaabaaaab' vs. 'aaa' : PASSED
> >> 'baaabaab' vs. 'aaa' : PASSED
> >> 'aaa' vs. 'aaa' : PASSED
> >> 'aaa' vs. 'a' : PASSED
> >> 'aaa' vs. 'bbb' : PASSED
> >> 'a' vs. 'aaa' : PASSED
> >> 'aaa' vs. '' : PASSED
> >> '' vs. 'aaa' : PASSED
> >> '' vs. '' : PASSED
> >> (cases with NULLs are not tested)
> >>
> >> Comparing with current busybox:
> >>
> >> function old new delta
> >> strrstr 53 42 -11
>
> Sounds good. Please apply.
> >./test2
> >strstr(aaa,"") returns not-NULL
> >aaa
> >strstr("","") returns not-NULL
>
> For practical reasons i would return NULL if one of them is NULL or ""
> to avoid checks in the callers.
>
Hi, just for fun,
one more variant that seems to pass the tests as modified (for "")
char* strrstr(const char *haystack, const char *needle)
{
char *s = NULL;
while (*haystack) {
s = (strstr(haystack++, needle)) ? : s;
}
return s;
}
but size on my system is the same as Denys' version.... :(
scripts/bloat-o-meter busybox_old busybox_unstripped
function old new delta
strrstr 53 42 -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-11) Total: -11 bytes
Ciao,
Tito
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox