diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/common.h | 58 | ||||
| -rw-r--r-- | src/common/parse.c | 49 | ||||
| -rw-r--r-- | src/common/stack_core.c | 3 |
3 files changed, 91 insertions, 19 deletions
diff --git a/src/common/common.h b/src/common/common.h index 0cfd687..97881c8 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/19 06:43:24 by cacharle ### ########.fr */ +/* Updated: 2020/01/19 13:31:27 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include <stdio.h> @@ -17,39 +17,61 @@ #include <stdlib.h> #include "libft.h" +typedef enum +{ + STATUS_SUCCESS, + STATUS_FAILURE, + STATUS_ERROR, + STATUS_EOF, +} t_status; + +typedef enum +{ + STACK_NO_TAG, + STACK_A, + STACK_B +} t_stack_tag; + typedef struct { - int *elements; - int top; -} t_stack; + int *elements; + t_stack_tag tag; + int top; +} t_stack; /* ** stack_core.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); +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); /* ** 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); +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 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); +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); + +/* +** parse.c +*/ + +t_status parse(int argc, char **argv, t_stack *a); #endif diff --git a/src/common/parse.c b/src/common/parse.c new file mode 100644 index 0000000..b0415cd --- /dev/null +++ b/src/common/parse.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/19 09:03:28 by cacharle #+# #+# */ +/* Updated: 2020/01/19 13:33:17 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "common.h" + +static t_status has_dup(int *xs, size_t size) +{ + 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); +} + +t_status parse(int argc, char **argv, t_stack *a) +{ + while (--argc >= 1) + { + errno = 0; + stack_push(a, ft_strict_atoi(argv[argc])); + if (errno != 0) + { + ft_putendl_fd("Error", STDERR_FILENO); + stack_destroy(a); + return (STATUS_FAILURE); + } + } + if (has_dup(a->elements, stack_length(a)) != STATUS_SUCCESS) + { + ft_putendl_fd("Error", STDERR_FILENO); + stack_destroy(a); + return (STATUS_FAILURE); + } + return (STATUS_SUCCESS); +} diff --git a/src/common/stack_core.c b/src/common/stack_core.c index 6875862..bf766d4 100644 --- a/src/common/stack_core.c +++ b/src/common/stack_core.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/19 06:37:45 by cacharle #+# #+# */ -/* Updated: 2020/01/19 06:50:50 by cacharle ### ########.fr */ +/* Updated: 2020/01/19 13:33:08 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,7 @@ t_stack *stack_new(int size) return (NULL); } stack->top = -1; + stack->tag = STACK_NO_TAG; return (stack); } |
