add list remove if and fix valgrind error
This commit is contained in:
3
Makefile
3
Makefile
@ -14,7 +14,8 @@ SRCS_NAMES = ft_strlen.s\
|
|||||||
SRCS_BONUS_NAMES = ft_atoi_base.s\
|
SRCS_BONUS_NAMES = ft_atoi_base.s\
|
||||||
ft_list_push_front.s\
|
ft_list_push_front.s\
|
||||||
ft_list_size.s\
|
ft_list_size.s\
|
||||||
ft_list_sort.s
|
ft_list_sort.s\
|
||||||
|
ft_list_remove_if.s\
|
||||||
|
|
||||||
SRCS = $(addprefix $(SRCS_DIR)/, $(SRCS_NAMES))
|
SRCS = $(addprefix $(SRCS_DIR)/, $(SRCS_NAMES))
|
||||||
SRCS_BONUS = $(addprefix $(SRCS_BONUS_DIR)/, $(SRCS_NAMES))
|
SRCS_BONUS = $(addprefix $(SRCS_BONUS_DIR)/, $(SRCS_NAMES))
|
||||||
|
1
libasm.h
1
libasm.h
@ -19,5 +19,6 @@ int ft_atoi_base(char *nbr, char *base);
|
|||||||
void ft_list_push_front(t_list **begin_list, void *data);
|
void ft_list_push_front(t_list **begin_list, void *data);
|
||||||
int ft_list_size(t_list *list_start);
|
int ft_list_size(t_list *list_start);
|
||||||
void ft_list_sort(t_list **begin_list, int (*cmp)());
|
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 *));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,7 +9,7 @@ ft_list_push_front:
|
|||||||
|
|
||||||
push rdi
|
push rdi
|
||||||
push rsi
|
push rsi
|
||||||
mov rdi, 10
|
mov rdi, 16
|
||||||
call malloc wrt ..plt
|
call malloc wrt ..plt
|
||||||
pop rsi
|
pop rsi
|
||||||
pop rdi
|
pop rdi
|
||||||
|
95
srcs/bonus/ft_list_remove_if.s
Normal file
95
srcs/bonus/ft_list_remove_if.s
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
global ft_list_remove_if
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
remove_element:
|
||||||
|
|
||||||
|
call call_free_elem
|
||||||
|
push rax
|
||||||
|
mov rax, [rax + 8]
|
||||||
|
|
||||||
|
test r8, r8
|
||||||
|
jz element_is_first
|
||||||
|
|
||||||
|
mov [r8 + 8], rax
|
||||||
|
pop rax
|
||||||
|
ret
|
||||||
|
|
||||||
|
element_is_first:
|
||||||
|
mov [rdi], rax
|
||||||
|
pop rax
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
call_free_elem:
|
||||||
|
push rdi
|
||||||
|
push rsi
|
||||||
|
push rdx
|
||||||
|
push rcx
|
||||||
|
push rax
|
||||||
|
push r8
|
||||||
|
|
||||||
|
mov rdi, [rax]
|
||||||
|
call rcx
|
||||||
|
|
||||||
|
pop r8
|
||||||
|
pop rax
|
||||||
|
pop rcx
|
||||||
|
pop rdx
|
||||||
|
pop rsi
|
||||||
|
pop rdi
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ft_list_remove_if:
|
||||||
|
test rdi, rdi
|
||||||
|
jz end
|
||||||
|
test rdx, rdx
|
||||||
|
jz end
|
||||||
|
test rcx, rcx
|
||||||
|
jz end
|
||||||
|
|
||||||
|
xor r8, r8
|
||||||
|
|
||||||
|
mov rax, [rdi]
|
||||||
|
loop:
|
||||||
|
test rax, rax
|
||||||
|
jz end
|
||||||
|
push rax
|
||||||
|
|
||||||
|
push rdi
|
||||||
|
push rsi
|
||||||
|
push rdx
|
||||||
|
push rcx
|
||||||
|
push r8
|
||||||
|
|
||||||
|
mov rdi, [rax]
|
||||||
|
call rdx
|
||||||
|
|
||||||
|
test eax, eax
|
||||||
|
pop r8
|
||||||
|
pop rcx
|
||||||
|
pop rdx
|
||||||
|
pop rsi
|
||||||
|
pop rdi
|
||||||
|
|
||||||
|
jz loop_end
|
||||||
|
|
||||||
|
mov rax, [rsp]
|
||||||
|
call remove_element
|
||||||
|
|
||||||
|
loop_end:
|
||||||
|
|
||||||
|
pop rax
|
||||||
|
mov r8, rax
|
||||||
|
mov rax, [rax + 8]
|
||||||
|
jmp loop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
end:
|
||||||
|
ret
|
@ -7,18 +7,16 @@ ft_strcpy:
|
|||||||
test rsi, rsi
|
test rsi, rsi
|
||||||
jz err
|
jz err
|
||||||
push rdi
|
push rdi
|
||||||
jmp loop_start
|
|
||||||
condition_check:
|
|
||||||
mov al, [rdi]
|
|
||||||
test al, al
|
|
||||||
jz end
|
|
||||||
|
|
||||||
loop_start:
|
loop_start:
|
||||||
mov rax, [rsi]
|
mov al, [rsi]
|
||||||
mov [rdi], rax
|
mov [rdi],al
|
||||||
lea rdi, [rdi + 1]
|
lea rdi, [rdi + 1]
|
||||||
lea rsi, [rsi + 1]
|
lea rsi, [rsi + 1]
|
||||||
jmp condition_check
|
|
||||||
|
test al, al
|
||||||
|
jne loop_start
|
||||||
|
|
||||||
end:
|
end:
|
||||||
pop rax
|
pop rax
|
||||||
|
@ -11,6 +11,7 @@ ft_strdup:
|
|||||||
|
|
||||||
push rdi ;push to use it for the strcpy
|
push rdi ;push to use it for the strcpy
|
||||||
call ft_strlen
|
call ft_strlen
|
||||||
|
inc rax
|
||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
|
|
||||||
call malloc wrt ..plt
|
call malloc wrt ..plt
|
||||||
|
40
test.c
40
test.c
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/03/29 19:53:58 by tomoron #+# #+# */
|
/* Created: 2025/03/29 19:53:58 by tomoron #+# #+# */
|
||||||
/* Updated: 2025/04/06 01:39:26 by tomoron ### ########.fr */
|
/* Updated: 2025/04/12 18:33:43 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ int test_strcpy(void)
|
|||||||
memset(buf,'a', 255);
|
memset(buf,'a', 255);
|
||||||
buf[255] = 0;
|
buf[255] = 0;
|
||||||
|
|
||||||
TEST("copy normal string", strcmp(ft_strcpy(buf, "hello"),"hello") == 0);
|
TEST("copy normal string", strcmp(ft_strcpy(buf, "patate douce"),"patate douce") == 0);
|
||||||
TEST("copy empty string", strcmp(ft_strcpy(buf, ""),"") == 0);
|
TEST("copy empty string", strcmp(ft_strcpy(buf, ""),"") == 0);
|
||||||
TEST("copy to null pointer", ft_strcpy(NULL, "") == 0);
|
TEST("copy to null pointer", ft_strcpy(NULL, "") == 0);
|
||||||
TEST("copy from null pointer", ft_strcpy("", NULL) == 0);
|
TEST("copy from null pointer", ft_strcpy("", NULL) == 0);
|
||||||
@ -237,6 +237,40 @@ int test_list_sort()
|
|||||||
return(fail);
|
return(fail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int remove_if_compare(void *data, int *nb)
|
||||||
|
{
|
||||||
|
return((long)data == *nb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_if_free(void *data)
|
||||||
|
{
|
||||||
|
printf("%ld\n", (long int) data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_list_remove_if()
|
||||||
|
{
|
||||||
|
int fail = 0;
|
||||||
|
int nb = 2;
|
||||||
|
t_list *tmp;
|
||||||
|
|
||||||
|
tmp = 0;
|
||||||
|
ft_list_push_front(&tmp, (void *)4);
|
||||||
|
ft_list_push_front(&tmp, (void *)3);
|
||||||
|
ft_list_push_front(&tmp, (void *)2);
|
||||||
|
ft_list_push_front(&tmp, (void *)1);
|
||||||
|
|
||||||
|
ft_list_remove_if(&tmp, &nb, remove_if_compare, remove_if_free);
|
||||||
|
TEST("is the number 2 gone", (long int)tmp->next->data == 3);
|
||||||
|
nb = 1;
|
||||||
|
ft_list_remove_if(&tmp, &nb, remove_if_compare, remove_if_free);
|
||||||
|
TEST("is the number 1 gone", (long int)tmp->data == 3);
|
||||||
|
ft_list_remove_if(&tmp, &nb, 0, remove_if_free);
|
||||||
|
ft_list_remove_if(&tmp, &nb, remove_if_compare, 0);
|
||||||
|
TEST("null pointers in functions", 1);
|
||||||
|
|
||||||
|
return(fail);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
@ -260,5 +294,7 @@ int main(void)
|
|||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
FNC_TEST("ft_list_sort", test_list_sort());
|
FNC_TEST("ft_list_sort", test_list_sort());
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
|
FNC_TEST("ft_list_sort", test_list_remove_if());
|
||||||
|
printf("\n\n");
|
||||||
FNC_TEST("check valgrind", 1);
|
FNC_TEST("check valgrind", 1);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user