From 2b4327b7a448228f67a054b4bdaa3f84b9db2164 Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 19 Jan 2020 08:38:07 +0100 Subject: refactored stack functions and checking for duplicates in args --- Makefile | 2 +- libft | 2 +- src/checker/check.c | 37 +++++++++-------- src/checker/checker.h | 17 ++++---- src/checker/main.c | 51 ++++++++++++----------- src/common/common.h | 37 ++++++++--------- src/common/stack.c | 103 ---------------------------------------------- src/common/stack_core.c | 56 +++++++++++++++++++++++++ src/common/stack_helper.c | 41 ++++++++++++++++++ src/common/stack_op.c | 63 ++++++++++++++++++++++++++++ 10 files changed, 235 insertions(+), 174 deletions(-) delete mode 100644 src/common/stack.c create mode 100644 src/common/stack_core.c create mode 100644 src/common/stack_helper.c create mode 100644 src/common/stack_op.c diff --git a/Makefile b/Makefile index 5ae44dd..8177f82 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ COMMON_DIR = $(SRC_DIR)/common CHECKER_NAME = checker COMMON_HEADER = $(COMMON_DIR)/common.h -COMMON_FILES = stack.c action.c +COMMON_FILES = stack_core.c stack_op.c stack_helper.c COMMON_SRC = $(addprefix $(COMMON_DIR)/,$(COMMON_FILES)) COMMON_OBJ = $(COMMON_SRC:.c=.o) diff --git a/libft b/libft index 676b37f..a5b0687 160000 --- a/libft +++ b/libft @@ -1 +1 @@ -Subproject commit 676b37f963789f3d85b18ed5b3708374971b65e2 +Subproject commit a5b068767440327f910dfa815be12ff4c0d94309 diff --git a/src/checker/check.c b/src/checker/check.c index 35bd992..125fdb7 100644 --- a/src/checker/check.c +++ b/src/checker/check.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/18 10:16:08 by cacharle #+# #+# */ -/* Updated: 2020/01/18 12:04:41 by cacharle ### ########.fr */ +/* Updated: 2020/01/19 07:11:05 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,17 +45,17 @@ t_status read_action(t_stack *a, t_stack *b) } static t_action g_actions[] = { - {"sa", FLAG_ARG_A, {.arg_1 = &swap_a}}, - {"sb", FLAG_ARG_B, {.arg_1 = &swap_b}}, - {"ss", FLAG_ARG_A_B, {.arg_2 = &swap_both}}, - {"pa", FLAG_ARG_A_B, {.arg_2 = &push_a}}, - {"pb", FLAG_ARG_B_A, {.arg_2 = &push_a}}, - {"ra", FLAG_ARG_A, {.arg_1 = &rotate_a}}, - {"rb", FLAG_ARG_B, {.arg_1 = &rotate_b}}, - {"rr", FLAG_ARG_A_B, {.arg_2 = &rotate_both}}, - {"rra", FLAG_ARG_A, {.arg_1 = &reverse_rotate_a}}, - {"rrb", FLAG_ARG_B, {.arg_1 = &reverse_rotate_b}}, - {"rrr", FLAG_ARG_A_B, {.arg_2 = &reverse_rotate_both}}, + {"sa", FLAG_ARG_A, {.arg_1 = &stack_swap}}, + {"sb", FLAG_ARG_B, {.arg_1 = &stack_swap}}, + {"ss", FLAG_ARG_A_B, {.arg_2 = &stack_swap_2}}, + {"pa", FLAG_ARG_A_B, {.arg_2 = &stack_push_to}}, + {"pb", FLAG_ARG_B_A, {.arg_2 = &stack_push_to}}, + {"ra", FLAG_ARG_A, {.arg_1 = &stack_rotate}}, + {"rb", FLAG_ARG_B, {.arg_1 = &stack_rotate}}, + {"rr", FLAG_ARG_A_B, {.arg_2 = &stack_rotate_2}}, + {"rra", FLAG_ARG_A, {.arg_1 = &stack_reverse_rotate}}, + {"rrb", FLAG_ARG_B, {.arg_1 = &stack_reverse_rotate}}, + {"rrr", FLAG_ARG_A_B, {.arg_2 = &stack_reverse_rotate_2}}, }; #define ACTIONS_SIZE (sizeof(g_actions) / sizeof(t_action)) @@ -65,18 +65,21 @@ t_status exec_action(char action_id[ACTION_ID_BUF_SIZE], { int i; - printf("action id %s\n", action_id); i = 0; while (ft_strcmp(action_id, g_actions[i].id) != 0) i++; if (i == ACTIONS_SIZE) return (STATUS_ERROR); - if (g_actions[i].args & FLAG_ARG_A) + if (g_actions[i].args == FLAG_ARG_A) g_actions[i].func.arg_1(a); - else if (g_actions[i].args & FLAG_ARG_B) + else if (g_actions[i].args == FLAG_ARG_B) g_actions[i].func.arg_1(b); - else if (g_actions[i].args & FLAG_ARG_A_B) + else if (g_actions[i].args == FLAG_ARG_A_B) g_actions[i].func.arg_2(a, b); + else if (g_actions[i].args == FLAG_ARG_B_A) + g_actions[i].func.arg_2(b, a); + else + return (STATUS_ERROR); return (STATUS_SUCCESS); } @@ -87,7 +90,7 @@ t_bool stack_sorted(t_stack *stack) if (stack_length(stack) < 2) return (TRUE); i = -1; - while (++i < stack->top - 1) + while (++i < stack->top) if (stack->elements[i] > stack->elements[i + 1]) return (FALSE); return (TRUE); diff --git a/src/checker/checker.h b/src/checker/checker.h index e6973b6..877f669 100644 --- a/src/checker/checker.h +++ b/src/checker/checker.h @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/18 10:16:12 by cacharle #+# #+# */ -/* Updated: 2020/01/18 12:01:00 by cacharle ### ########.fr */ +/* Updated: 2020/01/19 06:30:04 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include @@ -18,10 +18,7 @@ # include "common.h" # include "libft.h" -# define FLAG_ARG_A (1 << 0) -# define FLAG_ARG_B (1 << 1) -# define FLAG_ARG_A_B (1 << 2) -# define FLAG_ARG_B_A (1 << 3) +# define ACTION_ID_BUF_SIZE 4 typedef enum { @@ -31,9 +28,13 @@ typedef enum STATUS_EOF, } t_status; -# define ACTION_ID_BUF_SIZE 4 - -typedef char t_flag_arg; +typedef enum +{ + FLAG_ARG_A, + FLAG_ARG_B, + FLAG_ARG_A_B, + FLAG_ARG_B_A +} t_flag_arg; typedef struct { diff --git a/src/checker/main.c b/src/checker/main.c index 3866800..3b4b313 100644 --- a/src/checker/main.c +++ b/src/checker/main.c @@ -6,18 +6,31 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/18 10:16:14 by cacharle #+# #+# */ -/* Updated: 2020/01/18 12:04:47 by cacharle ### ########.fr */ +/* Updated: 2020/01/19 08:37:03 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "checker.h" -// need to check duplicate -int main(int argc, char **argv) +t_status has_dup(int *xs, size_t size) { - t_status s; - t_stack *a; - t_stack *b; + int *tmp; + t_status ret; + + if ((tmp = (int*)malloc(size * sizeof(int))) == NULL) + return (STATUS_ERROR); + ft_memcpy(tmp, xs, size * sizeof(int)); + ret = ft_is_set(tmp, size, sizeof(int), &ft_compar_int) ? + STATUS_SUCCESS : STATUS_FAILURE; + free(tmp); + return (ret); +} + +int main(int argc, char **argv) +{ + t_status s; + t_stack *a; + t_stack *b; if (argc == 1) return (0); @@ -25,7 +38,6 @@ int main(int argc, char **argv) return (1); while (--argc >= 1) { - printf("argc %d\n", argc); errno = 0; stack_push(a, ft_strict_atoi(argv[argc])); if (errno != 0) @@ -35,19 +47,18 @@ int main(int argc, char **argv) return (1); } } + + if (has_dup(a->elements, stack_length(a)) != STATUS_SUCCESS) + { + ft_putendl_fd("Error", STDERR_FILENO); + stack_destroy(a); + return (1); + } if ((b = stack_new(stack_length(a))) == NULL) { stack_destroy(a); return (1); } - printf("stack a: "); - for (int i = 0; i <= a->top; i++) - printf("[%d]", a->elements[i]); - printf("\nstack b: "); - for (int i = 0; i <= b->top; i++) - printf("[%d]", b->elements[i]); - printf("\n"); - s = check(a, b); if (s == STATUS_SUCCESS) ft_putendl("OK"); @@ -55,15 +66,7 @@ int main(int argc, char **argv) ft_putendl("KO"); else if (s == STATUS_ERROR) ft_putendl_fd("Error", STDERR_FILENO); - - printf("stack a: "); - for (int i = 0; i <= a->top; i++) - printf("[%d]", a->elements[i]); - printf("\nstack b: "); - for (int i = 0; i <= b->top; i++) - printf("[%d]", b->elements[i]); - printf("\n"); stack_destroy(a); stack_destroy(b); - return 0; + return (0); } diff --git a/src/common/common.h b/src/common/common.h index b914d5e..0cfd687 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/18 11:20:54 by cacharle #+# #+# */ -/* Updated: 2020/01/18 11:21:03 by cacharle ### ########.fr */ +/* Updated: 2020/01/19 06:43:24 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include @@ -24,7 +24,7 @@ typedef struct } t_stack; /* -** stack.c +** stack_core.c */ t_stack *stack_new(int size); @@ -32,27 +32,24 @@ 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 +** stack_op.c +*/ + +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); + +/* +** stack_helper.c */ -void swap_a(t_stack *a); -void swap_b(t_stack *b); -void swap_both(t_stack *a, t_stack *b); -void push_a(t_stack *a, t_stack *b); -void push_b(t_stack *b, t_stack *a); -void rotate_a(t_stack *a); -void rotate_b(t_stack *b); -void rotate_both(t_stack *a, t_stack *b); -void reverse_rotate_a(t_stack *a); -void reverse_rotate_b(t_stack *b); -void reverse_rotate_both(t_stack *a, t_stack *b); +void stack_swap_2(t_stack *stack_a, t_stack *stack_b); +void stack_rotate_2(t_stack *stack_a, t_stack *stack_b); +void stack_reverse_rotate_2(t_stack *stack_a, t_stack *stack_b); +t_bool stack_empty(t_stack *stack); +int stack_length(t_stack *stack); #endif diff --git a/src/common/stack.c b/src/common/stack.c deleted file mode 100644 index 269dbc4..0000000 --- a/src/common/stack.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "common.h" - -t_stack *stack_new(int size) -{ - t_stack *stack; - - if ((stack = (t_stack*)malloc(sizeof(t_stack))) == NULL) - return (NULL); - if ((stack->elements = (int*)malloc(sizeof(int) * size)) == NULL) - { - free(stack); - return (NULL); - } - stack->top = -1; - return (stack); -} - -void stack_destroy(t_stack *stack) -{ - if (stack == NULL) - return ; - free(stack->elements); - free(stack); -} - -void stack_push(t_stack *stack, int n) -{ - stack->top++; - printf("%d\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]); -} - -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); - stack_pop(stack); - stack_push(stack, first); - stack_push(stack, second); -} - -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); -} - -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; -} - -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/common/stack_core.c b/src/common/stack_core.c new file mode 100644 index 0000000..6875862 --- /dev/null +++ b/src/common/stack_core.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* stack_core.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/19 06:37:45 by cacharle #+# #+# */ +/* Updated: 2020/01/19 06:50:50 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "common.h" + +t_stack *stack_new(int size) +{ + t_stack *stack; + + if ((stack = (t_stack*)malloc(sizeof(t_stack))) == NULL) + return (NULL); + if ((stack->elements = (int*)malloc(sizeof(int) * size)) == NULL) + { + free(stack); + return (NULL); + } + stack->top = -1; + return (stack); +} + +void stack_destroy(t_stack *stack) +{ + if (stack == NULL) + return ; + free(stack->elements); + free(stack); +} + +void stack_push(t_stack *stack, int 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]); +} diff --git a/src/common/stack_helper.c b/src/common/stack_helper.c new file mode 100644 index 0000000..6ea7cef --- /dev/null +++ b/src/common/stack_helper.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* stack_helper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/19 06:40:18 by cacharle #+# #+# */ +/* Updated: 2020/01/19 07:03:32 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "common.h" + +void stack_swap_2(t_stack *stack_a, t_stack *stack_b) +{ + stack_swap(stack_a); + stack_swap(stack_b); +} + +void stack_rotate_2(t_stack *stack_a, t_stack *stack_b) +{ + stack_rotate(stack_a); + stack_rotate(stack_b); +} + +void stack_reverse_rotate_2(t_stack *stack_a, t_stack *stack_b) +{ + stack_reverse_rotate(stack_a); + stack_reverse_rotate(stack_b); +} + +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/common/stack_op.c b/src/common/stack_op.c new file mode 100644 index 0000000..e1c095b --- /dev/null +++ b/src/common/stack_op.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* stack.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/19 06:37:44 by cacharle #+# #+# */ +/* Updated: 2020/01/19 07:06:58 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "common.h" + +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); + stack_pop(stack); + stack_push(stack, first); + stack_push(stack, second); +} + +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); +} + +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, + (stack_length(stack) - 1) * sizeof(int)); + stack->elements[0] = tmp; +} + +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, + (stack_length(stack) - 1) * sizeof(int)); + stack->elements[stack->top] = tmp; +} -- cgit