lib/util: Optimise trim_string() to use a single memmove(3)
authorMartin Schwenke <martin@meltin.net>
Sat, 18 Jun 2016 20:47:09 +0000 (06:47 +1000)
committerMartin Schwenke <martins@samba.org>
Mon, 20 Jun 2016 02:47:26 +0000 (04:47 +0200)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Ralph Boehme <slow@samba.org>
Autobuild-User(master): Martin Schwenke <martins@samba.org>
Autobuild-Date(master): Mon Jun 20 04:47:26 CEST 2016 on sn-devel-144

lib/util/util.c

index 683741c60f7677e9f52ee951c53aa9cec1c0edcc..a8bbc158f60dd9c80a3fc5fbe34c26120691efa9 100644 (file)
@@ -802,24 +802,29 @@ _PUBLIC_ bool trim_string(char *s, const char *front, const char *back)
        size_t len;
 
        /* Ignore null or empty strings. */
-       if (!s || (s[0] == '\0'))
+       if (!s || (s[0] == '\0')) {
                return false;
+       }
+       len = strlen(s);
 
        front_len       = front? strlen(front) : 0;
        back_len        = back? strlen(back) : 0;
 
-       len = strlen(s);
-
        if (front_len) {
-               while (len && strncmp(s, front, front_len)==0) {
+               size_t front_trim = 0;
+
+               while (strncmp(s+front_trim, front, front_len)==0) {
+                       front_trim += front_len;
+               }
+               if (front_trim > 0) {
                        /* Must use memmove here as src & dest can
                         * easily overlap. Found by valgrind. JRA. */
-                       memmove(s, s+front_len, (len-front_len)+1);
-                       len -= front_len;
+                       memmove(s, s+front_trim, (len-front_trim)+1);
+                       len -= front_trim;
                        ret=true;
                }
        }
-       
+
        if (back_len) {
                while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {
                        s[len-back_len]='\0';