push_swap/src/checker.c

81 lines
2.2 KiB
C

/* ************************************************************************** */
/* */
/* ::: o_ :::::: ::: */
/* checker.c :+: / :+::+: :+: */
/* +:+ > +:++:+ +:+ */
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
/* +#+ +#+#+ +#++#+ +#+ \o/ */
/* Created: 2024/11/24 15:05:06 by whaffman #+#+# #+#+# #+# #+# | */
/* Updated: 2024/11/24 15:05:43 by whaffman ### ### ### ### / \ */
/* */
/* ************************************************************************** */
#include "push_swap.h"
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
int execute_move(const char *move, t_state *state)
{
const t_move moves[11] = {&sa, &sb, &ss, &pa, &pb, \
&ra, &rb, &rr, &rra, &rrb, &rrr};
const char *moves_names[] = {"sa\n", "sb\n", "ss\n", \
"pa\n", "pb\n", \
"ra\n", "rb\n", "rr\n", \
"rra\n", "rrb\n", "rrr\n"};
int i;
i = 0;
while (i < 11)
{
if (ft_strcmp(move, moves_names[i]) == 0)
{
moves[i](state, 1);
return (1) ;
}
i++;
}
return (0);
}
int read_moves(t_state *state)
{
char *move;
int ret;
move = get_next_line(STDIN_FILENO);
while (move)
{
ret = execute_move(move, state);
free(move);
if (!ret)
return (0);
move = get_next_line(STDIN_FILENO);
}
free(move);
return (1);
}
int main(int argc, char *argv[])
{
int size;
t_state *state;
if (!initialise_state(&state))
return (ft_putstr_fd("Error\n", STDERR_FILENO), 1);
if (argc == 1)
return (free_state(state), 1);
while (argc-- > 1)
{
if (!new_element(&(state->a), argv[argc]))
return (error(state));
}
if (has_duplicates(state->a))
return (error(state));
size = ft_lstsize(state->a);
if (!read_moves(state))
return (error(state));
if (ft_lstsize(state->a) == size && (size == 0 || is_sorted(state->a)))
return (free_state(state), ft_printf("OK\n"));
return (free_state(state), ft_printf("KO\n"));
}