completion: small optimization
[gitweb.git] / builtin / mailsplit.c
index 2d4327801e4f7766328389311c87dd63d4c5f8e4..06296d4bdf607431bfcb38f0bc6720f555d6917a 100644 (file)
@@ -130,6 +130,27 @@ static int populate_maildir_list(struct string_list *list, const char *path)
        return 0;
 }
 
+static int maildir_filename_cmp(const char *a, const char *b)
+{
+       while (*a && *b) {
+               if (isdigit(*a) && isdigit(*b)) {
+                       long int na, nb;
+                       na = strtol(a, (char **)&a, 10);
+                       nb = strtol(b, (char **)&b, 10);
+                       if (na != nb)
+                               return na - nb;
+                       /* strtol advanced our pointers */
+               }
+               else {
+                       if (*a != *b)
+                               return (unsigned char)*a - (unsigned char)*b;
+                       a++;
+                       b++;
+               }
+       }
+       return (unsigned char)*a - (unsigned char)*b;
+}
+
 static int split_maildir(const char *maildir, const char *dir,
        int nr_prec, int skip)
 {
@@ -139,6 +160,8 @@ static int split_maildir(const char *maildir, const char *dir,
        int i;
        struct string_list list = STRING_LIST_INIT_DUP;
 
+       list.cmp = maildir_filename_cmp;
+
        if (populate_maildir_list(&list, maildir) < 0)
                goto out;