103 lines
2.8 KiB
C
103 lines
2.8 KiB
C
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;
|
|
}
|
|
|