#include #include #include #include #include #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); } } } }