diff --git a/CMakeLists.txt b/CMakeLists.txt index 386ef46..18827b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ link_directories(libft) # libraries set(SOURCE_FILES src/main.c - ) # sources + src/ft_ls.c src/parse_input.c src/flags.c src/sort.c src/output.c libft/ft_lst_merge_sort.c) # sources add_executable(ft_ls ${SOURCE_FILES}) # compilation diff --git a/libft/ft_lst_merge_sort.c b/libft/ft_lst_merge_sort.c new file mode 100644 index 0000000..45054a1 --- /dev/null +++ b/libft/ft_lst_merge_sort.c @@ -0,0 +1,75 @@ +#include "libft.h" + +t_list *SortedMerge(t_list *a, t_list *b) +{ + t_list *result; + + result = NULL; + + if (a == NULL) + return(b); + else if (b==NULL) + return(a); + + /* Pick either a or b, and recur */ + if (a->data <= b->data) + { + result = a; + result->next = SortedMerge(a->next, b); + } + else + { + result = b; + result->next = SortedMerge(a, b->next); + } + return(result); +} + +void split(t_list *source, t_list **front_ptr, t_list **back_ptr) +{ + t_list *fast; + t_list *slow; + + if (source==NULL || source->next==NULL) + { + *front_ptr = source; + *back_ptr = NULL; + } + else + { + slow = source; + fast = source->next; + while (fast != NULL) + { + fast = fast->next; + if (fast != NULL) + { + slow = slow->next; + fast = fast->next; + } + } + + *front_ptr = source; + *back_ptr = slow->next; + slow->next = NULL; + } +} +void ft_lst_merge_sort(t_list **head_ptr, int (*cmp)()) +{ + t_list *head; + t_list *a; + t_list *b; + + head = *head_ptr; + if ((head == NULL) || (head->next == NULL)) + return; + + split(head, &a, &b); + + /* Recursively sort the sublists */ + ft_lst_merge_sort(&a, cmp); + ft_lst_merge_sort(&b, cmp); + + /* answer = merge the two sorted lists together */ + *head_ptr = SortedMerge(a, b); +} diff --git a/src/flags.c b/src/flags.c new file mode 100644 index 0000000..9abb3f1 --- /dev/null +++ b/src/flags.c @@ -0,0 +1,22 @@ +#include "ft_ls.h" + +void set_flags_to_zero(t_flags *flgs) +{ + flgs->a = 0; + flgs->l = 0; + flgs->R = 0; + flgs->t = 0; + flgs->col = 0; +} + +int chck_flgs(char *flg, t_flags *flgs) +{ + if ((!*(flg + 1)) && (flg += 1)) + return (1); + if (flgs->l == 0) flgs->l = (ft_strchr(flg, 'l') != NULL) ? 1 : 0; + if (flgs->a == 0) flgs->a = (ft_strchr(flg, 'a') != NULL) ? 1 : 0; + if (flgs->R == 0) flgs->R = (ft_strchr(flg, 'R') != NULL) ? 1 : 0; + if (flgs->t == 0) flgs->t = (ft_strchr(flg, 't') != NULL) ? 1 : 0; + if (flgs->col == 0) flgs->col = (ft_strchr(flg, '1') != NULL) ? 1 : 0; + return (0); +} \ No newline at end of file diff --git a/src/ft_ls.c b/src/ft_ls.c new file mode 100644 index 0000000..3419495 --- /dev/null +++ b/src/ft_ls.c @@ -0,0 +1,47 @@ +#include "ft_ls.h" + +void put_error(char *arg) +{ + char *final_str; + char *arg_colon_errno; + char *colon_errno; + + colon_errno = ft_strjoin(": ", strerror(errno)); + arg_colon_errno = ft_strjoin(arg, colon_errno); + final_str = ft_strjoin("ls: ", arg_colon_errno); + ft_putstr(final_str); + ft_putstr("\n"); + free(final_str); + free(arg_colon_errno); + free(colon_errno); +} + +void init_dir_ent_list(DIR *dp, t_list **del, t_flags *flgs) +{ + t_dir_entity de; + + + while ((de.dirent = readdir(dp)) && (de.flags = flgs)) + ft_lstadd(del, ft_lstnew(&de, sizeof(t_dir_entity))); +} + +void ft_ls(char *path, t_flags *flgs) +{ + DIR *dp; +// int blocks; +// char *tmp_path; + t_list *dir_ent_list; + +// tmp_path = 0; +// blocks = 0; + dir_ent_list = NULL; + if (!(dp = opendir(path)) || open(path, O_RDONLY) == -1) + put_error(path); + else + { + init_dir_ent_list(dp, &dir_ent_list, flgs); + sort(dir_ent_list, flgs); + output(dir_ent_list); + } + +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 31d768e..7c7eb92 100644 --- a/src/main.c +++ b/src/main.c @@ -12,114 +12,6 @@ #include "ft_ls.h" -void put_error(char *arg) -{ - char *final_str; - char *arg_colon_errno; - char *colon_errno; - - colon_errno = ft_strjoin(": ", strerror(errno)); - arg_colon_errno = ft_strjoin(arg, colon_errno); - final_str = ft_strjoin("ls: ", arg_colon_errno); - ft_putstr(final_str); - ft_putstr("\n"); - free(final_str); - free(arg_colon_errno); - free(colon_errno); -} - -int chck_flgs(char *flg, t_flags *flgs) -{ - if ((!*(flg + 1)) && (flg += 1)) - return (1); - if (flgs->l == 0) flgs->l = (ft_strchr(flg, 'l') != NULL) ? 1 : 0; - if (flgs->a == 0) flgs->a = (ft_strchr(flg, 'a') != NULL) ? 1 : 0; - if (flgs->R == 0) flgs->R = (ft_strchr(flg, 'R') != NULL) ? 1 : 0; - if (flgs->t == 0) flgs->t = (ft_strchr(flg, 't') != NULL) ? 1 : 0; - if (flgs->col == 0) flgs->col = (ft_strchr(flg, '1') != NULL) ? 1 : 0; - return (0); -} - -void init_dir_ent_list(DIR *dp, t_list **del, t_flags *flgs) -{ - t_dir_entity de; - - - while ((de.dirent = readdir(dp)) && (de.flags = flgs)) - ft_lstadd(del, ft_lstnew(&de, sizeof(t_dir_entity))); -} - -void column_out(t_list *entity) -{ - t_dir_entity *d_ent; - - d_ent = (t_dir_entity *)entity->content; - if (d_ent->flags->a) - printf("%s\t", d_ent->dirent->d_name); - else - if (*d_ent->dirent->d_name != '.') - printf("%s\t\n", d_ent->dirent->d_name); -} - -void output(t_list *del) -{ - ft_lstiter(del, column_out); -} - -void ft_ls(char *path, t_flags *flgs) -{ - DIR *dp; -// int blocks; -// char *tmp_path; - t_list *dir_ent_list; - -// tmp_path = 0; -// blocks = 0; - dir_ent_list = NULL; - if (!(dp = opendir(path)) || open(path, O_RDONLY) == -1) - put_error(path); - else - { - init_dir_ent_list(dp, &dir_ent_list, flgs); - output(dir_ent_list); - } - -} - -void set_flags_to_zero(t_flags *flgs) -{ - flgs->a = 0; - flgs->l = 0; - flgs->R = 0; - flgs->t = 0; - flgs->col = 0; -} - -void parse_input(int ac, char **av, t_flags *flgs) -{ - int i; - int paths; - - i = 0; - set_flags_to_zero(flgs); - if (ac == 1) - ft_ls(".", flgs); - else if (ac > 1) - { - while (i < ac - 1 && *av[i + 1] == '-') - if (chck_flgs(av[i + 1], flgs)) - break ; - else - i++; - paths = i; - if (paths == ac - 1) - ft_ls("./", flgs); - else - while (paths < ac - 1) - ft_ls(av[paths++ + 1], flgs); - } -} - int main(int argc, char **argv) { // DIR *dp; diff --git a/src/output.c b/src/output.c new file mode 100644 index 0000000..0d0abad --- /dev/null +++ b/src/output.c @@ -0,0 +1,18 @@ +#include "ft_ls.h" + +void column_out(t_list *entity) +{ + t_dir_entity *d_ent; + + d_ent = (t_dir_entity *)entity->content; + if (d_ent->flags->a) + printf("%s\t", d_ent->dirent->d_name); + else + if (*d_ent->dirent->d_name != '.') + printf("%s\t\n", d_ent->dirent->d_name); +} + +void output(t_list *del) +{ + ft_lstiter(del, column_out); +} \ No newline at end of file diff --git a/src/parse_input.c b/src/parse_input.c new file mode 100644 index 0000000..ef60463 --- /dev/null +++ b/src/parse_input.c @@ -0,0 +1,26 @@ +#include "ft_ls.h" + +void parse_input(int ac, char **av, t_flags *flgs) +{ + int i; + int paths; + + i = 0; + set_flags_to_zero(flgs); + if (ac == 1) + ft_ls(".", flgs); + else if (ac > 1) + { + while (i < ac - 1 && *av[i + 1] == '-') + if (chck_flgs(av[i + 1], flgs)) + break ; + else + i++; + paths = i; + if (paths == ac - 1) + ft_ls("./", flgs); + else + while (paths < ac - 1) + ft_ls(av[paths++ + 1], flgs); + } +} \ No newline at end of file diff --git a/src/sort.c b/src/sort.c new file mode 100644 index 0000000..5e9e422 --- /dev/null +++ b/src/sort.c @@ -0,0 +1,14 @@ +#include "ft_ls.h" + + + +void sort_by(t_list **del, int (*f)()) +{ + +} + +void sort(t_list *del, t_flags *flgs) +{ + if (!flgs->t) + sort_by(&del, lex); +} \ No newline at end of file