diff options
| -rw-r--r-- | ext/standard/strnatcmp.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/ext/standard/strnatcmp.c b/ext/standard/strnatcmp.c index 2d7ecd8178..a071fd186f 100644 --- a/ext/standard/strnatcmp.c +++ b/ext/standard/strnatcmp.c @@ -116,17 +116,26 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len while (1) { ca = *ap; cb = *bp; - /* skip over leading spaces or zeros */ - while (leading && (isspace((int)(unsigned char)ca) || (ca == '0' && (ap+1 < aend) && !ispunct(*(ap+1))))) { + /* skip over leading zeros unless they are followed by punctuation */ + while (leading && ca == '0' && (ap+1 < aend) && !ispunct(*(ap+1))) { ca = *++ap; } - while (leading && (isspace((int)(unsigned char)cb) || (cb == '0' && (bp+1 < bend) && !ispunct(*(bp+1))))) { + while (leading && cb == '0' && (bp+1 < bend) && !ispunct(*(bp+1))) { cb = *++bp; } leading = 0; + /* Skip consecutive whitespace */ + while (isspace((int)(unsigned char)ca)) { + ca = *++ap; + } + + while (isspace((int)(unsigned char)cb)) { + cb = *++bp; + } + /* process run of digits */ if (isdigit((int)(unsigned char)ca) && isdigit((int)(unsigned char)cb)) { fractional = (ca == '0' || cb == '0'); |
