static void display_type(dir_t *dir); static void display_permission(dir_t *dir); static void display_size(dir_t *dir, i32 max_size); static void display_date(dir_t *dir); static void display_path(dir_t *dir); i32 display_files_stat(t_list **files) { if (!files) return 0; if (ft_lstsize(*files) <= 0) { ft_printf("total 0\n"); return 0; } i32 max_size = ft_get_size(((dir_t*)(*files)->content)->lstat.st_size); 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); total += dir->lstat.st_blocks; } ft_printf("total %d\n", total / 2); i32 drawed = 0; for (cur = *files; cur != NULL; cur = cur->next) { dir_t *dir = (dir_t*)(cur)->content; display_single_stat(dir, max_size); drawed++; ft_printf("\n"); } return drawed; } void display_single_stat(dir_t *dir, i32 max_size) { if (!dir) return; display_type(dir); display_permission(dir); ft_printf(" "); ft_printf("%d", dir->lstat.st_nlink); ft_printf(" "); if (dir->psswd) ft_printf("%s", dir->psswd->pw_name); ft_printf(" "); if (dir->grp) ft_printf("%s", dir->grp->gr_name); ft_printf(" "); display_size(dir, max_size); ft_printf(" "); display_date(dir); ft_printf(" "); display_name(dir); if (S_ISLNK(dir->lstat.st_mode)) display_path(dir); } static void display_type(dir_t *dir) { if (!dir) return; if (S_ISLNK(dir->lstat.st_mode)) ft_printf("l"); else if (!dir->is_file) ft_printf("d"); else if (S_ISSOCK(dir->lstat.st_mode)) ft_printf("s"); else if (S_ISFIFO(dir->lstat.st_mode)) ft_printf("p"); else if (S_ISCHR(dir->lstat.st_mode)) ft_printf("c"); else if (S_ISBLK(dir->lstat.st_mode)) ft_printf("b"); else ft_printf("-"); } static void display_permission(dir_t *dir) { if (!dir) return; char buf[10]; strmode(dir->stat.st_mode, buf); ft_printf("%s", buf); } static void display_size(dir_t *dir, i32 max_size) { if (!dir) return; i32 len = ft_get_size(dir->lstat.st_size); for (int i = max_size - len; i > 0; i--) ft_printf(" "); ft_printf("%d", dir->lstat.st_size); } static void display_date(dir_t *dir) { if (!dir) return; struct timespec last_edit = dir->lstat.st_mtim; char *base_time_str = ctime(&last_edit.tv_sec); if (!base_time_str) return; char *time_str = ft_substr(base_time_str, 4, ft_strlen(base_time_str) - 14); if (!time_str) return; ft_printf(time_str); free(time_str); } static void display_path(dir_t *dir) { if (!dir || !dir->path) return; char buf[512] = {[0 ... 511] = 0}; i32 error = readlink(dir->path, buf, dir->lstat.st_size); if (error == -1) return; ft_printf(" -> %s", buf); }