126 lines
3.1 KiB
C
126 lines
3.1 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* main.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2022/01/17 21:29:45 by apommier #+# #+# */
|
|
/* Updated: 2022/01/18 06:49:49 by apommier ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../Utils/push_swap.h"
|
|
|
|
void big_slstclear(t_slist **lst)
|
|
{
|
|
t_slist *chr;
|
|
|
|
chr = *lst;
|
|
while (*lst)
|
|
{
|
|
chr = (*lst)->next;
|
|
free((*lst)->action);
|
|
free(*lst);
|
|
*lst = chr;
|
|
}
|
|
lst = 0;
|
|
}
|
|
|
|
t_slist *verify_list(t_slist *a)
|
|
{
|
|
t_slist *start;
|
|
|
|
start = a;
|
|
while (a && a->action)
|
|
{
|
|
if (!ft_strcmp("sa\n", a) || !ft_strcmp("rb\n", a)
|
|
|| !ft_strcmp("rr\n", a) || !ft_strcmp("rra\n", a)
|
|
|| !ft_strcmp("rrb\n", a) || !ft_strcmp("rrr\n", a)
|
|
|| !ft_strcmp("ra\n", a) || !ft_strcmp("pa\n", a)
|
|
|| !ft_strcmp("pb\n", a) || !ft_strcmp("sb\n", a))
|
|
a = a->next;
|
|
else
|
|
{
|
|
ft_putstr_fd("Error\n", 2);
|
|
big_slstclear(&start);
|
|
return (0);
|
|
}
|
|
}
|
|
return (start);
|
|
}
|
|
|
|
void do_move(t_list **lst, t_list **lst_b, t_slist *a, t_slist *delete)
|
|
{
|
|
if (!ft_strcmp("pa\n", a))
|
|
ft_pa(lst, lst_b, &delete);
|
|
else if (!ft_strcmp("pb\n", a))
|
|
ft_pb(lst, lst_b, &delete);
|
|
else if (!ft_strcmp("sa\n", a))
|
|
ft_sa_sb(lst, &delete, 'a', 0);
|
|
else if (!ft_strcmp("sb\n", a))
|
|
ft_sa_sb(lst_b, &delete, 'b', 0);
|
|
else if (!ft_strcmp("ra\n", a))
|
|
ft_ra_rb(lst, &delete, 'a');
|
|
else if (!ft_strcmp("rb\n", a))
|
|
ft_ra_rb(lst_b, &delete, 'b');
|
|
else if (!ft_strcmp("rra\n", a))
|
|
ft_rra_rrb(lst, &delete, 'a');
|
|
else if (!ft_strcmp("rrb\n", a))
|
|
ft_rra_rrb(lst_b, &delete, 'b');
|
|
else
|
|
do_move2(lst, lst_b, a, &delete);
|
|
s_lstclear(&delete);
|
|
}
|
|
|
|
int checker(t_slist *action, t_list **a)
|
|
{
|
|
t_list *lst_b;
|
|
int lst_size;
|
|
|
|
lst_size = ft_lstsize(*a);
|
|
lst_b = 0;
|
|
action = verify_list(action);
|
|
if (!(*a))
|
|
return (0);
|
|
while (action)
|
|
{
|
|
do_move(a, &lst_b, action, 0);
|
|
action = action->next;
|
|
}
|
|
if (is_sorted(*a) && lst_size == ft_lstsize(*a))
|
|
ft_putendl_fd("OK", 1);
|
|
else
|
|
ft_putendl_fd("KO", 1);
|
|
return (1);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
t_list *start;
|
|
t_slist *start_action;
|
|
char *line;
|
|
|
|
start_action = 0;
|
|
if (argc == 1)
|
|
return (1);
|
|
if (!is_nbr(argc, argv) || !is_double(argc, argv))
|
|
{
|
|
ft_putstr_fd("Error\n", 2);
|
|
return (0);
|
|
}
|
|
start = set_list(--argc, argv);
|
|
lst_indexing(start);
|
|
line = get_next_line(0);
|
|
while (line)
|
|
{
|
|
if (line)
|
|
s_lstadd_back(&start_action, new_slist(line));
|
|
line = get_next_line(0);
|
|
}
|
|
checker(start_action, &start);
|
|
ft_lstclear(&start, &free);
|
|
big_slstclear(&start_action);
|
|
return (1);
|
|
}
|