/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ps_sort.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/16 13:21:02 by tmaze #+# #+# */ /* Updated: 2019/03/16 13:27:43 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" static int join_lists(t_psdata *data, t_stack **last, int inds, int inds2) { while ((*last)->ind == inds2 || data->size_b > 0) if (((*last)->ind != inds2 && data->size_b > 0) || (data->size_b > 0 && data->b->nb > (*last)->nb)) { if (add_op(data, "pa\0") == NULL) return (0); ps_push(data, 'a'); data->a->ind = inds; } else if (data->size_b == 0 || data->b->nb < (*last)->nb) { if (add_op(data, "rra") == NULL) return (0); ps_rerot(data, 'a'); data->a->ind = inds; (*last) = get_last_a(data); } return (1); } static int rotate_list(t_psdata *data, t_stack **last) { t_list *tmp; if (get_nb_groups(data) > 2) { if (get_nb_groups(data) != 2 && data->a->ind != (*last)->ind && add_op(data, "rra") == NULL) return (0); else if (get_nb_groups(data) != 2 && data->a->ind != (*last)->ind) { ps_rerot(data, 'a'); (*last) = get_last_a(data); while ((*last)->ind == data->a->ind && (tmp = add_op(data, "rra")) != NULL) { ps_rerot(data, 'a'); (*last) = get_last_a(data); } } } return (1); } int sort(t_psdata *data) { t_list *tmp; t_stack *last; int inds; int inds2; last = get_last_a(data); inds = last->ind + 1; while (data->a->ind != last->ind) { inds2 = data->a->ind; while (data->a && data->a->ind == inds2 && (tmp = add_op(data, "pb\0")) != NULL) ps_push(data, 'b'); if (tmp == NULL) return (0); inds2 = last->ind; if (join_lists(data, &last, inds, inds2) == 0) return (0); if (rotate_list(data, &last) == 0) return (0); inds++; } return (1); }