feat(list_remove_if)
This commit is contained in:
parent
73d921ebc7
commit
69b65b653a
1
Makefile
1
Makefile
|
@ -10,6 +10,7 @@ SRC = \
|
||||||
ft_list_size.s \
|
ft_list_size.s \
|
||||||
ft_list_push_front.s \
|
ft_list_push_front.s \
|
||||||
ft_list_sort.s \
|
ft_list_sort.s \
|
||||||
|
ft_list_remove_if.s \
|
||||||
|
|
||||||
OBJ = $(SRC:.s=.o)
|
OBJ = $(SRC:.s=.o)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
global ft_list_remove_if
|
||||||
|
extern free
|
||||||
|
|
||||||
|
ft_list_remove_if:
|
||||||
|
push rsp ; push callee saved registers
|
||||||
|
push rbx
|
||||||
|
push r12
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
|
push rsi
|
||||||
|
mov r14, rdx ; save cmp func
|
||||||
|
mov r15, rcx ; save free func
|
||||||
|
mov r13, rdi ; save begin_list
|
||||||
|
mov rbx, 0 ; prev = null
|
||||||
|
mov r12, [r13] ; curr = *begin_list
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
cmp r12, 0
|
||||||
|
je .done
|
||||||
|
mov rdi, [r12]
|
||||||
|
pop rsi
|
||||||
|
push rsi
|
||||||
|
call r14
|
||||||
|
cmp rax, 0
|
||||||
|
jne .next
|
||||||
|
cmp rbx, 0
|
||||||
|
je .first_elem
|
||||||
|
mov rdi, [r12]
|
||||||
|
call r15
|
||||||
|
mov rax, [r12 + 8]
|
||||||
|
mov [rbx + 8], rax
|
||||||
|
mov rdi, r12
|
||||||
|
call free WRT ..plt
|
||||||
|
mov r12, [rbx + 8]
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.first_elem:
|
||||||
|
mov rdi, [r12]
|
||||||
|
call r15
|
||||||
|
mov rax, [r12 + 8]
|
||||||
|
mov [r13], rax
|
||||||
|
mov rdi, r12
|
||||||
|
call free WRT ..plt
|
||||||
|
mov r12, [r13]
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.next:
|
||||||
|
mov rbx, r12 ; prev = curr
|
||||||
|
mov r12, [r12 + 8] ; curr = curr->next
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.done:
|
||||||
|
pop rsi
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
pop r12
|
||||||
|
pop rbx
|
||||||
|
pop rsp
|
||||||
|
ret
|
2
libasm.h
2
libasm.h
|
@ -20,7 +20,9 @@ char *ft_strdup(const char *);
|
||||||
void ft_list_push_front(t_list **, void *);
|
void ft_list_push_front(t_list **, void *);
|
||||||
int ft_list_size(t_list *);
|
int ft_list_size(t_list *);
|
||||||
void ft_list_sort(t_list **, int (*)());
|
void ft_list_sort(t_list **, int (*)());
|
||||||
|
void ft_list_remove_if(t_list **, void *, int (*)(), void (*)(void *));
|
||||||
|
|
||||||
void ft_list_print(t_list *begin_list);
|
void ft_list_print(t_list *begin_list);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
19
main.c
19
main.c
|
@ -3,6 +3,10 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "libasm.h"
|
#include "libasm.h"
|
||||||
|
|
||||||
|
void do_nothing(void *data) {
|
||||||
|
(void)data;
|
||||||
|
}
|
||||||
|
|
||||||
int ft_strcmp(const char *s1, const char *s2) {
|
int ft_strcmp(const char *s1, const char *s2) {
|
||||||
printf("s1: %ss2: %s", s1, s2);
|
printf("s1: %ss2: %s", s1, s2);
|
||||||
while (*s1 && *s2 && *s1 == *s2) {
|
while (*s1 && *s2 && *s1 == *s2) {
|
||||||
|
@ -13,6 +17,7 @@ int ft_strcmp(const char *s1, const char *s2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
/*
|
||||||
t_list *list;
|
t_list *list;
|
||||||
|
|
||||||
list = NULL;
|
list = NULL;
|
||||||
|
@ -86,13 +91,23 @@ int main(void) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
ft_list_print(begin_ok);
|
ft_list_print(begin_ok);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
*/
|
||||||
t_list *c = NULL;
|
t_list *c = NULL;
|
||||||
ft_list_push_front(&c, "b\n");
|
ft_list_push_front(&c, "b\n");
|
||||||
ft_list_push_front(&c, "c\n");
|
ft_list_push_front(&c, "c\n");
|
||||||
ft_list_push_front(&c, "a\n");
|
ft_list_push_front(&c, "a\n");
|
||||||
|
ft_list_push_front(&c, "c\n");
|
||||||
|
ft_list_push_front(&c, "a\n");
|
||||||
|
ft_list_push_front(&c, "b\n");
|
||||||
|
ft_list_push_front(&c, "c\n");
|
||||||
|
ft_list_push_front(&c, "c\n");
|
||||||
|
ft_list_push_front(&c, "b\n");
|
||||||
|
ft_list_push_front(&c, "a\n");
|
||||||
|
ft_list_push_front(&c, "b\n");
|
||||||
ft_list_print(c);
|
ft_list_print(c);
|
||||||
ft_list_sort(&c, *ft_strcmp);
|
// ft_list_sort(&c, *ft_strcmp);
|
||||||
|
ft_list_print(c);
|
||||||
|
ft_list_remove_if(&c, "b\n", &ft_strcmp, &do_nothing);
|
||||||
ft_list_print(c);
|
ft_list_print(c);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue