ft_ls/src/display_stat.c
2025-01-10 15:30:01 +01:00

130 lines
3 KiB
C

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