From 0d74dd1917f1f4c6c8b3d12b688752a0fac7bde0 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Mon, 20 Nov 2023 16:29:38 +0100 Subject: [PATCH] counting done - printf don't work to fix --- Makefile | 10 +++--- ft_printf.c | 44 +++++++++++++++----------- libftprintf.h => ft_printf.h | 17 +++++----- ft_printf.o | Bin 0 -> 3768 bytes ft_putchar.c | 4 +-- ft_putchar.o | Bin 0 -> 1136 bytes ft_putnbr.c | 21 ++++++------ ft_putnbr.o | Bin 0 -> 1496 bytes ft_putnbrbase_fd.c => ft_putnbrbase.c | 31 ++++++++---------- ft_putnbrbase.o | Bin 0 -> 1392 bytes ft_putstr.c | 4 +-- ft_putstr.o | Bin 0 -> 1384 bytes ft_strlen.c | 23 ++++++++++++++ ft_strlen.o | Bin 0 -> 1016 bytes libftprintf.a | Bin 0 -> 10770 bytes 15 files changed, 91 insertions(+), 63 deletions(-) rename libftprintf.h => ft_printf.h (74%) create mode 100644 ft_printf.o create mode 100644 ft_putchar.o create mode 100644 ft_putnbr.o rename ft_putnbrbase_fd.c => ft_putnbrbase.c (62%) create mode 100644 ft_putnbrbase.o create mode 100644 ft_putstr.o create mode 100644 ft_strlen.c create mode 100644 ft_strlen.o create mode 100644 libftprintf.a diff --git a/Makefile b/Makefile index 6b9a490..65fa8b2 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/11/17 12:35:27 by adjoly #+# #+# # -# Updated: 2023/11/20 10:07:45 by adjoly ### ########.fr # +# Updated: 2023/11/20 15:55:52 by adjoly ### ########.fr # # # # **************************************************************************** # @@ -19,16 +19,18 @@ SRCS = ft_printf.c \ ft_putnbr.c \ ft_putnbrbase.c \ ft_putstr.c \ + ft_strlen.c \ OBJS = $(SRCS:.c=.o) FLAGS = -Werror -Wall -Wextra -HEADER = libftprintf.h \ +HEADER = libftprintf.h + $(NAME): $(OBJS) ar -rcs $(NAME) $(OBJS) -%.o: %.cc +%.o: %.c $(CC) $(FLAGS) -I $(HEADER) $< -c -o $@ all: $(NAME) @@ -37,7 +39,7 @@ clean: rm -f $(OBJS) fclean: clean - rn -f $(NAME) + rm -f $(NAME) re: fclean all diff --git a/ft_printf.c b/ft_printf.c index 3348e71..ed2733a 100644 --- a/ft_printf.c +++ b/ft_printf.c @@ -6,26 +6,34 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/17 16:48:37 by adjoly #+# #+# */ -/* Updated: 2023/11/20 11:53:52 by adjoly ### ########.fr */ +/* Updated: 2023/11/20 16:09:16 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libftprintf.h" +#include "ft_printf.h" -void ft_putaddr(void *ptr) +int ft_putaddr(void *ptr) { - ft_putstr((char *)ptr); + int r; + + write(1, "0x", 2); + r = ft_putnbrbase((long unsigned int)ptr, "0123456789abcdef"); + return (2 + r); } -void ft_putnbrulong(unsigned long n) +int ft_putnbrulong(unsigned long n) { + int len; + + len = 0; if (n < 10) - write(1, &(char){n + '0'}, 1); + len += write(1, &(char){n + '0'}, 1); else { - ft_putnbrulong(n / 10); - write(1, &(char){n % 10 + '0'}, 1); + len += ft_putnbrulong(n / 10); + len += write(1, &(char){n % 10 + '0'}, 1); } + return (len); } int ft_printconversion(char conversion, va_list args) @@ -34,33 +42,33 @@ int ft_printconversion(char conversion, va_list args) count = 0; if (conversion == '%') - ft_putchar('%'); + count = ft_putchar('%'); else if (conversion == 's') - ft_putstr(va_arg(args, char *)); + count = ft_putstr(va_arg(args, char *)); else if (conversion == 'c') - ft_putchar(va_arg(args, char *)[0]); + count = ft_putchar(va_arg(args, char *)[0]); else if (conversion == 'i' || conversion == 'd') - ft_putnbr(va_arg(args, int)); + count = ft_putnbr(va_arg(args, int)); else if (conversion == 'u') - ft_putnbrulong(va_arg(args, unsigned long)); + count = ft_putnbrulong(va_arg(args, unsigned long)); else if (conversion == 'p') - ft_putstr((char *)va_arg(args, void *)); + count = ft_putaddr(va_arg(args, void *)); else if (conversion == 'x') - ft_putnbrbase(va_arg(args, int), "0123456789abcdef"); + count = ft_putnbrbase(va_arg(args, unsigned int), "0123456789abcdef"); else if (conversion == 'X') - ft_putnbrbase(va_arg(args, int), "0123456789ABCDEF"); + count = ft_putnbrbase(va_arg(args, unsigned int), "0123456789ABCDEF"); return (count); } int ft_printf(const char *format, ...) { int i; - int j; va_list args; int count; va_start(args, format); count = 0; + i = 0; while (format[i]) { if (format[i] == '%') @@ -69,7 +77,7 @@ int ft_printf(const char *format, ...) count += ft_printconversion(format[i], args); } else - ft_putchar(format[i]); + count += ft_putchar(format[i]); i++; } va_end(args); diff --git a/libftprintf.h b/ft_printf.h similarity index 74% rename from libftprintf.h rename to ft_printf.h index d9ad512..ff61971 100644 --- a/libftprintf.h +++ b/ft_printf.h @@ -1,17 +1,17 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* libftprintf.h :+: :+: :+: */ +/* ft_printf.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/17 16:50:36 by adjoly #+# #+# */ -/* Updated: 2023/11/20 10:04:12 by adjoly ### ########.fr */ +/* Updated: 2023/11/20 15:52:59 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef LIBFTPRINTF_H -# define LIBFTPRINTF_H +#ifndef FT_PRINTF_H +# define FT_PRINTF_H # include # include @@ -19,12 +19,13 @@ int ft_printf(const char *format, ...); int ft_printconversion(char conversion, va_list args); -void ft_putnbrulong(unsigned long n); -void ft_putaddr(void *ptr); +int ft_putnbrulong(unsigned long n); +int ft_putaddr(void *ptr); int ft_putstr(char *s); -void ft_putnbrbase(int n, char *base); +int ft_putnbrbase(int n, char *base); int ft_putchar(char c); -void ft_putnbr(int n); +int ft_putnbr(int n); +size_t ft_strlen(const char *s); #endif \ No newline at end of file diff --git a/ft_printf.o b/ft_printf.o new file mode 100644 index 0000000000000000000000000000000000000000..9f17c871f66fac937a2424edc03f18141f2739a1 GIT binary patch literal 3768 zcmbtXQD|FL7(QuAmvx&rPQ~Gr#)n~}EGFBW9SqIf?mR-Pa}rQkUDGt#%G#u+$?Rlv z8R^wt@4^C7s1Ji8D->~%m%zCP_W3rp%3;!rGbFm7BCND{Qr}4?mfF{ees8L z|8u_oJOB5ebI(0Z&#Rq>n;Z@z%t2lw)<~d)R5w}uAnOLnCSZoB{yWW<-BdqUy@?a) zoFHCrg5C;_sG(N%c`L#|U9A{uC0lHw**os;+e%vosdBz~wSo}Mo~yPhSwD6m5zQ9; zW9q}YST6nWI;z%X^zUgztx(4Tps=z8PBO!fPlHASoW5GY-vn= zAo4y~Coj}oFF2;O9pd#~C>KE^I944~YgA9K&Z}h@6J<`VWve?BZ7U3J?tlkhc)9eU zQ-p^Vts5dx%_`N^WrOJIO19dreEuv$yOxd63XR;N&I9i3Etmc{knWY9<}qr#>!SJ+ zg$UKLtKNe|&^k<|KjAIZ3yCONkEOJLN_SQZAtK4OzKhgl^cBr-gE%QF$7ar==w}nX2hWHgf`nuE;_YM(B!7C@+L2 z8in#81kGCCmvGkVOBzzNn6;z~DqUnsZ4B+o7@>=gDrqCNTCMa94>yRhFg3WdB)6NA zBZ~H^DXE==Y@n*8z%yYyU)0Dkd>m1md=JV$XOS8!Kn7HR&gf|PTFWH^Cf8U0zM`G6 zN;!fPpp;|aw%!so*QCrJj2}OJabc%%v~)oH&bM8b_tz#HVA2;Lfj?A zdlg@e;++~|t~;Z6LwUv9HK}-2_)IjEgcHCDFzV$PGpmq?8nakxr=cyQ)3pv{>a%|4 zX4;t>_b`{+#vI(UIdzHVa&9)HZkp?YOP;#sgUxso&l49u)kS!Mt6$W3J4d=Inf)%J zj7A{<-w#8Sxn>u;310$`-TDrG10(;7W*5z+mz23Gzn&L$b&-FTV*Y-Y6f-lFbg0fy z7vW9g8|}XBA0ht0uHAcH+52k8zHo1(FB+4818*EWq#lM#yEh$Ar9F{>aQuYlbTm2K zpNM+`yL^6MU}s=onnicx!U%b??ug@)qr@@dc5L6g!IcLoyq&S3y@ihhkGVfv`Y#0z{1s|_%`_81>L8ru`_d!V@yu-S_+UJJjp z4&Dnm=0C#ouswzTQ|s{cb?_(nd|Vc8yRheZ2bZ-O+TU=n&~|cM@Wq_H5`Uw_ACqu7 zPeH<4CH}I6%lw!5zGFQbB>qQ|3kv%dOqL_#5^q${}+zi z_u)5*FYiMP6MzZ6_>K}BMl2agaSNT%4C48!pau z#)gY?-LiROYx9OpF5*i@2g1HobRMTj=*D|RFLE+m z?sYoKu?-}BYCsI-0n{S794yVGAQ#=LCOAjRCCx~xg;Pl{e%sAYCf(3DYjC`Ez zPemp@2LMTifoOND#EpBZF6ndl3r!UzX^0lw(};jY14@h!+{ zJpBKJpJWjF{Mec(zE;He>oxHp?_IJ5>~{su(YJqf`frWEtV{(S_Pv$K`}mw{&5HvawvpQmeBYY}GH UYsVzlc>NuG!RW9~kx%IV3sP6zX#fBK literal 0 HcmV?d00001 diff --git a/ft_putchar.c b/ft_putchar.c index 426b046..5921424 100644 --- a/ft_putchar.c +++ b/ft_putchar.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/18 10:49:00 by adjoly #+# #+# */ -/* Updated: 2023/11/20 10:04:41 by adjoly ### ########.fr */ +/* Updated: 2023/11/20 15:51:04 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libftprintf.h" +#include "ft_printf.h" int ft_putchar(char c) { diff --git a/ft_putchar.o b/ft_putchar.o new file mode 100644 index 0000000000000000000000000000000000000000..e31b0fe8b4ad72b16b780769693dd12e8882895a GIT binary patch literal 1136 zcmb_aJxc>Y5S>ecUqm@XK~Uj38(k7@w2_Ek5rT!1QsQ|zli=MYT=q2DC;haf!XSuDtfaQYRkCvu55s5p~aACeTOX=LZ=RDml!bLc1*_Y8V6>TUDx(F9P(Tx z;8xM}fq7+av(4@7T$P*F5irL&c5`Mvk5enaiC^Nj*upO64t>+Lm1<@It8$;42gs)` z@jqc7_lfq{>y&;oqSB)FSIBL@4=vJ&RiuO?=PYBLv!+^_Zzs~C(S!&LBGbI(n~-`O zHA+q3QsD?^MitQ(+qT(IG&S{Bbrf6HOKA%Y)GF#*pxB*ASQIQto?rTFX!N@OzGx)x wN%yB2%X+EPy`!11jC6skjhd*J=cRgr^jjW45sl8XQ|v_~)C5x +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/10/31 11:52:46 by adjoly #+# #+# */ -/* Updated: 2023/11/20 10:40:57 by adjoly ### ########.fr */ +/* Updated: 2023/11/20 16:00:22 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libftprintf.h" +#include "ft_printf.h" -void ft_putnbr_fd(int n, int fd) +int ft_putnbr(int n) { unsigned int nbr; - int i; + int len; + len = 0; if (n < 0) { - write(fd, "-", 1); + write(1, "-", 1); nbr = -n; } else nbr = n; if (nbr < 10) - { - write(fd, &(char){nbr + '0'}, 1); - i++; - } + len += write(1, &(char){nbr + '0'}, 1); else { - ft_putnbr_fd(nbr / 10, fd); - write(fd, &(char){nbr % 10 + '0'}, 1); + len += ft_putnbr(nbr / 10); + len += write(1, &(char){nbr % 10 + '0'}, 1); } + return (len); } diff --git a/ft_putnbr.o b/ft_putnbr.o new file mode 100644 index 0000000000000000000000000000000000000000..61a66143e1fff36945d82bfea813bb8bd9ee5898 GIT binary patch literal 1496 zcmbW0&ubG=5XWbe{-RbJL?xhLK+uEanXMN+sFAX|hw7n_qlQhgsnujtHZL^_!NP(h zgkq24f1-%iA5f3#!T&(8;H7QA90GA>GcQ@z^y0wVdGne1&b}YJ&y1y85lsVS8eE4_ zq$ofH-sD3?5Ex-TSYwh^m zqecg_ZKFF(cpp>EuT5iLb=*IsV;ft0pJVqvB>^(Inj>q8e93ZF66>~GU9C6?eLw zDirXhR^YL_DsApyKgbqct89z@E-MX!K_gBOkOh2kJgmE_|n?{r9T?nBn)=SxEm5A@xbdnLFsI#{$R7o#KTC z?}~DahklM(N(tG=x$r`WhxKP!A1Z?zsxXuYV{@Qi3$HWHg;zp)wSR>daWd}wHn^cW xCpy1r97?bFC1la1eg)kIj-kC|y;>LP$-?U|B2zVf0YB*v literal 0 HcmV?d00001 diff --git a/ft_putnbrbase_fd.c b/ft_putnbrbase.c similarity index 62% rename from ft_putnbrbase_fd.c rename to ft_putnbrbase.c index bd9ccb2..9d15ba8 100644 --- a/ft_putnbrbase_fd.c +++ b/ft_putnbrbase.c @@ -1,35 +1,30 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_putnbrbase_fd.c :+: :+: :+: */ +/* ft_putnbrbase.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/18 10:57:44 by adjoly #+# #+# */ -/* Updated: 2023/11/18 11:10:32 by adjoly ### ########.fr */ +/* Updated: 2023/11/20 16:16:34 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" +#include "ft_printf.h" -void ft_putnbrbase_fd(int n, char *base, int fd) +int ft_putnbrbase(int n, char *base) { - unsigned int nbr; - size_t base_len; + int base_len; + int len; - base_len = ft_strlen(base); - if (n < 0) - { - write(fd, "-", 1); - nbr = -n; - } - else - nbr = n; - if (nbr < base_len) - write(fd, &base[nbr % base_len], 1); + len = 0; + base_len = (int)ft_strlen(base); + if (n < base_len) + len += write(1, &base[n % base_len], 1); else { - ft_putnbrbase_fd(nbr / base_len, base, fd); - write(fd, &base[nbr % base_len], 1); + len += ft_putnbrbase(n / base_len, base); + len += write(1, &base[n % base_len], 1); } + return (len); } diff --git a/ft_putnbrbase.o b/ft_putnbrbase.o new file mode 100644 index 0000000000000000000000000000000000000000..f305abe2cf3c502fe1a91a4259737e0c41996ee2 GIT binary patch literal 1392 zcmb_c&1(}u6rate^@D1ICSWjMp@x9%db{O{1gFl#g@BQ9y-prfX_BoB2!^rNF)Y(@!kti=}=4gnNI$DX$ZMwj6V4X?w9b{AK19P#y1DgDBrZH;0hK z@X(b8px^#xJo!rMtteoT;dpkiYHYe;cfB1L)pcDB@?hunZQ*Xq@A*#7{{43yIey{+-0jdV}-Wf!u{&o**=IJ)1JO#|U-WzV8N% ztguFxg`OJ_8nl^9@7$};cA4#L5bAlGe#2f~hDTW?Ps4TQqPi2YpcS_4uFLDWYmJrA z_LU@c2!+DTZh?K~qx~=FKoz_P6&t+SEhVA;mL?&O99kJQ9*B1pIrR;3ExwzIlyB7J ziDO{#Na7Pb%lRp=D4pZ6Fn_soQ4rknvituD=YbcTEWJ=f7HA*kTu1&ku+AmE{u%}n z#Q6pF0Gy)!@AHD9PwXG>SgaTP72x!xaU0AQjD4)}_2O-DJwk1(2b_9#)HS(q2Lk|x ISWDgi9}aTD!~g&Q literal 0 HcmV?d00001 diff --git a/ft_putstr.c b/ft_putstr.c index 123a0e7..97a8dd3 100644 --- a/ft_putstr.c +++ b/ft_putstr.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/10/31 11:45:55 by adjoly #+# #+# */ -/* Updated: 2023/11/20 10:07:08 by adjoly ### ########.fr */ +/* Updated: 2023/11/20 15:51:38 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libftprintf.h" +#include "ft_printf.h" int ft_putstr(char *s) { diff --git a/ft_putstr.o b/ft_putstr.o new file mode 100644 index 0000000000000000000000000000000000000000..410f795906b80cb4f611d37dadba860fc4581f4f GIT binary patch literal 1384 zcmbtSPiqrF6n~r8KWMc<6a)qLBBqCq-Fm5@5-Fp5s2&PA*09}dYUyS-Y-Vc}f`zCM z;-P*EKSK{HD6Lm-egUC{J;Zw;zBidMLz1)}+Fz{>&rXj9g8^C{-tY3h+x~8Ed@Dw2 z7%l*mH`7R@wjX-Ymc1J!&Fwg{on^MfoJHqeDo^hMT%qC!>-9QVdj;$I+|29&R=R;4 zEy73I9$hND&#hjZ&V4`+A|_)U>2vUBFzGZ8#t;pMJVuP;DiW6sf7t_a4{#O6ozbRg z6KF_zsSP*0q6Af#!qvx#5gJ2URyKKC@zkl=?G&&i2t6i(Jps&*>-8WKP!p9#Dw-kz z7R4f9Po9+*o5J&VfQ8|1z2a4?IQT7inQV(dWe8qWYKd15M#0PnhB<_{iSkul$|SCO z!Xw&Yj_T=u#B&Tb=c02hs7tmqp(M@G1pQXxNSY`qL%)wc8-F8;J^RW4KU5)C1)fJq zE$J_IP4N**a$Q!o7C)6TqX{KdS{Xys94_LP$T09r>9-Az)baS624}iX{OA*W>3*2A zVg4zZM-^HzlcKKgujy4(Ce5#)66!h8{AdH1La62^*LVuFQy}tkN^Mx literal 0 HcmV?d00001 diff --git a/ft_strlen.c b/ft_strlen.c new file mode 100644 index 0000000..ce68f8d --- /dev/null +++ b/ft_strlen.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/10/30 18:15:57 by adjoly #+# #+# */ +/* Updated: 2023/11/20 15:51:51 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +size_t ft_strlen(const char *s) +{ + int i; + + i = 0; + while (s[i]) + i++; + return (i); +} diff --git a/ft_strlen.o b/ft_strlen.o new file mode 100644 index 0000000000000000000000000000000000000000..0bbb64d68366066fa8c98a0b4d25754df39a605e GIT binary patch literal 1016 zcmb<-^>JfjWMqH=Mg}_u1P><4z_0^J&;cy$z`zMq8S2sb)T6WZ$8py$AW@HQ*B>6q zzF!(_I2ia__<$nau3wrDFm}3rdHLY~|NkDzu3usgGlV9U=9QExBKa;>f@O`twupd91_s8eAO^+?0Y+&ac8&=^x5xm+K^O!~L4+fpKpT@Y zFIxdn0f>(SxC6ym7(V{TCe6&igdr>d6cIua2ipY{Q-G=j=|It?SCU#$!l0L&pPQSS zSHh515?@?Wl#`mrpqH0llB(zK7phxal9-&$pqGA3;bm;j|g`atmvGY4ir05JGl3;+NC literal 0 HcmV?d00001 diff --git a/libftprintf.a b/libftprintf.a new file mode 100644 index 0000000000000000000000000000000000000000..49341a24c18ba71c051a7ea8f695a152c4271faa GIT binary patch literal 10770 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 literal 0 HcmV?d00001