aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--README.md2
-rw-r--r--ft_list_remove_if.s82
-rw-r--r--main.c37
4 files changed, 92 insertions, 33 deletions
diff --git a/Makefile b/Makefile
index 2925114..3bf5764 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@
# By: cacharle <marvin@42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2019/11/22 02:56:22 by cacharle #+# #+# #
-# Updated: 2020/02/08 00:14:34 by cacharle ### ########.fr #
+# Updated: 2020/02/08 20:55:14 by cacharle ### ########.fr #
# #
# **************************************************************************** #
@@ -22,7 +22,7 @@ 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_list_push_front.s \
- ft_list_size.s ft_list_sort.s #ft_list_remove_if.s
+ ft_list_size.s ft_list_sort.s ft_list_remove_if.s
ASMOBJ = $(ASMSRC:.s=.o)
all: $(NAME)
diff --git a/README.md b/README.md
index c7af14f..2bd0427 100644
--- a/README.md
+++ b/README.md
@@ -14,5 +14,5 @@ Clone the test [repository](https://github.com/HappyTramp/libasm_test) next to t
```
cd libasm_test
-make run
+make runbonus
```
diff --git a/ft_list_remove_if.s b/ft_list_remove_if.s
index 9ae6ba5..5a2fd8b 100644
--- a/ft_list_remove_if.s
+++ b/ft_list_remove_if.s
@@ -12,47 +12,83 @@
global _ft_list_remove_if
-; ft_list_remove_if(t_list **begin_list, void *data_ref,
-; int (*cmp)(), void (*free_fct)(void *))
+extern _free
+
+%define NULL 0x0
+
+%macro EXTERN_FUNCTION_SAVE 0
+ push rdi
+ push rsi
+ push rdx
+ push rcx
+%endmacro
+
+%macro EXTERN_FUNCTION_SAVE_END 0
+ pop rcx
+ pop rdx
+ pop rsi
+ pop rdi
+%endmacro
+; ft_list_remove_if(t_list **begin_list, void *data_ref,
+; int (*cmp)(void *data, void *data_ref),
+; void (*free_fct)(void *))
_ft_list_remove_if:
+ ; t_list *saved_next
+
+ ; === prolog ===
+ push rbp
+ mov rbp, rsp
sub rsp, 8
- cmp rdi, 0x0
+ ; === base condition ===
+ cmp rdi, NULL
je FT_LIST_REMOVE_IF_END
- cmp [rdi], 0x0
+ cmp qword [rdi], NULL
je FT_LIST_REMOVE_IF_END
- push rdi
- mov rdi, [rdi] + 8 ;&(*begin_list)->val
- call rdx
- pop rdi
- cmp rax, 0x0
+ ; === compare (*begin_list)->data and data_ref
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ mov rdi, [rdi + 0]
+ call rdx ; cmp((*begin_list)->data, data_ref)
+ EXTERN_FUNCTION_SAVE_END
+ cmp rax, 0
je FT_LIST_REMOVE_IF_REMOVE
-
- mov rdi, [rdi] + 8
+ ; === next element ===
+ push rdi
+ mov rdi, [rdi]
+ lea rdi, [rdi + 8]
call _ft_list_remove_if
- add rsp, 8
- ret
+ pop rdi
+ jmp FT_LIST_REMOVE_IF_END
+ ; === remove head and go next ===
FT_LIST_REMOVE_IF_REMOVE:
- mov [rsp], [rdi] + 8 ; saved_next = (*begin_list)->next
+ mov rax, [rdi] ; rax = *begin_list
+ mov rax, [rax + 8] ; rax = rax->next
+ mov [rbp - 8], rax ; saved_next = (*begin_list)->next
- push rdi
- mov rdi, [[rdi]]
- call rcx ; free_fct((*begin_list)->data)
- pop rdi
-
- push rdi
+ push rdi ; strange behavior
+ EXTERN_FUNCTION_SAVE
mov rdi, [rdi]
- call _free ; free(*begin_list)
+ mov rdi, [rdi + 0]
+ call rcx ; free_fct((*begin_list)->data)
+ EXTERN_FUNCTION_SAVE_END
pop rdi
- mov [rdi], [rsp] ; *begin_list = saved_next
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ call _free ; free(*begin_list)
+ EXTERN_FUNCTION_SAVE_END
+ mov rax, [rbp - 8]
+ mov [rdi], rax
call _ft_list_remove_if
FT_LIST_REMOVE_IF_END:
- add rsp, 8
+ ; === epilog ===
+ mov rsp, rbp
+ pop rbp
ret
diff --git a/main.c b/main.c
index 9c28aef..5c165b8 100644
--- a/main.c
+++ b/main.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/11/22 02:02:24 by cacharle #+# #+# */
-/* Updated: 2020/02/08 02:58:50 by cacharle ### ########.fr */
+/* Updated: 2020/02/08 20:36:59 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -141,13 +141,25 @@ int ft_atoi_base(const char*, const char*);
void ft_list_push_front(t_list **begin_list, void *data);
int ft_list_size(t_list *begin_list);
void ft_list_sort(t_list **begin_list, int (*cmp)());
+void ft_list_remove_if(t_list **begin_list, void *data_ref, int (*cmp)(), void (*free_fct)(void*));
int compar(void *a, void *b)
{
printf("---\n");
printf("a = %p, b = %p\n", a, b);
printf("*a = %d, *b = %d\n", *(int*)a, *(int*)b);
- return *(int*)a - *(int*)b;
+ int c = *(int*)a - *(int*)b;
+ printf("ret %d\n", c);
+ return c;
+}
+
+void free_fct(void *data)
+{
+ printf("free: %p\n", data);
+ printf("free data %d\n", *(int*)data);
+ free(data);
+ printf("end free\n");
+ fflush(stdout);
}
int main()
@@ -184,7 +196,7 @@ int main()
/* printf("%d\n", h); */
/* printf("%s\n", h); */
/* free(h); */
- /* */
+
/* printf("%d\n", check_base("01")); */
@@ -194,9 +206,20 @@ int main()
/* system("vmmap a.out"); */
/* t_list *a = list_from_format("-1 2 3 98 1234 12 123 4 123 -123 2 5 6 0 1 3 4"); */
/* t_list *a = list_from_format("1"); */
- t_list *a = NULL;
- printf("%d: ", ft_list_size(a)); list_print(a); putchar('\n');
- ft_list_sort(&a, compar);
- printf("%d: ", ft_list_size(a)); list_print(a); putchar('\n');
+ /* t_list *a = NULL; */
+ /* printf("%d: ", ft_list_size(a)); list_print(a); putchar('\n'); */
+ /* ft_list_sort(&a, compar); */
+ /* printf("%d: ", ft_list_size(a)); list_print(a); putchar('\n'); */
+
+ t_list *a = list_from_format("1 2 3 4 1 2 3 1");
+ int data_ref = 1;
+ printf("f: %p\n", a->data);
+ /* free(a->data); */
+ printf("%p\n", &data_ref);
+ list_print(a); putchar('\n');
+ ft_list_remove_if(&a, &data_ref, compar, free_fct);
+ list_print(a); putchar('\n');
+
+ list_destroy(a);
return 0;
}