void strmode(mode_t mode, char *buf) { const char chars[] = "rwxrwxrwx"; for (size_t i = 0; i < 9; i++) buf[i] = (mode & (1 << (8-i))) ? chars[i] : '-'; buf[9] = '\0'; } void delete_directory(void *deleted) { t_list *lst = (t_list*)deleted; dir_t *dir = (dir_t*)lst->content; free(dir->path); free(dir); } void remove_all_end_character(char *str, char c) { for (i32 i = ft_strlen(str) - 1; i >= 0; i--) { if (str[i] != c) return; str[i] = '\0'; } } t_list ** get_all_in(dir_t *dir) { struct dirent *in_dir; t_list **head = ft_calloc(1, sizeof(t_list*)); while ((in_dir = readdir(dir->dir)) != nullptr) { if (!flags.a && ft_strncmp(".", in_dir->d_name, 1) == 0) continue; remove_all_end_character(dir->path, '/'); char *new_path = ft_strlcats(3, dir->path, "/", in_dir->d_name); dir_t *new_dir = get_directory_files(new_path); free(new_path); if (!new_dir) continue; new_dir->name = in_dir->d_name; if (ft_strcmp(new_dir->name, "switchpro_rstick_click_md.png") == 0) ft_printf(""); add_sort(head, new_dir, false); } return head; } static bool compare_name(char *s1, char *s2); static bool compare_time(dir_t *dir1, dir_t *dir2); void add_sort(t_list **head, dir_t *new_dir, bool file_priority) { t_list *cur = *head, *prev = NULL; for (; cur != nullptr; prev = cur, cur = cur->next) { dir_t *cur_dir = ((dir_t *)cur->content); if (file_priority && !cur_dir->is_file && new_dir->is_file) break; else if (file_priority && cur_dir->is_file && !new_dir->is_file) continue; if (flags.t) { if (compare_time(new_dir, cur_dir)) break; } else if (compare_name(new_dir->name, cur_dir->name)) break; } t_list *new = ft_lstnew(new_dir); if (!prev) *head = new; else prev->next = new; new->next = cur; } static bool compare_name(char *s1, char *s2) { i32 cmp = ft_strcmp(s1, s2); if ((flags.r && cmp > 0) || (!flags.r && cmp < 0)) return true; return false; } static bool compare_time(dir_t *dir1, dir_t *dir2) { time_t dir1_sec = dir1->lstat.st_mtim.tv_sec; time_t dir2_sec = dir2->lstat.st_mtim.tv_sec; time_t dir1_nsec = dir1->lstat.st_mtim.tv_nsec; time_t dir2_nsec = dir2->lstat.st_mtim.tv_nsec; i64 diff_sec = dir1_sec - dir2_sec; i64 diff_nsec = dir1_nsec - dir2_nsec; if (diff_sec == 0 && diff_nsec == 0) { if (compare_name(dir1->name, dir2->name)) return true; } else if ((flags.r && (diff_sec < 0 || (diff_sec == 0 && diff_nsec < 0))) || (!flags.r && (diff_sec > 0 || (diff_sec == 0 && diff_nsec > 0)))) return true; return false; }