diff --git a/sorting.c b/sorting.c index 41f39b1..a5aabfb 100644 --- a/sorting.c +++ b/sorting.c @@ -16,14 +16,27 @@ int skip_hidden_files(const struct dirent *entry){ int sort_natural(const void *file0, const void *file1){ unsigned char file_type0 = ((file*)file0)->file_type; unsigned char file_type1 = ((file*)file1)->file_type; - if (file_type0 > file_type1) { - return 1; - } else if (file_type0 < file_type1) { - return -1; - } else { + + char weight = 0; + if (file_type0 == FILE_TYPE_DIR || file_type0 == FILE_TYPE_SYMLINK) { + weight |= 1; + } + if (file_type1 == FILE_TYPE_DIR || file_type1 == FILE_TYPE_SYMLINK) { + weight |= 2; + } + if (weight == 0 || weight == 3) { char *file_name0 = ((file*)file0)->file_name; char *file_name1 = ((file*)file1)->file_name; return strcasecmp(file_name0, file_name1); + } else { + if (file_type0 > file_type1) { + return 1; + } else if (file_type0 < file_type1) { + return -1; + } else { + char *file_name0 = ((file*)file0)->file_name; + char *file_name1 = ((file*)file1)->file_name; + return strcasecmp(file_name0, file_name1); + } } - }