looking good, still have to do: CHR and BLK info, and -> link path...

This commit is contained in:
Jack Halford 2016-09-25 22:06:31 +02:00
parent 0a4d0b0cb1
commit c1d3bb9aef
12 changed files with 197 additions and 172 deletions

View file

@ -1,24 +1,24 @@
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_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_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_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_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_pads src/lib_ls_long_misc.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_total src/lib_ls_long_misc.c /^int 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_xattr src/lib_ls_long_misc.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_print_header src/lib_print.c /^void ft_ls_print_header(char *dirname)$/
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_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_long2.c /^void ft_ls_long_rights(int st_mode)$/
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(mode_t m)$/
ft_ls_long_xattr src/lib_ls_long2.c /^int ft_ls_long_xattr(char *path)$/
ft_ls_short src/ft_ls_short.c /^void ft_ls_short(t_list *ent)$/
ft_lsdata_cmp0 src/lib_lsdata.c /^int ft_lsdata_cmp0(t_lsdata *dat, char *dataref)$/
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_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_options src/lib_parse.c /^int ft_parse_ls_options(int ac, char **av, char */

View file

@ -2,6 +2,7 @@
# define FTLS_H
# define ALL_OPTS "lRart"
# include "libft.h"
# include <errno.h>
# include <dirent.h>
# include <unistd.h>
# include <sys/stat.h>
@ -26,32 +27,33 @@ typedef struct s_pads
int size;
} 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);
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_time(t_lsdata *dat1, t_lsdata *dat2);
int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref);
void ft_ent_handle(t_list **ent, t_lsdata *topdir, char *opts, int (*ft_sort)());
t_list *ft_ent_get_dirs(t_list *ent);
void ft_ent_filter(t_list **ent, char *opts);
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);
void ft_ls_short(t_list *ent);
int ft_ls_long(t_list *ent);
int ft_ls_long_total(t_list *ent);
int ft_ls_long(t_list *ent, t_lsdata *topdir);
void ft_ls_long_total(t_list *ent);
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);
int ft_ls_long_xattr(char *path);
int ft_ls_long_middle(struct stat *stat, t_pads *pads);
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_dir(char *s);

@ -1 +1 @@
Subproject commit d351b97f35fbb2551cfaab92322cac8524112486
Subproject commit 27c15060b59c76458da441881cdcb05055db1711

34
ls/src/ft_ls_long.c Normal file
View 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
View 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;
}
}

View file

@ -1,13 +1,44 @@
#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);
if (ft_strchr(opts, 'r'))
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)

View file

@ -1,35 +1,5 @@
#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)
{
struct passwd *pwd;
@ -39,11 +9,10 @@ int ft_ls_long_middle(struct stat *stat, t_pads *pads)
return (1);
if ((grp = getgrgid(stat->st_gid)) == NULL)
return (1);
printf(" %*hu", pads->nlink, stat->st_nlink);
printf(" %-*s", pads->name, pwd->pw_name);
printf(" %-*s", pads->gr_name, grp->gr_name);
printf(" %*lld", pads->size, stat->st_size);
fflush(stdout);
ft_printf(" %*hu", pads->nlink, stat->st_nlink);
ft_printf(" %-*s", pads->name, pwd->pw_name);
ft_printf(" %-*s", pads->gr_name, grp->gr_name);
ft_printf(" %*lld", pads->size, stat->st_size);
return (0);
}
@ -61,46 +30,22 @@ void ft_ls_long_date(struct stat *stat)
time = ft_time_isrecent(stat->st_mtime)
? ft_strsub(date, 11, 5)
: ft_strsub(date, 20, 4);
/* ft_putstr(day); */
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;
type = '\0';
type = d_type == DT_REG ? '-' : type;
type = d_type == DT_DIR ? 'd' : type;
type = d_type == DT_FIFO ? 'p' : type;
type = d_type == DT_SOCK ? 's' : type;
type = d_type == DT_CHR ? 'c' : type;
type = d_type == DT_BLK ? 'b' : type;
type = d_type == DT_LNK ? 'l' : type;
type = S_ISREG(m) ? '-' : type;
type = S_ISDIR(m) ? 'd' : type;
type = S_ISFIFO(m) ? 'p' : type;
type = S_ISSOCK(m) ? 's' : type;
type = S_ISCHR(m) ? 'c' : type;
type = S_ISBLK(m) ? 'b' : type;
type = S_ISLNK(m) ? 'l' : 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);
}

View file

@ -1,17 +1,48 @@
#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;
struct dirent *dirent;
int i;
char *rights;
dirent = data->dirent;
stat = data->stat;
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);
}
if (dirent->d_type == DT_LNK)
ft_printf(" -> unknown\n");
int ft_ls_long_lnk(t_lsdata *data)
{
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
ft_printf("\n");
printf("\n");
return (0);
}
int ft_ls_long_xattr(char *path)
@ -19,14 +50,20 @@ int ft_ls_long_xattr(char *path)
int n;
char x;
x = ' ';
if ((n = ft_xattr_count(path)) == -1)
{
printf("\ncouldnt get xattr: %i\n", n);
return (1);
x = n > 0 ? '@' : '\0';
ft_printf("%1c", x);
}
if (n > 0)
x = '@';
/* ft_printf("%c", x); */
ft_putchar(x);
return (0);
}
int ft_ls_long_total(t_list *ent)
void ft_ls_long_total(t_list *ent)
{
struct stat stat;
t_lsdata *data;
@ -42,8 +79,7 @@ int ft_ls_long_total(t_list *ent)
total += stat.st_blocks;
}
ft_printf("total %i\n", total);
return (0);
printf("total %i\n", total);
}
int ft_ls_long_pads(t_list *ent, t_pads *pads)

View file

@ -1,12 +1,14 @@
#include "ftls.h"
void ft_lsdata_print(t_list *ent)
void ft_lsdata_filename(t_lsdata *data)
{
while (ent)
{
ft_printf("found recursively: %s\n", ((t_lsdata*)ent->content)->path);
ent = ent->next;
}
struct dirent *dirent;
dirent = data->dirent;
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)
@ -22,7 +24,13 @@ int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata *dat2)
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);
}

View file

@ -7,6 +7,7 @@ void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts)
DIR *stream;
ft_bzero(opts, 7);
data.dirent = NULL;
i = ft_parse_ls_options(ac, av, opts);
/* ft_strlsort(av + i, ac - i, &ft_strcmp); */
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]);
if (lstat(data.path, &data.stat) < 0)
{
ft_error_dir(data.path);
}
else if (!(stream = opendir(data.path)))
{
/* ft_printf("found file: %s\n", data.path); */

View file

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

View file

@ -6,41 +6,37 @@ int main(int ac, char **av)
t_list *dir_r;
t_list *ent;
t_lsdata *dirdata;
int (*ft_sort)();
char *opts;
dir = NULL;
ent = NULL;
opts = (char *)malloc(sizeof(char) * 7);
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)
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)
{
dirdata = dir->content;
dir = dir->next;
/* ft_lstfree(ent); */
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'))
{
dir_r = ft_ent_get_dirs(ent);
ft_lst_merge(&dir_r, dir);
dir = dir_r;
}
if (dir)
ft_printf("\n");
/* if (dir) */
/* ft_printf("\n"); */
/* ft_lsdata_print(dir); */
}
return (0);
return (errno);
}