summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/strnatcmp.c15
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');