Hi,
attached you will find a patch that shrinks libbb's last_char_is function.
bloatcheck is:

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
 981219   16907    1872  999998   f423e busybox_old
 981208   16907    1872  999987   f4233 busybox_unstripped

Patch for review:

--- libbb/last_char_is.c.orig   2020-07-05 09:54:24.737931000 +0200
+++ libbb/last_char_is.c        2020-07-06 14:29:27.768898574 +0200
@@ -11,14 +11,7 @@
 /* Find out if the last character of a string matches the one given */
 char* FAST_FUNC last_char_is(const char *s, int c)
 {
-       if (s) {
-               size_t sz = strlen(s);
-               /* Don't underrun the buffer if the string length is 0 */
-               if (sz != 0) {
-                       s += sz - 1;
-                       if ((unsigned char)*s == c)
-                               return (char*)s;
-               }
-       }
-       return NULL;
-}
+       if (!s || !*s) return NULL;
+    while (*(s + 1)) s++;
+       return (*s == c) ? (char *) s : NULL;
+}


The alternative version:

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

that was also posted to the list on my system was bigger:

function                                             old     new   delta
last_char_is                                          53      46      -7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-7)               Total: -7 bytes

Ciao,
Tito


P.S.: test program, if you are aware of other corner cases please tell me:
____________________________________________________________________________

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

int main (int argc, char **argv) {
        char *c;
        int ret = 0;

        printf("Test 1 'prova','a' : ");
        c = last_char_is("prova", 'a');
        if (c !=  NULL && *c == 'a') {
                puts("PASSED");
        } else {
                puts("FAILED");
                ret |= 1;
        }
        printf("Test 2 ''     ,'x' : ");
        c = last_char_is("", 'x');
        if (c != NULL) {
                puts("FAILED");
                ret |= 1;
                
        } else {
                puts("PASSED");
        }
        printf("Test 3  NULL  ,'3' : ");
        c = last_char_is(NULL, 'e');
        if (c != NULL) {
                puts("FAILED");
                ret |= 1;
        } else {
                puts("PASSED");
        }
        printf("Test 4 'prova','x' : ");
        c = last_char_is("prova", 'x');
        if (c != NULL) {
                puts("FAILED"); 
                ret |= 1;
        } else {
                puts("PASSED");
        }
        printf("Test 5 'prova','\\n': ");
        c = last_char_is("prova", '\n');
        if (c != NULL) {
                puts("FAILED");
                ret |= 1;
        } else {
                puts("PASSED");
        }
        printf("Test 6 'prova','\\0': ");
        c = last_char_is("prova", 0);
        if (c != NULL) {
                puts("FAILED");
                ret |= 1;
        } else {
                puts("PASSED");
        }
        return ret;
}
____________________________________________________________________________________________
Shrink libbb/last_char_is function more.

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

Signed-off-by: Tito Ragusa <[email protected]>

--- libbb/last_char_is.c.orig	2020-07-05 09:54:24.737931000 +0200
+++ libbb/last_char_is.c	2020-07-06 14:29:27.768898574 +0200
@@ -11,14 +11,7 @@
 /* Find out if the last character of a string matches the one given */
 char* FAST_FUNC last_char_is(const char *s, int c)
 {
-	if (s) {
-		size_t sz = strlen(s);
-		/* Don't underrun the buffer if the string length is 0 */
-		if (sz != 0) {
-			s += sz - 1;
-			if ((unsigned char)*s == c)
-				return (char*)s;
-		}
-	}
-	return NULL;
-}
+	if (!s || !*s) return NULL;
+    while (*(s + 1)) s++;
+	return (*s == c) ? (char *) s : NULL;
+} 

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

Reply via email to