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)
/* 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 */
/* */
/* ************************************************************************** */
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)
{
int optimizations;
cur = data->cmds;
- last = cur;
+ last = ft_lstnew(NULL);
+ if (!last)
+ return ;
+ last->next = cur;
optimizations = 0;
while (cur && cur->next)
{
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);
int optimizations;
cur = data->cmds;
- last = cur;
+ last = ft_lstnew(NULL);
+ if (!last)
+ return ;
optimizations = 0;
while (cur && cur->next)
{
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);
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
/* 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 */
/* */
/* ************************************************************************** */
{
if (*str == '-')
str++;
+ if (!*str)
+ return (0);
while (*str)
{
if (ft_isdigit(*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);
}
/* 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 */
/* */
/* ************************************************************************** */
} 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);
/* 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 */
/* */
/* ************************************************************************** */
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;
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);
}