158 lines
3.9 KiB
C
158 lines
3.9 KiB
C
#include <curses.h>
|
|
#include <dirent.h>
|
|
#include <strings.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "defines.h"
|
|
|
|
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;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
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;
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
int sort_random(const void *file0, const void *file1){
|
|
unsigned char file_type0 = ((file*)file0)->file_type;
|
|
unsigned char file_type1 = ((file*)file1)->file_type;
|
|
static int seed = 0;
|
|
static int random = 0;
|
|
|
|
if (seed == 0) {
|
|
seed = rand();
|
|
}
|
|
if (random == 0) {
|
|
random = seed;
|
|
}
|
|
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) {
|
|
random = random > 1;
|
|
if ((random & 2) == 2) {
|
|
return -1;
|
|
} else {
|
|
if (random & 1){
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
} else {
|
|
if (file_type0 > file_type1) {
|
|
return 1;
|
|
} else if (file_type0 < file_type1) {
|
|
return -1;
|
|
} else {
|
|
random = random > 1;
|
|
if ((random & 2) == 2) {
|
|
return -1;
|
|
} else {
|
|
if (random & 1){
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
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) {
|
|
return -1;
|
|
} else if (file_type0 < file_type1) {
|
|
return 1;
|
|
} else {
|
|
return strcasecmp(file_name0, file_name1);
|
|
}
|
|
}
|
|
}
|
|
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) {
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|