From 7dce30ca733f6b310f997c4515e486718b273d44 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 15 Jan 2020 14:19:33 +0100 Subject: WIP: Checker base --- .gitignore | 2 + Makefile | 53 +++++++++++++++++----- libft | 2 +- src/checker/check.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++ src/checker/checker.h | 38 ++++++++++++++++ src/checker/main.c | 34 ++++++++++++++ src/common/common.h | 20 +++++---- src/common/stack.c | 26 ++++++++++- src/push_swap/main.c | 4 ++ src/push_swap/push_swap.h | 4 ++ src/src_checker/check.c | 52 --------------------- src/src_checker/checker.h | 35 --------------- src/src_checker/main.c | 28 ------------ src/src_push_swap/main.c | 4 -- subject.en.pdf | Bin 1351267 -> 1681897 bytes 15 files changed, 271 insertions(+), 143 deletions(-) create mode 100644 src/checker/check.c create mode 100644 src/checker/checker.h create mode 100644 src/checker/main.c create mode 100644 src/push_swap/main.c create mode 100644 src/push_swap/push_swap.h delete mode 100644 src/src_checker/check.c delete mode 100644 src/src_checker/checker.h delete mode 100644 src/src_checker/main.c delete mode 100644 src/src_push_swap/main.c diff --git a/.gitignore b/.gitignore index 869816d..0e68f7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ a.out checker push_swap +!src/checker +!src/push_swap *.o *.ghc diff --git a/Makefile b/Makefile index f1bb6eb..f36ee3c 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,46 @@ RM = rm -f +LIBFT_DIR = libft + CC = gcc -CCFLAGS = -Wall -Wextra #-Werror +CCFLAGS = -I$(COMMON_DIR) -I$(LIBFT_DIR)/include -Wall -Wextra #-Werror +LDFLAGS = -L$(LIBFT_DIR) -lft + +SRC_DIR = src +COMMON_DIR = $(SRC_DIR)/common CHECKER_NAME = checker -CHECKER_SRC = checker_src/main.c -CHECKER_OBJ = $(CHECKER_SRC:.c=.o) + +COMMON_HEADER = $(COMMON_DIR)/common.h +COMMON_FILES = stack.c action.c +COMMON_SRC = $(addprefix $(COMMON_DIR)/,$(COMMON_FILES)) +COMMON_OBJ = $(COMMON_SRC:.c=.o) PUSH_SWAP_NAME = push_swap -PUSH_SWAP_SRC = push_swap_src/main.c -PUSH_SWAP_OBJ = $(PUSH_SWAP_SRC:.c=.o) +CHECKER_DIR = $(SRC_DIR)/checker +PUSH_SWAP_DIR = $(SRC_DIR)/push_swap +CHECKER_HEADER = $(CHECKER_DIR)/checker.h +CHECKER_FILES = main.c check.c +CHECKER_SRC = $(addprefix $(CHECKER_DIR)/,$(CHECKER_FILES)) +CHECKER_OBJ = $(CHECKER_SRC:.c=.o) +CHECKER_OBJ += $(COMMON_OBJ) + +PUSH_SWAP_HEADER = $(PUSH_SWAP_DIR)/push_swap.h +PUSH_SWAP_FILES = main.c +PUSH_SWAP_SRC = $(addprefix $(PUSH_SWAP_DIR)/,$(PUSH_SWAP_FILES)) +PUSH_SWAP_OBJ = $(PUSH_SWAP_SRC:.c=.o) +PUSH_SWAP_OBJ += $(COMMON_OBJ) -all: $(CHECKER_NAME) $(PUSH_SWAP_NAME) +all: libft_all $(CHECKER_NAME) $(PUSH_SWAP_NAME) +$(CHECKER_NAME): CCFLAGS += -I$(CHECKER_DIR) $(CHECKER_NAME): $(CHECKER_OBJ) $(CHECKER_HEADER) - $(CC) -o $@ $(CHECKER_OBJ) + $(CC) $(LDFLAGS) -o $@ $(CHECKER_OBJ) +$(PUSH_SWAP_NAME): CCFLAGS += -I$(PUSH_SWAP_DIR) $(PUSH_SWAP_NAME): $(PUSH_SWAP_OBJ) $(PUSH_SWAP_HEADER) - $(CC) -o $@ $(PUSH_SWAP_OBJ) + $(CC) $(LDFLAGS) -o $@ $(PUSH_SWAP_OBJ) %.o: %.c $(CC) $(CCFLAGS) -c -o $@ $< @@ -26,9 +48,16 @@ $(PUSH_SWAP_NAME): $(PUSH_SWAP_OBJ) $(PUSH_SWAP_HEADER) clean: $(RM) $(CHECKER_OBJ) $(RM) $(PUSH_SWAP_OBJ) + make -C $(LIBFT_DIR) fclean + +fclean: + $(RM) $(CHECKER_OBJ) $(CHECKER_NAME) + $(RM) $(PUSH_SWAP_OBJ) $(PUSH_SWAP_NAME) + make -C $(LIBFT_DIR) fclean -fclean: clean - $(RM) $(CHECKER_NAME) - $(RM) $(PUSH_SWAP_NAME) +re: + make fclean + make all -re: fclean all +libft_all: + make -C $(LIBFT_DIR) diff --git a/libft b/libft index ee4b8e5..e8a7d07 160000 --- a/libft +++ b/libft @@ -1 +1 @@ -Subproject commit ee4b8e5e481850c936c5df10a0d3e70038234754 +Subproject commit e8a7d07f1c99b5ce6210603d88098580af95fb13 diff --git a/src/checker/check.c b/src/checker/check.c new file mode 100644 index 0000000..d4ab16f --- /dev/null +++ b/src/checker/check.c @@ -0,0 +1,112 @@ +#include "checker.h" + +t_status check(t_stack *a, t_stack *b) +{ + t_action action; + t_list *tmp; + t_list *action_stack; + + action_stack = NULL; + while ((action = read_action()) != ACTION_EOF) + { + if (action == ACTION_ERROR || (tmp = ft_lstnew((void*)action)) == NULL) + { + ft_lstclear(&action_stack, NULL); + return (STATUS_FAILURE); + } + ft_lstadd_front(&action_stack, tmp); + } + action_stack = ft_lstreverse_ret(action_stack); + while (action_stack != NULL) + { + exec_action((t_action)action_stack->content, a, b); + ft_lstpop_front(&action_stack, NULL); + } + return (stack_sorted(a) && stack_empty(b) ? + STATUS_SUCCESS : STATUS_FAILURE); +} + +t_action read_action(void) +{ + int i; + int ret; + char c; + char buf[4]; + + ft_bzero(buf, sizeof(char) * 4); + i = 0; + while ((ret = read(STDIN_FILENO, &c, 1)) > 0) + { + if (c == '\n') + return (str_action(buf)); + if (i >= 3) + return (ACTION_ERROR); + buf[i++] = c; + buf[i] = '\0'; + } + return (ret == 0 ? ACTION_EOF : ACTION_ERROR); +} + +t_action str_action(char *s) +{ + if (ft_strcmp(s, "sa") != 0) + return (ACTION_SA); + if (ft_strcmp(s, "sb") != 0) + return (ACTION_SB); + if (ft_strcmp(s, "ss") != 0) + return (ACTION_SS); + if (ft_strcmp(s, "pa") != 0) + return (ACTION_PA); + if (ft_strcmp(s, "pa") != 0) + return (ACTION_PB); + if (ft_strcmp(s, "ra") != 0) + return (ACTION_RA); + if (ft_strcmp(s, "rb") != 0) + return (ACTION_RB); + if (ft_strcmp(s, "rr") != 0) + return (ACTION_RR); + if (ft_strcmp(s, "rra") != 0) + return (ACTION_RRA); + if (ft_strcmp(s, "rrb") != 0) + return (ACTION_RRB); + if (ft_strcmp(s, "rrr") != 0) + return (ACTION_RRR); + return (ACTION_ERROR); +} + +void exec_action(t_action action, t_stack *a, t_stack *b) +{ + if (action == ACTION_SA) + swap_a(a); + else if (action == ACTION_SB) + swap_b(b); + else if (action == ACTION_SS) + swap_both(a, b); + else if (action == ACTION_PA) + push_a(a, b); + else if (action == ACTION_PB) + push_b(b, a); + else if (action == ACTION_RA) + rotate_a(a); + else if (action == ACTION_RB) + rotate_b(b); + else if (action == ACTION_RR) + rotate_both(a, b); + else if (action == ACTION_RRA) + reverse_rotate_a(a); + else if (action == ACTION_RRB) + reverse_rotate_b(b); + else if (action == ACTION_RRR) + reverse_rotate_both(a, b); +} + +t_bool stack_sorted(t_stack *stack) +{ + int i; + + i = -1; + while (++i < stack->top - 1) + if (stack->elements[i] > stack->elements[i + 1]) + return (FALSE); + return (TRUE); +} diff --git a/src/checker/checker.h b/src/checker/checker.h new file mode 100644 index 0000000..1fbb46f --- /dev/null +++ b/src/checker/checker.h @@ -0,0 +1,38 @@ +#ifndef CHECKER_H +# define CHECKER_H + +# include +# include "common.h" +# include "libft.h" + +typedef enum +{ + STATUS_SUCCESS, + STATUS_FAILURE, + STATUS_ERROR +} t_status; + +typedef enum +{ + ACTION_SA, + ACTION_SB, + ACTION_SS, + ACTION_PA, + ACTION_PB, + ACTION_RA, + ACTION_RB, + ACTION_RR, + ACTION_RRA, + ACTION_RRB, + ACTION_RRR, + ACTION_ERROR, + ACTION_EOF +} t_action; + +t_status check(t_stack *a, t_stack *b); +t_action read_action(void); +t_action str_action(char *s); +void exec_action(t_action action, t_stack *a, t_stack *b); +t_bool stack_sorted(t_stack *stack); + +#endif diff --git a/src/checker/main.c b/src/checker/main.c new file mode 100644 index 0000000..d113802 --- /dev/null +++ b/src/checker/main.c @@ -0,0 +1,34 @@ +#include "checker.h" + +// need to check duplicate +int main(int argc, char **argv) +{ + t_status s; + + if (argc == 1) + return (0); + t_stack *a = stack_new(argc - 1); + while (--argc > 1) + { + errno = 0; + ft_strict_atoi(argv[argc]); + if (errno != 0) + { + stack_destroy(a); + ft_putendl_fd("Error", STDERR_FILENO); + return (1); + } + stack_push(a, ft_atoi(argv[argc])); + } + t_stack *b = stack_new(argc - 1); + s = check(a, b); + if (s == STATUS_SUCCESS) + ft_putendl("OK"); + else if (s == STATUS_FAILURE) + ft_putendl("KO"); + else if (s == STATUS_ERROR) + ft_putendl_fd("Error", STDERR_FILENO); + stack_destroy(a); + stack_destroy(b); + return 0; +} diff --git a/src/common/common.h b/src/common/common.h index 4225d87..18ccae3 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -14,15 +14,17 @@ typedef struct ** stack.c */ -t_stack *stack_new(int size); -void stack_destroy(t_stack *stack); -void stack_push(t_stack *stack, int n); -void stack_pop(t_stack *stack); -int stack_peek(t_stack *stack); -void stack_swap(t_stack *stack); -void stack_push_to(t_stack *from, t_stack *to); -void stack_rotate(t_stack *stack); -void stack_reverse_rotate(t_stack *stack); +t_stack *stack_new(int size); +void stack_destroy(t_stack *stack); +void stack_push(t_stack *stack, int n); +void stack_pop(t_stack *stack); +int stack_peek(t_stack *stack); +void stack_swap(t_stack *stack); +void stack_push_to(t_stack *from, t_stack *to); +void stack_rotate(t_stack *stack); +void stack_reverse_rotate(t_stack *stack); +t_bool stack_empty(t_stack *stack); +int stack_length(t_stack *stack); /* ** action.c diff --git a/src/common/stack.c b/src/common/stack.c index 693fb85..02d3207 100644 --- a/src/common/stack.c +++ b/src/common/stack.c @@ -11,7 +11,7 @@ t_stack *stack_new(int size) free(stack); return (NULL); } - stack->top = 0; + stack->top = -1; return (stack); } @@ -25,17 +25,21 @@ void stack_destroy(t_stack *stack) void stack_push(t_stack *stack, int n) { - stack->elements[stack->top] = n; stack->top++; + stack->elements[stack->top] = n; } void stack_pop(t_stack *stack) { + if (stack_empty(stack)) + return ; stack->top--; } int stack_peek(t_stack *stack) { + if (stack_empty(stack)) + return (0); return (stack->elements[stack->top]); } @@ -44,6 +48,8 @@ void stack_swap(t_stack *stack) int first; int second; + if (stack_length(stack) < 2) + return ; first = stack_peek(stack); stack_pop(stack); second = stack_peek(stack); @@ -56,6 +62,8 @@ void stack_push_to(t_stack *from, t_stack *to) { int tmp; + if (stack_empty(from)) + return ; tmp = stack_peek(from); stack_pop(from); stack_push(to, tmp); @@ -65,6 +73,8 @@ void stack_rotate(t_stack *stack) { int tmp; + if (stack_length(stack) < 2) + return ; tmp = stack_peek(stack); ft_memmove(&stack->elements[1], stack->elements, sizeof(int) * stack->top); stack->elements[0] = tmp; @@ -74,7 +84,19 @@ void stack_reverse_rotate(t_stack *stack) { int tmp; + if (stack_length(stack) < 2) + return ; tmp = stack->elements[0]; ft_memmove(stack->elements, &stack->elements[1], sizeof(int) * stack->top); stack_push(stack, tmp); } + +t_bool stack_empty(t_stack *stack) +{ + return (stack->top == -1); +} + +int stack_length(t_stack *stack) +{ + return (stack->top + 1); +} diff --git a/src/push_swap/main.c b/src/push_swap/main.c new file mode 100644 index 0000000..5019e79 --- /dev/null +++ b/src/push_swap/main.c @@ -0,0 +1,4 @@ +int main(int argc, char **argv) +{ + return 0; +} diff --git a/src/push_swap/push_swap.h b/src/push_swap/push_swap.h new file mode 100644 index 0000000..0e553e0 --- /dev/null +++ b/src/push_swap/push_swap.h @@ -0,0 +1,4 @@ +#ifndef PUSH_SWAP_H +# define PUSH_SWAP_H + +#endif diff --git a/src/src_checker/check.c b/src/src_checker/check.c deleted file mode 100644 index 1a7a943..0000000 --- a/src/src_checker/check.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "checker.h" - -t_status check(t_stack *a, t_stack *b) -{ - -} - -t_action read_action(void) -{ - int i; - char c; - char buf[4]; - - ft_bzero(buf, sizeof(char) * 4); - i = 0; - while (read(STDIN_FILENO, 1, &c) > 0) - { - if (c == '\n') - return (str_action(buf)); - if (i >= 3) - return (ACTION_ERROR); - buf[i++] = c; - buf[i] = '\0'; - } -} - -t_action str_action(char *s) -{ - if (ft_strcmp(s, "sa") != 0) - return (ACTION_SA); - if (ft_strcmp(s, "sb") != 0) - return (ACTION_SB); - if (ft_strcmp(s, "ss") != 0) - return (ACTION_SS); - if (ft_strcmp(s, "pa") != 0) - return (ACTION_PA); - if (ft_strcmp(s, "pa") != 0) - return (ACTION_PB); - if (ft_strcmp(s, "ra") != 0) - return (ACTION_RA); - if (ft_strcmp(s, "rb") != 0) - return (ACTION_RB); - if (ft_strcmp(s, "rr") != 0) - return (ACTION_RR); - if (ft_strcmp(s, "rra") != 0) - return (ACTION_RRA); - if (ft_strcmp(s, "rrb") != 0) - return (ACTION_RRB); - if (ft_strcmp(s, "rrr") != 0); - return (ACTION_RRR); - return (ACTION_ERROR); -} diff --git a/src/src_checker/checker.h b/src/src_checker/checker.h deleted file mode 100644 index ad24942..0000000 --- a/src/src_checker/checker.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef CHECKER_H -# define CHECKER_H - -# include -# include "common.h" -# include "libft.h" - -typedef enum -{ - STATUS_SUCCESS, - STATUS_FAILURE, - STATUS_ERROR -} t_status; - -typedef enum -{ - ACTION_SA, - ACTION_SB, - ACTION_SS, - ACTION_PA, - ACTION_PB, - ACTION_RA, - ACTION_RB, - ACTION_RR, - ACTION_RRA, - ACTION_RRB, - ACTION_RRR, - ACTION_ERROR -} t_action; - -t_status check(t_stack *a, t_stack *b); -t_action read_action(void); -t_action str_action(char *s); - -#endif diff --git a/src/src_checker/main.c b/src/src_checker/main.c deleted file mode 100644 index 17b10c3..0000000 --- a/src/src_checker/main.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "checker.h" - -int main(int argc, char **argv) -{ - t_status s; - - if (argc == 1) - return (0); - if (!check_argv(argc, argv)) - { - ft_putendl_fd("Error", STDERR_FILENO); - return (1); - } - t_stack *a = stack_new(argc - 1); - t_stack *b = stack_new(argc - 1); - while (--argc > 1) - stack_push(a, ft_atoi(argv[argc])); - s = check(a, b)) - if (s == STATUS_SUCCESS) - ft_putendl("OK"); - else if (s == STATUS_FAILURE) - ft_putendl("KO"); - else if (s == STATUS_ERROR) - ft_putendl_fd("Error", STDERR_FILENO); - stack_destroy(a); - stack_destroy(b); - return 0; -} diff --git a/src/src_push_swap/main.c b/src/src_push_swap/main.c deleted file mode 100644 index 5019e79..0000000 --- a/src/src_push_swap/main.c +++ /dev/null @@ -1,4 +0,0 @@ -int main(int argc, char **argv) -{ - return 0; -} diff --git a/subject.en.pdf b/subject.en.pdf index d90f5b9..f598861 100644 Binary files a/subject.en.pdf and b/subject.en.pdf differ -- cgit