diff --git a/dir.c b/dir.c index 757f859..d3e7e96 100644 --- a/dir.c +++ b/dir.c @@ -91,9 +91,15 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten dir_content[i].color_pair = COLOR_DIR; dir_content[i].file_size = get_dir_size(full_path); } else if (S_ISLNK(file->st_mode)) { - dir_content[i].file_type = FILE_TYPE_SYMLINK; - dir_content[i].color_pair = COLOR_SYMLINK; - dir_content[i].file_size = get_dir_size(full_path); + stat(full_path, file); + if (S_ISDIR(file->st_mode)) { + dir_content[i].file_type = FILE_TYPE_DIR | FILE_TYPE_SYMLINK; + dir_content[i].color_pair = COLOR_SYMLINK; + dir_content[i].file_size = get_dir_size(full_path); + } else { + dir_content[i].file_type = FILE_TYPE_REGULAR | FILE_TYPE_SYMLINK; + dir_content[i].color_pair = COLOR_SYMLINK; + } } else if (file->st_mode & S_IXUSR) { dir_content[i].file_type = FILE_TYPE_EXEC; dir_content[i].color_pair = COLOR_EXEC; @@ -239,7 +245,7 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file } while (file_size > 1 && size_index < size_unit_count); size_char = size_unit[(unsigned)size_index]; - if (dir_content[i].file_type == FILE_TYPE_DIR || dir_content[i].file_type == FILE_TYPE_SYMLINK) { + if (dir_content[i].file_type &= FILE_TYPE_DIR) { offset_back = line_width - (snprintf(NULL,0,"%ld", dir_content[i].file_size) + 1); } else if (size_char =='B') { offset_back = line_width - (snprintf(NULL,0,"%0.0lf %c", printed_size, size_char) + 1); @@ -300,7 +306,7 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file mvwaddnstr(win, i-offset_vertical, offset_front+is_selected, file_name, line_width-offset_front-is_selected-2); free(file_name); - if (dir_content[i].file_type == FILE_TYPE_DIR || dir_content[i].file_type == FILE_TYPE_SYMLINK) { + if (dir_content[i].file_type &= FILE_TYPE_DIR) { mvwprintw(win, i-offset_vertical, offset_back, "%ld", dir_content[i].file_size); }else if (size_char =='B') { mvwprintw(win, i-offset_vertical, offset_back, "%0.0lf %c", printed_size, size_char); @@ -381,7 +387,7 @@ void dir_init(){ } char recursive_delete(file current_file){ - if (current_file.file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) { + if (current_file.file_type & FILE_TYPE_DIR) { unsigned int file_modifiers_tmp = file_modifiers; file_modifiers |= FILE_MODIFIERS_HIDDEN_FILES; unsigned long current_file_count = get_dir_size(current_file.file_name); diff --git a/interactions.c b/interactions.c index 49fc027..c4adfda 100644 --- a/interactions.c +++ b/interactions.c @@ -254,7 +254,7 @@ void move_right(){ if (mid_content->file_name[0] == '\0') { return; } - if (mid_content[selected_file_current].file_type == FILE_TYPE_DIR || mid_content[selected_file_current].file_type == FILE_TYPE_SYMLINK) { + if (mid_content[selected_file_current].file_type &= FILE_TYPE_DIR) { if (chdir(mid_content[selected_file_current].file_name) != 0) { FAIL("move_right", "unhandled error of chdir"); } else { @@ -465,7 +465,7 @@ void delete(){ btm_buffer = concat("deleted: ", file_str); } else { free(btm_buffer); - if (mid_content[selected_file_current].file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) { + if (mid_content[selected_file_current].file_type & FILE_TYPE_DIR) { recursive_delete(mid_content[selected_file_current]); } remove(mid_content[selected_file_current].file_name); diff --git a/sorting.c b/sorting.c index 93dacc8..9399d20 100644 --- a/sorting.c +++ b/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; } diff --git a/threading.c b/threading.c index 594b778..5502074 100644 --- a/threading.c +++ b/threading.c @@ -156,7 +156,7 @@ void *thread_rgt(){ pthread_mutex_unlock(&mutex_mid); if (mid_content[selected_file_current].permissions & S_IRUSR) { - if (file_current.file_type == FILE_TYPE_DIR || file_current.file_type == FILE_TYPE_SYMLINK) { + if (file_current.file_type &= FILE_TYPE_DIR) { #if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0 images_clear(); #endif @@ -281,7 +281,7 @@ void *thread_btm(){ unsigned long i; unsigned long total_dir_size = 0; for(i = 0; i < mid_file_count; i++) { - if (!(mid_content[i].file_type & (FILE_TYPE_DIR | FILE_TYPE_SYMLINK))) { + if (!(mid_content[i].file_type & (FILE_TYPE_DIR))) { total_dir_size += mid_content[i].file_size; } }