diff -r -u3 imap-4.5_datefix_pre/src/osdep/unix/maildir.c imap-4.5_datefix_post/src/osdep/unix/maildir.c --- imap-4.5_datefix_pre/src/osdep/unix/maildir.c Wed Nov 10 16:54:15 1999 +++ imap-4.5_datefix_post/src/osdep/unix/maildir.c Mon Sep 10 12:22:22 2001 @@ -542,7 +542,30 @@ int maildir_namesort (struct direct **d1,struct direct **d2) { - return strcmp ((*d1)->d_name,(*d2)->d_name); + /* Return +1/0/-1 if d1 is greater/same/less than d2 */ + char *s1, *s2, *x1, *x2; + int lendiff; + + s1 = (*d1)->d_name; + s2 = (*d2)->d_name; + + if (isdigit(*s1) && isdigit(*s2)) + { + /* scan off any leading zeros */ + for( ; *s1 == '0'; s1++); + for( ; *s2 == '0'; s2++); + /* scan off any remaining digits */ + for(x1=s1; isdigit(*x1); x1++); + for(x2=s2; isdigit(*x2); x2++); + /* Find difference of length of numbers without leading zeros + as length(number 1) - length(number 2). */ + lendiff = (x1-s1) - (x2-s2); + if (lendiff != 0) + return lendiff > 0 ? 1 : -1; + /* If control reaches here then the the lengths of the numbers + match, so we can compare strings with leading zeros removed. */ + } + return strcmp (s1, s2); }