Compare commits
26 Commits
1d7727e9ff
...
master
Author | SHA1 | Date | |
---|---|---|---|
66cc5c87d4 | |||
0b4d562ef9 | |||
42b7aab1ae | |||
e3b2eb0852 | |||
ebf0b0e442 | |||
3effb7caf5 | |||
27f25d2cea | |||
fdc1923211 | |||
cbed6c468f | |||
eadf7cde62 | |||
b1a86b85fe | |||
49283f4227 | |||
8ae1a6e876 | |||
174a587414 | |||
a05124885e | |||
50d50092bf | |||
b3a4690a85 | |||
3632b34e40 | |||
a5ccf7df95 | |||
054e31a020 | |||
5bccb1efc6 | |||
723a2e901b | |||
1de03da534 | |||
d1756266b2 | |||
1c7245213e | |||
b86d5dbab9 |
2
Makefile
2
Makefile
@ -24,7 +24,7 @@ all : $(NAME)
|
|||||||
|
|
||||||
test : $(NAME)
|
test : $(NAME)
|
||||||
$(CC) $(CFLAGS) test/test.c $(BUILDDIR)/$(NAME) -o $(BUILDDIR)/test
|
$(CC) $(CFLAGS) test/test.c $(BUILDDIR)/$(NAME) -o $(BUILDDIR)/test
|
||||||
$(BUILDDIR)/test
|
valgrind --leak-check=full $(BUILDDIR)/test
|
||||||
|
|
||||||
clean :
|
clean :
|
||||||
rm -rf $(OBJDIR)
|
rm -rf $(OBJDIR)
|
||||||
|
11
headers/libasm.h
Normal file
11
headers/libasm.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <aio.h>
|
||||||
|
|
||||||
|
char *ft_strcpy(char *dest, const char *src);
|
||||||
|
size_t ft_strlen(const char *str);
|
||||||
|
int ft_strcmp( const char *first, const char *second);
|
||||||
|
ssize_t ft_write(int fd, const void *buf, size_t count);
|
||||||
|
char *ft_strdup(const char *s);
|
||||||
|
ssize_t ft_read(int fildes, void *buf, size_t nbyte);
|
@ -1,7 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
char *ft_strcpy(char *dest, const char *src);
|
|
||||||
size_t ft_strlen(const char *str);
|
|
||||||
int ft_strcmp( const char *first, const char *second);
|
|
30
src/ft_read.s
Normal file
30
src/ft_read.s
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
extern __errno_location
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global ft_read
|
||||||
|
ft_read:
|
||||||
|
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
syscall
|
||||||
|
|
||||||
|
cmp rax, 0
|
||||||
|
jne syscall_failed
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
syscall_failed:
|
||||||
|
|
||||||
|
push rbx
|
||||||
|
|
||||||
|
neg rax
|
||||||
|
mov rbx, rax
|
||||||
|
|
||||||
|
call __errno_location wrt ..plt
|
||||||
|
|
||||||
|
mov [rax], rbx
|
||||||
|
mov rax, -1
|
||||||
|
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
ret
|
@ -1,25 +0,0 @@
|
|||||||
section .note.GNU-stack noalloc noexec nowrite progbits
|
|
||||||
section .text
|
|
||||||
global ft_strcmp
|
|
||||||
|
|
||||||
ft_strcmp:
|
|
||||||
mov rcx, 0
|
|
||||||
loop:
|
|
||||||
mov dl, [rsi + rcx]
|
|
||||||
mov bl, [rdi + rcx]
|
|
||||||
|
|
||||||
cmp bl, 0
|
|
||||||
je out
|
|
||||||
|
|
||||||
cmp bl, dl
|
|
||||||
jne out
|
|
||||||
|
|
||||||
inc rcx
|
|
||||||
jmp loop
|
|
||||||
out:
|
|
||||||
mov rax, 0
|
|
||||||
mov rbx, 0
|
|
||||||
mov bl, BYTE [rsi + rcx]
|
|
||||||
mov al, BYTE [rdi + rcx]
|
|
||||||
sub rax, rbx
|
|
||||||
ret
|
|
28
src/ft_strcmp.s
Normal file
28
src/ft_strcmp.s
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
section .text
|
||||||
|
global ft_strcmp
|
||||||
|
|
||||||
|
ft_strcmp:
|
||||||
|
push rbx
|
||||||
|
|
||||||
|
xor rcx, rcx
|
||||||
|
|
||||||
|
loop:
|
||||||
|
mov dl, [rsi + rcx]
|
||||||
|
mov bl, [rdi + rcx]
|
||||||
|
|
||||||
|
cmp bl, 0
|
||||||
|
je out
|
||||||
|
|
||||||
|
cmp bl, dl
|
||||||
|
jne out
|
||||||
|
|
||||||
|
inc rcx
|
||||||
|
jmp loop
|
||||||
|
|
||||||
|
out:
|
||||||
|
sub bl, dl
|
||||||
|
movsx rax, bl
|
||||||
|
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
ret
|
@ -1,19 +0,0 @@
|
|||||||
section .text
|
|
||||||
global ft_strcpy
|
|
||||||
|
|
||||||
ft_strcpy:
|
|
||||||
mov rcx, 0
|
|
||||||
loop:
|
|
||||||
mov al, [rsi + rcx]
|
|
||||||
|
|
||||||
mov [rdi + rcx], al
|
|
||||||
|
|
||||||
cmp al, 0
|
|
||||||
je out
|
|
||||||
|
|
||||||
inc rcx
|
|
||||||
|
|
||||||
jmp loop
|
|
||||||
out:
|
|
||||||
mov rax, rcx
|
|
||||||
ret
|
|
19
src/ft_strcpy.s
Normal file
19
src/ft_strcpy.s
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
section .text
|
||||||
|
global ft_strcpy
|
||||||
|
|
||||||
|
ft_strcpy:
|
||||||
|
xor rcx, rcx
|
||||||
|
loop:
|
||||||
|
mov al, [rsi + rcx]
|
||||||
|
|
||||||
|
mov [rdi + rcx], al
|
||||||
|
|
||||||
|
cmp al, 0
|
||||||
|
je out
|
||||||
|
|
||||||
|
inc rcx
|
||||||
|
|
||||||
|
jmp loop
|
||||||
|
out:
|
||||||
|
mov rax, rdi
|
||||||
|
ret
|
35
src/ft_strdup.s
Normal file
35
src/ft_strdup.s
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
extern ft_strlen
|
||||||
|
extern malloc
|
||||||
|
extern ft_strcpy
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global ft_strdup
|
||||||
|
ft_strdup:
|
||||||
|
push rbx
|
||||||
|
|
||||||
|
call ft_strlen
|
||||||
|
|
||||||
|
mov rbx, rdi
|
||||||
|
mov rdi, rax
|
||||||
|
add rdi, 1
|
||||||
|
|
||||||
|
call malloc wrt ..plt
|
||||||
|
|
||||||
|
cmp rax, 0
|
||||||
|
je error
|
||||||
|
|
||||||
|
mov rdi, rax
|
||||||
|
mov rsi, rbx
|
||||||
|
|
||||||
|
call ft_strcpy
|
||||||
|
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
error:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
ret
|
@ -1,14 +0,0 @@
|
|||||||
section .note.GNU-stack noalloc noexec nowrite progbits
|
|
||||||
section .text
|
|
||||||
global ft_strlen
|
|
||||||
|
|
||||||
ft_strlen:
|
|
||||||
mov rcx, 0
|
|
||||||
loop:
|
|
||||||
cmp BYTE [rdi + rcx], 0
|
|
||||||
je out
|
|
||||||
inc rcx
|
|
||||||
jmp loop
|
|
||||||
out:
|
|
||||||
mov rax, rcx
|
|
||||||
ret
|
|
15
src/ft_strlen.s
Normal file
15
src/ft_strlen.s
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
section .text
|
||||||
|
global ft_strlen
|
||||||
|
|
||||||
|
ft_strlen:
|
||||||
|
xor rcx, rcx
|
||||||
|
loop:
|
||||||
|
cmp BYTE [rdi + rcx], 0
|
||||||
|
je out
|
||||||
|
|
||||||
|
inc rcx
|
||||||
|
|
||||||
|
jmp loop
|
||||||
|
out:
|
||||||
|
mov rax, rcx
|
||||||
|
ret
|
28
src/ft_write.s
Normal file
28
src/ft_write.s
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
extern __errno_location
|
||||||
|
|
||||||
|
section .text
|
||||||
|
global ft_write
|
||||||
|
ft_write:
|
||||||
|
mov rax, 1
|
||||||
|
|
||||||
|
syscall
|
||||||
|
|
||||||
|
cmp rax, 0
|
||||||
|
jne syscall_failed
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
syscall_failed:
|
||||||
|
|
||||||
|
push rbx
|
||||||
|
|
||||||
|
neg rax
|
||||||
|
mov rbx, rax
|
||||||
|
|
||||||
|
call __errno_location wrt ..plt
|
||||||
|
mov [rax], rbx
|
||||||
|
mov rax, -1
|
||||||
|
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
ret
|
63
test/test.c
63
test/test.c
@ -1,6 +1,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "../include/libasm.h"
|
#include "../headers/libasm.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
void test_size_t(size_t expected_value, size_t value)
|
void test_size_t(size_t expected_value, size_t value)
|
||||||
{
|
{
|
||||||
@ -20,7 +23,7 @@ void test_int(int expected_value, int value)
|
|||||||
|
|
||||||
void test_str(const char *expected_value, const char *value)
|
void test_str(const char *expected_value, const char *value)
|
||||||
{
|
{
|
||||||
if (strcmp(expected_value, value) == 0)
|
if (strcmp(expected_value, value))
|
||||||
printf("[FAILED] %s != %s", expected_value, value);
|
printf("[FAILED] %s != %s", expected_value, value);
|
||||||
else
|
else
|
||||||
printf("[OK]");
|
printf("[OK]");
|
||||||
@ -46,13 +49,63 @@ void multiple_test_int_2(int (*normal_func)(const char *, const char *), int (*o
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void multiple_test_strcpy(char *(*own_func)(char *, const char *), const char * const *values)
|
||||||
|
{
|
||||||
|
char tmp[4096];
|
||||||
|
|
||||||
|
for (size_t i = 0; values[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
printf("test: %s", values[i]);
|
||||||
|
test_size_t((size_t) strcpy(tmp, values[i]), (size_t) own_func(tmp, values[i]));
|
||||||
|
test_str(values[i], tmp);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void multiple_test_atoi_base(char *(*own_func)(char *, const char *), const char * const *values[2])
|
||||||
|
{
|
||||||
|
char tmp[4096];
|
||||||
|
|
||||||
|
for (size_t i = 0; values[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
printf("test: %s", values[i]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void multiple_test_strdup(const char * const *values)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
for (size_t i = 0; values[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
tmp = ft_strdup(values[i]);
|
||||||
|
test_str(tmp, values[i]);
|
||||||
|
free(tmp);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
printf("STRLEN\n");
|
||||||
const char *strlen_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
|
const char *strlen_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
|
||||||
|
multiple_test_int(strlen, ft_strlen, strlen_tests);
|
||||||
multiple_test_int(&strlen, ft_strlen, strlen_tests);
|
printf("\n");
|
||||||
|
|
||||||
|
printf("STRCMP\n");
|
||||||
const char *strcmp_tests[][2] = {{"w", "z"}, {"bonjour", "bonjour"}, {"", ""}, {"bonjour", "salut"}, {"co\0fgf", "co\0fgf"}, NULL};
|
const char *strcmp_tests[][2] = {{"w", "z"}, {"bonjour", "bonjour"}, {"", ""}, {"bonjour", "salut"}, {"co\0fgf", "co\0fgf"}, NULL};
|
||||||
|
multiple_test_int_2(strcmp, ft_strcmp, strcmp_tests);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
multiple_test_int_2(&strcmp, ft_strcmp, strcmp_tests);
|
printf("STRCPY\n");
|
||||||
|
const char *strcpy_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
|
||||||
|
multiple_test_strcpy(ft_strcpy, strcpy_tests);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("STRDUP\n");
|
||||||
|
const char *strdup_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
|
||||||
|
multiple_test_strdup(strdup_tests);
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
Reference in New Issue
Block a user