ft_ls/src/directory.c
2025-01-10 09:12:14 +01:00

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