]> git.dkaiser.de - 42/push_swap.git/commitdiff
Sort three and some norme cleanup
authorDominik Kaiser <dkaiser@3-F-6.42heilbronn.de>
Fri, 26 Apr 2024 16:36:07 +0000 (18:36 +0200)
committerDominik Kaiser <dkaiser@3-F-6.42heilbronn.de>
Fri, 26 Apr 2024 16:36:07 +0000 (18:36 +0200)
Makefile
cmd_optimization.c
ft_atol.c [new file with mode: 0644]
input_handling.c
push_swap.h
sorting.c

index 4ae0b74673a818a27d784269fe65718177b2be10..6a499133b40ce9eca7f926930486543e0ef7e654 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ LIBFT = libft
 CC = cc
 CFLAGS = -Wall -Wextra -Werror
 
-SRC_FILES = main.c input_handling.c stack_utils.c command_handling.c sorting.c stack_optimization.c cmd_optimization.c
+SRC_FILES = main.c ft_atol.c input_handling.c stack_utils.c command_handling.c sorting.c stack_optimization.c cmd_optimization.c
 OBJ_FILES = $(SRC_FILES:%.c=%.o)
 
 LIB_DIR = $(LIBFT)
index ac023c54ef11b2eea81b9054e6b28f361f9bd0c4..b310f349c9ec8de6e21ba927c73364706e41dbd2 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/13 16:42:34 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/26 13:55:55 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/26 15:52:23 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -22,6 +22,15 @@ static enum e_pscmd  get_cmd(t_list *cmd)
                return (NO_CMD);
 }
 
+static void    set_last(t_list **last, t_list **cur)
+{
+       *last = (*last)->next;
+       if (*last)
+               *cur = (*last)->next;
+       else
+               *cur = NULL;
+}
+
 static void    optimize_redundant(t_psdata *data, enum e_pscmd cmd1,
                enum e_pscmd cmd2)
 {
@@ -30,7 +39,10 @@ static void  optimize_redundant(t_psdata *data, enum e_pscmd cmd1,
        int             optimizations;
 
        cur = data->cmds;
-       last = cur;
+       last = ft_lstnew(NULL);
+       if (!last)
+               return ;
+       last->next = cur;
        optimizations = 0;
        while (cur && cur->next)
        {
@@ -42,11 +54,7 @@ static void  optimize_redundant(t_psdata *data, enum e_pscmd cmd1,
                        ft_lstdelone(cur, free);
                        optimizations++;
                }
-               last = last->next;
-               if (last)
-                       cur = last->next;
-               else
-                       cur = NULL;
+               set_last(&last, &cur);
        }
        if (optimizations)
                optimize_redundant(data, cmd1, cmd2);
@@ -60,7 +68,9 @@ static void   optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1,
        int             optimizations;
 
        cur = data->cmds;
-       last = cur;
+       last = ft_lstnew(NULL);
+       if (!last)
+               return ;
        optimizations = 0;
        while (cur && cur->next)
        {
@@ -72,11 +82,7 @@ static void  optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1,
                        ft_lstdelone(cur, free);
                        optimizations++;
                }
-               last = last->next;
-               if (last)
-                       cur = last->next;
-               else
-                       cur = NULL;
+               set_last(&last, &cur);
        }
        if (optimizations)
                optimize_two_stack_ops(data, cmd1, cmd2, new_cmd);
diff --git a/ft_atol.c b/ft_atol.c
new file mode 100644 (file)
index 0000000..8184301
--- /dev/null
+++ b/ft_atol.c
@@ -0,0 +1,41 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   ft_atol.c                                          :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2024/04/26 16:18:28 by dkaiser           #+#    #+#             */
+/*   Updated: 2024/04/26 17:56:54 by dkaiser          ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "push_swap.h"
+
+long   ft_atol(const char *str)
+{
+       long    result;
+       int             i;
+       int             posneg;
+
+       posneg = 1;
+       result = 0;
+       i = 0;
+       while ((str[i] >= '\t' && str[i] <= '\r') || str[i] == ' ')
+       {
+               i++;
+       }
+       if (str[i] == '-')
+       {
+               posneg = -1;
+               i++;
+       }
+       else if (str[i] == '+')
+               i++;
+       while (str[i] >= '0' && str[i] <= '9')
+       {
+               result = 10 * result + str[i] - '0';
+               i++;
+       }
+       return (result * posneg);
+}
index 274a0fbe36e41dc095580fb9ee8b44963299186c..50e9e87b296bbf3bcb3ec857e0cf534fa549b0d3 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/12 17:31:49 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/26 13:55:13 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/26 18:35:38 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -17,6 +17,8 @@ static int    is_nbr(char *str)
 {
        if (*str == '-')
                str++;
+       if (!*str)
+               return (0);
        while (*str)
        {
                if (ft_isdigit(*str))
@@ -29,10 +31,15 @@ static int  is_nbr(char *str)
 
 static int     is_input_only_nbrs(int argc, char *argv[])
 {
+       long    nbr;
+
        while (argc-- > 1)
        {
                if (!is_nbr(argv[argc]))
                        return (0);
+               nbr = ft_atol(argv[argc]);
+               if (nbr < -2147483648 || nbr > 2147483647)
+                       return (0);
        }
        return (1);
 }
index 3091fb8bce5f530a4ef432c076d2b32d849ddde5..99b99af606b31b9b786baa39ac1d37c432a08fdb 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/12 16:59:09 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/26 13:54:38 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/26 16:19:46 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -45,6 +45,7 @@ typedef struct s_psdata
 }                      t_psdata;
 
 t_stack                *create_stack(int argc, char *argv[]);
+long           ft_atol(const char *str);
 
 void           stack_swap(t_stack *stack);
 void           stack_push(t_stack *dst_stack, t_stack *src_stack);
index ec8a33647506c0933bf60757b2113feeccee514e..88055e7d83940091556fd374f5bf6bc39596df0f 100644 (file)
--- a/sorting.c
+++ b/sorting.c
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/13 15:04:19 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/26 13:54:26 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/26 18:35:27 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -28,6 +28,18 @@ static int   is_sorted(t_stack *stack)
        return (1);
 }
 
+static void    sort_three(t_psdata *data)
+{
+       if (data->a->stack[1] > data->a->stack[0]
+               && data->a->stack[1] > data->a->stack[2])
+               run_command(data, RRA);
+       else if (data->a->stack[0] > data->a->stack[1]
+               && data->a->stack[0] > data->a->stack[2])
+               run_command(data, RA);
+       if (data->a->stack[0] > data->a->stack[1])
+               run_command(data, SA);
+}
+
 static void    ps_radixsort(t_psdata *data, int bit)
 {
        int     i;
@@ -51,6 +63,12 @@ static void  ps_radixsort(t_psdata *data, int bit)
 
 void   stack_sort(t_psdata *data)
 {
-       if (!is_sorted(data->a))
+       if (is_sorted(data->a))
+               return ;
+       else if (data->a->size == 2)
+               run_command(data, SA);
+       else if (data->a->size == 3)
+               sort_three(data);
+       else
                ps_radixsort(data, 0);
 }