]> granicus.if.org Git - php/commitdiff
Loop invariant code motion
authorDmitry Stogov <dmitry@zend.com>
Wed, 3 Mar 2021 23:10:10 +0000 (02:10 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 3 Mar 2021 23:10:10 +0000 (02:10 +0300)
ext/standard/strnatcmp.c

index 3cdba2adf2e57c16cdef66b78b71935f1cd4c71d..8171b802e9507631c9ee4a363980b4064f13d403 100644 (file)
@@ -92,7 +92,6 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
        char const *aend = a + a_len,
                           *bend = b + b_len;
        int fractional, result;
-       short leading = 1;
 
        if (a_len == 0 || b_len == 0) {
                return (a_len == b_len ? 0 : (a_len > b_len ? 1 : -1));
@@ -100,19 +99,19 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
 
        ap = a;
        bp = b;
-       while (1) {
-               ca = *ap; cb = *bp;
 
-               /* skip over leading zeros */
-               while (leading && ca == '0' && (ap+1 < aend) && isdigit((int)(unsigned char)*(ap+1))) {
-                       ca = *++ap;
-               }
+       ca = *ap; cb = *bp;
 
-               while (leading && cb == '0' && (bp+1 < bend) && isdigit((int)(unsigned char)*(bp+1))) {
-                       cb = *++bp;
-               }
+       /* skip over leading zeros */
+       while (ca == '0' && (ap+1 < aend) && isdigit((int)(unsigned char)*(ap+1))) {
+               ca = *++ap;
+       }
+
+       while (cb == '0' && (bp+1 < bend) && isdigit((int)(unsigned char)*(bp+1))) {
+               cb = *++bp;
+       }
 
-               leading = 0;
+       while (1) {
 
                /* Skip consecutive whitespace */
                while (isspace((int)(unsigned char)ca)) {
@@ -166,6 +165,8 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
                        return -1;
                else if (bp >= bend)
                        return 1;
+
+               ca = *ap; cb = *bp;
        }
 }
 /* }}} */