aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-01-19 08:38:07 +0100
committerCharles <sircharlesaze@gmail.com>2020-01-19 08:38:07 +0100
commit2b4327b7a448228f67a054b4bdaa3f84b9db2164 (patch)
tree154e15f5533dee898f180e3588165c06b43a76ec /src
parent5e0e41652315114a8b0d883c473dbbbfc1c28342 (diff)
downloadpush_swap-2b4327b7a448228f67a054b4bdaa3f84b9db2164.tar.gz
push_swap-2b4327b7a448228f67a054b4bdaa3f84b9db2164.tar.bz2
push_swap-2b4327b7a448228f67a054b4bdaa3f84b9db2164.zip
refactored stack functions and checking for duplicates in args
Diffstat (limited to 'src')
-rw-r--r--src/checker/check.c37
-rw-r--r--src/checker/checker.h17
-rw-r--r--src/checker/main.c51
-rw-r--r--src/common/common.h37
-rw-r--r--src/common/stack.c103
-rw-r--r--src/common/stack_core.c56
-rw-r--r--src/common/stack_helper.c41
-rw-r--r--src/common/stack_op.c63
8 files changed, 233 insertions, 172 deletions
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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdio.h>
@@ -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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdio.h>
@@ -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 <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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 <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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 <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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;
+}