On 7/3/20 4:58 AM, Jody Bruchon wrote:
> 
> 
> On July 2, 2020 3:26:29 PM EDT, Tito <[email protected]> wrote:
>> hi,
>> just for fun I add my version:
>>
>> char* FAST_FUNC last_char_is(const char *s, int c)  {
>>      while (s && *s && *(s + 1)) s++;
>>      return (c == *s) ? (char *)s : NULL;
>> }
> 
> That's pretty small, but it performs three comparisons for each character 
> until
 the end and effectively scans the string twice in "parallel." If a bad pointer 
is passed in s, it'll segfault at the equality check in the return statement 
even though the first comparison is supposed to be a null pointer safeguard.
Hi,
Ops that slipped through, my copy-paste test case was wrong:

c = last_char_is("NULL", 'e');

Improved version:

char* last_char_is(const char *s, int c)  {
        if (!s || !*s) return NULL;
        while (*(s + 1))s++;
        return (c == *s) ? (char *)s : NULL;
}

or if you like gotos:

char* FAST_FUNC last_char_is(const char *s, int c)
{
        if (!s || !*s) goto OUT;
        while (*(s + 1))s++;
        if (c == *s) return (char *) s;
OUT:
        return NULL;
}

bloatcheck is same for both:
function                                             old     new   delta
last_char_is                                          53      42     -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-11)             Total: -11 bytes
   text    data     bss     dec     hex filename
 980860   16891    1872  999623   f40c7 busybox_old
 980849   16891    1872  999612   f40bc busybox_unstripped

Ciao,
Tito
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to