From 87261ffddb3d734b2128de0a685b83ed8bb3bbdc Mon Sep 17 00:00:00 2001 From: Tanguy MAZE Date: Sat, 2 Mar 2019 18:28:51 +0100 Subject: [PATCH] Nice job for a week-end =) finished checker programm tested actions functions all normed and sexy ;) --- includes/push_swap.h | 6 +- srcs/checker.c | 129 +++++++++++++++++++++++-------------------- srcs/ps_rerot.c | 12 ++-- srcs/ps_rot.c | 23 ++++---- srcs/ps_stktools.c | 18 +++--- srcs/ps_stktools2.c | 57 ++++++++++++++++++- srcs/ps_swap.c | 2 +- 7 files changed, 156 insertions(+), 91 deletions(-) diff --git a/includes/push_swap.h b/includes/push_swap.h index 5672eb0..af68fcd 100644 --- a/includes/push_swap.h +++ b/includes/push_swap.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 14:13:53 by tmaze #+# #+# */ -/* Updated: 2019/02/28 16:10:45 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 18:21:11 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,4 +51,8 @@ void ps_rrot(t_psdata *data); void ps_rerot(t_psdata *data, char c); void ps_rrerot(t_psdata *data); +int is_op(char *buff); +int get_params(t_psdata *data, int ac, char **av); +int check_input(char *in, int *ret); + #endif diff --git a/srcs/checker.c b/srcs/checker.c index 34a93c7..a7af1e0 100644 --- a/srcs/checker.c +++ b/srcs/checker.c @@ -6,95 +6,102 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/23 13:35:15 by tmaze #+# #+# */ -/* Updated: 2019/02/28 17:02:28 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 18:28:08 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -int check_input(char *in, int *ret) +void exec_actions(t_psdata *data) { - int i; + char *buff; + t_list *nop; - i = 0; - if (in[i] && ft_issign(in[i])) - i++; - while (in[i] && ft_isdigit(in[i])) - i++; - if (in[i] == '\0' && ft_hasdigit(in) && ft_atois(in, ret)) - return (1); + nop = data->op; + while (nop && (buff = (char*)nop->content)) + { + if (ft_strlen(buff) == 2) + { + if (buff[0] == 's' && buff[1] != 's') + ps_swap(data, buff[1]); + else if (buff[0] == 's' && buff[1] == 's') + ps_sswap(data); + else if (buff[0] == 'r' && buff[1] != 'r') + ps_rot(data, buff[1]); + else if (buff[0] == 'r' && buff[1] == 'r') + ps_rrot(data); + else if (buff[0] == 'p') + ps_push(data, buff[1]); + } + else if (buff[2] != 'r') + ps_rerot(data, buff[2]); + else if (buff[2] == 'r') + ps_rrerot(data); + nop = nop->next; + } +} + +int read_ops(t_psdata *data) +{ + t_list *nop; + char buff[5]; + int ret; + + ft_memset(buff, '\0', 5); + while ((ret = read(1, buff, 4)) > 0) + { + buff[ft_strlen(buff) - 1] = '\0'; + if (ret > 4 || !is_op(buff) || (nop = ft_lstnew(buff, 4)) == NULL) + { + ft_putendl_fd("Error", 2); + return (1); + } + ft_lstaddend(&(data->op), nop); + } return (0); } -int get_params(t_psdata *data, int ac, char **av) +void check_stack(t_psdata *data) { - t_stack *new; - char **tab; + t_stack *ind; int nb; - int i; - int j; - i = ac; - nb = 0; - while (--i > 0 && !(j = 0)) - if ((tab = ft_strsplitwhitespace(av[i])) != NULL) + ind = data->a; + nb = ind->nb; + while (ind) + { + if (ind->nb < nb) { - while (tab[j]) - j++; - while (--j >= 0) - if (check_input(tab[j], &nb) && (new = ps_stknew(nb)) != NULL) - ps_stkpsh(data, 'a', new); - else - { - ft_putendl_fd("Error", 2); - ps_stkclean(data); - return (0); - } - ft_del_words_tables(&tab); + ft_putendl("KO"); + return ; } - return (1); + nb = ind->nb; + ind = ind->next; + } + if (!ind) + ft_putendl("OK"); } -int is_op(char *buff) -{ - static char ops[11][3] = {"sa", "sb", "ss", "pa", "pb", "ra", - "rb", "rr", "rra", "rrb", "rrr"}; - size_t i; - - i = 0; - while (i < 11 && ft_strcmp(buff, ops[i]) != 0) - i++; - return (i < 11 && ft_strcmp(buff, ops[i]) == 0); -} - -int main(int ac, char **av) +int main(int ac, char **av) { t_psdata data; t_stack *new; - t_list *nop; - char buff[5]; int ret; ps_initdata(&data); - ft_memset(buff, '\0', 5); + ret = 0; if (!get_params(&data, ac, av)) return (0); new = data.a; if (new == NULL) ft_putendl("Empty"); - else - while ((ret = read(1, buff, 4)) > 0) - { - buff[ft_strlen(buff) - 1] = '\0'; - if (ret > 4 || !is_op(buff) || (nop = ft_lstnew(buff, 4)) == NULL) - { - ft_putendl_fd("Error", 2); - ps_stkclean(&data); - return (1); - } - printf("%d\n", ret); - ft_lstaddend(&(data.op), nop); - } + if (new == NULL || read_ops(&data)) + { + ps_stkclean(&data); + return (0); + } + exec_actions(&data); + check_stack(&data); ps_stkclean(&data); return (0); } diff --git a/srcs/ps_rerot.c b/srcs/ps_rerot.c index 5b1f773..8657fbd 100644 --- a/srcs/ps_rerot.c +++ b/srcs/ps_rerot.c @@ -6,16 +6,15 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 16:32:04 by tmaze #+# #+# */ -/* Updated: 2019/02/24 13:58:12 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 17:37:07 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void ps_rerot(t_psdata *data, char c) +void ps_rerot(t_psdata *data, char c) { t_stack *s; - t_stack *prec; t_stack *tmp; size_t size; @@ -29,21 +28,20 @@ void ps_rerot(t_psdata *data, char c) size = data->size_b; if (s != NULL && size > 2) { - prec = s; tmp = s->next; while (tmp->next != NULL) { tmp = tmp->next; - prec = prec->next; + s = s->next; } - prec->next = NULL; + s->next = NULL; ps_stkpsh(data, c, tmp); } else if (s != NULL && size == 2) ps_swap(data, c); } -void ps_rrerot(t_psdata *data) +void ps_rrerot(t_psdata *data) { ps_rerot(data, 'a'); ps_rerot(data, 'b'); diff --git a/srcs/ps_rot.c b/srcs/ps_rot.c index c9cd6f2..09ae23b 100644 --- a/srcs/ps_rot.c +++ b/srcs/ps_rot.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 16:07:55 by tmaze #+# #+# */ -/* Updated: 2019/02/24 13:56:33 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 16:32:04 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,26 +16,27 @@ void ps_rot(t_psdata *data, char c) { t_stack *s; t_stack *tmp; - t_stack *ind; - size_t size; + size_t *size; if (c == 'a') s = data->a; if (c == 'a') - size = data->size_a; + size = &(data->size_a); else if (c == 'b') s = data->b; if (c == 'b') - size = data->size_b; - if (s != NULL && size > 2) + size = &(data->size_b); + if (s != NULL && *size > 2) { + s = s->next; tmp = ps_stkpop(data, c); - ind = s; - while (ind->next != NULL) - ind = ind->next; - ind->next = tmp; + tmp->next = NULL; + while (s->next != NULL) + s = s->next; + s->next = tmp; + (*size)++; } - else if (s != NULL && size == 2) + else if (s != NULL && *size == 2) ps_swap(data, c); } diff --git a/srcs/ps_stktools.c b/srcs/ps_stktools.c index 904dbc3..b919d55 100644 --- a/srcs/ps_stktools.c +++ b/srcs/ps_stktools.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/22 14:41:27 by tmaze #+# #+# */ -/* Updated: 2019/02/25 15:11:44 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 15:23:43 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ void ps_stkpsh(t_psdata *data, char c, t_stack *new) { t_stack *ind; t_stack **s; - size_t size; + size_t *size; s = NULL; if (data != NULL && new != NULL) @@ -36,17 +36,17 @@ void ps_stkpsh(t_psdata *data, char c, t_stack *new) if (c == 'a') s = &(data->a); if (c == 'a') - size = data->size_a; + size = &(data->size_a); if (c == 'b') s = &(data->b); if (c == 'b') - size = data->size_b; + size = &(data->size_b); if (s != NULL) { ind = *s; *s = new; new->next = ind; - size++; + (*size)++; } } } @@ -55,16 +55,16 @@ t_stack *ps_stkpop(t_psdata *data, char c) { t_stack *ret; t_stack **s; - size_t size; + size_t *size; if (c == 'a') s = &(data->a); if (c == 'a') - size = data->size_a; + size = &(data->size_a); if (c == 'b') s = &(data->b); if (c == 'b') - size = data->size_b; + size = &(data->size_b); else if (c != 'a' && c != 'b') return (NULL); ret = NULL; @@ -72,7 +72,7 @@ t_stack *ps_stkpop(t_psdata *data, char c) { ret = *s; *s = ret->next; - size--; + (*size)--; } return (ret); } diff --git a/srcs/ps_stktools2.c b/srcs/ps_stktools2.c index 77f0faf..350c79f 100644 --- a/srcs/ps_stktools2.c +++ b/srcs/ps_stktools2.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/25 12:44:08 by tmaze #+# #+# */ -/* Updated: 2019/02/25 12:48:34 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 18:20:51 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,3 +20,58 @@ void ps_initdata(t_psdata *data) data->size_b = 0; data->op = NULL; } + +int check_input(char *in, int *ret) +{ + int i; + + i = 0; + if (in[i] && ft_issign(in[i])) + i++; + while (in[i] && ft_isdigit(in[i])) + i++; + if (in[i] == '\0' && ft_hasdigit(in) && ft_atois(in, ret)) + return (1); + return (0); +} + +int get_params(t_psdata *data, int ac, char **av) +{ + t_stack *new; + char **tab; + int nb; + int i; + int j; + + i = ac; + nb = 0; + while (--i > 0 && !(j = 0)) + if ((tab = ft_strsplitwhitespace(av[i])) != NULL) + { + while (tab[j]) + j++; + while (--j >= 0) + if (check_input(tab[j], &nb) && (new = ps_stknew(nb)) != NULL) + ps_stkpsh(data, 'a', new); + else + { + ft_putendl_fd("Error", 2); + ps_stkclean(data); + return (0); + } + ft_del_words_tables(&tab); + } + return (1); +} + +int is_op(char *buff) +{ + static char ops[11][4] = {"sa\0", "sb\0", "ss\0", "pa\0", "pb\0", "ra\0", + "rb\0", "rr\0", "rra\0", "rrb\0", "rrr\0"}; + size_t i; + + i = 0; + while (i < 11 && ft_strcmp(buff, ops[i]) != 0) + i++; + return (i < 11 && ft_strcmp(buff, ops[i]) == 0); +} diff --git a/srcs/ps_swap.c b/srcs/ps_swap.c index da964e1..906455f 100644 --- a/srcs/ps_swap.c +++ b/srcs/ps_swap.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 14:06:40 by tmaze #+# #+# */ -/* Updated: 2019/02/24 13:59:48 by tmaze ### ########.fr */ +/* Updated: 2019/03/02 15:34:54 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */