diff --git a/inc/main.h b/inc/main.h index 1d09863..c400efb 100644 --- a/inc/main.h +++ b/inc/main.h @@ -47,7 +47,7 @@ void display_file(dir_t *dir, i32 max_size); i32 display_files(t_list **files); void display_directory(dir_t *dir); i32 display_files_stat(t_list **files); -void display_single_stat(dir_t *dir, i32 max_size); +void display_single_stat(dir_t *dir, i32 max_size, i32 max_nlink); void space_between_files(t_list **files, dir_t *file); // Directory diff --git a/src/display.c b/src/display.c index a28c053..a25b794 100644 --- a/src/display.c +++ b/src/display.c @@ -7,17 +7,22 @@ void space_between_files(t_list **files, dir_t *file) { return; } - u32 max = 0, i = 0, index_file = 0; + 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; - max = MAX(ft_strlen(cur_file->name), max); + 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 (col >= i && index_file != i - 1) + 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"); diff --git a/src/display_stat.c b/src/display_stat.c index ab5fda6..87d0fe9 100644 --- a/src/display_stat.c +++ b/src/display_stat.c @@ -1,5 +1,6 @@ static void display_type(dir_t *dir); static void display_permission(dir_t *dir); +static void display_nlink(dir_t *dir, i32 max_nlink); static void display_size(dir_t *dir, i32 max_size); static void display_date(dir_t *dir); static void display_path(dir_t *dir); @@ -15,11 +16,13 @@ display_files_stat(t_list **files) { i32 max_size = ft_get_size(((dir_t*)(*files)->content)->lstat.st_size); + i32 max_nlink = ft_get_size(((dir_t*)(*files)->content)->lstat.st_nlink); i32 total = 0; t_list *cur; for (cur = *files; cur != NULL; cur = cur->next) { dir_t *dir = (dir_t*)(cur)->content; max_size = MAX(ft_get_size(dir->lstat.st_size), max_size); + max_nlink = MAX(ft_get_size(dir->lstat.st_nlink), max_nlink); total += dir->lstat.st_blocks; } @@ -28,7 +31,7 @@ display_files_stat(t_list **files) { i32 drawed = 0; for (cur = *files; cur != NULL; cur = cur->next) { dir_t *dir = (dir_t*)(cur)->content; - display_single_stat(dir, max_size); + display_single_stat(dir, max_size, max_nlink); drawed++; ft_printf("\n"); } @@ -36,13 +39,13 @@ display_files_stat(t_list **files) { } void -display_single_stat(dir_t *dir, i32 max_size) { +display_single_stat(dir_t *dir, i32 max_size, i32 max_nlink) { if (!dir) return; display_type(dir); display_permission(dir); ft_printf(" "); - ft_printf("%d", dir->lstat.st_nlink); + display_nlink(dir, max_nlink); ft_printf(" "); if (dir->psswd) ft_printf("%s", dir->psswd->pw_name); @@ -65,7 +68,7 @@ display_type(dir_t *dir) { return; if (S_ISLNK(dir->lstat.st_mode)) ft_printf("l"); - else if (!dir->is_file) + else if (S_ISDIR(dir->lstat.st_mode)) ft_printf("d"); else if (S_ISSOCK(dir->lstat.st_mode)) ft_printf("s"); @@ -88,6 +91,17 @@ display_permission(dir_t *dir) { ft_printf("%s", buf); } +static void +display_nlink(dir_t *dir, i32 max_nlink) { + if (!dir) + return; + i32 len = ft_get_size(dir->lstat.st_nlink); + + for (int i = max_nlink - len; i > 0; i--) + ft_printf(" "); + ft_printf("%d", dir->lstat.st_nlink); +} + static void display_size(dir_t *dir, i32 max_size) { if (!dir) diff --git a/src/parsing.c b/src/parsing.c index 9f6c8a5..c2c82e8 100644 --- a/src/parsing.c +++ b/src/parsing.c @@ -84,8 +84,11 @@ get_directory_files(char *path) { dir->dir = opendir(path); if (dir->dir == NULL) { - if (errno == EACCES) - ft_printf_fd(2, "Permission denied\n"); + if (errno == EACCES) { + ft_printf_fd(2, "ft_ls: cannot access '%s': Permission denied\n", path); + dir->is_file = true; + return dir; + } else if (errno == ENOENT) ft_printf_fd(2, "ft_ls: cannot access '%s': No such file or directory\n", path); else if (errno == ENOTDIR) {