-
Notifications
You must be signed in to change notification settings - Fork 0
/
display_long.c
102 lines (95 loc) · 3.21 KB
/
display_long.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* display_long.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: itiievsk <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2018/08/13 11:11:18 by itiievsk #+# #+# */
/* Updated: 2018/08/13 11:11:20 by itiievsk ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_ls.h"
static void parse_list(t_pstat *pstat, t_file *file, t_flags *flags)
{
t_file *temp;
int lnk_len;
int size_len;
temp = file;
while (temp)
{
pstat->total += (temp->stat).st_blocks;
temp->type = define_type(temp, pstat);
define_chmod(temp);
get_owner(pstat, temp, flags);
lnk_len = ft_intlen(temp->stat.st_nlink);
size_len = ft_intlen(temp->stat.st_size);
lnk_len > pstat->maxlnk ? pstat->maxlnk = lnk_len : 0;
size_len > pstat->maxsize ? pstat->maxsize = size_len : 0;
temp = temp->next;
}
if (pstat->special && pstat->maxsize < 8)
pstat->maxsize = 8;
}
static void print_time(t_file *temp, t_flags *flags)
{
if (flags->fulltime == 1)
ft_printf("%.20s", ctime(&temp->ftime) + 4);
else
{
if ((time(NULL) - temp->ftime < 15780000 &&
temp->ftime - time(NULL) < 15780000))
ft_printf("%.12s", ctime(&temp->ftime) + 4);
else if ((ctime(&temp->ftime) + 20)[0] != ' ')
ft_printf("%.7s %.4s", ctime(&temp->ftime) + 4,
ctime(&temp->ftime) + 20);
else
ft_printf("%.7s 10000", ctime(&temp->ftime) + 4);
}
}
static void print_size(t_file *temp, t_pstat *pstat)
{
if (!pstat->special)
ft_printf("%*d ", pstat->maxsize, temp->stat.st_size);
else
{
if (temp->type == 'c' || temp->type == 'b')
{
if (ft_intlen(major(temp->stat.st_rdev)) < 4)
ft_printf("% 3d,", major(temp->stat.st_rdev));
else
ft_printf(" %#010x,", major(temp->stat.st_rdev));
if (ft_intlen(minor(temp->stat.st_rdev)) < 4)
ft_printf("% 4d ", minor(temp->stat.st_rdev));
else
ft_printf(" %#010x ", minor(temp->stat.st_rdev));
}
else
ft_printf("%*d ", pstat->maxsize, temp->stat.st_size);
}
}
void display_long(t_ls *ls, t_file *file, t_flags *flags)
{
t_file *temp;
t_pstat *pstat;
temp = file;
pstat = (t_pstat*)malloc(sizeof(t_pstat));
init_pstat(pstat);
parse_list(pstat, file, flags);
(file != ls->files && file) ? ft_printf("total %d\n", pstat->total) : 0;
while (temp && ls)
{
ft_printf("%c%s %*d %-*s%-*s",
temp->type, temp->chmod, pstat->maxlnk, temp->stat.st_nlink,
pstat->maxusr, temp->user, pstat->maxgrp, temp->group);
print_size(temp, pstat);
print_time(temp, flags);
ft_printf(" %s", temp->name);
pf_flags_display(temp, flags);
if (temp->type == 'l' && temp->target)
ft_printf(" -> %s", temp->target);
write(1, "\n", 1);
temp = temp->next;
}
free(pstat);
}