aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-11-25 04:47:15 +0100
committerCharles <sircharlesaze@gmail.com>2019-11-25 04:47:15 +0100
commit6808cd0fbd3edf68422228d2ee6a41ad70f971d5 (patch)
treee490451ca06766021086e45062980ee3aa607964
parent9af248e8a78f111a39d507f199d56eb8af6e52d6 (diff)
downloadlibasm-6808cd0fbd3edf68422228d2ee6a41ad70f971d5.tar.gz
libasm-6808cd0fbd3edf68422228d2ee6a41ad70f971d5.tar.bz2
libasm-6808cd0fbd3edf68422228d2ee6a41ad70f971d5.zip
draft for ft_list*.s functions
-rw-r--r--Makefile5
-rw-r--r--ft_list_remove_if.s58
-rw-r--r--ft_list_sort.s166
3 files changed, 177 insertions, 52 deletions
diff --git a/Makefile b/Makefile
index c30f961..f1aa92d 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@
# By: cacharle <marvin@42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2019/11/22 02:56:22 by cacharle #+# #+# #
-# Updated: 2019/11/23 02:31:39 by cacharle ### ########.fr #
+# Updated: 2019/11/25 04:46:29 by cacharle ### ########.fr #
# #
# **************************************************************************** #
@@ -21,7 +21,8 @@ NASMFLAGS = -f macho64
NAME = libasm.a
ASMSRC = ft_strlen.s ft_strcpy.s ft_strcmp.s ft_write.s ft_read.s \
- ft_strdup.s ft_atoi_base.s
+ ft_strdup.s ft_atoi_base.s ft_list_push_front.s \
+ ft_list_size.s ft_list_sort.s ft_list_remove_if.s
ASMOBJ = $(ASMSRC:.s=.o)
all: $(NAME)
diff --git a/ft_list_remove_if.s b/ft_list_remove_if.s
index e69de29..9ae6ba5 100644
--- a/ft_list_remove_if.s
+++ b/ft_list_remove_if.s
@@ -0,0 +1,58 @@
+; **************************************************************************** ;
+; ;
+; ::: :::::::: ;
+; ft_list_remove_if.s :+: :+: :+: ;
+; +:+ +:+ +:+ ;
+; By: cacharle <marvin@42.fr> +#+ +:+ +#+ ;
+; +#+#+#+#+#+ +#+ ;
+; Created: 2019/11/25 04:23:22 by cacharle #+# #+# ;
+; Updated: 2019/11/25 04:23:22 by cacharle ### ########.fr ;
+; ;
+; **************************************************************************** ;
+
+global _ft_list_remove_if
+
+; ft_list_remove_if(t_list **begin_list, void *data_ref,
+; int (*cmp)(), void (*free_fct)(void *))
+
+_ft_list_remove_if:
+ sub rsp, 8
+
+ cmp rdi, 0x0
+ je FT_LIST_REMOVE_IF_END
+ cmp [rdi], 0x0
+ je FT_LIST_REMOVE_IF_END
+
+ push rdi
+ mov rdi, [rdi] + 8 ;&(*begin_list)->val
+ call rdx
+ pop rdi
+ cmp rax, 0x0
+ je FT_LIST_REMOVE_IF_REMOVE
+
+
+ mov rdi, [rdi] + 8
+ call _ft_list_remove_if
+ add rsp, 8
+ ret
+
+FT_LIST_REMOVE_IF_REMOVE:
+ mov [rsp], [rdi] + 8 ; saved_next = (*begin_list)->next
+
+ push rdi
+ mov rdi, [[rdi]]
+ call rcx ; free_fct((*begin_list)->data)
+ pop rdi
+
+ push rdi
+ mov rdi, [rdi]
+ call _free ; free(*begin_list)
+ pop rdi
+
+ mov [rdi], [rsp] ; *begin_list = saved_next
+
+ call _ft_list_remove_if
+
+FT_LIST_REMOVE_IF_END:
+ add rsp, 8
+ ret
diff --git a/ft_list_sort.s b/ft_list_sort.s
index 1ab5485..23924e1 100644
--- a/ft_list_sort.s
+++ b/ft_list_sort.s
@@ -1,51 +1,117 @@
-# **************************************************************************** #
-# #
-# ::: :::::::: #
-# ft_list_sort.s :+: :+: :+: #
-# +:+ +:+ +:+ #
-# By: cacharle <marvin@42.fr> +#+ +:+ +#+ #
-# +#+#+#+#+#+ +#+ #
-# Created: 2019/11/22 21:03:52 by cacharle #+# #+# #
-# Updated: 2019/11/22 21:27:27 by cacharle ### ########.fr #
-# #
-# **************************************************************************** #
-
-.globl _ft_list_sort
-
-# void ft_list_sort(t_list **begin_list, int (*cmp)());
+; **************************************************************************** ;
+; ;
+; ::: :::::::: ;
+; ft_list_sort.s :+: :+: :+: ;
+; +:+ +:+ +:+ ;
+; By: cacharle <marvin@42.fr> +#+ +:+ +#+ ;
+; +#+#+#+#+#+ +#+ ;
+; Created: 2019/11/22 21:03:52 by cacharle #+# #+# ;
+; Updated: 2019/11/22 21:27:27 by cacharle ### ########.fr ;
+; ;
+; **************************************************************************** ;
+
+global _ft_list_sort
+
+; void ft_list_sort(t_list **begin_list, int (*cmp)());
_ft_list_sort:
- push rbp
- mov rbp, rsp
-
- call _ft_list_size
- cmp eax, 2
- jl FT_LIST_SORT_END
-
- # split in half
- # _ft_list_sort both half
- # merge_sorted
-
-
- FT_LIST_SORT_END:
- pop rbp
- ret
-
-
-merge_sorted:
-#ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
-#{
-# ListNode *merged = NULL;
-#
-# if (l1 == NULL && l2 == NULL)
-# return NULL;
-# if (l1 == NULL)
-# return l2;
-# if (l2 == NULL)
-# return l1;
-# merged = l1->val < l2->val ? l1 : l2;
-# if (l1->val < l2->val)
-# merged->next = mergeTwoLists(l1->next, l2);
-# else
-# merged->next = mergeTwoLists(l1, l2->next);
-# return merged;
-#}
+ ; t_list *fast
+ ; t_list *slow
+ ; t_list *middle
+ sub rsp, 24
+
+ cmp rdi, 0x0
+ je FT_LIST_SORT_END
+ cmp [rdi], 0x0
+ je FT_LIST_SORT_END
+ cmp [[rdi] + 8], 0x0 ; use tmp register
+ je FT_LIST_SORT_END
+
+ mov [rsp], [[rdi] + 8]
+ mov [rsp + 8], [rdi]
+FT_GET_MIDDLE_LOOP:
+ mov [rsp], [rsp + 8]
+ cmp [rsp], 0x0
+ je FT_GET_MIDDLE_LOOP_END
+ mov [rsp], [rsp + 8]
+ mov [rsp + 8], [[rsp + 8] + 8] ; i want c pointers back plz
+FT_GET_MIDDLE_LOOP_END:
+ mov [rsp + 16], [[rsp + 8] + 8]
+ mov [[rsp + 8] + 8], 0x0
+
+ push rdi
+ call _ft_list_sort
+ pop rdi
+
+ push rdi
+ mov rdi, [rsp + 16]
+ call _ft_list_sort
+ pop rdi
+
+ push rdi
+ push rsi
+ mov rdx, rsi
+ mov rdi, [rdi]
+ mov rsi, [rsp + 16]
+ call _merge_sorted_list
+ pop rsi
+ pop rdi
+
+ mov [rdi], rax
+
+ add rsp, 24
+FT_LIST_SORT_END:
+ ret
+
+
+
+; t_list *merge_sorted_list(t_list* l1, t_list* l2, int (*cmp)())
+_merge_sorted_list:
+ sub rsp, 8
+
+ cmp rdi, 0x0
+ je MERGE_SORTED_LIST_RETURN_L2
+ cmp rsi, 0x0
+ je MERGE_SORTED_LIST_RETURN_L1
+
+ push rdi
+ push rsi
+ mov rdi, [rdi]
+ mov rsi, [rsi]
+ call rdx ; cmp
+ pop rsi
+ pop rdi
+
+ cmp rax, 0x0
+ jl L1_LT_L2
+
+; L1_GE_L2
+ mov rsp, rsi
+ push rdi
+ push rsi
+ mov rdi, [rdi + 8]
+ call _merge_sorted_list
+ pop rsi
+ pop rdi
+ mov [rsp + 8], rax
+ jmp MERGE_SORTED_LIST_END
+
+L1_LT_L2:
+ mov rsp, rdi
+ push rdi
+ push rsi
+ mov rsi, [rsi + 8]
+ call _merge_sorted_list
+ pop rsi
+ pop rdi
+ mov [rsp + 8], rax
+
+MERGE_SORTED_LIST_END:
+ mov rax, [rsp]
+ add rsp, 8
+ ret
+MERGE_SORTED_LIST_RETURN_L1:
+ mov rax, rdi
+ ret
+MERGE_SORTED_LIST_RETURN_L2:
+ mov rax, rsi
+ ret