summaryrefslogtreecommitdiff
path: root/cmd_optimization.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd_optimization.c')
-rw-r--r--cmd_optimization.c126
1 files changed, 62 insertions, 64 deletions
diff --git a/cmd_optimization.c b/cmd_optimization.c
index d0928f5..ac023c5 100644
--- a/cmd_optimization.c
+++ b/cmd_optimization.c
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 16:42:34 by dkaiser #+# #+# */
-/* Updated: 2024/04/17 09:41:10 by dkaiser ### ########.fr */
+/* Updated: 2024/04/26 13:55:55 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,79 +14,77 @@
#include "libft/libft.h"
#include "push_swap.h"
-static enum e_pscmd get_cmd(t_list *cmd)
+static enum e_pscmd get_cmd(t_list *cmd)
{
- if (cmd)
- return (*(enum e_pscmd*)cmd->content);
- else
- return NO_CMD;
+ if (cmd)
+ return (*(enum e_pscmd *)cmd->content);
+ else
+ return (NO_CMD);
}
-static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1, enum e_pscmd cmd2)
+static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1,
+ enum e_pscmd cmd2)
{
- t_list *cur;
- t_list *last;
- int optimizations;
+ t_list *cur;
+ t_list *last;
+ int optimizations;
- cur = data->cmds;
- last = cur;
- optimizations = 0;
-
- if (!cur)
- return ;
- while (cur && cur->next)
- {
- if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2) || (get_cmd(cur) == cmd2 && get_cmd(cur->next) == cmd1))
- {
- last->next = cur->next->next;
- ft_lstdelone(cur->next, free);
- ft_lstdelone(cur, free);
- optimizations++;
- }
- last = last->next;
- if (last)
- cur = last->next;
- else
- cur = NULL;
- }
- if (optimizations)
- optimize_redundant(data, cmd1, cmd2);
+ cur = data->cmds;
+ last = cur;
+ optimizations = 0;
+ while (cur && cur->next)
+ {
+ if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2)
+ || (get_cmd(cur) == cmd2 && get_cmd(cur->next) == cmd1))
+ {
+ last->next = cur->next->next;
+ ft_lstdelone(cur->next, free);
+ ft_lstdelone(cur, free);
+ optimizations++;
+ }
+ last = last->next;
+ if (last)
+ cur = last->next;
+ else
+ cur = NULL;
+ }
+ if (optimizations)
+ optimize_redundant(data, cmd1, cmd2);
}
-static void optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1, enum e_pscmd cmd2, enum e_pscmd new_cmd)
+static void optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1,
+ enum e_pscmd cmd2, enum e_pscmd new_cmd)
{
- t_list *cur;
- t_list *last;
- int optimizations;
-
- cur = data->cmds;
- last = cur;
- optimizations = 0;
+ t_list *cur;
+ t_list *last;
+ int optimizations;
- if (!cur)
- return ;
- while (cur && cur->next)
- {
- if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2) || (get_cmd(cur) == cmd2 && get_cmd(cur->next) == cmd1))
- {
- last->next = cur->next;
- *(enum e_pscmd*)cur->next->content = new_cmd;
- ft_lstdelone(cur, free);
- optimizations++;
- }
- last = last->next;
- if (last)
- cur = last->next;
- else
- cur = NULL;
- }
- if (optimizations)
- optimize_two_stack_ops(data, cmd1, cmd2, new_cmd);
+ cur = data->cmds;
+ last = cur;
+ optimizations = 0;
+ while (cur && cur->next)
+ {
+ if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2)
+ || (get_cmd(cur) == cmd2 && get_cmd(cur->next) == cmd1))
+ {
+ last->next = cur->next;
+ *(enum e_pscmd *)cur->next->content = new_cmd;
+ ft_lstdelone(cur, free);
+ optimizations++;
+ }
+ last = last->next;
+ if (last)
+ cur = last->next;
+ else
+ cur = NULL;
+ }
+ if (optimizations)
+ optimize_two_stack_ops(data, cmd1, cmd2, new_cmd);
}
-void optimize_commands(t_psdata *data)
+void optimize_commands(t_psdata *data)
{
- optimize_redundant(data, PA, PB);
- optimize_redundant(data, RB, RRB);
- optimize_two_stack_ops(data, RA, RB, RR);
+ optimize_redundant(data, PA, PB);
+ optimize_redundant(data, RB, RRB);
+ optimize_two_stack_ops(data, RA, RB, RR);
}