diff --git a/ls/.tags b/ls/.tags index f39fbe7c..0bf30406 100644 --- a/ls/.tags +++ b/ls/.tags @@ -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 */ diff --git a/ls/includes/ftls.h b/ls/includes/ftls.h index 7a5f5aa0..21801fb1 100644 --- a/ls/includes/ftls.h +++ b/ls/includes/ftls.h @@ -2,6 +2,7 @@ # define FTLS_H # define ALL_OPTS "lRart" # include "libft.h" +# include # include # include # include @@ -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); diff --git a/ls/libft b/ls/libft index d351b97f..27c15060 160000 --- a/ls/libft +++ b/ls/libft @@ -1 +1 @@ -Subproject commit d351b97f35fbb2551cfaab92322cac8524112486 +Subproject commit 27c15060b59c76458da441881cdcb05055db1711 diff --git a/ls/src/ft_ls_long.c b/ls/src/ft_ls_long.c new file mode 100644 index 00000000..ec7f9cef --- /dev/null +++ b/ls/src/ft_ls_long.c @@ -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); +} diff --git a/ls/src/ft_ls_short.c b/ls/src/ft_ls_short.c new file mode 100644 index 00000000..1f46fea2 --- /dev/null +++ b/ls/src/ft_ls_short.c @@ -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; + } +} diff --git a/ls/src/lib_dirents.c b/ls/src/lib_dirents.c index f1886651..3b15d64d 100644 --- a/ls/src/lib_dirents.c +++ b/ls/src/lib_dirents.c @@ -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) diff --git a/ls/src/lib_ls_long.c b/ls/src/lib_ls_long.c index eb32f922..7bc46c70 100644 --- a/ls/src/lib_ls_long.c +++ b/ls/src/lib_ls_long.c @@ -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); -} diff --git a/ls/src/lib_ls_long_misc.c b/ls/src/lib_ls_long2.c similarity index 51% rename from ls/src/lib_ls_long_misc.c rename to ls/src/lib_ls_long2.c index b7ad6607..3b719bad 100644 --- a/ls/src/lib_ls_long_misc.c +++ b/ls/src/lib_ls_long2.c @@ -1,17 +1,48 @@ #include "ftls.h" +#include -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) diff --git a/ls/src/lib_lsdata.c b/ls/src/lib_lsdata.c index 26bd7bf4..58bb8599 100644 --- a/ls/src/lib_lsdata.c +++ b/ls/src/lib_lsdata.c @@ -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); } diff --git a/ls/src/lib_parse.c b/ls/src/lib_parse.c index 7853f8c0..0a94ccdc 100644 --- a/ls/src/lib_parse.c +++ b/ls/src/lib_parse.c @@ -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); */ diff --git a/ls/src/lib_print.c b/ls/src/lib_print.c deleted file mode 100644 index 5ada278e..00000000 --- a/ls/src/lib_print.c +++ /dev/null @@ -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); -} diff --git a/ls/src/main.c b/ls/src/main.c index 04b40cae..8cf1f4d2 100644 --- a/ls/src/main.c +++ b/ls/src/main.c @@ -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); }