Compare commits

...

4 Commits

Author SHA1 Message Date
y-syo
3137cde790 🔨」 fix(test/main.c): improving the tests readability 2026-01-06 12:06:26 +01:00
y-syo
16b3a15963 」 feat(strdup): yayy :D 2026-01-06 11:24:05 +01:00
y-syo
388aebd819 🔨」 fix(Makefile): fixed rm missing the -f flag for fclean + added tester 2025-12-06 17:44:56 +01:00
y-syo
f6ad491a44 」 feat(ft_read): added read yayy 2025-12-06 17:38:13 +01:00
5 changed files with 106 additions and 25 deletions

View File

@@ -33,12 +33,15 @@ clean:
fclean: clean
rm $(NAME)
rm -f $(NAME)
rm -f $(t_NAME)
re: fclean
$(MAKE) -s all
test: $(OBJ)
rm -f out_libasm
rm -f out_libc
$(t_CC) $(OBJ) $(t_SRC) $(t_CFLAGS) -o $(t_NAME)
.PHONY: clean fclean all re

31
src/mem/ft_strdup.s Normal file
View File

@@ -0,0 +1,31 @@
section .text
global ft_strdup
extern malloc
extern ft_strlen
extern ft_strcpy
; char *ft_strdup(const char *str)
ft_strdup:
cmp rdi, 0
je .endz
push rdi
call ft_strlen
dec rax
mov rdi, rax
call malloc
mov rdx, rdi
mov rdi, rax
pop rsi
call ft_strcpy
jmp .end
.endz:
mov rax, 0
.end:
ret

22
src/sys/ft_read.s Normal file
View File

@@ -0,0 +1,22 @@
extern __errno_location
section .text
global ft_read
; ssize_t ft_read(int fd, void *buf, size_t count);
ft_read:
mov eax, 0
syscall
cmp rax, 0
jle .error
.ret:
ret
.error:
mov r10, rax
call __errno_location wrt ..plt
mov [rax], r10
mov rax, -1
jmp .ret

View File

@@ -3,7 +3,7 @@ extern __errno_location
section .text
global ft_write
; ssize_t write(int fd, const void *buf, size_t count);
; ssize_t ft_write(int fd, const void *buf, size_t count);
ft_write:
mov eax, 1
syscall

View File

@@ -1,27 +1,30 @@
int ft_strlen(char *str);
char *ft_strcpy(char *dest, const char *src);
int ft_strcmp(const char *s1, const char *s2);
int ft_write(int fd, const char *buf, unsigned int count);
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
ssize_t ft_strlen(char *str);
char *ft_strcpy(char *dest, const char *src);
int ft_strcmp(const char *s1, const char *s2);
ssize_t ft_write(int fd, const char *buf, unsigned int count);
ssize_t ft_read(int fd, char *buf, unsigned int count);
char *ft_strdup(const char *str);
int main(void)
{
printf("\n--- ft_strlen ---\n");
printf("arg : \"i love kissing girls\" | result : %d\n", ft_strlen("i love kissing girls"));
printf("arg : NULL | result : %d\n", ft_strlen(NULL));
printf("arg : \"\" | result : %d\n", ft_strlen(""));
printf("arg: \"i love kissing girls\" | result: %ld (expected: %ld)\n", ft_strlen("i love kissing girls"), strlen("i love kissing girls"));
printf("arg: \"\" | result: %ld (expected: %ld)\n", ft_strlen(""), strlen(""));
printf("EXCPETION: arg: NULL | result: %ld\n", ft_strlen(NULL));
printf("\n--- ft_strcpy ---\n");
char *a1 = calloc(sizeof(char), 10);
char *a2 = calloc(sizeof(char), 10);
printf("arg : \"abcdefgh\" | result : %s\n", ft_strcpy(a1, "abcdefgh"));
printf("arg : \"abcdefgh\" | result : %s\n", strcpy(a2, "abcdefgh"));
printf("arg : \"67\" | result : %s\n", ft_strcpy(a1, "67"));
printf("arg : \"67\" | result : %s\n", strcpy(a2, "67"));
printf("arg: \"abcdefgh\" | result: %s ", ft_strcpy(a1, "abcdefgh"));
printf("(expected: %s)\n", strcpy(a2, "abcdefgh"));
printf("arg: \"67\" | result: %s ", ft_strcpy(a1, "67"));
printf("(expected: %s)\n", strcpy(a2, "67"));
printf("EXCEPTION: dest: NULL | result: %s\n", ft_strcpy(NULL, "67"));
printf("EXCEPTION: src: NULL | result: %s\n", ft_strcpy(a2, NULL));
@@ -34,8 +37,30 @@ int main(void)
printf("EXCEPTION: s2: NULL | result: %d \n", ft_strcmp("hihi :3", NULL));
printf("\n--- ft_write ---\n");
printf("| 1 \"xd\" 2 | %d\n", ft_write(1, "xd", 2));
printf("| 200 \"xd\" 2 | %d\n", ft_write(200, "xd", 2));
int fd = open("out", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
printf("| %d \"[...]\" 42 | %d\n", fd, ft_write(fd, "wizard money gang, we love casting spells\n", 42));
printf("arg: 1 \"xd\" 2 | result: %ld ", ft_write(1, "xd", 2));
printf("(expected: %ld)\n", write(1, "xd", 2));
printf("arg: 200 \"xd\" 2 | result: %ld ", ft_write(200, "xd", 2));
printf("(expected: %ld)\n", write(200, "xd", 2));
int fd = open("out_libasm", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
int fd2 = open("out_libc", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
printf("arg: %d \"[...]\" 42 | result: %ld ", fd, ft_write(fd, "wizard money gang, we love casting spells", 41));
printf("(expected: %ld)\n", write(fd2, "wizard money gang, we love casting spells", 41));
close(fd);
printf("\n--- ft_read ---\n");
char *xd = calloc(sizeof(char), 43);
printf("arg: 200 (buffer) 2 | result: %ld : \"%s\" ", ft_read(200, xd, 6), xd);
printf("(expected: %ld : \"%s\")\n", read(200, xd, 6), xd);
fd = open("out_libasm", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
fd2 = open("out_libc", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
printf("arg: %d (buffer) 42 | result: %ld : \"%s\" ", fd, ft_read(fd, xd, 41), xd);
printf("(expected: %ld : \"%s\")\n", read(fd2, xd, 41), xd);
printf("\n--- ft_strdup ---\n");
printf("%s\n", ft_strdup("this is a very cool test yayy"));
printf("%s\n", ft_strdup("hi"));
if (ft_strdup(NULL) == NULL)
printf("arg: NULL | %s\n", "(null)"); // because printf's behavior on NULL is unexpected, i will not try it (it segfaults on my computer :c)
else
printf("arg: NULL | %s\n (this should never happen)", ft_strdup(NULL));
}