From 088a3be5ebbb327347d1772137c2fcac5f07f19e Mon Sep 17 00:00:00 2001 From: Camille Chauvet Date: Thu, 2 Feb 2023 17:27:26 +0100 Subject: [PATCH] in file & out file work prety well --- Makefile | 6 +-- d | 1 + e | 0 filetester.c => file.c | 22 +++++++++- file.o | Bin 0 -> 4720 bytes g | 0 infile.c | 75 +++++++++++++++++++++++++++++++ infile.o | Bin 0 -> 4768 bytes libftx/libftx.a | Bin 5204 -> 5278 bytes libftx/printf/ft_eprintf.c | 2 +- libftx/printf/ft_eprintf.o | Bin 0 -> 3360 bytes libftx/printf/ft_printf.a | Bin 52442 -> 55878 bytes main.c | 40 +++-------------- main.o | Bin 1608 -> 3576 bytes minishell | Bin 33424 -> 45352 bytes minishell.h | 3 ++ outfile.c | 88 +++++++++++++++++++++++++++++++++++++ outfile.o | Bin 0 -> 5072 bytes t | 0 utils/ft_getstr.o | Bin 1456 -> 3184 bytes utils/ft_is_in_quote.o | Bin 1240 -> 2928 bytes utils/ft_strnchr.o | Bin 1080 -> 2744 bytes utils/ft_strncpy.o | Bin 1056 -> 2536 bytes utils/ft_strreplace.o | Bin 1704 -> 3408 bytes 24 files changed, 196 insertions(+), 41 deletions(-) create mode 100644 d create mode 100644 e rename filetester.c => file.c (63%) create mode 100644 file.o create mode 100644 g create mode 100644 infile.c create mode 100644 infile.o create mode 100644 libftx/printf/ft_eprintf.o create mode 100644 outfile.c create mode 100644 outfile.o create mode 100644 t diff --git a/Makefile b/Makefile index ac9d00c..70ce727 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -UTILS_SRC = utils/ft_is_in_quote.c utils/ft_strncpy.c utils/ft_strreplace.c utils/ft_strnchr.c utils/ft_getstr.c filetester.c -SRCS = main.c ${UTILS_SRC} +UTILS_SRC = utils/ft_is_in_quote.c utils/ft_strncpy.c utils/ft_strreplace.c utils/ft_strnchr.c utils/ft_getstr.c +SRCS = main.c file.c infile.c outfile.c ${UTILS_SRC} OBJS = ${SRCS:.c=.o} @@ -7,7 +7,7 @@ NAME = minishell CC = clang -CFLAGS = -Wall -Werror -Wextra +CFLAGS = -Wall -Werror -Wextra -g LIBS = libftx/libftx.a diff --git a/d b/d new file mode 100644 index 0000000..4bcfe98 --- /dev/null +++ b/d @@ -0,0 +1 @@ +d diff --git a/e b/e new file mode 100644 index 0000000..e69de29 diff --git a/filetester.c b/file.c similarity index 63% rename from filetester.c rename to file.c index 0e72bf4..7d3f287 100644 --- a/filetester.c +++ b/file.c @@ -1,8 +1,9 @@ -#include "minishell" +#include "minishell.h" int ft_file_is_readable(char *path) { int readable; + int fd; fd = open(path, O_RDONLY); if (fd == -1) @@ -23,11 +24,12 @@ int ft_file_is_readable(char *path) int ft_file_is_writeable(char *path) { int writeable; + int fd; fd = open(path, O_WRONLY | O_CREAT, 0644); if (fd == -1) { - ft_eprintf("bizarre l'erreur"); + ft_eprintf("minishell: %s: Permission denied\n", path); return (0); } writeable = write(fd, "", 0); @@ -39,3 +41,19 @@ int ft_file_is_writeable(char *path) close(fd); return (1); } + +char *ft_get_file_path(char *infile) +{ + size_t i; + + i = 1; + while (infile[i] == ' ') + i++; + if (infile[i] == '\0') + { + ft_eprintf("minishell: syntax error near "); + ft_eprintf("unexpected token `newline'\n"); + return (NULL); + } + return (ft_getstr(infile, i + 1)); +} diff --git a/file.o b/file.o new file mode 100644 index 0000000000000000000000000000000000000000..7b79ab5b0d4d34ac51a6bded3eb19006faa271eb GIT binary patch literal 4720 zcmd5;O>7%Q6rQy`Yv<3-Pg~L-wTqw>L9poFwXEB!vV+eey!IhdIGIWc)bOH55%OiWK) z?D*p(nM3xn++ys=wV))XOBWNLx^D2t8Rz=1ATs{|{7p~HC1z1W={P-ghR3)t zIdS2i#E5|##BjYJF22EZ|CPk#S?%%9vwCdPvly4eHZ93_b_d|6-UNsLUEZ-xca!RT z&-KsYn{o>+cHH*ZK#F6Engr&f_{skbC z`PFVvoYfKp{z7qU3(*%K@Pb#_f?*nVj^*>++Ge|38z^daDV@`@MxJR!OUoD*OFKpD zU@aj&>V3>A7`AN`O)bMrgJo)EhJDahW)h`~|jvK;M9l@(^lD5DOR# z92@ntU!e&Fj^$mAq7Ag1tEq0O%Q4;qkjH4PiqTpXV_j8@_0=(6tHfwSuW}x)RvtNi z855xHUr7B;^i?ISx^Ikyb*^#w>R-J394ty}fN)$u)L7)d^ac zeha}Rp{GgQ%-Zo>vB2zjI-N_E#+VcD>Wr5c2gy1^NF6flA&aFlso^{$hUv)o0n2ch zYXI^H;|`-KCr2QpMciK5Ih!FB2gAhR#31=1>f#q9~W64cOom!K1`WwiVAC!|{B6tkBlc>Gs`uihJ`DH_UXtlwm~7 z3pmVKqtVQCg$+QWd&AYK{igq#9|V%`>z??V)uMoyNGe zt747J(16;b?xjkJlE|Z#Sdr#(Fp0iuhDIS+Jp^mKO0e%}sP+?DGYP~btx3|BBn|Y? zkUByGA5--aNGeI;*9iYTkZUf|0?DrWif#aKW0KYa{b8!8_Xgnnz{0H{KLQ>imll^Z z2P^x$${ggUL=^~1(A!yl7;sn+%SezkEJ0rcq;UyK$ixcxmw-1*dAe&6un#$Y5?T~@ z4MO__Jjmb2YvQgwz^;R5xp8-`fd8-p{=y14er-_je8soE0$(tctq6i(IzhMR{oTs@ z$j9ml{%(#7{!Lup%Uk5*RYvgL(-?HYznSx%OU8 z_#q^M2)@X_iQ~wR!6U}K(Z?70Z5)s$GK|6vW*xj;rC?^hDroTwf#MA|^uXBpl;(aeX6iF|G1h2YpdL zKYlysi*X0JzSD;v=en>9zSu`;AO8f`i@X)%ihYUu8b!n@cq*CZt-!^&uln$Jxc;^e z7vp}waWSsg_n-Or&v5-4A1?fHzoUqJPI)Ss=dHjEuK(`CU*@{I@S!jGUvoT+34#cG z##4#LTbx6A9{YT_sOLT(F5WlAaU4dD(-4VzVM?}h@G5!3q>tI@UA2-0y<>vq=t!ZA1t`7 zRm`NE6v7>P2d~k8X>dKr=eUS<10I?n-p$(U<3FGFGJy9j#N<7W#y7*{~=dj6yQH3dxixc_(=@jBxD1^gCtmaE@s{=rIcBG#`C z9^o(651!BdoY3VXKK_8u=u^onz+GWw3GQCR<}f^E(YU|ZSLl!8 YAO8|y{@Nigf|m)9!`uNIg#6?G4e17#4*&oF literal 0 HcmV?d00001 diff --git a/g b/g new file mode 100644 index 0000000..e69de29 diff --git a/infile.c b/infile.c new file mode 100644 index 0000000..a5cf9a7 --- /dev/null +++ b/infile.c @@ -0,0 +1,75 @@ +#include "minishell.h" + +static int ft_get_infile(char *line) +{ + size_t i; + char *path; + + path = NULL; + i = 0; + while (line[i] != '\0') + { + if (line[i] == '<' && ft_is_in_quote(line, i) == 0) + { + if (path != NULL) + free(path); + path = ft_get_file_path(line + i); + if (path == NULL || ft_file_is_readable(path) == 0) + { + free(path); + return (-1); + } + } + i++; + } + if (path == NULL) + return (-2); + i = open(path, O_RDONLY); + free(path); + return (i); +} + +static int ft_remove_infile(char *line) +{ + size_t i; + int separator; + + i = 0; + while (line[i] != '\0') + { + if (line[i] == '<' && ft_is_in_quote(line, i) == 0) + { + line[i++] = ' '; + while (line[i] == ' ') + i++; + separator = ft_is_in_quote(line, i); + if (separator == 0) + separator = ' '; + else if (separator == 1) + separator = '\''; + else + separator = '\"'; + while (line[i] != separator && line[i] != '\0') + line[i++] = ' '; + if (line[i] != '\0' + && (separator == '\'' || separator == '\"')) + line[i++] = ' '; + } + i++; + } + return (0); +} + +int ft_infile(char *line) +{ + int fd; + + fd = ft_get_infile(line); + if (ft_remove_infile(line)) + { + if (fd > 0) + close(fd); + return (-1); + } + return (fd); +} diff --git a/infile.o b/infile.o new file mode 100644 index 0000000000000000000000000000000000000000..cc20d3e9280d1b113cdb9d6847aec8348199cd49 GIT binary patch literal 4768 zcmb_fO>7&-6`tjCmMc=?%2NGT2Q_OoaL~j{OHqp=VPgg@8=AJ;!l_f*NFh_?QY1o= zDwh=807?o|Dx#_l>;^^M9D-g_(;AbQ-rxf$}M2ZT51ZAvTLsk zGomg%NN8ta4ap67gf;0COnt#)W|uQ-k~HEc2@kvdh?>fG0dC--G}g17RShoIH}1zQ zJwHo>(1H93&3jDn7S_f;`aSc4Um-e5r*g@x`-@^7O#AC`4Rz?sSl3X8Zm$ky)Ex=< zK-3{Ezy*NqZodv+_EEFTZ)7{KA>}jOzlP1kRu2hlX_q&zuAEnQ<6ktd6`xBiyjW&A z&CLWXHV)wjsAehjFrg9rT+M8fQWQ*8O(s2Pj<4Q*YV)zo`_`gYY5#PX^~+VLewumz z8Mx)-;}-m=i~|$dcv|GS)xqNJFhE*|t;ML{>3w?quGrnN!~2hq9^21Yn6r?Cj*l|NC$|iZn~fNY ze2MAtdt$K|W2VK(YG4l<&o3gyu#jQOk(uZ*MjP#BiRefSk0;+pqdh=EnXnC8Uoz zF*+oDczKM8JZR%E9yUKjBl?Cm5D`>^9n%WksLn04G_u~;dz=bct^aw0iftykTOQ>(FZ zYsw?TrbVL}r-xwFbY>g#j-u46b%()Cla))X%4!Xy(yqJJnYvR-kiA=d*qLgvxk9VL zTxYJ(EVLRpu0B)lR1L`IyoPBHpJv*HVePHak?SrI*(4zJAzYzMwRXv2{S|_zw&-WT%=Z2BH z$fHI@U{Pa+hm921jk7%ZG7q7vfy49{9yJp@5`C42JA9zSEy&G6VulsFGRi|8kiXAU;tp%wYQ$-~I?vnCowqEWbr zzr$njI*cxI97UKEqMF?%JUJF#>B`H6KkQIXEB}r*fP!;`l%Kws!!(O zGEa7%$HYZGR_3?m_*jnLp3_fW;$eLC;XWrAV;)Oqs$NFsK6%F zyrRfD(iL^8y{PZWhfHiCwd6Oq?*R(44{iiCe*_T1-+8GJdl~&zJcQ3lpJES7jt+b~ z(d9uJ)al-N6NH(*&0%{Htl^uOjJ>-9{?-oo_jbUa0Y2i(U%cDE+#UGGcEG;|oP<6d zI1ZS&k>PXsI|3nu58+Yx-wA{eK7dEz|0EDXI6hH5`~w0ZgwuCc@pZW#K|jZRI9)jv zKkvi+ai90${yd{{Y01AIS6?8?h3*YX)aR0L#UUNt`$!ai#2d0bvL#%6bL9B*KAik~ zRgUQfOhV~WPD<{OogjXf#8q6izS#i2D97R}j=thQF7avED*xx@SbSg6SA3koLLQN= z!j=D@1@Oyq{A2)sR*ruwTNPKmf6oQ@v|mYH^O{~hD(*i5xQhGl0R9I#elLI*7KXncZ}11-s>3XfeCkn4NWSdyovb)s$+_0{4>!Ys@)yX4e}n$G-2|XO6h7 zLh&JWU7@?ql(=))^kJSVluEcB&4{~=i@VFz58JR~#ahF4ws;oz87~v3GF5ICW*y&! z=zm;>pca9vE^bMMQenCVEKm9gl(ke_d+x^ijwf`6S54`m5yFQOs=um*DbI2Qc z@2BchOZO^TBmbE|c$$77bfNZ3@XV)w0{r`=$E6Ji>3R(#9_^+b(%uRv14CwmyIuZWnSYv+hEV==o(A(D14cfN;_=Jd(&j3h5({!419!Xl7i4_3&nP~91B3A$VEV}$4KzQ- h)00cmUh&DEBpCl=V1X0`?}{|6NCRpJQvOt4p8~qE>B#^9 literal 0 HcmV?d00001 diff --git a/libftx/libftx.a b/libftx/libftx.a index 707690daf82c29620c468ea12826415579451b8c..23466973865a07778bfc5212f08f95d9af3ebe96 100644 GIT binary patch delta 560 zcmZwDF=$gk7zglwt}%(JdC9#<2L}lbHc6p~P0}*`1TJ2q2ECzuAn8(_ zp3{4vUr~*wyISa9WAO{PG)xopj=lq_t90)iubJ%ujzhQT8Ew;FARW>ZTBSoEQ>2IV zmc9Y{3f-lb^s&PLZnDQ1>!-9ye}Jr|$FxERz~$@IY(I*;QjrI8()YE!8{J5#Q6uxI zFdBF^C-*aha+-2g#mG^-nDxxr|BeJUER}+wD#!7HOgdVXsxs$@%ra(J_-?_rR2WU$&A3sb{qEE#JbEhTD1B$>>N) mTFy|m;`eqp*5mvLUsTgtSu3}7w^!LWoWWkodhHqgS^WdpgK8oG delta 552 zcmZwEF-Tic6b9hmYhvO{^4_~I3W5b49E_-Wi7&}BNZX-!->xaHJk=X!B5 z@3jYK+yF2LghyzdegF+o`anzcmHq+|kEZB=egn}C8mAq)0velWm{#dKV1(#B&C?h9 z1H@b^1r`z8XK@F_+vyW+(w7O%t?7H-P3B+%>D1+9!|0NCrXv|UC39v{x!DcfCWmIL%J|jlTcS}OO{bQZt(fCJ|3|tn zU(9-*A54@jLrRubIj=fZwpx|QY6k!S diff --git a/libftx/printf/ft_eprintf.c b/libftx/printf/ft_eprintf.c index 985cdee..857a9ed 100644 --- a/libftx/printf/ft_eprintf.c +++ b/libftx/printf/ft_eprintf.c @@ -12,7 +12,7 @@ #include "ft_printf.h" -int ft_printf(const char *format, ...) +int ft_eprintf(const char *format, ...) { va_list va; int i; diff --git a/libftx/printf/ft_eprintf.o b/libftx/printf/ft_eprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..2b649ef24bd33cd7c2f5caddbf1be6ee5924e764 GIT binary patch literal 3360 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 literal 1608 zcmbu9&x_Mg5XUF&?zU*vA_}5{xp>^?wkqgBsYu)$R*{7s1f^t~bhp?hHBFbgP!-Cm zB^M7~{4e|qbWy>7K`-J(sL;cDksbNsW2feX5=F0+!N>FVA#73J z=(s^guQn`qQ{Q&{cHMLJLQ$-UmF0__Xt404h}k7^Ihyf=oLAdf2d$ge&g3%LSGa?- z$mt<_Lq9i;=AWl-9$8AgMg@Unvk))9uW8a~8d6CZ(pV9+eaS<>dvkM@6r(ub}=>{OGUbE@A0W__;3tr1{LAYMvh}Apg<#u3I zAA)E!wwo2pw(%BiLM^DY{JI;|pxW@-j_l=ZRcgM~bij8kJL)B>AliW+SR3dcHzV(R zwiQ@}3!)$w_@8bI>(%$b?Iv>5FBnKq=cn2dCdA0AR+0(dA0CU}MXKd@${O;zoPSS3 z`X~wUCv!^jE_&)wlsUVvGN5;=8n2%{{nt>uqKYv7CUX(vT*v+#j&rO^b4f5kyFOzr z^^Q@WysW=MiDJBeMz=9YI=}C-A)gbSAAN^h&-?!ujZ*3rpZ^aML$tX7 diff --git a/minishell b/minishell index 4395a1cfbae386bbf2ab81d7f01d69a0f513fd60..f1d744f758af24982abc40500fd513b0496e2881 100755 GIT binary patch literal 45352 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 delta 8669 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 diff --git a/minishell.h b/minishell.h index 237180e..19129ad 100644 --- a/minishell.h +++ b/minishell.h @@ -8,6 +8,9 @@ int ft_file_is_readable(char *path); int ft_file_is_writeable(char *path); +char *ft_get_file_path(char *infile); +int ft_infile(char *line); +int ft_outfile(char *line); typedef struct cmd { diff --git a/outfile.c b/outfile.c new file mode 100644 index 0000000..8939ef3 --- /dev/null +++ b/outfile.c @@ -0,0 +1,88 @@ +#include "minishell.h" + +static int ft_get_outfile(char *line) +{ + size_t i; + int append; + char *path; + + path = NULL; + append = 0; + i = 0; + while (line[i] != '\0') + { + if (line[i] == '>' && ft_is_in_quote(line, i) == 0) + { + if (line[i + 1] == '>') + { + i++; + append = 1; + } + else + append = 0; + if (path != NULL) + free(path); + path = ft_get_file_path(line + i); + if (path == NULL || ft_file_is_writeable(path) == 0) + { + free(path); + return (-1); + } + } + i++; + } + if (path == NULL) + return (-2); + if (append == 1) + i = open(path, O_APPEND | O_CREAT, 0664); + else + i = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0664); + free(path); + return (i); +} + +static int ft_remove_outfile(char *line) +{ + size_t i; + int separator; + + i = 0; + while (line[i] != '\0') + { + if (line[i] == '>' && ft_is_in_quote(line, i) == 0) + { + while (line[i] == '>') + line[i++] = ' '; + while (line[i] == ' ') + i++; + separator = ft_is_in_quote(line, i); + if (separator == 0) + separator = ' '; + else if (separator == 1) + separator = '\''; + else + separator = '\"'; + while (line[i] != separator && line[i] != '\0') + line[i++] = ' '; + if (line[i] != '\0' + && (separator == '\'' || separator == '\"')) + line[i++] = ' '; + } + i++; + } + return (0); +} + +int ft_outfile(char *line) +{ + int fd; + + fd = ft_get_outfile(line); + if (ft_remove_outfile(line)) + { + if (fd > 0) + close(fd); + return (-1); + } + return (fd); +} diff --git a/outfile.o b/outfile.o new file mode 100644 index 0000000000000000000000000000000000000000..13f900ddeabbaeb4e981c761fb13011d6ed35450 GIT binary patch literal 5072 zcmbtXUu;`f89&$8=laG;>@-=^l#b4uODbBM?DEC(Ajf1F=<7cS{I*>o1noXeJn7^xqmm)5m;L z!S*`5u?p3zv5&97EhiuUZAw2BdA2)PeB4RvaCkB3^d1f`?L$u$*IO5;NVh%v6gJ1` zs`DGt_GpiW2Dl#T+jk(eN9)JW%tyas-GZjy7$4F@Pjo-oeR%)rfs^|g^K<5t(CGoj z`0=)(vD1jLz#~i#o#^iFX3PvTvg#T{6S{a9>lN{ERbV^r&%@&g@-;p4~)Xtb|V zUpwuXd}PGPASOmhF$xfK z+vBxuk4L1(^MZFodUUd~q(>*KsK|=85#xSShYQg+w64AAllUxw1WYzDT`$$@k#sRt z%0=evO0`ffMMjTWBi6|9vAR%>zH$_!LpI>;^ zH0|G^UWSHf_-N63wGu5BrlZB;+|2OkQPCIc5_Q%iS}3K9^^DD2>j2woEt9dcR^GWV zyAZ(<{dd@DgTbHkfRW%l$%l+Dal=R~@Su?wSkTCEzcI#j<3%34&VA@=;4u9s7tII{ z1aI=L2KU$LI|LV93BD)6ePgiA^Bw?!1P>?p;23`_%dG_8pWvfO9vI^$^u5rV3I0Hm zn`4LygKOlfXOj2UK}aHr9OocCh~S??+l>H8m_5VyLOY!0LkWINSW~)Sf~Q~S{ujAV zFJ9%{`d|`%lSn?td#};NkW+@Uw1_y3GPG|3+Y3znfI??G`{OX7c(ZpCjy za&+)Ji7pRquTFPPGcU~a4hQ=JSbaN~&b`_R|Kl$F=Xb%YyWm%V_q*mL&JtiJcj12# zI0;=-IA)l5k>YCpfItZ0bZsfzxyT&6%Z01+o%py8Tl`^Jcf#pTSAI^qaJQc~U3kdF z|8N)lwhMRrIV_jfoBunz;OZu&9O><%L|xg0D-P-CO-rKiVQ0t&WlOlY>E!q`E}Z;) zL5>f~mZm|uDmfxMUi=A(tGMFs1{U|=m*iNyB+ys<*CjqJTjl?p9E)2WeZ|j7{1w?M zT>1Zw2Y*A3-}d0|$?+8r{-GSdFI$z5`n}%r@aN?CBM+|f`HKfv`7}NFbvfSh;AuJb zQz8&G-|sp@7WUvjlK7wpe^cTS+0wRiukW}AKPShkReV*4jMS_8$RQq%W=~glFvP5k zJzdXDrKYDV_8hY+b}?nu?DI8drOPujHr_FkQLR;^+Oa5;$`JzV&|u_mDG&w zex3c#ml+5mHllo^QmEOf=^`9dY}@q=u`r!lYMNQqZ_ZHr{|fDg)?3`=?ALS{LDc!@ zjKup%bwx|>J6a?6SwV_%`hw77-!0y|fc`;o?~@jn4poSXPdwTqCV`M4rxCH`R+Na- z{8`3bXhV1Ae+>Fg_Akk#KI>6>hRlL}r~FNMkR~Z<2<1=btT+Edz{uwaK5n@n59Ql# z5PcP2wRFyQvLBZVLixEx*{Svvl&bIMmAnfom0s>Uj{U5hX3NE_v_IcMoQ|5mg1?VW zr}~|f`!6nuR6jbKl)YMiI;Xrjk;%G@|6@;LUhXAuJH@{uII{yFw literal 0 HcmV?d00001 diff --git a/t b/t new file mode 100644 index 0000000..e69de29 diff --git a/utils/ft_getstr.o b/utils/ft_getstr.o index 8e8314fd80b8c5c365eb86cb6d078c192681b8c3..fa8b630a752c0f13c5dce00c2afd6c3b243f7750 100644 GIT binary patch literal 3184 zcmbtVUuYaf7@ys}*}MF^%O4YyM%$yd2C3OgVg#$Tjg+(3v-%)LLZn!HXS0(U^$$a{Vh@Xy)Q94vzeInHWKsk zjl^txjqBCKJn-}0#v1y}##bscD3!Ek;UO#{Y!^`eKmeFa*ZDw`y772+<>#h2x{s}NU#xU1{eAuc(V-zhE1!EhVZ!p(Pfhg+0Zoe7x%o1=K5fhA2m44Cx%D7z(}v3M@w$3Vn%+A_s?tK?#0}8bmc16AUp$17vvI zb6hW)vD3~(bjmE1t)dg{A29lizTO8sw%GsT0H8tRLE^cVU5@44)P(7l-I9?ZF(+4! z<%ZDOV}k>+g5_A{ylLBH+nB&|iGUYzh+Twao>R6a95WlW9G8@>b7l&Z zn=av4oFo}?)+@Ru!PWn^OE~5o?66SYb59dxx>@ON42CX4(edKrhk`!>c`V#~Nj=`A zYx@*1A@>6pAXrmHQT_}!p+YnG6n1zL^U9@|ZH>old#cdeKfva!dNIFhG0Vx=Ue+W# zM~6B=fU=v-nmHryUxT{s%g|2i>o;jgPtrR52^s|51$r;&`XmjF&_?}Hssp0>1l2${ z>CZ7M9dH1!u8-=PousO+b&Noa5!#fbZ4fOBDsUxZm#eve)l=p!RkUzF+ zEowXOVArz7U(qfSfJTBc#jr;H`O@xzmDZ~G>^BCk1Ya}r+C4mU8~#3ShVL4){{^iE zWe-0w^4OXM&t4PYdiXT>goqs?k3K?L`9$!&9CuXl*i41&;S*thjN`prXh6wD9Z zhCj@C5oe6!6B1wKcv#}g9A_l{b&k(U{F@w~m-x3heof-v=J;KSKg03I68{RvHzeNU z_$!IWdx;WdqhGV?y4jqU>j|yF$eQEcL@GT#UNWbMQ8Mkc;hNJfF*3zM!Gtcg)9Sb_ zHaj3eIazO#`}kojCs!nf0}akN@ziiH^u5gU#K4}CN@ugsg(uL{DyJ+b<@Z59qwj57 zj>*HB`BbiyE|@#nq1zac(oK(pexZQ+f6H}ujB>RWuwy0#=L=6t@e&&XY z2&zQ(KMrfP_Wujt{|)Yd`$tONKlTSS5$A*{lR18QKNJMlBEQhsKWh2M_>XG*i~lp+ zUos=7Yh8*Ow%2@avihxItTFD7eYjf0`33g|OlsBd0>6LacgFf*ZxjB4zXY791x&YP zf#>g&79~ht0*_kx7i#3ko-gOm0;iqYDuTKI-?rS~{-Q3pe-t_Y7r+S{X26FZ`KDGl LMn8OGa{j*oEDMM& delta 391 zcmew$v4MMnhNuBE0~|PjSq=-VPu)SmQ|dG6)5@VKLku}V3%NGVV!({U7jngB)+($C@-b7 zU@|L*$z(5%G!~%BqRAUM#5q?%4R4x!kwc!5ZSqGB`^gVDSSFirifAT46OZA*VRgB*w{w9AZEN1sG!{f8-Kpn!z}ki(8E` ze6k^@xaI_?`7m=p=Cffj-)izlZgJ5SP}NY10i>D%Xp1mo)nr2+ag7U5`zL_JfdIq> I1vR>B0fT}*00000 diff --git a/utils/ft_is_in_quote.o b/utils/ft_is_in_quote.o index e732a6237f4641e61a9a078745bac6528e54a33f..1177bf1466c1c255940f37cd48f1ceccd82a93c2 100644 GIT binary patch literal 2928 zcmbtW&2Jk;6o0$xSvzs!brTX&LQ#ZTRS0FBgdov2DnZ56u>wL!LFoY*f2{2l>vif~ zN1-CLU;<5ZA*h8M03l8R^-wMd^#F-DK=}ixkLdv^xrJL02lHlkCRvYM3B;3j-~4{> zYv;{}eKk4zk}OHUMS}Bigg6UuCww%X_J-4-q32v`^^er*@Fppm_t4rw=31okwDl_Q)L`*-SOI zBuv%ZyU=R2Fx3v$+?BMO+t(gooqO94q{gmzw9YnMhAjhbUt?UC^beM}!4eWvai z$KRbmG^sxeb=S0k1_5PAy@XxrAjcRz}Asys_8Tgx}7DY3Hqa!2qEh*g(wUxP^jI)XV<1=sMgS10>%4 zQ-g#Wq^m)C)imi!lX#j8y-$XV4)%V7|-kCF7f1|zaNo|D55=0{<<; zR|WnDhSvn%W%x6Je~00(1^yPp-w1qz;Sr{3Z-V{d-zoMD^n#JAmonL0u4XKP?ix!j z==o};V&G-MjPy>?Ylf9&*tCmP&~182U3_J3)N!-=YG>{z|RHe z<9xt0jTLiJ(+nfMA0OsRmFTN?;Hcks%<&Ed0TJV$LR;`Wa@T2g=r&jY{dYqBBFtfk zX?pIc%NWC4W!WaX%L%4=eXi;MmQL}*Y*Fa^g2LmtK8r>^4*Jb>TGS4{%RaXdJQFm} zt1SLG3If9CIGbn0J|Z3x~c+P^M*cs%DVKZwkru*gNXC!J4v30Sb+ypCs1*2R~O_ApigX delta 328 zcmew$c7t<*hUg3?1~_m4vm6*WH`?+rPEKIbo9xeQIe8Pi1f$R7jV$_;H*m063o#%x za56%)DnKZ(3_=zts8^C&QNo~?oS&PUnpZN}k=e4XEne$$}j6 zlM6UFCR=b=FtSfJUXR3bPv`2UP{MMVK*lvLUy)#s;YU O2~Y(fE;A6Ln+5=Jb1L`% diff --git a/utils/ft_strnchr.o b/utils/ft_strnchr.o index d90543eba51647469751129e8d679983868efbae..c1cc6b1681edcbe9c70ee4c12e6f8b6ea4612f4c 100644 GIT binary patch literal 2744 zcmbtV&2Jl35TD)kvy(cp^FhBTLOFl{A@3$3L@l6VgiIZ)<$x5#1&lv7_QHA{d3U3v z5-n0%Xp~EWkm#X@3Zx1lAx>~Xs;D^7KLKvJAkkC9EfNPavpdh(Jd7&DNN;E6H#2XZ z=gmA{EnR#=*EEo%!Ff2;BnohlK9q}*ScE)!E|<4{FW%TMZ+*0Xqx7)+OKFdc;a?lGRTa0bPQmXm69I86JKOeRnn1wquPP z(6)o$l)n3Zq=_$xi4FQ98Lqe%OQ7G2DlSGc6cEX2O?=7Llo=tJ5m>H=UJ%YS+?v;# zS+je-)AeTN=FM4iw(vq28RxFdqqbna2w~v3zO@om{h;SH+C8%Ymbc+2;|HABFZ6t;<=M?BfW80Q zY3a8<#y?oQ{1#~I6WW=v%*YO2$rFgvB8m$8T5jSK{q^y*{sDRbWYH%DKcZFBw7+uW z#ONk*X;Brx3jLntcnvpf+SdBn#p>ch!F9ZFz0mSPtL_B;BV7Cq_HdoL<+^K~!rZ(? za ~dHZqyN-+0vERh#rWj9G#AroK zRD}MD$fVmMi$JC#CMzO`f+@z*Es;uB(z`k>S_G#RHmV{iD(M`><=>rk4I1M#XBW8p1f5y76;8$6{qTnIx z*A?7leOJNhEh4%Vvq9cFtbe88pR+#0oNAM-&wa+#x`ElW>tU-}tJiz>8km8-9)Q{C zb~-k`A8f=|C@~gb_H4JtCdXUpg6VYw+r04Ra={O3jSs=3DXZ3+O?>5AN8E96Z3gUi zb){G9*omES;7rUF)auALI>i4k(fuX+Q||W;H}Gubrn=at@{Y4udy2Ajf|ABu8|LIn5in%(5=o zJ&yZU0?cK8$&VvGEZ*bhG#?RP;&{akZY7&LVU&3#ME}@`t*Y*~88|B)nakfV;Q)nU z^?Q~ZLe`1uH;PNfOPuakJrhFkE9cKEMn#R@oniTlL-Nz>t>&lq%(&R6HvJgafMowm cfX+{(=D&%UT08RlgNN#CQjjQ)j-=-Q8++d}LjV8( delta 355 zcmdlXx`SharU)Yg95{ek4h)Iem5=E;gI!kiPJ z7N$;)WS3`ToLtFn&&dvy1qmBWKFBT(w09~8C9nc&i3C`hfdS+MRv-q^AOI8B2C|ub{^tX!1|Wt5m?L2V f9Fr5-#aUv3+{uERA{r7<;}f9rATBcyqZ(b5i;Far3X+DLaH2ly^dF`*TK6R zB^4A<1jJNAEud0~3pbGX0bG$daNtk)f>dtdfK;gmGqXF-SwFc#h>_mTeBYaS^WN;d z_fhro>#CxF5Cty6F%m4mlg6=KNz4i?py#GN_`@E2c+VchNA_UzuKineNYnO>>d?MW zy}NL5K1E0NjW>p0oSMOjdt@Fa=FmR)MX?9f;h(>cMk5Nk`m1tMd7`+aYsJ#T=ZYtl zMa-<4NG=+cGg|S*!iB>5vl~mVoCVNyP?_3T0?4gTK>ajqETsVe#^azBFBS>~fcygT zxT$Y(-0&0H~8mYT4$q^$L0b{D4#rw(zSc%KhRAQuLQ_D9M4rio?F;driytce~50Yl)py%t|X|d4c1{ zEf+GU#oFKsVbp55ZL^d9*xB*#eMryE{jJX)=mn#ut2KSz=;$Rh=WDw5lAf>Wb2U9@ zysWD~>vLCi)u^c|?hAMIU^&349Q-w!=Aj)o*2J_1+5{FrOZ!8>vDN^)S`ymTVrKoM z#>k0lJco8Ri)eo0(@TK{%3`WO@XL%(XLy}$QjcVKTBpMJG1j!NalO%g`T_h4%!|AY z#+M}iQ^uPTPxq0;N!57&Uon1P;=f`1iNs%Ld?@igV-Y9zIbgobn$DU%ZQM($n&rqk@B!JLaQD5yWy0;$+x-^6-{+&te4f;H7A zE7VuSiT)LH6*feF3%(=_*3{qfnlwePE=lrKr)Kh%eW@R1jvVhN-T>dR7E1PA$BFE{ z5`ITqlnw_J*$3!6V-1Phlm$E{a<-cNWmS>{}X|X$iDQB zOv}GBB|p8!a(;TBw9BI&s*iDuMfATQX#XT~{yWIYwIe^9`{zdjC=^F`M9%*Y(na}Y delta 332 zcmaDMynthZhUf!E1~_m4vm6*WC)$Qh)?qT49M5Dq*_cg&(PMHVv;O28%o39$SS2QR zu=4Vjq*jzL=q2ap=BDPAOg_V^I+=+rjRUAZ6o{E8H!=%zRzOWoo!rSL&&V@*C7V5` z5KtB*Y%uvFn>eH1XSb-Qsg8)oi8^~t%`JWG@8h{uMV2*?da7>=aCe9KI7%Q6rS~FHg0|#H--Kr6*Zz2f{=BS28om?1S-?5+dzZ}DhCuCdlOr%*O9#& z+9H=U5mhZqDCHC`P!$jn;!p$<5f{pjNP7#n94jQGAUK2`P$iJc_trDbdgC6Dc+z;@ z``-87%)Fg>$=iuj&xaI+Nm1A^+p;9e*w~IOeZ*5oSQN~0qw=e9;g2~$My0%IRNM`t zGJeabjIJBi^5zCnjY{G=jE$O6Enhd3Rim0%H+mAcjK@}ug;hoJ){KSn8tZtcox)ZV zcPRX~n`BhWYev=GG^*pbM4rT&p&~&gaS6$=YGTp92taqysC+NUL|ob;RK7#dlA+uH zd;==wBK->VP3Y^;mq8aNsFvYymyyrt8DEz<*Fai900mz2kw>o)u?nB^v(YoU{!>#J z2f!MY#2w6cj0-=`;Y_dnpzKr*MRsvD65Z1s*{O7DjDDt&i?I zvFn+Aj5To<63~fVjPZdwQ|n-aHXmeaWVp4pm9g+{Ahi@o`V~eK25|2Sw|RQ-XBfVa zDp9hOSIAP-_wm~lx;#^7W$UchYt|>2z&yQW@zCWl&*GE?mf=|%F`4!OewsZ^316cb z64E`SIn2fi`!GBc(#x?OYw9%n{sDOCqB?0&*$u1DQj95s|#SD6d4k*sT_PICslNq zRlw@5UCK?{W+s-i9ahSnGbb=Pg&9_Gp}2YW-!_Y5KHwb|K9;>B}z+Hx}{t3N%;g(M{>lQF0CEDIqi+u{9^_8{+S318(=Ey;Tp`NK(mV37|D z@xdhTOY-N2csR+m)4WAH$u-QXHqF~_@=mb#BzY*w+qGBuPFP*@{PB4n19qE-fpux~ zJeuT@Z@4xD(n*iBcb@N0a($j3O!6bQ5e}jT;_i9gmgFtBdG`>11PbUO_ ze7Jwz4)HmI>rzgV7L0q{3c9R3;S?jKQz#Obb=mF1xg=xm^5K-{n6MubGi~eMqk#Uz zeek0Km+NMPE$c7wHwEtXTIdpgOW-n2;&TEoido_x3S0Um{;|N{4e*zRE#o9#=KUGybP#V>5Oc3RFrutE@kns|yKGtae zD`NfbfHPn+>N}0r&o)?}?pkpD3^4W7-2$dLjC(RCh_Z~df0E$(-vSHPj(F>0Q}X^( K99^m4`u_r`k=`x< delta 533 zcmca0wSsqohNuP$0~|PjSq=F7O*Z6~XVjV;$R*CShH-Krr`Y5JoC1u# zlP_|MGi_j;{EAzR(F1IL1Jq`iIUw`du$XT(`67?F=nSZ8C#+J!~yy6-! Qp!TnTx(dVvsYQ1!05xQ5S^xk5