From 7b9b708a945db191887c0e6ab9658aad77ef2bdb Mon Sep 17 00:00:00 2001 From: rask24 Date: Wed, 14 Feb 2024 14:02:43 +0900 Subject: [PATCH] implement checker --- .gitignore | 3 ++ Makefile | 26 +++++++++++ include/checker.h | 19 ++++++++ src/checker/checker_main.c | 95 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 include/checker.h create mode 100644 src/checker/checker_main.c diff --git a/.gitignore b/.gitignore index 5420bd9..581f75b 100644 --- a/.gitignore +++ b/.gitignore @@ -61,8 +61,11 @@ build/ push_swap checker_Mac checker_linux +checker tester +!src/checker + # Subject File en.subject.pdf diff --git a/Makefile b/Makefile index 5aa7bb5..c6495a7 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ NAME = push_swap +CHECKER = checker CFLAGS = -Werror -Wextra -Wall CXXFLAGS = -std=c++17 -Wall -Wextra -Werror PROD_FLAGS = -O3 @@ -42,6 +43,19 @@ SRC = $(SRC_DIR)/main.c \ $(SRC_DIR)/utils/stack_size.c OBJ = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC)) DEP = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.d, $(SRC)) +BONUS_SRC = $(SRC_DIR)/checker/checker_main.c \ + $(SRC_DIR)/initialization/check_args.c \ + $(SRC_DIR)/initialization/exit_with_error.c \ + $(SRC_DIR)/initialization/generate_stack.c \ + $(SRC_DIR)/sort/is_sorted_stack.c \ + $(SRC_DIR)/stack_operations/push.c \ + $(SRC_DIR)/stack_operations/swap.c \ + $(SRC_DIR)/stack_operations/rotate.c \ + $(SRC_DIR)/stack_operations/reverse_rotate.c \ + $(SRC_DIR)/utils/get_content.c \ + $(SRC_DIR)/utils/stack_size.c +BONUS_OBJ = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(BONUS_SRC)) +BONUS_DEP = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.d, $(BONUS_SRC)) OBJ_FILTER_MAIN = $(filter-out $(BUILD_DIR)/main.o, $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC))) TEST_NAME = tester TEST_SRC = $(TEST_DIR)/test_check_args.cpp \ @@ -77,11 +91,20 @@ all: CFLAGS += $(PROD_FLAGS) all: title all: $(NAME) +bonus: CFLAGS += $(PROD_FLAGS) +bonus: bonus_title +bonus: $(CHECKER) + $(NAME): $(OBJ) @printf "\n" @make -C $(LIBFT_DIR) @$(CC) $(CFLAGS) $^ -L $(LIBFT_DIR) -lft -o $@ +$(CHECKER): $(BONUS_OBJ) + @printf "\n" + @make -C $(LIBFT_DIR) + @$(CC) $(CFLAGS) $^ -L $(LIBFT_DIR) -lft -o $@ + $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(@D) @$(CC) $(CFLAGS) $(INCLUDE) $(DEPFLAGS) -c $< -o $@ @@ -151,6 +174,9 @@ norm: title: @echo "$(BLUE)push_swap$(RESET)" +bonus_title: + @echo "$(BLUE)bonus$(RESET)" + .PHONY: all clean fclean re dev redev leak releak test norm title -include $(DEP) diff --git a/include/checker.h b/include/checker.h new file mode 100644 index 0000000..710cc51 --- /dev/null +++ b/include/checker.h @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* checker.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: reasuke +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/02/14 10:26:54 by reasuke #+# #+# */ +/* Updated: 2024/02/14 10:29:44 by reasuke ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CHECKER_H +# define CHECKER_H + +# include "../libft/libft.h" +# include "types.h" + +#endif diff --git a/src/checker/checker_main.c b/src/checker/checker_main.c new file mode 100644 index 0000000..dab9669 --- /dev/null +++ b/src/checker/checker_main.c @@ -0,0 +1,95 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* checker_main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: reasuke +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/02/14 10:25:27 by reasuke #+# #+# */ +/* Updated: 2024/02/14 13:50:38 by reasuke ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "checker.h" +#include "initialization.h" +#include "sort.h" +#include "stack_operations.h" + +static bool _is_operation_present(const char *op) +{ + bool present; + + present = false; + present |= !ft_strcmp(op, "sa\n"); + present |= !ft_strcmp(op, "sb\n"); + present |= !ft_strcmp(op, "ss\n"); + present |= !ft_strcmp(op, "pa\n"); + present |= !ft_strcmp(op, "pb\n"); + present |= !ft_strcmp(op, "ra\n"); + present |= !ft_strcmp(op, "rb\n"); + present |= !ft_strcmp(op, "rr\n"); + present |= !ft_strcmp(op, "rra\n"); + present |= !ft_strcmp(op, "rrb\n"); + present |= !ft_strcmp(op, "rrr\n"); + return (present); +} + +static void _stack_operation(t_stack **p_a, t_stack **p_b, const char *op) +{ + if (!ft_strcmp(op, "sa\n") || !ft_strcmp(op, "ss\n")) + swap_stack(p_a); + if (!ft_strcmp(op, "sb\n") || !ft_strcmp(op, "ss\n")) + swap_stack(p_b); + if (!ft_strcmp(op, "pa\n")) + push_stack(p_b, p_a); + if (!ft_strcmp(op, "pb\n")) + push_stack(p_a, p_b); + if (!ft_strcmp(op, "ra\n") || !ft_strcmp(op, "rr\n")) + rotate_stack(p_a); + if (!ft_strcmp(op, "rb\n") || !ft_strcmp(op, "rr\n")) + rotate_stack(p_b); + if (!ft_strcmp(op, "rra\n") || !ft_strcmp(op, "rrr\n")) + reverse_rotate_stack(p_a); + if (!ft_strcmp(op, "rrb\n") || !ft_strcmp(op, "rrr\n")) + reverse_rotate_stack(p_b); +} + +static void _sort_based_on_operation(t_stack **p_a, t_stack **p_b) +{ + char *op; + + while (true) + { + op = get_next_line(STDIN_FILENO); + if (!op) + break ; + if (!_is_operation_present(op)) + exit_with_error(); + _stack_operation(p_a, p_b, op); + } +} + +static void _check_sorted(t_stack *st_a, int size_a) +{ + if (stack_size(st_a) != size_a) + ft_putendl_fd("KO", STDOUT_FILENO); + if (is_sorted_stack(st_a)) + ft_putendl_fd("OK", STDOUT_FILENO); + else + ft_putendl_fd("KO", STDOUT_FILENO); +} + +int main(int argc, char **argv) +{ + t_stack *st_a; + t_stack *st_b; + + if (argc == 1) + return (0); + check_args(argc, argv); + st_a = generate_stack(argc, argv); + st_b = NULL; + _sort_based_on_operation(&st_a, &st_b); + _check_sorted(st_a, argc - 1); + return (0); +}