From beba6ce86fad8ac17d64929b505eacc069931591 Mon Sep 17 00:00:00 2001 From: Tanguy MAZE Date: Sat, 23 Feb 2019 18:35:46 +0100 Subject: [PATCH] lazy week-end stuff B) started conversion of functions to data structure system still WIP added first iteration of int parser does not check for int overflow --- Makefile | 123 +++++++++++++++++++++++++++++++++++++++++++ includes/push_swap.h | 24 ++++++--- srcs/checker.c | 77 +++++++++++++++++++++++++++ srcs/ps_push.c | 8 +-- srcs/ps_rerot.c | 16 ++++-- srcs/ps_rot.c | 24 ++++++--- srcs/ps_stktools.c | 81 ++++++++++++++++++++++++++++ srcs/ps_swap.c | 24 ++++++--- 8 files changed, 348 insertions(+), 29 deletions(-) create mode 100644 Makefile create mode 100644 srcs/checker.c create mode 100644 srcs/ps_stktools.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3c5d178 --- /dev/null +++ b/Makefile @@ -0,0 +1,123 @@ +#******************************************************************************# +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tmaze +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2019/02/23 14:30:57 by tmaze #+# #+# # +# Updated: 2019/02/23 14:54:34 by tmaze ### ########.fr # +# # +#******************************************************************************# + +NAME1 = checker +NAME2 = push_swap + +# Make options +MAKEFLAGS += --no-print-directory + +# Output +UNAME := $(shell uname) +ifeq ($(UNAME), Darwin) +ECHO = @echo +endif + +ifeq ($(UNAME), Linux) +ECHO = @echo -e +endif + +# Compilator +CC = gcc +FLAGS = -Wall -Wextra -g + +# Folders +LIBDIR = libft +SRCDIR = srcs +OBJDIR = objs +INCDIR = includes libft + +# Source files +SRC = ps_push.c \ + ps_rot.c \ + ps_rerot.c \ + ps_swap.c \ + ps_stktools.c \ + \ + checker.c + +MAIN1 = checker.c +MAIN2 = push_swap.c + +OBJ = $(SRC:.c=.o) + +OBJ1 = $(MAIN1:.c=.o) +OBJ2 = $(MAIN2:.c=.o) + +LIB = ft +LIBFILE = libft.a + +# Prefixes +OBJP = $(addprefix $(OBJDIR)/, $(SRC:.c=.o)) +OBJP1 = $(addprefix $(OBJDIR)/, $(MAIN1:.c=.o)) +OBJP2 = $(addprefix $(OBJDIR)/, $(MAIN2:.c=.o)) +INCP = $(foreach dir, $(INCDIR), -I$(dir)) +OBJS_DIRS = $(sort $(dir $(OBJP))) +# Default Rule +DRULE = all + +# Main rules +default : + @echo -e "$(PUR)===> $(GRE)$(NAME) : $(PUR) START RULE : $(DRULE) <===$(DEF)" + @make $(DRULE) + @echo -e "$(PUR)===> $(GRE)$(NAME) : $(PUR) END RULE : $(DRULE) <===$(DEF)" + +all : $(NAME1) $(NAME2) + +re : fclean default + +# Compilation rules + +$(OBJDIR)/%.o : $(SRCDIR)/%.c $(OBJDIR) + $(CC) $(FLAGS) -c -o $@ $< $(INCP) + +$(OBJDIR) : + @echo -e "$(YEL)===> $(GRE)$(NAME) : $(YEL) Objects Compilation <===$(DEF)" + @mkdir -p $(OBJDIR) + @mkdir -p $(OBJS_DIRS) + +$(LIBDIR)/$(LIBFILE) : + @echo -e "$(YEL)===> $(GRE)$(NAME) : $(YEL) Librairy Compilation <===$(DEFOB)" + $(MAKE) -C $(LIBDIR) all + +$(NAME1) : $(OBJP1) $(OBJP) $(LIBDIR)/$(LIBFILE) + @echo -e "$(YEL)===> $(GRE)$(NAME) : $(YEL) Binary Compilation <===$(DEF)" + $(CC) $(FLAGS) -c $@ $^ $(INCP) -L$(LIBDIR) -l$(LIB) + +$(NAME2) : $(OBJP2) $(OBJP) $(LIBDIR)/$(LIBFILE) + @echo -e "$(YEL)===> $(GRE)$(NAME) : $(YEL) Binary Compilation <===$(DEF)" + $(CC) $(FLAGS) -c $@ $^ $(INCP) -L$(LIBDIR) -l$(LIB) + +# Cleaner rules +clean : + @echo -e "$(RED)===> $(GRE)$(NAME) : $(RED) Delete Object Files <===$(DEF)" + @rm -rf $(OBJDIR) + +fclean : clean + @echo -e "$(RED)===> $(GRE)$(NAME) : $(RED) Delete Binary File <===$(DEF)" + @rm -f $(NAME1) $(NAME2) + +# Phony +.PHONY = default all re clean fclean $(OBJDIR) $(NAME) +# Color +DEF = \033[0m +BLA = \033[30m +BLI = \033[5m +BLU = \033[34m +CYA = \033[36m +GRA = \033[1m +GRE = \033[32m +PUR = \033[35m +RED = \033[31m +SOU = \033[4m +WHI = \033[37m +YEL = \033[33m diff --git a/includes/push_swap.h b/includes/push_swap.h index 469660c..3af7873 100644 --- a/includes/push_swap.h +++ b/includes/push_swap.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 14:13:53 by tmaze #+# #+# */ -/* Updated: 2019/02/21 16:05:33 by tmaze ### ########.fr */ +/* Updated: 2019/02/23 15:46:05 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,17 +23,25 @@ typedef struct s_stack struct s_stack *next; } t_stack; +typedef struct s_psdata +{ + t_stack *a; + t_stack *b; + size_t size_a; + size_t size_b; + t_list op; +} t_psdata; + t_stack *ps_stknew(int nb); void *ps_stkpsh(t_stack **s, t_stack *new); t_stack *ps_stkpop(t_stack **s); +void ps_stkclean(t_psdata *data); -size_t ps_stksize(t_stack *s); - -void ps_swap(t_stack **s); -void ps_sswap(t_stack **a, t_stack **b); -void ps_push(t_stack **s1, t_stack **s2); -void ps_rot(t_stack **s); -void ps_rrot(t_stack **a, t_stack **b); +void ps_swap(t_psdata *data, char c); +void ps_sswap(t_psdata *data); +void ps_push(t_psdata *data, char c); +void ps_rot(t_psdata *data, char c); +void ps_rrot(t_psdata *data); void ps_rerot(t_stack **s); void ps_rrerot(t_stack **a, t_stack **b); diff --git a/srcs/checker.c b/srcs/checker.c new file mode 100644 index 0000000..b2a279e --- /dev/null +++ b/srcs/checker.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* checker.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/23 13:35:15 by tmaze #+# #+# */ +/* Updated: 2019/02/23 14:55:14 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +int ft_issign(char c) +{ + return (c == '+' || c == '-'); +} + +int ft_iswhitespace(char c) +{ + return (c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' + || c == '\r'); +} + +int ft_hasdigit(char *s) +{ + int i; + + i = 0; + while (s[i] && !ft_isdigit(s[i])) + i++; + return (ft_isdigit(s[i])); +} + +int check_input(char *in, int *ret) +{ + int i; + + i = 0; + ret = 0; + while (in[i] && ft_iswhitespace(in[i])) + i++; + if (in[i] && ft_issign(in[i])) + i++; + while (in[i] && ft_iswhitespace(in[i])) + i++; + while (in[i] && ft_isdigit(in[i])) + i++; + while (in[i] && ft_iswhitespace(in[i])) + i++; + if (in[i] == '\0' && ft_hasdigit(in)) + *ret = ft_atoi(in); + return (in[i] == '\0' && ft_hasdigit(in)); +} + +int main(int ac, char **av) +{ + int i; + int nb; + t_stack *new; + t_psdata data; + + i = ac; + while (i > 0) + { + if (check_input(av[i], &nb) && (new = ps_stknew(nb)) != NULL) + ps_stkpsh(&(data.a), new); + else + { + ft_putendl_fd("Error", 2); + ps_stkclean(&data); + return (2); + } + i--; + } +} diff --git a/srcs/ps_push.c b/srcs/ps_push.c index 6881efc..5e3ae36 100644 --- a/srcs/ps_push.c +++ b/srcs/ps_push.c @@ -6,16 +6,16 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 15:59:46 by tmaze #+# #+# */ -/* Updated: 2019/02/21 16:06:04 by tmaze ### ########.fr */ +/* Updated: 2019/02/23 15:45:30 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void ps_push(t_stack **s1, t_stack **s2) +void ps_push(t_psdata *data, char c) { t_stack *tmp; - tmp = ps_stkpop(s2); - ps_stkpsh(s1, tmp); + tmp = ps_stkpop(data, (c == 'a') ? c : 'b'); + ps_stkpsh(data, c, tmp); } diff --git a/srcs/ps_rerot.c b/srcs/ps_rerot.c index ba10c5e..05d4cf9 100644 --- a/srcs/ps_rerot.c +++ b/srcs/ps_rerot.c @@ -6,18 +6,28 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 16:32:04 by tmaze #+# #+# */ -/* Updated: 2019/02/21 16:38:13 by tmaze ### ########.fr */ +/* Updated: 2019/02/23 16:08:12 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void ps_rerot(t_stack **s) +void ps_rerot(t_psdata *data, char c) { + t_stack *s; t_stack *prec; t_stack *tmp; + size_t size; - if (*s != NULL && ps_stksize(*s) > 2) + if (c == 'a') + s = data->a; + if (c == 'a') + size = data->size_a; + else if (c == 'b') + s = data->b; + if (c == 'b') + size = data->size_b; + if (*s != NULL && size > 2) { prec = *s; tmp = (*s)->next; diff --git a/srcs/ps_rot.c b/srcs/ps_rot.c index d2d9617..5d0e97b 100644 --- a/srcs/ps_rot.c +++ b/srcs/ps_rot.c @@ -6,18 +6,28 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 16:07:55 by tmaze #+# #+# */ -/* Updated: 2019/02/21 16:26:22 by tmaze ### ########.fr */ +/* Updated: 2019/02/23 15:19:59 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void ps_rot(t_stack **s) +void ps_rot(t_psdata *data, char c) { + t_stack *s; t_stack *tmp; t_stack *ind; + size_t size; - if (*s != NULL && ps_stksize(*s) > 2) + if (c == 'a') + s = data->a; + if (c == 'a') + size = data->size_a; + else if (c == 'b') + s = data->b; + if (c == 'b') + size = data->size_b; + if (*s != NULL && size > 2) { tmp = ps_stkpop(s); ind = *s; @@ -25,12 +35,12 @@ void ps_rot(t_stack **s) ind = ind->next; ind->next = tmp; } - else if (*s != NULL && ps_stksize(*s) == 2) + else if (*s != NULL && size == 2) ps_swap(s); } -void ps_rrot(t_stack **a, t_stack **b) +void ps_rrot(t_psdata *data) { - ps_rot(a); - ps_rot(b); + ps_rot(data, 'a'); + ps_rot(data, 'b'); } diff --git a/srcs/ps_stktools.c b/srcs/ps_stktools.c new file mode 100644 index 0000000..5b4940f --- /dev/null +++ b/srcs/ps_stktools.c @@ -0,0 +1,81 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ps_stktools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/22 14:41:27 by tmaze #+# #+# */ +/* Updated: 2019/02/23 13:30:09 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +t_stack *ps_stknew(int nb) +{ + t_stack *ret; + + if ((ret = (t_stack*)ft_memalloc(sizeof(t_stack))) != NULL) + { + ret->nb = nb; + ret->next = NULL; + } + return (ret); +} + +void *ps_stkpsh(t_stack **s, t_stack *new) +{ + t_stack *ind; + + if (s != NULL && *s == NULL) + *s = new; + else if (s != NULL) + { + ind = *s; + *s = new; + new->next = ind; + } +} + +t_stack *ps_stkpop(t_stack **s) +{ + t_stack *ret; + + ret = NULL; + if (s != NULL && *s != NULL) + { + ret = *s; + *s = ret->next; + } + return (ret); +} + +void ft_lstdelstr(void *content, size_t content_size) +{ + ft_strdel(&content); + content_size = 0; +} + +void ps_stkclean(t_psdata *data) +{ + t_stack *tmp; + + tmp = data->a; + while (data->a != NULL) + { + tmp = data->a; + data->a = data->a->next; + ft_memedel(&tmp); + data->size_a--; + } + tmp = data->b; + while (data->b != NULL) + { + tmp = data->b; + data->b = data->b->next; + ft_memedel(&tmp); + data->size_b--; + } + ft_lstdel(&op, &ft_lstdelstr); +} diff --git a/srcs/ps_swap.c b/srcs/ps_swap.c index 3a09a04..6db54c3 100644 --- a/srcs/ps_swap.c +++ b/srcs/ps_swap.c @@ -6,17 +6,27 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 14:06:40 by tmaze #+# #+# */ -/* Updated: 2019/02/21 15:19:00 by tmaze ### ########.fr */ +/* Updated: 2019/02/23 15:24:12 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void ps_swap(t_stack **s) +void ps_swap(t_psdata *data, char c) { - int tmp; + t_stack *s; + size_t size; + int tmp; - if (*s != NULL && ps_stksize(*s) >= 2) + if (c == 'a') + s = data->a; + if (c == 'a') + size = data->size_a; + else if (c == 'b') + s = data->b; + if (c == 'b') + size = data->size_b; + if (*s != NULL && size >= 2) { tmp = (*s)->nb; (*s)->nb = (*s)->next->nb; @@ -24,8 +34,8 @@ void ps_swap(t_stack **s) } } -void ps_sswap(t_stack **a, t_stack **b) +void ps_sswap(t_psdata *data) { - ps_swap(a); - ps_swap(b); + ps_swap(data, 'a'); + ps_swap(data, 'b'); }