looking good, still have to do: CHR and BLK info, and -> link path...
This commit is contained in:
parent
0a4d0b0cb1
commit
c1d3bb9aef
12 changed files with 197 additions and 172 deletions
26
ls/.tags
26
ls/.tags
|
|
@ -1,24 +1,24 @@
|
||||||
Mmain src/main.c /^int main(int ac, char **av)$/
|
Mmain src/main.c /^int main(int ac, char **av)$/
|
||||||
ft_dir_get_ents src/lib_dirs.c /^t_list *ft_dir_get_ents(t_lsdata *topdir)$/
|
ft_dir_get_ents src/lib_dirs.c /^t_list *ft_dir_get_ents(t_lsdata *topdir)$/
|
||||||
|
ft_ent_filter src/lib_dirents.c /^void ft_ent_filter(t_list **ent, char *opts)$/
|
||||||
ft_ent_get_dirs src/lib_dirents.c /^t_list *ft_ent_get_dirs(t_list *ent)$/
|
ft_ent_get_dirs src/lib_dirents.c /^t_list *ft_ent_get_dirs(t_list *ent)$/
|
||||||
ft_ent_handle src/lib_dirents.c /^void ft_ent_handle(t_list **ent, t_lsdata *topdir,/
|
ft_ent_print src/lib_dirents.c /^void ft_ent_print(t_list *ent, char *opts, t_lsdat/
|
||||||
|
ft_ent_sort src/lib_dirents.c /^void ft_ent_sort(t_list **ent, char *opts)$/
|
||||||
ft_error_dir src/lib_error.c /^void ft_error_dir(char *s)$/
|
ft_error_dir src/lib_error.c /^void ft_error_dir(char *s)$/
|
||||||
ft_error_option src/lib_error.c /^void ft_error_option(char c)$/
|
ft_error_option src/lib_error.c /^void ft_error_option(char c)$/
|
||||||
ft_ls_long src/lib_ls_long.c /^int ft_ls_long(t_list *ent)$/
|
ft_ls_long src/ft_ls_long.c /^int ft_ls_long(t_list *ent, t_lsdata *topdir)$/
|
||||||
ft_ls_long_date src/lib_ls_long.c /^void ft_ls_long_date(struct stat *stat)$/
|
ft_ls_long_date src/lib_ls_long.c /^void ft_ls_long_date(struct stat *stat)$/
|
||||||
ft_ls_long_lnk src/lib_ls_long_misc.c /^void ft_ls_long_lnk(t_lsdata *data)$/
|
ft_ls_long_lnk src/lib_ls_long2.c /^int ft_ls_long_lnk(t_lsdata *data)$/
|
||||||
ft_ls_long_middle src/lib_ls_long.c /^int ft_ls_long_middle(struct stat *stat, t_pads */
|
ft_ls_long_middle src/lib_ls_long.c /^int ft_ls_long_middle(struct stat *stat, t_pads */
|
||||||
ft_ls_long_pads src/lib_ls_long_misc.c /^int ft_ls_long_pads(t_list *ent, t_pads *pads)$/
|
ft_ls_long_pads src/lib_ls_long2.c /^int ft_ls_long_pads(t_list *ent, t_pads *pads)$/
|
||||||
ft_ls_long_rights src/lib_ls_long.c /^void ft_ls_long_rights(int st_mode)$/
|
ft_ls_long_rights src/lib_ls_long2.c /^void ft_ls_long_rights(int st_mode)$/
|
||||||
ft_ls_long_total src/lib_ls_long_misc.c /^int ft_ls_long_total(t_list *ent)$/
|
ft_ls_long_total src/lib_ls_long2.c /^void ft_ls_long_total(t_list *ent)$/
|
||||||
ft_ls_long_type src/lib_ls_long.c /^void ft_ls_long_type(unsigned char d_type)$/
|
ft_ls_long_type src/lib_ls_long.c /^void ft_ls_long_type(mode_t m)$/
|
||||||
ft_ls_long_xattr src/lib_ls_long_misc.c /^int ft_ls_long_xattr(char *path)$/
|
ft_ls_long_xattr src/lib_ls_long2.c /^int ft_ls_long_xattr(char *path)$/
|
||||||
ft_ls_print src/lib_print.c /^void ft_ls_print(t_list *ent, char *opts, t_lsdata/
|
ft_ls_short src/ft_ls_short.c /^void ft_ls_short(t_list *ent)$/
|
||||||
ft_ls_print_header src/lib_print.c /^void ft_ls_print_header(char *dirname)$/
|
ft_lsdata_cmp0 src/lib_lsdata.c /^int ft_lsdata_cmp0(t_lsdata *dat, char *dataref)$/
|
||||||
ft_ls_short src/lib_print.c /^void ft_ls_short(t_list *ent)$/
|
|
||||||
ft_lsdata_cmp0 src/lib_lsdata.c /^int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref)/
|
|
||||||
ft_lsdata_cmp_name src/lib_lsdata.c /^int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata */
|
ft_lsdata_cmp_name src/lib_lsdata.c /^int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata */
|
||||||
ft_lsdata_cmp_time src/lib_lsdata.c /^int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata */
|
ft_lsdata_cmp_time src/lib_lsdata.c /^int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata */
|
||||||
ft_lsdata_print src/lib_lsdata.c /^void ft_lsdata_print(t_list *ent)$/
|
ft_lsdata_filename src/lib_lsdata.c /^void ft_lsdata_filename(t_lsdata *data)$/
|
||||||
ft_parse_ls src/lib_parse.c /^void ft_parse_ls(int ac, char **av, t_list **dir, /
|
ft_parse_ls src/lib_parse.c /^void ft_parse_ls(int ac, char **av, t_list **dir, /
|
||||||
ft_parse_ls_options src/lib_parse.c /^int ft_parse_ls_options(int ac, char **av, char */
|
ft_parse_ls_options src/lib_parse.c /^int ft_parse_ls_options(int ac, char **av, char */
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
# define FTLS_H
|
# define FTLS_H
|
||||||
# define ALL_OPTS "lRart"
|
# define ALL_OPTS "lRart"
|
||||||
# include "libft.h"
|
# include "libft.h"
|
||||||
|
# include <errno.h>
|
||||||
# include <dirent.h>
|
# include <dirent.h>
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# include <sys/stat.h>
|
# include <sys/stat.h>
|
||||||
|
|
@ -26,32 +27,33 @@ typedef struct s_pads
|
||||||
int size;
|
int size;
|
||||||
} t_pads;
|
} t_pads;
|
||||||
|
|
||||||
int ft_parse_ls_options(int ac, char **av, char *opts);
|
|
||||||
void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts);
|
void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts);
|
||||||
|
int ft_parse_ls_options(int ac, char **av, char *opts);
|
||||||
|
|
||||||
void ft_lsdata_print(t_list *ent);
|
void ft_lsdata_filename(t_lsdata *data);
|
||||||
int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2);
|
int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2);
|
||||||
int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata *dat2);
|
int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata *dat2);
|
||||||
int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref);
|
int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref);
|
||||||
|
|
||||||
void ft_ent_handle(t_list **ent, t_lsdata *topdir, char *opts, int (*ft_sort)());
|
void ft_ent_filter(t_list **ent, char *opts);
|
||||||
t_list *ft_ent_get_dirs(t_list *ent);
|
void ft_ent_sort(t_list **ent, char *opts);
|
||||||
|
void ft_ent_print(t_list *ent, char *opts, t_lsdata *topdir, t_list *nextdir);
|
||||||
|
|
||||||
|
t_list *ft_ent_get_dirs(t_list *ent);
|
||||||
t_list *ft_dir_get_ents(t_lsdata *dir);
|
t_list *ft_dir_get_ents(t_lsdata *dir);
|
||||||
|
|
||||||
void ft_ls_short(t_list *ent);
|
void ft_ls_short(t_list *ent);
|
||||||
int ft_ls_long(t_list *ent);
|
int ft_ls_long(t_list *ent, t_lsdata *topdir);
|
||||||
int ft_ls_long_total(t_list *ent);
|
|
||||||
|
void ft_ls_long_total(t_list *ent);
|
||||||
int ft_ls_long_pads(t_list *ent, t_pads *pads);
|
int ft_ls_long_pads(t_list *ent, t_pads *pads);
|
||||||
void ft_ls_long_type(unsigned char d_type);
|
void ft_ls_long_type(mode_t m);
|
||||||
void ft_ls_long_rights(int st_mode);
|
void ft_ls_long_rights(int st_mode);
|
||||||
int ft_ls_long_xattr(char *path);
|
int ft_ls_long_xattr(char *path);
|
||||||
int ft_ls_long_middle(struct stat *stat, t_pads *pads);
|
int ft_ls_long_middle(struct stat *stat, t_pads *pads);
|
||||||
void ft_ls_long_date(struct stat *stat);
|
void ft_ls_long_date(struct stat *stat);
|
||||||
void ft_ls_long_lnk(t_lsdata *data);
|
int ft_ls_long_lnk(t_lsdata *data);
|
||||||
|
|
||||||
void ft_ls_print(t_list *ent, char *opts, t_lsdata *topdir);
|
|
||||||
void ft_ls_print_header(char *dirname);
|
|
||||||
|
|
||||||
void ft_error_option(char c);
|
void ft_error_option(char c);
|
||||||
void ft_error_dir(char *s);
|
void ft_error_dir(char *s);
|
||||||
|
|
|
||||||
2
ls/libft
2
ls/libft
|
|
@ -1 +1 @@
|
||||||
Subproject commit d351b97f35fbb2551cfaab92322cac8524112486
|
Subproject commit 27c15060b59c76458da441881cdcb05055db1711
|
||||||
34
ls/src/ft_ls_long.c
Normal file
34
ls/src/ft_ls_long.c
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
#include "ftls.h"
|
||||||
|
|
||||||
|
int ft_ls_long(t_list *ent, t_lsdata *topdir)
|
||||||
|
{
|
||||||
|
t_lsdata *data;
|
||||||
|
struct stat stat;
|
||||||
|
struct dirent *dirent;
|
||||||
|
t_pads pads = {0, 0, 0, 0};
|
||||||
|
|
||||||
|
if (topdir)
|
||||||
|
ft_ls_long_total(ent);
|
||||||
|
if (ft_ls_long_pads(ent, &pads))
|
||||||
|
return (1);
|
||||||
|
while (ent)
|
||||||
|
{
|
||||||
|
data = ent->content;
|
||||||
|
stat = data->stat;
|
||||||
|
dirent = data->dirent;
|
||||||
|
ent = ent->next;
|
||||||
|
|
||||||
|
ft_ls_long_type(stat.st_mode);
|
||||||
|
ft_ls_long_rights(stat.st_mode);
|
||||||
|
if (ft_ls_long_xattr(data->path))
|
||||||
|
return (1);
|
||||||
|
if (ft_ls_long_middle(&stat, &pads))
|
||||||
|
return (1);
|
||||||
|
ft_ls_long_date(&stat);
|
||||||
|
ft_printf(" ");
|
||||||
|
ft_lsdata_filename(data);
|
||||||
|
if (ft_ls_long_lnk(data))
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
11
ls/src/ft_ls_short.c
Normal file
11
ls/src/ft_ls_short.c
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include "ftls.h"
|
||||||
|
|
||||||
|
void ft_ls_short(t_list *ent)
|
||||||
|
{
|
||||||
|
while (ent)
|
||||||
|
{
|
||||||
|
ft_lsdata_filename(ent->content);
|
||||||
|
ft_printf("\n");
|
||||||
|
ent = ent->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,13 +1,44 @@
|
||||||
#include "ftls.h"
|
#include "ftls.h"
|
||||||
|
|
||||||
void ft_ent_handle(t_list **ent, t_lsdata *topdir, char *opts, int (*ft_sort)())
|
void ft_ent_filter(t_list **ent, char *opts)
|
||||||
{
|
{
|
||||||
|
if (!ft_strchr(opts, 'a'))
|
||||||
|
ft_lst_delif(ent, ".", &ft_lsdata_cmp0, &ft_lst_cfree);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_ent_sort(t_list **ent, char *opts)
|
||||||
|
{
|
||||||
|
int (*ft_sort)();
|
||||||
|
|
||||||
|
if (ft_strchr(opts, 't'))
|
||||||
|
ft_sort = &ft_lsdata_cmp_time;
|
||||||
|
else
|
||||||
|
ft_sort = &ft_lsdata_cmp_name;
|
||||||
ft_lst_sort(ent, ft_sort);
|
ft_lst_sort(ent, ft_sort);
|
||||||
if (ft_strchr(opts, 'r'))
|
if (ft_strchr(opts, 'r'))
|
||||||
ft_lst_reverse(ent);
|
ft_lst_reverse(ent);
|
||||||
if (!ft_strchr(opts, 'a'))
|
}
|
||||||
ft_lst_delif(ent, ".", &ft_lsdata_cmp0, &ft_lst_cfree);
|
|
||||||
ft_ls_print(*ent, opts, topdir);
|
void ft_ent_print(t_list *ent, char *opts, t_lsdata *topdir, t_list *nextdir)
|
||||||
|
{
|
||||||
|
char *opt;
|
||||||
|
|
||||||
|
if (!(opt = ft_strchr(opts, '0')))
|
||||||
|
{
|
||||||
|
if (topdir)
|
||||||
|
ft_printf("%s:\n", topdir->path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*opt = '.';
|
||||||
|
if (ent)
|
||||||
|
{
|
||||||
|
if (ft_strchr(opts, 'l'))
|
||||||
|
ft_ls_long(ent, topdir);
|
||||||
|
else
|
||||||
|
ft_ls_short(ent);
|
||||||
|
}
|
||||||
|
if (nextdir)
|
||||||
|
ft_putendl("");
|
||||||
}
|
}
|
||||||
|
|
||||||
t_list *ft_ent_get_dirs(t_list *ent)
|
t_list *ft_ent_get_dirs(t_list *ent)
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,5 @@
|
||||||
#include "ftls.h"
|
#include "ftls.h"
|
||||||
|
|
||||||
int ft_ls_long(t_list *ent)
|
|
||||||
{
|
|
||||||
t_lsdata *data;
|
|
||||||
struct stat stat;
|
|
||||||
struct dirent *dirent;
|
|
||||||
t_pads pads = {0, 0, 0, 0};
|
|
||||||
|
|
||||||
ft_ls_long_total(ent);
|
|
||||||
if (ft_ls_long_pads(ent, &pads))
|
|
||||||
return (1);
|
|
||||||
while (ent)
|
|
||||||
{
|
|
||||||
data = ent->content;
|
|
||||||
stat = data->stat;
|
|
||||||
dirent = data->dirent;
|
|
||||||
ent = ent->next;
|
|
||||||
|
|
||||||
ft_ls_long_type(dirent->d_type);
|
|
||||||
ft_ls_long_rights(stat.st_mode);
|
|
||||||
if (ft_ls_long_xattr(dirent->d_name))
|
|
||||||
return (1);
|
|
||||||
if (ft_ls_long_middle(&stat, &pads))
|
|
||||||
return (1);
|
|
||||||
ft_ls_long_date(&stat);
|
|
||||||
ft_printf(" %s", data->dirent->d_name);
|
|
||||||
ft_ls_long_lnk(data);
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ft_ls_long_middle(struct stat *stat, t_pads *pads)
|
int ft_ls_long_middle(struct stat *stat, t_pads *pads)
|
||||||
{
|
{
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
|
@ -39,11 +9,10 @@ int ft_ls_long_middle(struct stat *stat, t_pads *pads)
|
||||||
return (1);
|
return (1);
|
||||||
if ((grp = getgrgid(stat->st_gid)) == NULL)
|
if ((grp = getgrgid(stat->st_gid)) == NULL)
|
||||||
return (1);
|
return (1);
|
||||||
printf(" %*hu", pads->nlink, stat->st_nlink);
|
ft_printf(" %*hu", pads->nlink, stat->st_nlink);
|
||||||
printf(" %-*s", pads->name, pwd->pw_name);
|
ft_printf(" %-*s", pads->name, pwd->pw_name);
|
||||||
printf(" %-*s", pads->gr_name, grp->gr_name);
|
ft_printf(" %-*s", pads->gr_name, grp->gr_name);
|
||||||
printf(" %*lld", pads->size, stat->st_size);
|
ft_printf(" %*lld", pads->size, stat->st_size);
|
||||||
fflush(stdout);
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -61,46 +30,22 @@ void ft_ls_long_date(struct stat *stat)
|
||||||
time = ft_time_isrecent(stat->st_mtime)
|
time = ft_time_isrecent(stat->st_mtime)
|
||||||
? ft_strsub(date, 11, 5)
|
? ft_strsub(date, 11, 5)
|
||||||
: ft_strsub(date, 20, 4);
|
: ft_strsub(date, 20, 4);
|
||||||
|
/* ft_putstr(day); */
|
||||||
ft_printf(" %s %s %5s", day, month, time);
|
ft_printf(" %s %s %5s", day, month, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_ls_long_type(unsigned char d_type)
|
void ft_ls_long_type(mode_t m)
|
||||||
{
|
{
|
||||||
char type;
|
char type;
|
||||||
|
|
||||||
type = '\0';
|
type = '\0';
|
||||||
type = d_type == DT_REG ? '-' : type;
|
type = S_ISREG(m) ? '-' : type;
|
||||||
type = d_type == DT_DIR ? 'd' : type;
|
type = S_ISDIR(m) ? 'd' : type;
|
||||||
type = d_type == DT_FIFO ? 'p' : type;
|
type = S_ISFIFO(m) ? 'p' : type;
|
||||||
type = d_type == DT_SOCK ? 's' : type;
|
type = S_ISSOCK(m) ? 's' : type;
|
||||||
type = d_type == DT_CHR ? 'c' : type;
|
type = S_ISCHR(m) ? 'c' : type;
|
||||||
type = d_type == DT_BLK ? 'b' : type;
|
type = S_ISBLK(m) ? 'b' : type;
|
||||||
type = d_type == DT_LNK ? 'l' : type;
|
type = S_ISLNK(m) ? 'l' : type;
|
||||||
ft_printf("%c", type);
|
ft_printf("%c", type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_ls_long_rights(int st_mode)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *rights;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
rights = ft_itoa_base(st_mode, "01", "");
|
|
||||||
rights = rights + ft_strlen(rights) - 9;
|
|
||||||
while (rights[i])
|
|
||||||
{
|
|
||||||
if (rights[i] == '0')
|
|
||||||
rights[i] = '-';
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (i % 3 == 0)
|
|
||||||
rights[i] = 'r';
|
|
||||||
else if (i % 3 == 1)
|
|
||||||
rights[i] = 'w';
|
|
||||||
else if (i % 3 == 2)
|
|
||||||
rights[i] = 'x';
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
ft_printf("%s", rights);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,48 @@
|
||||||
#include "ftls.h"
|
#include "ftls.h"
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
void ft_ls_long_lnk(t_lsdata *data)
|
void ft_ls_long_rights(int st_mode)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
int i;
|
||||||
struct dirent *dirent;
|
char *rights;
|
||||||
|
|
||||||
dirent = data->dirent;
|
i = 0;
|
||||||
stat = data->stat;
|
rights = ft_itoa_base(st_mode, "01", "");
|
||||||
|
rights = rights + ft_strlen(rights) - 9;
|
||||||
|
while (rights[i])
|
||||||
|
{
|
||||||
|
if (rights[i] == '0')
|
||||||
|
rights[i] = '-';
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i % 3 == 0)
|
||||||
|
rights[i] = 'r';
|
||||||
|
else if (i % 3 == 1)
|
||||||
|
rights[i] = 'w';
|
||||||
|
else if (i % 3 == 2)
|
||||||
|
rights[i] = 'x';
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
ft_printf("%s", rights);
|
||||||
|
}
|
||||||
|
|
||||||
if (dirent->d_type == DT_LNK)
|
int ft_ls_long_lnk(t_lsdata *data)
|
||||||
ft_printf(" -> unknown\n");
|
{
|
||||||
|
struct stat statbuf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ft_bzero(&statbuf, sizeof(statbuf));
|
||||||
|
if (S_ISLNK(data->stat.st_mode))
|
||||||
|
{
|
||||||
|
printf(" -> %lld\n", statbuf.st_size);
|
||||||
|
printf("path: %s\n", data->path);
|
||||||
|
if ((ret = stat(data->path, &statbuf)) == -1)
|
||||||
|
printf("stat=%i, errno=%i\n", ret, errno);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ft_printf("\n");
|
printf("\n");
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_ls_long_xattr(char *path)
|
int ft_ls_long_xattr(char *path)
|
||||||
|
|
@ -19,14 +50,20 @@ int ft_ls_long_xattr(char *path)
|
||||||
int n;
|
int n;
|
||||||
char x;
|
char x;
|
||||||
|
|
||||||
|
x = ' ';
|
||||||
if ((n = ft_xattr_count(path)) == -1)
|
if ((n = ft_xattr_count(path)) == -1)
|
||||||
|
{
|
||||||
|
printf("\ncouldnt get xattr: %i\n", n);
|
||||||
return (1);
|
return (1);
|
||||||
x = n > 0 ? '@' : '\0';
|
}
|
||||||
ft_printf("%1c", x);
|
if (n > 0)
|
||||||
|
x = '@';
|
||||||
|
/* ft_printf("%c", x); */
|
||||||
|
ft_putchar(x);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_ls_long_total(t_list *ent)
|
void ft_ls_long_total(t_list *ent)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
struct stat stat;
|
||||||
t_lsdata *data;
|
t_lsdata *data;
|
||||||
|
|
@ -42,8 +79,7 @@ int ft_ls_long_total(t_list *ent)
|
||||||
|
|
||||||
total += stat.st_blocks;
|
total += stat.st_blocks;
|
||||||
}
|
}
|
||||||
ft_printf("total %i\n", total);
|
printf("total %i\n", total);
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_ls_long_pads(t_list *ent, t_pads *pads)
|
int ft_ls_long_pads(t_list *ent, t_pads *pads)
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
#include "ftls.h"
|
#include "ftls.h"
|
||||||
|
|
||||||
void ft_lsdata_print(t_list *ent)
|
void ft_lsdata_filename(t_lsdata *data)
|
||||||
{
|
{
|
||||||
while (ent)
|
struct dirent *dirent;
|
||||||
{
|
|
||||||
ft_printf("found recursively: %s\n", ((t_lsdata*)ent->content)->path);
|
dirent = data->dirent;
|
||||||
ent = ent->next;
|
if (dirent)
|
||||||
}
|
ft_printf("%s", dirent->d_name);
|
||||||
|
else
|
||||||
|
ft_printf("%s", data->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2)
|
int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2)
|
||||||
|
|
@ -22,7 +24,13 @@ int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata *dat2)
|
||||||
return (ft_strcmp(dat1->path, dat2->path));
|
return (ft_strcmp(dat1->path, dat2->path));
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref)
|
int ft_lsdata_cmp0(t_lsdata *dat, char *dataref)
|
||||||
{
|
{
|
||||||
return (dat1->dirent->d_name[0] != *dataref);
|
char *filename;
|
||||||
|
|
||||||
|
if (dat->dirent)
|
||||||
|
filename = dat->dirent->d_name;
|
||||||
|
else
|
||||||
|
filename = ft_path_notdir(dat->path);
|
||||||
|
return (*filename != *dataref);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts)
|
||||||
DIR *stream;
|
DIR *stream;
|
||||||
|
|
||||||
ft_bzero(opts, 7);
|
ft_bzero(opts, 7);
|
||||||
|
data.dirent = NULL;
|
||||||
i = ft_parse_ls_options(ac, av, opts);
|
i = ft_parse_ls_options(ac, av, opts);
|
||||||
/* ft_strlsort(av + i, ac - i, &ft_strcmp); */
|
/* ft_strlsort(av + i, ac - i, &ft_strcmp); */
|
||||||
if (ac - i <= 1)
|
if (ac - i <= 1)
|
||||||
|
|
@ -23,9 +24,7 @@ void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts)
|
||||||
{
|
{
|
||||||
data.path = ft_strdup(av[i]);
|
data.path = ft_strdup(av[i]);
|
||||||
if (lstat(data.path, &data.stat) < 0)
|
if (lstat(data.path, &data.stat) < 0)
|
||||||
{
|
|
||||||
ft_error_dir(data.path);
|
ft_error_dir(data.path);
|
||||||
}
|
|
||||||
else if (!(stream = opendir(data.path)))
|
else if (!(stream = opendir(data.path)))
|
||||||
{
|
{
|
||||||
/* ft_printf("found file: %s\n", data.path); */
|
/* ft_printf("found file: %s\n", data.path); */
|
||||||
|
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
#include "ftls.h"
|
|
||||||
|
|
||||||
void ft_ls_print(t_list *ent, char *opts, t_lsdata *topdir)
|
|
||||||
{
|
|
||||||
char *opt;
|
|
||||||
|
|
||||||
if (!(opt = ft_strchr(opts, '0')))
|
|
||||||
ft_ls_print_header(topdir->path);
|
|
||||||
else
|
|
||||||
*opt = '.';
|
|
||||||
if (ent)
|
|
||||||
{
|
|
||||||
if (ft_strchr(opts, 'l'))
|
|
||||||
ft_ls_long(ent);
|
|
||||||
else
|
|
||||||
ft_ls_short(ent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ft_ls_short(t_list *ent)
|
|
||||||
{
|
|
||||||
t_lsdata *data;
|
|
||||||
struct dirent *dirent;
|
|
||||||
|
|
||||||
while (ent)
|
|
||||||
{
|
|
||||||
data = ent->content;
|
|
||||||
dirent = data->dirent;
|
|
||||||
ent = ent->next;
|
|
||||||
ft_printf("%s\n", dirent->d_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ft_ls_print_header(char *dirname)
|
|
||||||
{
|
|
||||||
ft_printf("%s:\n", dirname);
|
|
||||||
}
|
|
||||||
|
|
@ -6,41 +6,37 @@ int main(int ac, char **av)
|
||||||
t_list *dir_r;
|
t_list *dir_r;
|
||||||
t_list *ent;
|
t_list *ent;
|
||||||
t_lsdata *dirdata;
|
t_lsdata *dirdata;
|
||||||
int (*ft_sort)();
|
|
||||||
|
|
||||||
char *opts;
|
char *opts;
|
||||||
dir = NULL;
|
dir = NULL;
|
||||||
ent = NULL;
|
ent = NULL;
|
||||||
opts = (char *)malloc(sizeof(char) * 7);
|
opts = (char *)malloc(sizeof(char) * 7);
|
||||||
ft_parse_ls(ac, av, &dir, &ent, opts);
|
ft_parse_ls(ac, av, &dir, &ent, opts);
|
||||||
ft_sort = &ft_lsdata_cmp_name;
|
|
||||||
if (ft_strchr(opts, 't'))
|
|
||||||
ft_sort = &ft_lsdata_cmp_time;
|
|
||||||
ft_lst_sort(&dir, ft_sort);
|
|
||||||
ft_lst_sort(&ent, ft_sort);
|
|
||||||
if (ft_strchr(opts, 'r'))
|
|
||||||
{
|
|
||||||
ft_lst_reverse(&dir);
|
|
||||||
ft_lst_reverse(&ent);
|
|
||||||
}
|
|
||||||
if (ent)
|
if (ent)
|
||||||
ft_ent_handle(&ent, dir->content, opts, ft_sort);
|
{
|
||||||
|
ft_ent_filter(&ent, opts);
|
||||||
|
ft_ent_sort(&ent, opts);
|
||||||
|
ft_ent_print(ent, opts, NULL, dir);
|
||||||
|
}
|
||||||
|
ft_ent_sort(&dir, opts);
|
||||||
while (dir)
|
while (dir)
|
||||||
{
|
{
|
||||||
dirdata = dir->content;
|
dirdata = dir->content;
|
||||||
dir = dir->next;
|
dir = dir->next;
|
||||||
/* ft_lstfree(ent); */
|
/* ft_lstfree(ent); */
|
||||||
ent = ft_dir_get_ents(dirdata);
|
ent = ft_dir_get_ents(dirdata);
|
||||||
ft_ent_handle(&ent, dirdata, opts, ft_sort);
|
ft_ent_filter(&ent, opts);
|
||||||
|
ft_ent_sort(&ent, opts);
|
||||||
|
ft_ent_print(ent, opts, dirdata, dir);
|
||||||
if (ft_strchr(opts, 'R'))
|
if (ft_strchr(opts, 'R'))
|
||||||
{
|
{
|
||||||
dir_r = ft_ent_get_dirs(ent);
|
dir_r = ft_ent_get_dirs(ent);
|
||||||
ft_lst_merge(&dir_r, dir);
|
ft_lst_merge(&dir_r, dir);
|
||||||
dir = dir_r;
|
dir = dir_r;
|
||||||
}
|
}
|
||||||
if (dir)
|
/* if (dir) */
|
||||||
ft_printf("\n");
|
/* ft_printf("\n"); */
|
||||||
/* ft_lsdata_print(dir); */
|
/* ft_lsdata_print(dir); */
|
||||||
}
|
}
|
||||||
return (0);
|
return (errno);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue