1
0
mirror of https://gittea.dev/nova/th.git synced 2025-10-21 10:20:15 -04:00

Compare commits

...

2 Commits

Author SHA1 Message Date
nova
c6763233bf resolved all compiler warnings so far 2025-09-30 22:05:26 +02:00
nova
7ee16c8f4a now accounting for hardlinks & refactored sorting 2025-09-30 21:54:56 +02:00
5 changed files with 68 additions and 67 deletions

29
dir.c
View File

@@ -28,7 +28,6 @@ linked_dir *current_dir;
unsigned long get_dir_size(char *path);
void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_content);
void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file *dir_content);
char recursive_delete(file current_file);
@@ -91,9 +90,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 +244,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 +305,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);
@@ -380,8 +385,8 @@ void dir_init(){
}
char recursive_delete(file current_file){
if (current_file.file_type & (FILE_TYPE_SYMLINK | FILE_TYPE_DIR)) {
void recursive_delete(file current_file){
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);
@@ -389,14 +394,18 @@ char recursive_delete(file current_file){
file *current_dir = malloc(current_file_count * sizeof(file));
memset(current_dir, '\0', current_file_count * sizeof(file));
get_dir_content(current_file.file_name, &current_file_count, current_dir);
chdir(current_file.file_name);
if (chdir(current_file.file_name) != 0) {
return;
}
unsigned long i;
for (i = 0; i < current_file_count; i++) {
recursive_delete(current_dir[i]);
free(current_dir[i].file_name);
}
free(current_dir);
chdir("..");
if (chdir("..") != 0) {
return;
}
}
remove(current_file.file_name);
file_modifiers = file_modifiers_tmp;

2
dir.h
View File

@@ -10,4 +10,4 @@ char update_selected_file();
void dir_set_selected_file_current(unsigned long selected_file_current);
unsigned long dir_get_selected_file_current();
void dir_init();
char recursive_delete(file current_file);
void recursive_delete(file current_file);

View File

@@ -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);
@@ -813,10 +813,12 @@ void paste(){
FILE *cmd_open;
while (1) {
cmd_open = popen(cmd, "r");
getline(&line, &size, cmd_open);
int val = getline(&line, &size, cmd_open);
if (pclose(cmd_open) == 0) {
break;
} else if (val == 0 || val == -1) {
break;
}
cmd = concat(cmd, "_");
}

View File

@@ -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;
}

View File

@@ -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;
}
}