diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | ft_list_remove_if.s | 82 | ||||
| -rw-r--r-- | main.c | 37 |
4 files changed, 92 insertions, 33 deletions
@@ -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) @@ -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 @@ -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; } |
