From af6488534b0a3e2851e65005897b2260906282f6 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 24 Apr 2024 14:49:32 +0200 Subject: [PATCH] [ADD] parse_command() --- .gitignore | 2 + Makefile | 2 +- include/include.h | 9 ++- libtf/Makefile | 4 +- libtf/libtf.h | 18 +++++- libtf/src/list3.c | 53 ++++++++++++++++++ minishell | Bin 31432 -> 0 bytes src/error.c | 10 +++- src/main.c | 8 +-- src/parse_command.c | 132 ++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 225 insertions(+), 13 deletions(-) create mode 100644 libtf/src/list3.c delete mode 100755 minishell create mode 100644 src/parse_command.c diff --git a/.gitignore b/.gitignore index 2eea60a..c5d6576 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +./minishell + # Prerequisites *.d diff --git a/Makefile b/Makefile index 30a561d..52864a7 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ SRCS = src/ # include directory INCLUDES = include/ libtf/ libft/ # .c files in src/ without the extension -CODE = main ask_command error path +CODE = main ask_command error path parse_command # directories to 'make' LIBRARIES = libtf libft # .a files to include diff --git a/include/include.h b/include/include.h index f4e37a8..ce10b5f 100644 --- a/include/include.h +++ b/include/include.h @@ -6,7 +6,7 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/23 14:15:12 by mcolonna #+# #+# */ -/* Updated: 2024/04/24 13:19:28 by mcolonna ### ########.fr */ +/* Updated: 2024/04/25 16:53:06 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,7 +45,7 @@ typedef struct s_call // Represents a command given by the user. typedef struct s_command { - bool error; // true means an error occured in interpret_command(). + bool error; // true if an error occured in interpret_command(). const t_call *calls; // all calls to programs. int input_fd; // fd to use with '<' redirection (0 by default) int output_fd; // fd to use with '>' redirection (1 by default) @@ -53,7 +53,7 @@ typedef struct s_command // Return the t_command representing the command given by the user. // If error, return a t_command wth the value .error = true. -t_command parse_command(const char *command); +t_command parse_command(const t_memclass mc, const char *command); ///// EXECUTE COMMAND ///// @@ -66,6 +66,9 @@ int execute_command(t_command command); // If msg == "errno", use strerror(errno) void minishell_error(const char *msg); +// Call to write the error and exit the program. +void fatal_error(const char *msg); + ///// PATH ///// // Get the PATH values. diff --git a/libtf/Makefile b/libtf/Makefile index 977f51b..889a1eb 100644 --- a/libtf/Makefile +++ b/libtf/Makefile @@ -5,13 +5,13 @@ INCLUDES = ./ include/ CODE = \ mem mem_utils str1 str2 str3 str_stream str_char1 \ str_char2 str_stream_more str_streamstr print \ - list1 list2 error data read_line read_line_utils + list1 list2 list3 error data read_line read_line_utils PRINTF_CODE = \ conversions1 conversions2 do_conversion ft_itoa tf_printf \ ft_strjoin stream1 stream2 utils1 utils2 PRINTF_SRCS = tf_printf/src/ PRINTF_INCLUDES = ./ tf_printf/include/ -WHAT = LIBTF v9 +WHAT = LIBTF v11 USED = malloc() free() write() # It works and I probably won't change it for the rest of my life diff --git a/libtf/libtf.h b/libtf/libtf.h index 953cae3..1b94f83 100644 --- a/libtf/libtf.h +++ b/libtf/libtf.h @@ -6,7 +6,7 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/12/18 11:07:59 by mcolonna #+# #+# */ -/* Updated: 2024/03/11 12:12:03 by mcolonna ### ########.fr */ +/* Updated: 2024/04/25 16:06:24 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -381,6 +381,22 @@ void list_rotate(t_list *list); */ void list_revrotate(t_list *list); +/** + * Convert the t_list to a void** ended by NULL. + */ +void **list_convert( + t_err *err, t_memclass mc, const t_list *list); + +/** + * Let '' be the type of the value of all elements of the list: + * convert the t_list to a * list ended by a filled with nul bytes. + * For example: + * If 'list' is {3, 4, 7, 2, 1} wth each element being an int, this function + * will return (int*){3, 4, 7, 2, 1, 0}. + */ +void *list_convert_type(t_err *err, + t_memclass mc, const t_list *list, int size); + ///// DATA ///// /** diff --git a/libtf/src/list3.c b/libtf/src/list3.c new file mode 100644 index 0000000..474b0f0 --- /dev/null +++ b/libtf/src/list3.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list3.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: mcolonna +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/25 12:05:28 by mcolonna #+# #+# */ +/* Updated: 2024/04/25 16:19:00 by mcolonna ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libtf.h" + +void **list_convert(t_err *err, t_memclass mc, const t_list *list) +{ + const int size = list_getsize(list); + int i; + void **r; + + r = mem_alloc(err, mc, (size + 1) * sizeof(void *)); + i = -1; + while (++i < size) + r[i] = list_get(err, list, i); + r[i] = NULL; + return (r); +} + +static void fill_with_0(char *dest, int size) +{ + int i; + + i = -1; + while (++i < size) + dest[i] = '\0'; +} + +void *list_convert_type(t_err *err, + t_memclass mc, const t_list *list, int size) +{ + const t_memclass mc_in = mem_subclass(err, mc); + char **const list2 = (char **)list_convert(err, mc_in, list); + const int listsize = list_getsize(list); + char *r; + int i; + + r = mem_alloc(err, mc, (listsize + 1) * size); + i = -1; + while (++i < listsize) + data_cpy(r + i * size, list2[i], size); + fill_with_0(r + i * size, size); + return (r); +} diff --git a/minishell b/minishell deleted file mode 100755 index e178c734a87361c01a14af82aa79bf84531245d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31432 zcmeHQdw5jUwcj%#5D`gKP<)`Hq6L*9V9+R1!((u;iKLp;7kZc^0~wt>Iu9T=(RfE& zrbF(HZ`!KWUi|=s4u{ZJp7^F9tn6?_DPu-KmXk$haLI<07UI z8fv~-Uzuc6qquzC zOLy}nT;Evz(9Zp!Ay+Tv1Oqi^m&^&)%?<_{qw8m{FFkwq*(L69lY5?Yf&6meLpgQf z#nl34x`@VM6wY>qYkS0-!hDjy^IOCJe*DwnhAy(l zE=rurhv7pqDjqjUI??Fb<$sMcM&b7Fb3r)5P6U4P81xIrpx*(y3m^Mc0>WtaX&jG6 zzkCcj#bGr0&7iyRv0qa`7)|~;&|P+6;NQe&GC>FGgb#0eZj!>ei8Ef z>O_Mt7;LH)>q3EuUl;~brq&2Ye4&WZ;0rX0=4d1=R)_q45srlXp-@u@LV%4;2Go3! zKvN?KP^i7msI9-wSnUf01sS0zI^c#W1hRjES;4p&U4Qf#`3BPqs|}luL*=B z{!mrLl3-J#zsgq=ByZLE zw~DdFLg%GRGP*2u9SdUgSm+a#3HjY?p--~VbH!W)auLWyAQypL1ac9`MZg|`j|)%u z%o`gj@Fw!#F@*5m(iL&0d%dw81gGkbFIH_6@w3PNzF1P8*|r z1G`L|HfZ|>wwX9>koFDy(!^<_wr}786Q_;RzJXg!oHj`N25vHO+8FH{_^!s`%|hwT zQX%~T{^~X4T?T)_hX2-v|H_6xVZ(oJ!|%1>cUtkeA1sgWy2cy-vp2RkRaxbk+cozk zZ^y#p5Qg;BFeHapy9-ae8I3@II~M*36mLiVZ3NC8iA+W4ze8n&{*ZKk;fd`e_dG+$ z2c-P`8UnMv^u|-(Z699X-8Pcvb-d`^^<`uV44lda3ex?nWgN6V^-uf4`CyCa8P(p{ zLMIiy@xMeSc@qoA14%yeWjdX#LvUZrKMc6zYUrBvlm5UuFsV=tz0Rwj*F`kqh1q1R zJ9#H;0R1bY-&g1ax8kl-=uAfI6}p_!D-?PyqZcVO!RP{oKF;Ww3VoH)=?eXj(a8!e zoTKVZe<8gpW;CVHZ!`LyLPLzcq0rkIeO{qYG5VB3-(vLV3jGJ8cPaGfVpZ=C6k5vY zdWBxWXaJ}+im{{=B=^| zyOVSX1espw^peg6lJ4n)$aGoR_Gf8m0^PtGw@wC{fJEG6(Tx}>zX;ag&&2yMXatjL5Vn_bf><&#buz4rB0g3;>U7NIo zmNDykX59l;awCw=tjdc~d0)3@i2NTM7xN4`5}qONCU3`-7lG0d>-Yt+3gU68tZ#R`ysJhGK zt>poR%P2BPNF-G?e5K^_B%hlJwdBxevZ55aHYK9Rf{ARK`Ug4gbwvY@$qJ+@yq8_N zAAOQ>@D%9Db}b}x%EsMUHU_ViB8ln|Z@fqrGtMTx2}O!mPE%54(`fco!~~E;HLO=^ zJ&F)DI0ZVIQt3h&Hb{m(lVXY9lh@i>PEApe}Mq0yx2V=#nq6H zQvXt3Jg>!pBih}`+cA%+WLyhURx+wSD*zb*ko|(LqW(o&GX1L%nHI8tVWLd;FL+t~ zYo?A8C)25{0aS#>LrK<9L>+gOiI7U-l4<0^;E_y4-e{`wkNv^|%uXsk%(8E2@m2rC zY@b!D>b7{aA8P&HSXY4zH^egIL)8fF=^(3ku@lwkRaH3@EoL(f8L=$TdWMzrFsmhH zeLMbA%)q0_Q90@ge_$(<$(V7udeAy z2vbe5hCPm0+aA$!TeoLeJ2^~Fb|orO3D2;jhrHza&ot|gO5TAjxYBfD3zTDB4sUHQ zT1)+kAj);(AvIm{u$Z8_atWlRD6+=U`yzsc@nZ8KQ4NuoL59f72*?I!tYH}54~v#J zDcvkx9~+_$=|T5()p--+PNjL8`fhHQY(WS0q@05<$G*DTvq!c(Ks9&|zEQ@*eI52Zbq3)!ICOIx2sU&7-JP$Z^EZLNudjSZlf4GwFs=5?+B$a5>7IRY+uejgZwxn#^{RqUv+_n!fvBW()5}qB@ z50*u|Vl$**NOs3GntidU!lc&UK$*4V#-WZ@9-wD#e*};G*E7_Ex!sJv>?O3T>i5#8x5$FzurBh%05WRT1W z7}N8pVic@s{|3*HZi&nE1|HI2E%gi`Qb;c`I6bSC%tzMklwFMpGim;V=BubX?%AJQKsfdc+UxgE*5RNA4K8kP`&>kd zZfc|9*S>B7lJ=i{gJ%{#?fG1VaS|xEbgj<^7{nO>mW+<6Kh3gXX&DV>xiJ#77I@O_ zZD}F5nIL0Ut|Xta<`ltvI+MGZ(M4(&dTgjz2MTL;pI)@KPJ^#JRenH|3UwRp9rQ$m zwvsgEn4Bl+poY*aPief;24Vya3Q^zkhNWZbY>8E3q*FSmJ$m+?F!kR^JUR@oRD%(4 z7j9D2%9^BwGyWPSz=yCK8%altbVVm|^bbtvjJ@h)qGFg7)M{`u+=0cdG;`qgZoV`@ z*5CfXW_`+N)@7gMzh6!jQ+ucb@^=%88nS|2V0HwIKZ9B=PCkdqMe-pKvs7&T<4LNO zM-MUNZFL_-aZ};bOP!O>pBSA;4s^?BlrhhU%!dTsqSBp5AMP$Nz*@1Npl!K#63w(S z$>pkeJXSl3fP_%v;hcBwru_k&&au+{jINN z(D-&L$14lu%xuXJwO{E&mh{G}cRow)S3!6mejt>Xp`?3#=ACM<^x3m>Ym#;;G6AZF zXcP{`+J@5db~lA&TYDmL>E;B{Ob^aP{k@6G0^EQ*$d_LD0(q?avfjV1jQ1 zc&k0o3rV|`=a!RyQ=Bqx9Tm7C-ZqX-lH#u?Kf>mSa`J$h6Qt8o;v^4c^*G8>HJ?K@ ze=MsRhR;p*+P*Doo8(MX?}Re?S0+C#4x?6d@|YF929<#y%8F9AbQRuwDrK9alUkwY zlF#w?E?fZ}!No=#Q8)1uRJ?(<`)Ycl+y3}289_M^s5hEme$Z|A{&w$J?Y=-RQ`tM} zQwOX&YV0?Pk=A{dv9^v@ugq9OG`f=y(6kpv$IDc&NNycb!;N@#Fm|J1U-Az ztSip->}`ErYtAGMst|WE9g}1)ksEv24Rotxd*Ra#+(?23`U20+)}5+0O2Y2s&t#M- z1k`VGmF`mw*-l~y^knw_9RpdJxk{NqtI>U!|1_$?YFYV^1gHncAae4Y4$v>;2@I(D z559ojms4o|1G1QZ8v%JVk^gV1r~-?%%(8OAre40rxZ{Z?v3^-J4%iDJ0`U7$^v0;S z^t=BiyO1|V>TnxNraDkK#k{relYMuG(=;6b9m3~4bQ>y4Lg}zy%Vg2qC^F8GdFp^wQ{jv#F+>Lsv&^1JEHLE zH)i!(qV_f8?A>J1;dL(_-Hmb5gUV%~A3>n0UlX3)xC=;yC*nS$A0t8x&P-JAhExx& zQp71zc*;Agmu8DW8rD5jlI@_*Lce_r;|R3ueQP;vCZ)~OlnojT(gB!GR3MR%@;tn} zF;7x%pS%k^{UNaBkftb(+As0c2G8CDx{I4ntON*w;9nxfnp*OwEv4)6U}ra`fKD>R*$%76vm@w3(iMWl3p72 z*yG^_4i6a-0y&az{WBsv3RewmzVTjwDd`y{C6!icC7xBO6D)f{+U?VF6zrEZfqZrHu{ zsUsq491`YO@=zyHW*77p9PRe(rb)TmLz@>da5ugRpT#jx2acJ^tlU5pLjpJMJLv3L zp4jyulV}t3c5*jX=D24Mop{yu(gt)Jj)3|p(N$hwO29({33O{PYV97o``mCSC^*V=e z7G$3OQ?qkdE&{m-{xd`MUkc&Vr0=WqMe~$qDKTo29vZHdiaG~?&@nD8-?~yM%yG?;>QtYu(^@v= zA&wd#4(s@582Ew_y2t^-RayB13<@MJ<)v-NNd?tFDGpszUfE}PlA#YN=(5c|nABKh z-;{xZS(dsP`y`Bu{I|%gw3LZ1<+(LVo)C-8m6kHgLr!+Blt1W~vQL480_?h6i(Aff zRkQ?sjjkmt%2!-`@uDn!EzjL0d5aqB&U0PV6bgi0moD)xT2^Jz(DD?03wg|H~6TJ#7x&U?rUa!(9G7Yg~`++FH_u-EwNTx)&7s9(%JgB2z+%&_pkNRG=}K!?%a#N5*JN;+MPY3A~s z>Gb7*^?=QQNx*4HWL*VE}9z%77Dz~g$;=>j~8+ypoi@QPhHu>^b) zupaOiZ$O{uZ$cmNUcer}ALH~k30U+N^zj^h4d6_`Hb5`nLxA;wy8t%;*1QdUz_a?G z57_cfIz0sV31Cq^{P;cE0k{~j67X)oX25NLoq&UYn*pc(A)W38tOiU0J_cBXKa~mY zfj;1}ccBm12G|UECtxRF3UD*vnSX>nU@Kq>@b`d46Y&4u{{(%&lK?9L=L0qa9)T0w zPQYIPZU#IO|1+x>@Rs+X4|q5pi4@_FXm$dY0RG`G>2wv~aeqyxBY;hSn*bjG+ydzN z&vd#E@NK{mz(bShr$dBz7m)sI#wP2|k@Kp)Ew1T(oTRw2KN4U02X9E;#nQ z)6bf5GLcDtB|amNlZr&dMf3uBeOZ49|GWGw=(2 z#=nY8{pH}#2LE&`-2&rE*mQjcYr_ZApEDmKkFd;-QX_-zs&02x{QCr z;9m{?cdUG;>PXps%%!)3zb%WO$@3EMOMaJ5|2~Vq%WPj2_#c9Qj+Nh-sXqdKKIU-x zD@L;qR%G~hfd2*bud?!;mzegS0>2dc=Ue&Qh2;Nk@TuA0;`OcWscY!no zYuTsZ|HjJq#PXa^ND*nH6f&JyCkwO2>UeXk(*I$&5$j}`)duIF3$*p%{}lWxE8odM z0*(B<2QsfiW}a0hkn!Oe@ZSUfK`Y<+6DdIYd%*W&O};IQA2<2?!G9b45-b0@jQ!)W zCJ%!DhL!Jp$<#j|{ClysmuK;pnEaLCzXU$5cbPb=3dp}!@TX%ha8nk4y{Uf>_&0#R z*vfBF{<%PV2K@WMud?<5`YCUj>;}@xUAYM4B9MzfE&{m-{ zxd`MU@ZX4l{ykj%`?qwD~ zK0ue|fAVFziSW%hyQ2$7IP#jw1sr9_tB?5;8GnbNJX1$mp1A?i?=V|0Ruk>AmdtPW zcCnB=%R(7P4)Qvhp^FKczKR{ues{4PKW;GVKY{65?(?*2AL1%WUo!4ud+7{cYNi-> zGXGP?bvxMn{~6G~>uxt#%nvuzkJ|`Q$@nUU%?#Tab~3!5q21nB;re%$FI=+ZJlD+X znrLGr>Y6*(UE(gDJvS=Rxi`$4=PoXp#pHuqq&yxcK1$oAsJ|TGY~+BtSl~#&(d4N= zouWuI^Y25mxNtH3ejEKPrt9&f<(H%2z-VwaD~cXxbe8TAN15Y8%eSIH_3H7d=^Lc{ zRP%SOHT@wJM)RM3A&KnF;@`d2WgPt0L z{!h@!&ooao^4S7tc?h6v7f&$q*$U`WnZA`LBKb@O^pijzEk5os=;w_=FCT-x5_IzC zzLQWHF8PcA@LHz7#dJMSwSYdFKV!xDCbl#06lq?}R6xW*r@WfUd8OwaipOa7?`1n3 zY)78e!`72bzjlT)d=K0I4b#V;stA6jzXCedTgLT@cExxD^wH|wtL3SqacMv4*&W&O z+UOsTVdt|k=o9cvV6=Mamx4y4pEw5nbkM0E=g(Gt$}?~jbza@Xbb0m-`q?c13Da*< zYGM)7*WxGe=vu6R7;By>hr9z%kxMRSK?@ko|0|{Z(ZW7|*Mg2G@It@WLYrAD<)@kJ zpr+HaNuB~UNy2+2y-0j;k|N7zRwzEf^eZ`kpRo z^NP7en6F3k^CU?x5=+<-JwLda{!88vT)}o0Fuk7VlgpTX*%ut@{ExAGo=eGZQ$XC#^kZ!P-_P{jCo4huOb^A!m>%YhOB>ty4bh#4 zi%G>yV6aWfXVVDV!*&|D-ZB;$V7iy4l6i}n9_9|OV)_bAXFtEe^eaK9ezE7( z8kP_6gesp6Lg#x--{DdQkbzoheL9@}}BJ8B~< zEMYtLakPTvucwI=*If#TDyE;s4J~8(DyA2)|FujHGX1(!6+u2zMsY3ECmyBf`&qu7 z=|ASYl79mM-Vd3+h39$s%o6n5nSSpX%D`=G=RVLWAMEXV6m%EMSiufy$4XJa?tD9PU3TAO6nm)%kNc)1TwK;xOTbOtqoN zTz8W&3|~#ai1^kB5WecRAk$Fjs5os`L=`}H7NY*tOYl2NRzMxSTX$pl6UvxeF zU0`$2AMw|@i$|BBci;pJUnt~jG5n2@Pzzph<7@C6b9{PC~% z*VYF8zL01R1sWqpeL(oacnOaBn?w?zx8(pf`y%xK4gLo8ZA2r1U>Ie*QRggx$hs!H z;|4a?gvAF*!p1uZ~c=8fzPxO(f{2AQK~6qnbeF z=3pQKvI>fHhpVQp6oEC3XuT2kH=_@iU9zacV|XrJYT(sDORu~70Z@g>ZvlS7A-FK7}9E)etQwUs0coA0M!eVs39RgI<>}6uSBxF zH_24R>yGU2OEP(1_5LGz_fnQHb+-`+2b6)`q$M4ec>?1iQgCT8@{@_kUtzY z)&(NXmc}aRC!MMkoo&s zdKVPE6N&~DTAKYLD6`TMZO9jFuGh67qH=IqE2TkWU=URs7xYPRjoQ#xMgd9doj zO-4O(o!(Hjd<87j1saWL*k4BtQ7I}r2Z^gXheEA8gUX|KlX?+XR>Rn<@O6P^IWy2q zA}jHK7ai7Em)#T^hlWvu?pN)U@9&cJ!43t^GCgI6wscjcGeNKLzX4VKGX%)1R}D{I;C|0g*)8R5b@OjMnVeK z>k_)oA8Hov#-@nhy{0khZVojeaU(4jQcW~~7vcr#n6zl|^4YY|Nb!1KxL&yHS{hM> zg2*Y!S?dpl=~ZV|!~iek5Bf-fOU=QEaMOYz+$g%&G;ty9uNCfye?3q+P~4#=Io#a- zdR}Yl>tIb|%7$8Wl!h*&DqlkY#*{ibTexY(p>h7dzUa8afsd0dO~blQmxjEZR78A} zto5SpJDqiE{ZiJ~&~{s4-oI-bXWR7aSzp5$T96^OgIO1yk6G*2=W`mmvZU#rKKr8k zIQ*n^llEVqCu^wd$M!{D`uu@W;X{GW#$ao2aJ5AqSn{vIRVf}MeFPHYYpE4 z&wAP8|6MTYELiL7^Ir{h|7rhCIW~F&Ae}91x;|glu#DyG{xey0pg=Lz`ueVC~Z|+BVU&_aMkWiPs|L+0Ws_$Yw4Lh|WLuQ-R zJY>_~%mNx}d2L4H8g91fcQHf5cCE-z>uLCFo4&qJ(r_p5!?hW$r}5`(`uZF|!^5;7 zLwo#QV13>HqKpL@US?C!{l`+`RTL=xT3??(X()dfN(%$p%!xnP^_MB(%Nh1l;#w|y z{eJ;(GCn+P&GYg0tCf;nUgH{m1hGPkzJ6Y{;cM#C{W#^Wu3w+a>G$ZSC^)!uGjzSW zAL+b+M6|wsUe#`pmJsdoJM*RWH5?CRtG;>8u}bOadb93-({;5+(45vE;?=~#Yg+E=ifs>)4ro< hUOm^T;;H7uqHtZW7Nlc|(eyu{i5b_iHU%3h{tJKVmLvcG diff --git a/src/error.c b/src/error.c index af34a71..4316050 100644 --- a/src/error.c +++ b/src/error.c @@ -6,7 +6,7 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/23 15:51:56 by mcolonna #+# #+# */ -/* Updated: 2024/04/24 13:20:31 by mcolonna ### ########.fr */ +/* Updated: 2024/04/25 13:41:57 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,3 +20,11 @@ void minishell_error(const char *msg) print_str(err_remember, 2, msg); err_get(); } + +// TODO adapt for msg == errno +void fatal_error(const char *msg) +{ + print_str(err_remember, 2, "Fatal error: "); + print_line(err_remember, 2, msg); + exit(1); +} diff --git a/src/main.c b/src/main.c index a3506fa..7101c0c 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/23 14:33:45 by mcolonna #+# #+# */ -/* Updated: 2024/04/24 13:24:10 by mcolonna ### ########.fr */ +/* Updated: 2024/04/25 16:54:13 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -62,12 +62,10 @@ int main(const int argc, const char *argv[], const char *envp[]) { mc = mem_newclass(minishell_error); command_str = ask_command(mc); - print_str(minishell_error, 1, "command: "); - print_line(minishell_error, 1, command_str); - /* - command = parse_command(command_str); + command = parse_command(mc, command_str); if (command.error) continue ; + /* errorstatus = execute_command(command); mem_freeall(mc); */ diff --git a/src/parse_command.c b/src/parse_command.c new file mode 100644 index 0000000..0610053 --- /dev/null +++ b/src/parse_command.c @@ -0,0 +1,132 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_command.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: mcolonna +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/24 13:47:40 by mcolonna #+# #+# */ +/* Updated: 2024/04/25 16:51:22 by mcolonna ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "include.h" + +// To call when a parse error occurs (TODO) +static void parse_error(const char *msg) +{ + (void)msg; + fatal_error("parse error"); +} + +// Global variables for all the parsing functions +typedef struct s_parsing_args +{ + t_memclass mc; + t_command r; + t_stream stream; + t_list calls; + bool got_first_call; // got at least the first program call? +} t_parsing_args; + +// Skip blank characters +static void skip_blank(t_stream *stream) +{ + stream_skip(stream, " \r\n\t"); +} + +// Read the string, stop if the char is in stop_charset +// TODO quotes +static const char *get_string(t_parsing_args *args, const char *stop_charset) +{ + const t_memclass mc = mem_subclass(fatal_error, args->mc); + const char *stop_charset_2 + = str_join(fatal_error, mc, stop_charset, " \n"); + char *str; + char str2[2]; + char *str3; + + str = str_dup(fatal_error, mc, ""); + str2[1] = '\0'; + while (stream_read(&args->stream) + && !char_isin(stream_read(&args->stream), stop_charset_2)) + { + str2[0] = stream_pop(&args->stream); + str3 = str; + str = str_join(fatal_error, mc, str, str2); + mem_free(str3); + } + str = str_dup(fatal_error, args->mc, str); + mem_freeall(mc); + return (str); +} + +// Get a program call (program names & its arguments) until stop_charset. +static void get_call(t_parsing_args *args, const char *stop_charset) +{ + t_call *r; + t_list arguments; + + arguments = list_createempty(args->mc); + while (stream_read(&args->stream) + && !char_isin(stream_read(&args->stream), stop_charset)) + { + list_add(fatal_error, &arguments, + (char *)get_string(args, stop_charset)); + skip_blank(&args->stream); + } + r = mem_alloc(fatal_error, args->mc, sizeof(t_call)); + r->program = (char *)list_get(parse_error, &arguments, 0); + r->argc = list_getsize(&arguments); + r->argv = (const char *const *)list_convert( + fatal_error, args->mc, &arguments); + list_add(fatal_error, &args->calls, (t_call *)r); + args->got_first_call = true; +} + +// Read an element (a call to a program, a '< FILE' or a '> FILE') +// (TODO redirections) +static void get_element(t_parsing_args *args) +{ + char c; + + while (stream_read(&args->stream)) + { + c = stream_read(&args->stream); + if (c == '|') + { + if (!args->got_first_call) + parse_error(NULL); + stream_pop(&args->stream); + skip_blank(&args->stream); + get_call(args, "<>|"); + } + else if (!args->got_first_call) + get_call(args, "<>|"); + else + parse_error(NULL); + skip_blank(&args->stream); + } +} + +t_command parse_command(const t_memclass mc, const char *command) +{ + t_parsing_args args; + + args.mc = mc; + args.r.error = false; + args.r.input_fd = 0; + args.r.output_fd = 1; + args.calls = list_createempty(mc); + args.got_first_call = false; + streamstr_init(&args.stream, command); + skip_blank(&args.stream); + while (stream_read(&args.stream)) + { + get_element(&args); + skip_blank(&args.stream); + } + args.r.calls = (t_call *)list_convert_type( + fatal_error, args.mc, &args.calls, sizeof(t_call)); + return (args.r); +}