ft_ls/src/display.c
2025-01-10 17:12:17 +01:00

106 lines
2.6 KiB
C

static void display_recursive(dir_t *dir);
void space_between_files(t_list **files, dir_t *file) {
if (win.ws_col == 0) {
ft_printf("\n");
return;
}
u32 max = 0, i = 0, index_file = 0, count = 0;
for (t_list *cur = *files; cur != NULL; cur = cur->next) {
dir_t *cur_file = (dir_t*)(cur)->content;
u32 len = ft_strlen(cur_file->name);
count += len;
max = MAX(len, max);
if (ft_strcmp(cur_file->name, file->name) == 0)
index_file = i;
i++;
}
max += 1;
u32 col = MAX(win.ws_col / max, 1);
u32 line = index_file % col;
if (count <= win.ws_col)
ft_printf(" ");
else if (col >= i && index_file != i - 1)
ft_printf(" ");
else if (col >= i && index_file == i - 1)
ft_printf("\n");
else if (line == col - 1 || index_file == i - 1)
ft_printf("\n");
else
for (i = 0; i < max - ft_strlen(file->name); i++)
ft_printf(" ");
}
void
display_name(dir_t *dir) {
ft_printf("%s", dir->name);
}
void
display_directory(dir_t *dir) {
if (flags.R) {
if (!dir->is_file)
display_recursive(dir);
}
else {
t_list **files = get_all_in(dir);
if (!files)
return;
display_files(files);
free_files(files);
}
}
i32
display_files(t_list **files) {
i32 drawed = 0;
if (flags.l)
return display_files_stat(files);
else {
for (t_list *cur = *files; cur != NULL; cur = cur->next) {
dir_t *dir = (dir_t*)(cur)->content;
display_name(dir);
drawed++;
if (cur->next != NULL)
space_between_files(files, dir);
}
if (drawed > 0)
ft_printf("\n");
}
return drawed;
}
static void
to_print_return_of_line() {
static int need_to_return_of_line = 0;
if (!need_to_return_of_line)
need_to_return_of_line = 1;
else {
ft_printf("\n");
}
}
static void
display_recursive(dir_t *dir) {
if (dir->is_file)
return;
to_print_return_of_line();
ft_printf("%s:\n", dir->path);
t_list **files = get_all_in(dir);
if (!files)
return;
display_files(files);
for (t_list *cur = *files; cur != NULL; cur = cur->next) {
dir_t *cur_dir = (dir_t*)cur->content;
if (!cur_dir->is_file
&& ft_strcmp(".", cur_dir->path + ft_strlen(cur_dir->path) - 1) != 0
&& ft_strcmp("..", cur_dir->path + ft_strlen(cur_dir->path) - 2) != 0)
display_recursive(cur_dir);
}
free_files(files);
}