From b6ad45ab6de92744b1e6ed02d9ebddbf4b8b783a Mon Sep 17 00:00:00 2001 From: tomoron Date: Sat, 29 Mar 2025 19:54:58 +0100 Subject: [PATCH] add other basic functions and test with them --- .objs/ft_read.o | Bin 0 -> 784 bytes .objs/ft_strcmp.o | Bin 0 -> 832 bytes .objs/ft_strcpy.o | Bin 0 -> 736 bytes .objs/ft_strdup.o | Bin 0 -> 992 bytes .objs/ft_strlen.o | Bin 0 -> 720 bytes .objs/ft_write.o | Bin 0 -> 784 bytes Makefile | 2 +- libasm.a | Bin 0 -> 5362 bytes patate.c | 7 ++ srcs/ft_read.s | 19 ++++++ srcs/ft_strcmp.s | 48 ++++++++++++++ srcs/ft_strcpy.s | 29 +++++++++ srcs/ft_strdup.s | 31 +++++++++ srcs/ft_write.s | 20 ++++++ test | Bin 0 -> 25352 bytes test.c | 160 ++++++++++++++++++++++++++++++++++++++++++++-- test_file.tmp | 1 + 17 files changed, 311 insertions(+), 6 deletions(-) create mode 100644 .objs/ft_read.o create mode 100644 .objs/ft_strcmp.o create mode 100644 .objs/ft_strcpy.o create mode 100644 .objs/ft_strdup.o create mode 100644 .objs/ft_strlen.o create mode 100644 .objs/ft_write.o create mode 100644 libasm.a create mode 100644 patate.c create mode 100755 test create mode 100644 test_file.tmp diff --git a/.objs/ft_read.o b/.objs/ft_read.o new file mode 100644 index 0000000000000000000000000000000000000000..eeb6146e399194059439544dfdfd300c35c24a9f GIT binary patch literal 784 zcmb<-^>JfjWMqH=Mg}_u1P><4z~F#jLfH-sYz$0DqU13_c7ZS(n)U-wM<}9+3!w4Y zfqZ5(F%b6yRKE_I98?%CDhOm@^MwLbZ~{~%3y=n34k%v&N=pK1Z1!(}>NkX{gHh=A zgZu|F7ae?n>WA3_vIC?S-ToaQjr^=0%|96Gg+0FC=sf-cB+_Z&as0r4AUF)-Ap^aV z)QS=Yz2c1GlA@BtBp|CY7eYh%MX5Q75Jkw^(AgljurPf5k1h`4Gh<0XnqY;D3<_Wx zL4e{DJx)Qgpl}huVh%%bQF5_JfjWMqH=Mg}_u1P><4z~F#jLfH-stPD&@qU13_c7ZS(n)U{$BfQYW1IiTs$UUJ4k`>66$G-d`T{EW0jiP(NOJ-)2b3=Xr6qwhHv2z7^}9mV!64V&27W#a1fPa-c+@iw#I}dGwYsdi2&azJ3Ohso|{W+W|7?weXJr zK=7Jp2gtP7tYE>zP#g40QY%Ur^olczONvSolYp$sTnG)}LzNMtKqj*=eEg419W#~` zA_G>)$iR!HK^-a%p%Ie$P;oPa5SV2O6}LqbhwvF0T+qZFq3S)+#D#!-0W9uhC@xAa z)=w*m2L?}aZh>Ag1Dwr}lb>Gz6i+NFVMxx;El4a%1qzj?7BQq3r6!gD>C_@1&PzeI F3INgRORN9@ literal 0 HcmV?d00001 diff --git a/.objs/ft_strcpy.o b/.objs/ft_strcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..68931a731813abd44946c934eaefefe388fb2038 GIT binary patch literal 736 zcmb<-^>JfjWMqH=Mg}_u1P><4z~F#jLfH-stPD&@qU13_c7ZS(n)U{$BQ(*(1K(8s$UUJ4k`>66$G-d`Qiao;Q^>h79b6>iv!A+fYOpc8k_wKpoZE*)xjuq z`#oC!mne9&ek+ja(-S)W=Up#UVL&!YH~J1PJVs? TP+ekC2}5dL3PWm95d#ANk=s4% literal 0 HcmV?d00001 diff --git a/.objs/ft_strdup.o b/.objs/ft_strdup.o new file mode 100644 index 0000000000000000000000000000000000000000..3152a8fcdba4d1f8f0be276e2f463f8089f2172c GIT binary patch literal 992 zcmbW0J5R$v49A_elnNp7m|#HSF(E;Ce1NJ8C<8Mf20}1XM`@Z2ear`{KTJ4f6mcsM*si- literal 0 HcmV?d00001 diff --git a/.objs/ft_strlen.o b/.objs/ft_strlen.o new file mode 100644 index 0000000000000000000000000000000000000000..2785c5822cc49bb9c731a93794936c4cf839bbb3 GIT binary patch literal 720 zcmb<-^>JfjWMqH=Mg}_u1P><4z~F#jLfH-stPD&@qU13_c7ZS(n)U{$BjnM<1K(7s$UUJ4k`>66$G-d`Qidp;Q^>h79b6>iv!A+fYOpc8k_wSpoTg?)xjuq z`#oC!mxy_E{(H^h(ObsY#ny75^qYs~Kab82hdm4r9A;q9D@m;=VbCkiC@v`~NlXH= zDsv$;gby>A01dL2h2i6WY|5Ci#JCJtAtM79ng(5{I3Jq01yo!FP22`5E{!HG1mp`~ zv6rE^D7jcatt1}k-JH}syJfjWMqH=Mg}_u1P><4z~F#jLfH-sYz$0DqU13_c7ZS(n)U-wM<}9+3!w4Y zfqZ5(F%b6yRKE_I98?%CDhOm@^MwLbZ~{~%3y=n34k%v&N=pK1Z1!(}>Nkd}gHh=A zgZu|F7ae?n>WA3_vIC?S-ToaQL4H<`<{u38!XDpmbRK^JGOE+Uu2Eoh*)D7jcatt7s@D6=G0ub3e|KDDSQFF!sfKRK}^Ge3_3CdW`* Ynw*?kT#Tw;7|Mmk=O0iY0Rc=E0Ld3Z7fK6n;w*2P}S4f)I!z)Epo_}6XMttLipldfCD0ZZ|2Q<8P>@rK@cRKv^#G;zxmnO`TV_| z+?ee{dZ~ zPVJ`hDmC)1`=!t&$9L^1{%LBq2JB+XyeB5tX+|R_Pl~CG4ylOA?A*Cu&u=pfoRl;J z#-UwPD8NM9Wq$&CU|S5`m`h{PMavSm+dPRQaS;7Jt=^0EE)ApVeQuxAeq%U7zd|qR zDIRlRgCo1Kq_MVh{Q#E-u}m8O9(OvyajMYAx8_&E{Z{>Lv)j7+r?HT^)0ll}4ZOAL zttIP3V+kN1x;H||2Q#=iLi-Q&ZdPO|>#E~5N*cEt{#!{3>q>azUyDEkXv@a!2T?I# zcN|2&!1z85A7lKGhVR9CU&6Q$_)ahwaUmbHcQ=%(4sQLxE!MnJHFSL_dtMDmWBVbv z)hTd&pQDjGX}K`0=(+W|FrckrS}r`~O_$T!>wB>i7yjkI2De`?7w$6`&a5#$aly3a zUxtS+H8TsncN$@z^>@aq_gZ)745CN##bsuN?CBG8W0&?k-;25d{Te>X_)!i2nelHm zJPkK!hbwN7QaE09suY&IYSEc-ooh+dP~520QgWj(JjBwq^|^6TTf?;6Q2+BA<%SZE z7LQNd*nwACooF#P&S~@4xrt&x^cW+0j4t&4l$qT}{2;*yv&0SJNb?!}a%;!j?nUaZ z*}u4g*4(*By)}CTh>{{~i*e^WF)0IN$#cYFknxc=B)lIPKds@iZon@ZewO1eXm~2F zA!8!0VJ;Sv9mlKGY~MxbI_l9?lqb?95+V|$n5q1Ysb{JTj0hIb7o!}lAaga-+#L5Z zYJV4_$hW)*uiqCyVHwmU}I3FaI~A=I><%opi}$?%d<1#67ywa_=FxA8rpV zJf2pB((_Tjx+(6eT#)iWYO9Yg=(nfG`s+2!^;@r=)|a1CSM`Fm+#rG~N)jk+EpFz0 zw`|KG)g-B;xvVGWJ0?0Yz|=aU_1E7ig?uA$8bvde!-+2zq)xGjjHr6Wvgg>OQKUrj zYbKa=95)EwZLjoGz0WtaNN6gGKYboO{_@=l-{eA{qlDYc( zTp}JNaf#Mt)$bwt=cixOA48XhXs^UfU-wRD z2TC$Gs!PXNS6Vzat$hz(x-N7&J1|K|(0-RibWh8r+uVMVTXxbVN+<^|2`#c%ldO44 zC+o{s1iB>d%ditWx-5?)qREi+iFC>mlQ4w-#OL!HZ^ujF{{sp@9XkL3 literal 0 HcmV?d00001 diff --git a/patate.c b/patate.c new file mode 100644 index 0000000..d0d0c2d --- /dev/null +++ b/patate.c @@ -0,0 +1,7 @@ +#include +#include + +int main(void) +{ + printf("%d\n", strcmp("coucou", "c")); +} diff --git a/srcs/ft_read.s b/srcs/ft_read.s index e69de29..96197db 100644 --- a/srcs/ft_read.s +++ b/srcs/ft_read.s @@ -0,0 +1,19 @@ +global ft_read +extern __errno_location +section .text + +ft_read: + mov rax, 0 ;syscall number for read, args are already set at the right place + syscall + + cmp rax, 0 ; if return is < 0, it's an error in negative + jg success + + neg rax ; inv errno, and set errno + mov edi, eax + call __errno_location wrt ..plt + mov [rax], edi + mov rax, -1 + +success: + ret diff --git a/srcs/ft_strcmp.s b/srcs/ft_strcmp.s index e69de29..f33f554 100644 --- a/srcs/ft_strcmp.s +++ b/srcs/ft_strcmp.s @@ -0,0 +1,48 @@ +section .text + global ft_strcmp + +ft_strcmp: + xor rax, rax + + test rdi, rdi ; test if args are false + je err + test rsi, rsi + je err +loop_start: + mov al, [rdi] + cmp al, [rsi] + jne compare + + test al, al ; test if rdi is \0 + je compare + + mov al, [rsi] ; test if rsi is \0 + test al, al + je compare + + lea rsi, [rsi + 1] + lea rdi, [rdi + 1] + jmp loop_start + + +compare: + mov al, [rdi] + cmp al, [rsi] + jl lower + jg greater + mov eax, 0 + jmp end + +lower: + mov eax, -1 + jmp end + +greater: + mov eax, 1 + jmp end + +err: + mov eax, 0 + +end: + ret diff --git a/srcs/ft_strcpy.s b/srcs/ft_strcpy.s index e69de29..5bfc62a 100644 --- a/srcs/ft_strcpy.s +++ b/srcs/ft_strcpy.s @@ -0,0 +1,29 @@ +section .text + global ft_strcpy + +ft_strcpy: + test rdi, rdi + je err + test rsi, rsi + je err + push rdi + jmp loop_start +condition_check: + mov al, [rdi] + test al, al + je end + +loop_start: + mov rax, [rsi] + mov [rdi], rax + lea rdi, [rdi + 1] + lea rsi, [rsi + 1] + jmp condition_check + +end: + pop rax + ret + +err: + xor rax, rax + ret diff --git a/srcs/ft_strdup.s b/srcs/ft_strdup.s index e69de29..613bf50 100644 --- a/srcs/ft_strdup.s +++ b/srcs/ft_strdup.s @@ -0,0 +1,31 @@ +extern malloc +global ft_strdup +extern ft_strcpy +extern ft_strlen +extern __errno_location +section .text + +ft_strdup: + test rdi, rdi ; test if arg is NULL + je err + + push rdi ;push to use it for the strcpy + call ft_strlen + mov rdi, rax + + call malloc wrt ..plt + test rax, rax + je malloc_failed + mov rdi, rax + pop rsi + call ft_strcpy + ret + +malloc_failed: + call __errno_location wrt ..plt + mov dword [rax], 12 + pop rax + +err: + xor rax, rax + ret diff --git a/srcs/ft_write.s b/srcs/ft_write.s index e69de29..355fab5 100644 --- a/srcs/ft_write.s +++ b/srcs/ft_write.s @@ -0,0 +1,20 @@ +global ft_write +extern __errno_location +section .text + +ft_write: + mov rax, 1 ;syscall number for write, args are already set at the right place + syscall + + cmp rax, 0 ; if return is < 0, it's an error in negative + jg success + + neg rax ; inv errno, and set errno + mov edi, eax + call __errno_location wrt ..plt + mov [rax], edi + mov rax, -1 + + +success: + ret diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..0f950dace5bb7b2d7c5109152742a75c4067bf60 GIT binary patch literal 25352 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 Dn9Y?y literal 0 HcmV?d00001 diff --git a/test.c b/test.c index 5994364..21751e8 100644 --- a/test.c +++ b/test.c @@ -1,27 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tomoron +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/03/29 19:53:58 by tomoron #+# #+# */ +/* Updated: 2025/03/29 19:54:24 by tomoron ### ########.fr */ +/* */ +/* ************************************************************************** */ + #include +#include #include +#include +#include +#include #define OK "\033[32mOK\n\033[0m" #define KO "\033[31mKO\n\033[0m" #define FNC_TEST(title, condition)\ printf(title":\n");\ - if(test_strlen())\ + if(condition)\ printf("RESULT: "OK);\ else\ printf(" RESULT: "KO); #define TEST(title, condition) \ - printf("%s: ", title);\ + write(1, title, strlen(title));\ + write(1, ": ", 2);\ if(condition)\ {\ - printf(OK);\ + write(1, OK, strlen(OK));\ passed++;\ }\ else \ - printf(KO); + write(1, KO, strlen(KO));\ -size_t ft_strlen(char *str); +size_t ft_strlen(char *str); +char *ft_strcpy(char *dest, char *src); +int ft_strcmp(char *dest, char *src); +ssize_t ft_write(int fd, const void *buffer, size_t count); +ssize_t ft_read(int fd, void *buffer, size_t count); +char *ft_strdup(char *src); int test_strlen(void) { @@ -38,8 +60,136 @@ int test_strlen(void) return(nb_tests == passed); } +int test_strcpy(void) +{ + int nb_tests; + int passed; + char buf[256]; + + memset(buf,'a', 255); + buf[255] = 0; + + nb_tests = 5; + passed = 0; + + TEST("copy normal string", strcmp(ft_strcpy(buf, "hello"),"hello") == 0); + TEST("copy empty string", strcmp(ft_strcpy(buf, ""),"") == 0); + TEST("copy to null pointer", ft_strcpy(NULL, "") == 0); + TEST("copy from null pointer", ft_strcpy("", NULL) == 0); + TEST("copy from and to null pointer", ft_strcpy(NULL, NULL) == 0); + + return(nb_tests == passed); +} + +int test_strcmp(void) +{ + int nb_tests; + int passed; + + nb_tests = 5; + passed = 0; + + TEST("equal string", ft_strcmp("coucou", "coucou") == 0); + TEST("second smaller string", ft_strcmp("coucou", "c") == 1); + TEST("first smaller string", ft_strcmp("c", "coucou") == -1); + TEST("first null", ft_strcmp(NULL, "coucou") == 0); + TEST("second null", ft_strcmp("hello", NULL) == 0); + + return(nb_tests == passed); +} + +int test_write(void) +{ + int nb_tests; + int passed; + + nb_tests = 5; + passed = 0; + + TEST("writing hello and test return value", ft_write(1, "hello ", 6) == 6); + errno = 0; + TEST("failed write return value", ft_write(-1, "", 0) == (size_t)-1); + TEST("failed write errno test", errno == 9); + errno = 0; + TEST("call write with null pointer, return value", ft_write(1, NULL, 1) == (size_t)-1); + TEST("call write with null pointer, errno", errno == 14); + + return(nb_tests == passed); +} + +int test_read(void) +{ + int nb_tests; + int passed; + int fd; + char buf[512]; + + nb_tests = 8; + passed = 0; + + printf("creating test file to test the read function\n"); + fd = open("test_file.tmp", O_WRONLY | O_CREAT, 0600); + write(fd, "patate douce", 12); + close(fd); + + fd = open("test_file.tmp", O_RDONLY); + TEST("read 1 char", ft_read(fd, buf, 1) == 1); + TEST("check read char", memcmp(buf, "p", 1) == 0); + TEST("read multiple char", ft_read(fd, buf, 5) == 5); + TEST("compare with expected", memcmp(buf, "atate", 5) == 0); + + errno = 0; + TEST("invalid fd read, return", ft_read(-1, buf, 20) == (size_t)-1); + TEST("invalid fd read, errno", errno == 9); + errno = 0; + TEST("read to null pointer, return", ft_read(fd, NULL, 4) == (size_t)-1) + TEST("read to null pointer, errno", errno == 14) + close(fd); + + return(nb_tests == passed); +} + +int test_strdup(void) +{ + int nb_tests; + int passed; + char *src = "patate douce"; + char *dest; + + nb_tests = 4; + passed = 0; + + dest = ft_strdup(src); + + if(!dest) + { + printf("strdup failed, probably testing errno, returing with result\n"); + return(errno == ENOMEM); + } + + TEST("strdup normal stiring, diff pointer", dest != src); + TEST("strdup normal string , content", !strcmp(dest, src)); + free(dest); + + dest = ft_strdup(""); + TEST("strdup empty string", *dest == 0); + free(dest); + TEST("strdup null pointer", ft_strdup(NULL) == NULL); + + return(nb_tests == passed); +} + int main(void) { FNC_TEST("ft_strlen", test_strlen()); printf("\n\n"); + FNC_TEST("ft_strcpy", test_strcpy()); + printf("\n\n"); + FNC_TEST("ft_strcmp", test_strcmp()); + printf("\n\n"); + FNC_TEST("ft_write", test_write()); + printf("\n\n"); + FNC_TEST("ft_read", test_read()); + printf("\n\n"); + FNC_TEST("ft_strdup", test_strdup()); } diff --git a/test_file.tmp b/test_file.tmp new file mode 100644 index 0000000..5742772 --- /dev/null +++ b/test_file.tmp @@ -0,0 +1 @@ +patate douce \ No newline at end of file