mirror of
https://gittea.dev/nova/th.git
synced 2025-10-22 02:40:15 -04:00
now accounting for hardlinks & refactored sorting
This commit is contained in:
92
sorting.c
92
sorting.c
@@ -12,12 +12,14 @@ extern unsigned int settings;
|
||||
extern unsigned int file_modifiers;
|
||||
|
||||
int skip_hidden_files(const struct dirent *entry){
|
||||
|
||||
if (entry->d_name[0] == '.') {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int skip_dot(const struct dirent *entry){
|
||||
|
||||
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
|
||||
return 0;
|
||||
}
|
||||
@@ -26,10 +28,10 @@ int skip_dot(const struct dirent *entry){
|
||||
|
||||
int sort_natural(const void *file0, const void *file1){
|
||||
|
||||
if (((file*)file0)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR) && !(((file*)file1)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR))) {
|
||||
if ((((file*)file0)->file_type & FILE_TYPE_DIR) && !(((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return -1;
|
||||
}
|
||||
if (!(((file*)file0)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) && ((file*)file1)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) {
|
||||
if (!(((file*)file0)->file_type & FILE_TYPE_DIR) && (((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return 1;
|
||||
}
|
||||
const unsigned char *a = (unsigned char*)((file*)file0)->file_name;
|
||||
@@ -99,70 +101,58 @@ int sort_natural(const void *file0, const void *file1){
|
||||
return result;
|
||||
}
|
||||
int sort_alpha(const void *file0, const void *file1){
|
||||
char *file_name0 = ((file*)file0)->file_name;
|
||||
char *file_name1 = ((file*)file1)->file_name;
|
||||
return strcmp(file_name0, file_name1);
|
||||
|
||||
if ((((file*)file0)->file_type & FILE_TYPE_DIR) && !(((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return -1;
|
||||
}
|
||||
if (!(((file*)file0)->file_type & FILE_TYPE_DIR) && (((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return strcmp(((file*)file0)->file_name, ((file*)file1)->file_name);
|
||||
}
|
||||
int sort_random(const void *file0, const void *file1){
|
||||
|
||||
if (((file*)file0)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR) && !(((file*)file1)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR))) {
|
||||
if ((((file*)file0)->file_type & FILE_TYPE_DIR) && !(((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return -1;
|
||||
}
|
||||
if (!(((file*)file0)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) && ((file*)file1)->file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) {
|
||||
if (!(((file*)file0)->file_type & FILE_TYPE_DIR) && (((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return ((rand()%3)-1);
|
||||
|
||||
}
|
||||
int sort_type(const void *file0, const void *file1){
|
||||
unsigned char file_type0 = ((file*)file0)->file_type;
|
||||
unsigned char file_type1 = ((file*)file1)->file_type;
|
||||
char *file_name0 = ((file*)file0)->file_name;
|
||||
char *file_name1 = ((file*)file1)->file_name;
|
||||
if (file_type0 == file_type1) {
|
||||
return strcasecmp(file_name0, file_name1);
|
||||
} else if (file_type0 == FILE_TYPE_DIR || file_type0 == FILE_TYPE_SYMLINK) {
|
||||
return -1;
|
||||
} else if (file_type1 == FILE_TYPE_DIR || file_type1 == FILE_TYPE_SYMLINK) {
|
||||
return 1;
|
||||
} else {
|
||||
if (file_type0 > file_type1) {
|
||||
|
||||
if ((((file*)file0)->file_type & FILE_TYPE_DIR) && !(((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return -1;
|
||||
} else if (file_type0 < file_type1) {
|
||||
return 1;
|
||||
} else {
|
||||
return strcasecmp(file_name0, file_name1);
|
||||
}
|
||||
}
|
||||
if (!(((file*)file0)->file_type & FILE_TYPE_DIR) && (((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (((file*)file0)->file_type == ((file*)file1)->file_type) {
|
||||
/*somehow relying on the else below, occasionaly trips either one of the checked for conditions*/
|
||||
return strcasecmp(((file*)file0)->file_name, ((file*)file1)->file_name);
|
||||
} else if (((file*)file0)->file_type > ((file*)file1)->file_type) {
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int sort_size(const void *file0, const void *file1){
|
||||
unsigned char file_type0 = ((file*)file0)->file_type;
|
||||
unsigned char file_type1 = ((file*)file1)->file_type;
|
||||
unsigned long file_size0 = ((file*)file0)->file_size;
|
||||
unsigned long file_size1 = ((file*)file1)->file_size;
|
||||
char *file_name0 = ((file*)file0)->file_name;
|
||||
char *file_name1 = ((file*)file1)->file_name;
|
||||
if (file_type0 == file_type1) {
|
||||
if (file_size0 > file_size1) {
|
||||
|
||||
if ((((file*)file0)->file_type & FILE_TYPE_DIR) && !(((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return -1;
|
||||
} else if (file_size0 < file_size1) {
|
||||
return 1;
|
||||
} else {
|
||||
return strcasecmp(file_name0, file_name1);
|
||||
}
|
||||
} else {
|
||||
if (file_type0 == FILE_TYPE_DIR || file_type0 == FILE_TYPE_SYMLINK) {
|
||||
return -1;
|
||||
} else if (file_type1 == FILE_TYPE_DIR || file_type1 == FILE_TYPE_SYMLINK) {
|
||||
return 1;
|
||||
} else {
|
||||
if (file_size0 > file_size1) {
|
||||
return -1;
|
||||
} else if (file_size0 < file_size1) {
|
||||
return 1;
|
||||
} else {
|
||||
return strcasecmp(file_name0, file_name1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!(((file*)file0)->file_type & FILE_TYPE_DIR) && (((file*)file1)->file_type & FILE_TYPE_DIR)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (((file*)file0)->file_size == ((file*)file1)->file_size) {
|
||||
return strcasecmp(((file*)file0)->file_name, ((file*)file1)->file_name);
|
||||
} else if (((file*)file0)->file_size > ((file*)file1)->file_size) {
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user