From 2fa3015af4035f0c83c8e3487507559652bcb273 Mon Sep 17 00:00:00 2001 From: Leo Firmin Date: Wed, 8 Oct 2025 17:07:41 +0200 Subject: [PATCH] push3 --- Makefile | 5 +- cub3d | Bin 46728 -> 59192 bytes gnl/Makefile | 3 +- gnl/gnl.a | Bin 6254 -> 6046 bytes gnl/obj/get_next_line.o | Bin 3328 -> 3264 bytes gnl/obj/get_next_line_utils.o | Bin 2552 -> 2408 bytes includes/cub.h | 69 +++++++--- includes/messages.h | 31 ----- includes/parsing.h | 95 +++++++------ libft/Makefile | 2 +- libft/include/libft.h | 1 + libft/libft.a | Bin 244398 -> 135664 bytes libft/obj/ft_arrcpy.o | Bin 0 -> 2968 bytes libft/obj/ft_toupper.o | Bin 113944 -> 2168 bytes libft/srcs/ft_arrcpy.c | 41 ++++++ srcs/main.c | 66 +++++++-- srcs/parsing/check_colors.c | 36 ++--- srcs/parsing/check_file.c | 44 +++--- srcs/parsing/check_map.c | 248 +++++++++++++++------------------- srcs/parsing/check_map_2.c | 54 ++++++++ srcs/parsing/get_map.c | 125 +++++++++-------- srcs/parsing/get_textures.c | 110 ++++++++++----- srcs/parsing/init_parsing.c | 60 ++++---- srcs/parsing/line_detect.c | 144 +++++++++++--------- srcs/parsing/parsing.c | 31 +++-- srcs/utils/debug.c | 34 ----- srcs/utils/init.c | 35 ++--- srcs/utils/utils.c | 61 +++++---- test.cub | 33 ++--- 29 files changed, 744 insertions(+), 584 deletions(-) delete mode 100644 includes/messages.h create mode 100644 libft/obj/ft_arrcpy.o create mode 100644 libft/srcs/ft_arrcpy.c create mode 100644 srcs/parsing/check_map_2.c delete mode 100644 srcs/utils/debug.c diff --git a/Makefile b/Makefile index 867ffa6..2558b6d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -Wall -Wextra -Werror +CFLAGS = -fsanitize=address -g -Wall -Wextra -Werror NAME = cub3d SRCDIR = srcs @@ -17,12 +17,11 @@ SRCS = $(SRCDIR)/main.c \ $(SRCDIR)/parsing/check_colors.c \ $(SRCDIR)/utils/utils.c \ $(SRCDIR)/utils/init.c \ - $(SRCDIR)/utils/debug.c \ $(SRCDIR)/parsing/check_map.c \ + $(SRCDIR)/parsing/check_map_2.c \ INCS = $(INCDIR)/parsing.h \ $(INCDIR)/cub.h \ - $(INCDIR)/messages.h \ all: $(NAME) diff --git a/cub3d b/cub3d index e85885a4723356962f4c2ce9924f9ac68cf04f67..d6a801ce99f5bf23ff6f2ea6fab8c53091491ada 100755 GIT binary patch literal 59192 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 literal 46728 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

s* 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 diff --git a/gnl/Makefile b/gnl/Makefile index baedc93..c166fae 100644 --- a/gnl/Makefile +++ b/gnl/Makefile @@ -16,9 +16,8 @@ INCS_DIR = includes/ OBJ_DIR = obj/ SRC = get_next_line.c get_next_line_utils.c - CC = cc -CFLAGS = -Wall -Wextra -Werror +CFLAGS = -Wall -Wextra -Werror -fPIE INCLUDE = -I $(INCS_DIR) SRCS = $(addprefix $(SRCS_DIR), $(SRC)) OBJ = $(addprefix $(OBJ_DIR), $(SRC:.c=.o)) diff --git a/gnl/gnl.a b/gnl/gnl.a index a81d41a4d3ea3371ccb9d637bce5cdb133a3178d..ab25040938e94c30b2741700c7f69dc281cef326 100644 GIT binary patch literal 6046 zcmb_gZ-`@86~9TQ+w63v8A~gImW@k6)Ha)$9oAiUtr7e52|I$;5fPV6CX?CSHj`{K zN!f~_qnXuBLtzm_Q45P7bQM2TC|DK8X;+(3Dn!^15f&O`N)rflO6SA0isSFxdrs!& zZlVM08Q#11{m!3z&bjx!oHHLhl`5pqJv@3O+D~!o(ai08G&&idVu`s?rPKjj|5j@J zUH3YhDJFB7i^XL2d@iFFi^=68)+;2>=Cb^>P`Z#j%k#(b=W{&GW^xRd=Aon15!Xe_ z!$H%jX+h^k`@Be&is!S-vHX$IejLcKsEV@IcsvDLZJr@hmk2?hcP+)zM0toEJ+ zRcig<-aMhF2{i`ES-<+aU+KoHAm0Eu7KC;*THEw>@Yx}iwix>4;#DUrNKFyvX@mjgv zehlIJRqeEX)^@61bMK*2Ztl})SQ~|I)!XrFxGH~)pSivmiyT@dvug2*l|R2)YWvmM zR^7WvJ5VX#RFT!cU}mCi|F$g|t9m!V-Hlut2e+5ipNY~Xa=vqgZnzK?GLxRU`N~L` z5<+>NAoy8pllHct&*YbkdJFzH5I?R`+a#D207$kQW}$L>jou@JR(9aOc17PF+}+)U zD`d;cg~aby%Ug)VXx6+fzc$m3tc`^y*DLRgUiMy#tkPCPpE)C8GXK4Gu%7W=yB3I; zpxg>gYWnGh|It}1 z9VWGX`8#GzwIXXuuVWT=4=D%r$|KNB|<5 zcS>_{v-!b)5?k}X#{9!JKXkv=7gcw>0boSEwd>*!0thJmmT4B5B%)mo;x7@@k4mqF z=}}w(SQ3Iun!b;_mKOsu0uO;Rh(eYf;a|su-U^o<1uzJIdI;_h!D~bC!$a_&0>8)d zU+)>PzYdY#7=phKI1y#yPF(-O`#^L*fgs8#WK#m;w!*!krU`Cko@f68t{7nnDGNI(M?}?=5-K5&UIK-uClt3%|>fmm}r+^IkFvBAkBe#r~TXK4#%T z{1y?BJbm&+{$mzy=O+poA~Hv1mQaExf+yJTITvR?!jU^dqZ4->93LA|u|g)BiWO0p zsaQI{w3Nve6&?zyG=TZ#WnF`rx+``%M&(yu1r?i5r5`U{xV31L$}X167c;TXet!0$ z~iK@aKX$g4-rl7 z^EOcOVal+3chPsk*RmueIK2}zj}vIo&w2e1Sr|=4PsWsm*`f_MAZCi5$o|IYU*I$e ztVI7}4>1!r{uclb%KteQ^jV+sPmt(K{+|FAI=!36u!5^c&$A%u5y|NK-v!V0o#cIX z>IbYq!=Uy1njN%C|Eu?znvNeg9o7DOpSE?l6Xcvqs8Q@B*RBbwU8|)o)$XW?(aY2W z{!4Fg6?FZS$FX!(eP++PJKz4K9Bhq|fta=Q;e8i=6HSNN2AYPuPt~7+8*-i%=JBgE8QsVN8O{71)s~NXh$!AHi)`{^p3qb*e%@= z^_A_PgQjksYF_uG*OsOhUZ!WdCfhBVBHNJADd=_@CcT=$>9s5Q=$Y$%y$+hay0=L_ z*1Z-Dma8`~H;qO0rJ8pmuyL#3*jC+z_WAuon30x`eBF$!nLcUt0lk0@VABME{$*xU z2e7FF*zD91fM`?0h^~dTKWwx$$lA4;&Cm>D{j)aF(k5D+mrV|EW|_;0a2jCs|LbM` z2G@GMOz_oSuOhw7w9U_Jc3&^^xXlkP_Vm9&IOr<8iWsT5plR#*N}_Rp114#7(nZm%1~T13QV5&fLd z_dUGD&vOngd0laEH?Lw}@)|xcu=J#V3z}-v{DaW?H{k76l%~$@6^(;RMgDK#tpy{8 zc3T5|RtA+LALrl2UpUtJIP_2wBh304)x3nhD|Ny#?w&o;rL*EvoNL4@%s7aV_KMC3 zk<=)|YP6^JS)(0?EjK2zf7S7uFd|oW*^e7>sY%|+?Llqp^QS;Xhl#tj^j3g#O~~8 z=+G=CyrMo#r+h)GP(j-VzD}BurfMIyh)$&Khbr1Sh@c-bO@J%sLnc+o5@F$Y?mOrC z`qoeFgpfGW^S$?X&pG$pbKkr7{=98(wv?OL*RvzpDFa3`sGGmZOA+Jt)nQ~>U?3HxQD^2AKnNwWPO_VaH3RBz~ubd8heo&k& zD7C{5(TK2Hb?6B}M|(P=$W*+^sdB2gqo)%G5;f~5p9q}o+&T1A;B~a;r_S)9cr1pA z2NF~JRJ$dpQnR0J*VDS1RvXm@HRAezb8AZjes#(9D~ql_vM}eYkcV4u;K!{$vsibQ z-fARJ_pkeN4YKu}m0ERWwbFBmTDLCZ2W{2+@-I-UJ1cH(-mN=}ZfyRKFsoG;RHe^7 z|20z9_O9c%dYUY6JEyvTv?+YfdYM5gSlyA=utG)!rU&b0_lhY~{~3 z;`PF!;nrqjFo6Qk;(3iq*caTdz^nfUa(>>$I8MXA9>z*@tyPzm*zQ9Aa^UTLs)mZ~ z*|yyC-_~w8uh0r-hV{EytKL*EJnYuj((Kyyx=B#5SWBqAa|_EUE73w6EmgUz;qS?7 z{Q>fXx1v>dZU!&JTmN2N4VI3k8?KSgaWKVgcZsR_J(=;bPsmp=0W%3cvTe3&)rP9v z)$JPCG_GEzh#`j$9^8}c|3-dnGF!mLks3-3Zh!Jot|f;Ch6V=)2L}ROrS9iS>?cQ6 z>`Y(m!42y_GlS1!D{y*9{!TypH}(BIesJTu_=nI4`t}kI`3wDo{U3z=-zOaM5PfFS zpZHQtE9jm(e@JzW`grxu9;Fgpzj(s2%v~e_Pu(P;!gnR?{v2v?!@r(0uq5Ns)^i2c zk0)mMM@m9TsP$pptR$4F)$U2?4ZYo_+9003PDr;7N8rN|`0)rl7lBVi;6IAMe-?rN z68L6hXqFZfqTd0OzsA#TUaI5JNaa+ySn@L2!g!|a6-#-AL#>p}d1@@1`(fpDYCvTU z4<9+Oe>ijG(4l9YW0_<74-7jQRmx|_qt3LGrF?KEdN_m4)31Fl2B&35C~7)8HC3c^ zX`yu?p*L$Io)zrCBvS-J;&|xo68w1rA*8HHH5JEWRN$@!WA%xSr zD) z->sIu_#d=z@qaYJ&qRd&=?MKFTlzBYuPj`~ea-M=uJ0QLZsz%&2tRWX`qwRei6^PE z8RU~yG?KP(*|$b5T)s<{D!(x8Wyer@rJ$UUS}8x3O?mk8RBAlyWmRgdTvn-4F=*t9 z)6@9^`U*uapE~@lk?myNaHCIJ|~hN1R@ zsL?x?4w0a8jvbz3d%9?mt?blWSpN~m?UUvq8(@8V{Kwg+t=`XojK}8T_|m3*hkRPo zRAO(BXSa8={eU>+@=+eY-@?US$^&d~sj2VS6JiCi6aDAd-j4q`+n*6dF713A1>SA_ z`uM)@vK_4-*^0faAH`#jO(yd^ejj(<2W$f#+n$E$Hq}MGO1y@CQ|$TEp54vZ}}7xxKwN`qA__>~*rPFHZ_yh6Mnya?0H zRo_;bBNT*w2#skzRd;TI2#XR!5;X*VI7oLXOr5Xb(6{1K5dxDEZZvU%B1HL%c5YYJQM0*?ht@qX`)jRwTXEmoOEdyIsV!-?#lyn3Avy6KkcSo}>4HF-KWIAi znD){9dPjuy5m3r&W)^r7Pdlv_KL}OZ^JZf7ESPOStq!Q|{G78y;mtV>Di9FRIbHWJ zqctzB*n%C}B35uwRkrKUZoL9)P~w2&E+BvP5i}?|5Z+*oYR(c;Y^Vh5bG6w|Y0%_& zo(!K^0{M(xyTiHxYeO%vei!2a#v9SWu8C*YPqaXD?wR1+3%B_lB}uqR{MC@V2)9X@ z{gVN6*$Pa!jbrx5)1m!~ghS5KPw4+8-TyG4i-bcyrXT5dYKizif-wk=651R7_Z-RC z42(dcxeafGhVBZNzmJl{2?})_CFyVB zq0cft&iHQ_*SV*@jtf8kVU^P~A|M3axdsyh`j_p~{kQgIj)%@OIH9~!vnCyB90=m<2=$TWcv!6pBr8g1i}|CcOW^8c!ZOa4Fo-ShwJ z&iRU&EXdrZ{Hc**iO}YY*t$pW+x^oIAVDqrB$B(*m-mAUbIqf^6*!PDc z2NfA#$~}OkZmRy%%A54rx<}aFR&OydD~4Q3{sgA|fxe}*09+<{Ydgbj%0K;MBlcSu ur+DnKsp}G7nES@0gi4 zpZ9rh-n^NcJ#SCEm@y1SVz6h}?u<~zmJjXf1)&z$FffZe`jfYBjz{5EJKSRCrH8=C zSu;DEwc>}?!3ZbSF|MwS?n-Qn%9!_0;KI9~PoN#HGjslD(9+!|-y~GA$X*9)*IXC@>rPcaC8q^U zeq#|kXs|1&Oy$)2^?@7~1nWGC@FnGtc8{PZa`hsy$xwlC^0r6$}j1TgP{4A+c$w9mGn{ ze^aIxuEwo3URmXj6qRzMrR}NT<7udlxx~ae>B9OYm7BW$Le9V)Y88SILW<><7qrGI zHOHG8JLme%nT9u(KVgkq`Q!N~Tf%yh-7VS1JFhTfZq&Gc_+V}kuG0g6V?%iiuh(;T zjJ}t7eq=EFr~wpVdrDZLQ|+05&@Ak4Nc&OMo;@P`$yFbJ1z>>P?&|n401PJnWx|9Z zQSg*A@GE4*l!>)KJqgW#NF@?m z!Q(#o(LVSmfZwI$FU}0GU;6NW>Vw}0I0{zcAhdts|A2A?K@hAc){=01fl-LRozlC{ zrm*0fpcB6+apDvHy24lEI~t$jU(j%h^Fg0DpZDQ^(TD$)#;0|E({Nh%cO?!!X@uWW zaCKkw3DxT`DDR_Q=Mjk$pYl1Y@bTW!y5A{$^dbBQg|FuMmx3Qw_;jW8eD1}dAc*6q zp5ot9@L>hdz_$nm`S|1!{|NoW!%6bv^gw6rToo$!Lp`%N8}dF0Fk*`d+Hhen16 znB}`Q#|qrJfLWDBz3zGegNg4{04O(`Y%(Y{TjgfpGi$=aVag3k9#BfP8PB!KPUWrE ztY8KHnZ}GK)ylMAn(}JQ@*06_z4UVNcryShvud?-^^#Mq!rMC~xz*NeiS(N5f!=KR zLCNu|rDo9Z-QFc-%IH6VfU`WZo-p6y;ell3d8D)S(?B|oc$P>}&lK?jb|7Ufxc-)+FWwAVN_*WjNUbT#}Lz&VV5O9e4q%?=Uaec4kuFcPEY>Y_5~M7gyVk#^>G9h`An|= zu!5mVel$7?rczh+4M`*U5%=rVe^!=>U`GCPJ4mYN`@ahCUiF`rL@xcY{s@sj)&DGD l*@p5-QTq>CIf&Wi18Q3hYNvMV zN*5#S--HLPzTBuP2e+Cb@a=88-bAgfbSvd<&l>#>NBh^|0b>%r@+o*#rAsqAw5l|y zwDTj#D&<{bMd;=WNOttpR(4%@#EH;)8|b@$wrMrh0KZM`UnooFkR8ZPPU}h=BVmT` zN73QLt2Ha^tmCTE>-Ad0TPVruKwwo|a!|gSFX&Sc)&2p4Z&JvkH0^C~typWN+$LQ649vIP zXeZJ2i2Z6ibn{gw4BJ;=d6mKW?N!QqzyG&?qMB(cY7a>lb=Kf*3lu> zk-~2z$Fa$8L#_AF-y^o4n%1e=(L@fPWKg*lqu~ zQf?CK$gsnpY2LkqD+ZgNoqaw!`I4Sq(+bgeOrDbC=bt^tyy#SHDjti+V=kAFlgyDm zTp-d$L^?e-^1v3n7H0s*hV~~urcXpZ8JZnGKJ+^<+_?*ggZ+jNZ~kX*{w>78&f;sv z=R=Q44#Al@{6Ok3`Kxz$hLF&}Hy&{~<^dLhNP{dyyu0E}KMdZGFTPVVU{Qwiu~REx zlh7nzeAp7tLS)4A{Z5GZS^b$1Io=;IFAja=5DKRofF}d+r2sq=fM)~n_XF^c1MtrP zpMV{z;emoVcL4e?p$)2wtm>v(&^Jsqw^q>Q3@H^2Q`HK~YRN1bI)NEO%a|msW!|&a zElj_B}x!09Nb#Zzosi?%zwPmtmg2-65*40(!zgt`@kQGDM**KFm)YU?c zjdFT{F|9NR?_UbZYq?wzx63g+7c{(C{>9YHX}@vd?_#r7BR2_Iha;g9(6>pt8c|0jmy`Y{%dzZby2C-6J& zHuV1X@$nnVCug__BH+~$ zzmy5U(C+y+0mkeaI&=6q4Gr&D0-E2hv4Gc@9{*^emVc=qW#lIrF8Q<^FPgE ziu6ea@O(_}<>zDk?qE!zOv3eIK5_gU)5mx~)}LefCk34Ac|XJS0*$;T7Q_f#$N6tC zy}14*rr+R1){FbG0QjKui?ILul{1Gnvqm0*$aOvZOApeT9{Q8eOZ9L))+0aGgPx+_ z`J0R}R1axi5Bxq+KRJin9-Shbe8x9J+yFRWI-(Ojst@-rmx;Rn26`eojOwYr+E+iW z^8G+xqp=!1!FMeFiwk84>_h6{b7l_o;I;xM4=`WY!{po9Y$oG=E0wW$AA+W!r+V;9 zZR4n^sZ0CV2~n3`CValopZ4f6Vl2+AAM^Ik0}|0=I4GpYNes1Nmo3peVEhPfV6?pz zm`dY?Ch9G+MpHow&JB$uV#JAPd6N7JWdlEz$t|jgHkXpJb(=OS7JGwqrDbZHQnLq{)EO z%N&By>X9@@Q@yjQDs`a3-*||eJ7%KmHz3z;adG+zVEM~4C@<6 z!Cpt|tx`Fd0_~XrMtp!F`q=;@Hoz$9!2mLQ4BmL2{WNQjGEihk^--}7v;NLX#H>V| z{LDFkcUE`>5yK1-)r}*vzUeuxS268|vt7Aib-Fukr?UL4R@Ig-F0Xpbdx=~?T0oQ! z-XzNIqVm|;2g?WW1AQDYd{F+x<;C-hpB7#^w@~;4BDn7|;vmoABK>XVX1VVo4ss0_ z=`S?r`5z(}`P~7bu5pC1eRS##cot)*E1(0*^tXFit=}0uRPZVO+w-hi6fO8C?-}2{ir$ z@4;=Od@uSy96yy3|0#oK^2yKaYBZs+~>jw4L-YRA}iY@#`B*V0~n zef?tBZJ5`HX4^MfMq_IWegWGecFVhNNZYm?u=!!uRioKyv@FtU*mm0_+m>rM(12m@ zIF{kLJ9bwyi3aDpjZM%uTd4mJ!Ou$ZK82na|BFB5eB#>YD25@H`5R@v8e0ij%@xnT zdzg#wN?xiDaO6NZ&Va_d!gmDaQLe~Y&{zZiUb1piocmN31Y7nm^-2cIh92hnmOhy$ z_g$WUJ^PNLPv-w91BI6TOV|P9e)HcJ^Y4m4oF6%s`Eq_8u;P_j8`K^=b6F7=BKyL8 alzji+0VZQufLPuUO%25!^N^DK`Tqj1+w!*n literal 2552 zcmbtU-)kII6uz_DBxw3LFOS)&$)B%?seRN=vn5TbHDTR zes^cSE1Eo(o+j@~3(xG-buAK7il*5Z=vyU+(<_(#YB(2Op5M?{z6&2=_A zJ$>37d&gNQ7hN+qVNF`O@z-A=%bc8;%uVES6EOX=$ODM+#rw=y88wa{8F}mm{PAA^ z3?G#5ahZB*^y|#@lf#)?5Rv%aLL9`xMfuCpEptCY9E9Vd{F!_&{|e$D*Kq0iuS)+* z0DX%%$U|I|p9k5@?@14Y4-$NL53z@j2KloC-)zRR@Easqs5D5jO#2vU0a-Sp?fPbx z4fQuE*uGb;G^`T4?AZ-}q2bk;Jv%plZfee+pP9M9FWMKU&dqU~ zRg0BMEeZ4L700!gWQtcWE!XWOw?ex`|FfRwlUmtj>_wUfnSTPF{YQzsMsp#4Si@&D zT#vu2;d=bf2jKTLT(4t7FO&>Dasx}A423KHKThF_|Enon@qa6YEB=|)_`K>B7eIUU zL@z6=?o^7F2Y14(#iCba)kZ>cV-|CkPft+o z7{tFx7rH`$$UlD7RKDUL&yntpDR+p_WjZLnOPHI^$GU0m0b(ZIe+@U9DBcwGG#G>O OZ_@l9szB1|{J#LrX3o9< diff --git a/includes/cub.h b/includes/cub.h index cfafdc9..052dc8b 100644 --- a/includes/cub.h +++ b/includes/cub.h @@ -1,30 +1,57 @@ - +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cub.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:56:25 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 12:14:42 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ #ifndef CUB_H -#define CUB_H -#include "parsing.h" -#include "messages.h" -#include "../libft/include/libft.h" -#include "../gnl/include/get_next_line.h" +# define CUB_H + +# include "parsing.h" +# include "../libft/include/libft.h" +# include "../gnl/include/get_next_line.h" + +# define ERROR_PREFIX "Error\n" +# define ERROR_EXT "Invalid file extension. Only .cub files are accepted." +# define ERROR_EMPT_PATH "Invalid map file path." +# define ERROR_INIT_DATA "Initialization of the data structure failed." +# define ERROR_INIT_TEX "Initialization of the textures structure failed." +# define ERROR_INIT_PARS "Initialization of the parsing structure failed." +# define ERROR_EMPTY "You have provided an empty file." +# define ERROR_COL "The RGB values provided are not valid or absent." +# define ERROR_NULL_P "Player not found or multiple players." +# define ERROR_BAD_CHAR "Invalid character in map." +# define ERROR_POS "Player position not found." +# define ERROR_ALLOC "Allocation failed." +# define ERROR_PLAYER "Player not found or multiple players." +# define ERROR_CHAR "Invalid character in map." +# define ERROR_DOUBLE "Multiple images/colors have been provided \ +for the same texture." +# define ERROR_NOT_CLOSE "Map is not closed by walls." +# define ERROR_NOT_XMP "The texture file is not an xpm image." typedef struct s_data { - char **map; - char *map_path; - t_textures *texture; - t_data_parsing parsing; -} t_data; + char **map; + char *map_path; + t_textures *texture; + t_data_parsing parsing; +} t_data; -//////utils///// //utils -void ft_error(char *message); -void free_char_array(char **array); -int ft_arrlen(char **arr); +void ft_error(char *message); +void free_char_array(char **array); +int ft_arrlen(char **arr); +void print_array(char **array);//temp + //init -int init_data(t_data *data, char *path); -void free_data(t_data *data); +int init_data(t_data *data, char *path); +void free_data(t_data *data); -/////debug -void print_char_array_debug(char **arr, char *name); - -#endif \ No newline at end of file +#endif diff --git a/includes/messages.h b/includes/messages.h deleted file mode 100644 index dc6648b..0000000 --- a/includes/messages.h +++ /dev/null @@ -1,31 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* messages.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: lfirmin +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/08/22 15:00:45 by lfirmin #+# #+# */ -/* Updated: 2025/08/22 15:01:20 by lfirmin ### ########.fr */ -/* */ -/* ************************************************************************** */ -#ifndef MESSAGE_H -#define MESSAGE_H - -#define ERROR_PREFIX "\033[1m[❌]\033[0m\033[1;31mError\033[0m: " -#define ERROR_EXT "Invalid file extension. Only .cub files are accepted." -#define ERROR_EMPT_PATH "Invalid map file path." -#define ERROR_INIT_DATA "Initialization of the data structure failed." -#define ERROR_INIT_TEX "Initialization of the textures structure failed." -#define ERROR_INIT_PARS "Initialization of the parsing structure failed." -#define ERROR_EMPTY "You have provided an empty file." -#define ERROR_COL "The RGB values provided are not valid." -#define ERROR_NULL_P "Player not found or multiple players." -#define ERROR_BAD_CHAR "Invalid character in map." -#define ERROR_POS "Player position not found." -#define ERROR_ALLOC "Allocation failed." -#define ERROR_PLAYER "Player not found or multiple players." -#define ERROR_CHAR "Invalid character in map." -#define ERROR_NOT_CLOSE "Map is not closed by walls." -#define DEBUG "test" -#endif \ No newline at end of file diff --git a/includes/parsing.h b/includes/parsing.h index 9714ac9..8f96c8c 100644 --- a/includes/parsing.h +++ b/includes/parsing.h @@ -6,71 +6,84 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/22 14:08:04 by lfirmin #+# #+# */ -/* Updated: 2025/08/22 14:18:06 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 12:16:07 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef PARSING_H -#define PARSING_H +# define PARSING_H -#include -#include -#include -#include +# include +# include +# include +# include -struct s_data; -typedef struct s_data t_data; +struct s_data; +typedef struct s_data t_data; typedef struct s_textures { - char *north; //Path to texture.xmp - char *south; //Path to texture.xmp - char *east; //Path to texture.xmp - char *west; //Path to texture.xmp - int floor[3]; //RGB: [0] = R, [1] = G, [2] = B - int ceiling[3]; //RGB: [0] = R, [1] = G, [2] = B -} t_textures; + char *north; + char *south; + char *east; + char *west; + int floor[3]; + int ceiling[3]; +} t_textures; typedef struct s_data_parsing { - char **raw_map; - int fd_map; - int fd_map_dup; - int player[3]; -} t_data_parsing; + char **raw_map; + int fd_map; + int fd_map_dup; + int player[3]; +} t_data_parsing; +//player -> 0 = x, 1 = y, 2 = head //parsing -int parsing(t_data *data); +int parsing(t_data *data); //check_file -int check_extension(char *map_path); -int check_file(char *map_path, t_data_parsing *parsing); +int check_extension(char *map_path); +int check_file(char *map_path, t_data_parsing *parsing); //get_map -int get_map(t_data *data); -int line_counter(int fd); -int put_map_on_array(t_data *data); -char *clean_line(char *raw_line); +int get_map(t_data *data); +int line_counter(int fd); +int put_map_on_array(t_data *data); +char *clean_line(char *raw_line); //init_parsing -int init_parsing(t_data_parsing *parsing); -int init_textures(t_textures *textures); -int free_textures(t_textures *textures); +int init_parsing(t_data_parsing *parsing); +int init_textures(t_textures *textures); +int free_textures(t_textures *textures); //line_detect -int is_config_line(char *line); -int is_empty_line(char *line); -int is_texture_line(char *line); -int is_color_line(char *line); +int is_config_line(char *line); +int is_empty_line(char *line); +int is_texture_line(char *line); +int is_color_line(char *line); +int check_extension_2(char *str); //get_textures -int get_texture_path(char *line, t_textures *texture); -int get_rgb_values(char *line, int rgb[3]); +int get_texture_path(char *line, t_textures *texture, int *j); +int validate_and_convert_rgb(char **parts, int rgb[3]); +int get_rgb_values(char *line, int rgb[3]); +int is_valid_number(char *str); //check_colors -int check_colors(t_textures *texture); -int is_rgb(int color[3]); +int check_colors(t_textures *texture); +int is_rgb(int color[3]); -// check_mao -int validate_map(char **map, int *player); -#endif \ No newline at end of file +// check_map +int check_map_char(char **map); +void find_player_pos(char **map, int *player); +int flood_fill(char **map_cp, int x, int y); +int rep_ex_wall(char **map_cp, int x, int y); +int check_char_and_count(char c, int *p); + +//check_map_2 +int hasivalidchar(char **map); +int validate_map(char **map, int *player); + +#endif diff --git a/libft/Makefile b/libft/Makefile index dc17dcc..87b9709 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -23,7 +23,7 @@ SRC = ft_isalnum.c ft_isprint.c ft_memcmp.c ft_putchar_fd.c ft_split.c \ ft_lstnew_bonus.c ft_lstadd_front_bonus.c ft_lstsize_bonus.c \ ft_lstlast_bonus.c ft_lstadd_back_bonus.c ft_lstdelone_bonus.c \ ft_lstclear_bonus.c ft_lstiter_bonus.c ft_lstmap_bonus.c ft_strcmp.c \ - ft_atoll.c ft_straddchar.c ft_strcpy.c + ft_atoll.c ft_straddchar.c ft_strcpy.c ft_arrcpy.c SRCS = $(addprefix $(SRCS_DIR), $(SRC)) CC = cc diff --git a/libft/include/libft.h b/libft/include/libft.h index caf9d9c..b2d0d5a 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -83,6 +83,7 @@ char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); char *ft_itoa(int n); char *ft_straddchar(char *str, char c); char *ft_strcpy(char *dest, char *src); +char **ft_arrcpy(char **array); t_list *ft_lstnew(void *content); t_list *ft_lstlast(t_list *lst); diff --git a/libft/libft.a b/libft/libft.a index e7c4b91b8463e4a5d1f61beeec873b9603d80d53..d6d50baa288df8459b7f9629c04e2a054632c7b7 100644 GIT binary patch delta 1355 zcmYLIZA_b06h7y@y>H+0RYp4c5}*aqGVu#$0xVX>+^P)*GnHTkKWHjj=lH0Vsbj-V zicHc0WmmWfX8ObV#|%NyEi>ZSGDAlehlxLyjWBdI(m%oyXPQW?_ifpBl6&tt=XuU^ z&dvMYuWo0peXfMJ1uC}|rK}|l0JZ|?ssS0Q*k@hQom47XeQm0i0|DJi82daS`z66~OCJ zz(1w{*VX~oRgmO@=?pB9=$@|E-Tq)1Ia5Z^Ucky`8gt#oW2(4muqWPa9L^G6$Po{& zu(6q&x&uC6EBo!l7DbeGb&7~h{1_(UoUT1*ms0RA_7{{5w3UyXA`PtjY~J)U7v3ai z1{bB`rBq8kIYl0pwpH?xf29hx6f?2ciql7*M3c=Kv`4_$mukEmoW%jha_mMTkq9}o z$mxkY&;LpI_6kxMm=x2^Iig}0Lq?x)EE@;=gzpSF)|{UDs54}btZ1Nf;DX4lBy$6% z$X!3#>cgFa5z}bFo+ucHELwqJhw7uj^N9f=?9g?{MBYnvmo#>|z$H61$zGZ%e@{s- zP4A_Opy}lZ)g`kos;i@EqQWSPGfZih0A8YoCUMlsFV9nnyb~rFdY2&e%0b>^B@f~_ zyYcb6IK+%c%&h;*Y(w%2;ucKH@Wuh6N>2f6smjgk6tkRkb={Oq$+6=O0s=IrsewnDqRt*z5@2P&UvWaT+}e$6aKye{+I7PRrxRisGD zM_wD3Ec~A;lBa0Bgtf58YOK7nT5y|@FI16So+u%DR%kIWn^l!gBdhJO;dW-MRgv%QwEI7mS*A>Ushyaxg(nQCDsqZN*lMknH{}!6aA*8Awwhu6ANjV4 Ap#T5? literal 244398 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

oez>-jr`^+!#-JlC0PY;`VX#!x`7y1#zrPRm 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 rRu6;n{;{q3_wOU1g)pGDe2@%8_I|K9%! diff --git a/libft/obj/ft_arrcpy.o b/libft/obj/ft_arrcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..4882104ff97e455c2645a7f0b4125956ee8e81d8 GIT binary patch literal 2968 zcmb`J&2Jk;6u{qlJsUetZ0AFzB?t^EDH6&$X^WuLY6HP^o3yAx3WQcDS+CcL!CyFb zXn?2?r$tuOk_aIo{s6=Uxb?t=7Lbxw95`^O;6M&WI1-2SW(g$o-g?GfZxX?QC(XWj zzj<%oo7tJQuSCzi=#nH5BEczWS%Lz5+R^HdTHR3yqUWSm{#`5m8Pdv2I~&n08qrpx zJDPERODjb-A+X{{v>M$i-IB`Dt?l3H^?Jk7jGA`)54mcEl%rLxv{Z$_)oz+$BU&T8 z{WU%|q7~||Mk^8<*ykB4+G=Ez$A5>cididKxqq|Sw<@?gh9TQDM`@`7fg2Au zW~i>7uas`r%NSzZY0k8L4-3>*m#U3Y7&i zA@ut9QjhewzmLiO-~$8x9;sIWaH$A;mC=K;|5@Kj-;qOS`%WJMkQul*I@<@}KHg@s z01#CUgX}-$^Z78@IyN_D1&{Tzx~#tQF@R$(0m+bFAxrYVhfmqHo@-fd*ZQ1g1!)Ye zxMlTRZ&)*y)k_wz59o0XAGjcVNS0!5n2Z%Og<{A^>6zKkf|;LBW;3CYqw26aGBk3c zXpJ6&`Mfb7P86o~eBQ_{ss@DTvS~A%N+k2?WF~z4Xm~bRF!k_QF=if%hf~Q|q5w^Q zFy{0;V646fMmDzyNl0c2kTNsyAM;bqDE$ou(mOAMbU7#ubai;vaEl&7PK|`N44(4` zuerv$75RXKF7Oi~H#~t)Ns|8ZcatJFY!WRETD9WZXau~?cOd&ErgVPGyhY|xmYJe_ z$y^_?$1bu#CBhz!uty@yJI*?$lnET0VzM&J+;_;^hvTjY>sRJjxAF~>mzi&wdC;vx z*<@~uPBHg5>%@qFf_jay0uH>&ycbc8E3e&UE_q>1?wUfMWu=7q$C;!|xH@qGROEj0 z84kGNetoZTxplhQhGl*>+aMY;*ghh*K^brx=^#3qvi7qL>}6eFaUcLX2g z_5mAb!Ws30Hcs$fGaS6g z?YA8KU2cEq;3l`}y_1N2c)MXjh-+GteO*s+?p&A0tF&$+sBtq^oSoKVvAnqeYTiug zYQel*0M*E*(O*C|g zLvc>I`!3%X_KCmA<3ACBTsw1}M$SuZ^PJ+B@B$B@`UyGfA3{bh!`SRH!4K~hJH)=o zFZ5x~obh*g{E>f&zhIlw?s}ic+ZpvmUcpxyEa!BuaX{ZyyNLA*M(f*a|GwY{O1x*< zKf3E8UU2*&-BlAJ80LriXEJQ!tRMdm?3w@89{K5;?94xdOg>l7qIw@&Q||G2akr>` Z5@-IekU95`{5*V9cE~`XIGWO#{~rkuXAA%U literal 0 HcmV?d00001 diff --git a/libft/obj/ft_toupper.o b/libft/obj/ft_toupper.o index bdc406c88a182105d4cce1a4a1295d66498d7a92..1209c5de3186df135c7da756b8c85328321fcbe9 100644 GIT binary patch literal 2168 zcmbtU&1(};5TCc3jcwCz(#DV0isYack#72hSgkcuVpWPrB_2cxn`D!QCfTytl(tYT z1cXw-dh_Vb{t0^aAMqm8o8Af*>P+&c*=$o39C$l3zxjG^-n@OCTzH@e0ZamBp`|ej z@HxAKOkI{s=ZT6nBz`ufB?Y zaaE6Msvfy8toMrnG%E&z1Hr_gs^1RX35^UriryOnP&H5_^e74txB{v^8w!Om-*a5e zJ#{tq+l%^1nnFlnm=r;AAoNB2s>=Jdme$Os1t68FRoq%ETQVz!*sA4Ji*_Y8K4FX* z5z+bJz8-m_%=HCrbU?L$D*)H= zD}?y1_YtFh;SzKN@N5as&}e1%amQ3$Xk9%uO%FcSqInI!pSzkUucJ;LYU_&H%qpmDIx8yBK%FENXfWD|PCnqt-{=uyoS_G0ZxtRR z!aXC8Ihw@yHL0KX;F^?)UG(6T=a$qjOHSQ7ZZpa^PQj-o&UIf(ecp#JOZ}M-r~4<0 zHNMT7-nus>?%xj>IV)2uq|Hpmu~xxwtu+^ntX(c!IJeSRbsf+6fZYQOT~&M0c$Cpcg(Wo$&7<(U@h0oAYU&N|6kh0 z1m1h+e1r1RKQbV>f4akn6UKAI?g=UIoG~6@L2`=q=OmLW?Mca*`F&|F{22LukpV9x zXXf{%{dwn`{SM@C{FDIw$jOiXB}DX#C!#r~oMWVTC@Kq;Js62xpZPh7`Qx{w!^mIa zsXv^{>-wn^*ui(biLH3w0_EA0@%&y1BjWQnwdOr_>fgQ`D((~YuiF#P_!45Bw)#zi z{GPd<-#3efPW2h&I#i$jioAcuQ;4YxM>eu8T*t)o&j7^}`Rji`%-=imdn&;_QjjQ) I-iW{cAF4CA00000 literal 113944 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 ZFZu_3RsYRx8h-jc*?zO;cwZX7{{v;2{z?D< diff --git a/libft/srcs/ft_arrcpy.c b/libft/srcs/ft_arrcpy.c new file mode 100644 index 0000000..2498a9c --- /dev/null +++ b/libft/srcs/ft_arrcpy.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_arrcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 02:18:17 by lfirmin #+# #+# */ +/* Updated: 2025/10/06 14:06:37 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "libft.h" + +char **ft_arrcpy(char **array) +{ + char **copy; + int i; + int len; + + len = 0; + while (array[len]) + len++; + copy = malloc(sizeof(char *) * (len + 1)); + if (!copy) + return (NULL); + i = 0; + while (i < len) + { + copy[i] = strdup(array[i]); + if (!copy[i]) + { + while (i > 0) + free(copy[--i]); + free(copy); + return (NULL); + } + i++; + } + copy[i] = NULL; + return (copy); +} diff --git a/srcs/main.c b/srcs/main.c index e7b3e51..8283755 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -1,11 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 14:56:25 by lfirmin #+# #+# */ +/* Updated: 2025/10/08 16:25:42 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ #include "cub.h" -int main(int ac, char **av) +void print_int_array(int *array, int size) { - t_data data; - init_data(&data, av[1]); - parsing(&data); - free_char_array(data.parsing.raw_map); - free_textures(data.texture); - free_data(&data); -} \ No newline at end of file + int i; + + if (!array) + return ; + i = 0; + while (i < size) + { + ft_putnbr_fd(array[i], 1); + if (i < size - 1) + write(1, ", ", 2); + i++; + } + write(1, "\n", 1); +} +void debug(t_data data) +{ + printf("map:\n\n"); + print_array(data.map); + printf("\n"); + printf("c: "); + fflush(stdout); + print_int_array(data.texture->ceiling, 3); + printf("f: "); + fflush(stdout); + print_int_array(data.texture->floor, 3); + printf("p: "); + fflush(stdout); + print_int_array(data.parsing.player, 3); + printf("\n"); + printf("\ntexture:\n\n"); + printf("%s\n", data.texture->east); + printf("%s\n", data.texture->north); + printf("%s\n", data.texture->west); + printf("%s\n", data.texture->south); +} +int main(int ac, char **av) +{ + t_data data; + + init_data(&data, av[1]); + if (parsing(&data)); + debug(data); + free_char_array(data.parsing.raw_map); + free_textures(data.texture); + free_data(&data); +} diff --git a/srcs/parsing/check_colors.c b/srcs/parsing/check_colors.c index 415b45b..97a04a8 100644 --- a/srcs/parsing/check_colors.c +++ b/srcs/parsing/check_colors.c @@ -6,30 +6,30 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/25 18:41:26 by lfirmin #+# #+# */ -/* Updated: 2025/08/25 18:41:26 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 10:06:32 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int check_colors(t_textures *texture) +int check_colors(t_textures *texture) { - if (is_rgb(texture->floor)) - return (ft_error(ERROR_COL), 1); - if (is_rgb(texture->ceiling)) - return (ft_error(ERROR_COL), 1); - return (0); + if (is_rgb(texture->floor)) + return (ft_error(ERROR_COL), 1); + if (is_rgb(texture->ceiling)) + return (ft_error(ERROR_COL), 1); + return (0); } -int is_rgb(int color[3]) +int is_rgb(int color[3]) { - int i; + int i; - i = 0; - while (i < 3) - { - if (color[i] > 255 || color[i] < 0) - return (1); - i++; - } - return (0); -} \ No newline at end of file + i = 0; + while (i < 3) + { + if (color[i] > 255 || color[i] < 0) + return (1); + i++; + } + return (0); +} diff --git a/srcs/parsing/check_file.c b/srcs/parsing/check_file.c index 8bc0a27..5022033 100644 --- a/srcs/parsing/check_file.c +++ b/srcs/parsing/check_file.c @@ -6,35 +6,35 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ -/* Updated: 2025/08/22 15:07:33 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 10:11:50 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int check_file(char *map_path, t_data_parsing *parsing) +int check_file(char *map_path, t_data_parsing *parsing) { - if (!map_path) - return (ft_error(ERROR_EMPT_PATH), 1); - if (check_extension(map_path)) - return (1); - parsing->fd_map = open(map_path, O_RDONLY); - if (parsing->fd_map < 0) - return (perror("\033[1m[❌]\033[0m\033[1;31mError\033[0m"), 1); - parsing->fd_map_dup = open(map_path, O_RDONLY); - if (parsing->fd_map_dup < 0) - return (perror("\033[1m[❌]\033[0m\033[1;31mError\033[0m"), 1); - return (0); + if (!map_path) + return (ft_error(ERROR_EMPT_PATH), 1); + if (check_extension(map_path)) + return (1); + parsing->fd_map = open(map_path, O_RDONLY); + if (parsing->fd_map < 0) + return (perror("Error\n"), 1); + parsing->fd_map_dup = open(map_path, O_RDONLY); + if (parsing->fd_map_dup < 0) + return (perror("Error\n"), 1); + return (0); } -int check_extension(char *map_path) +int check_extension(char *map_path) { - int len_map_path; + int len_map_path; - len_map_path = ft_strlen(map_path); - if (len_map_path < 4) - return (ft_error(ERROR_EXT), 1); - if (ft_strcmp(map_path + len_map_path - 4, ".cub") != 0) - return (ft_error(ERROR_EXT), 1); - return (0); -} \ No newline at end of file + len_map_path = ft_strlen(map_path); + if (len_map_path < 4) + return (ft_error(ERROR_EXT), 1); + if (ft_strcmp(map_path + len_map_path - 4, ".cub") != 0) + return (ft_error(ERROR_EXT), 1); + return (0); +} diff --git a/srcs/parsing/check_map.c b/srcs/parsing/check_map.c index 1f45fd2..eb9c2ad 100644 --- a/srcs/parsing/check_map.c +++ b/srcs/parsing/check_map.c @@ -1,157 +1,123 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 10:11:50 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ #include "cub.h" -int has_playable_neighbor(int x, int y, char **map) +int check_char_and_count(char c, int *p) { - if (map[y] && map[y][x + 1] && - (map[y][x + 1] == '0' || map[y][x + 1] == 'N' || - map[y][x + 1] == 'S' || map[y][x + 1] == 'E' || - map[y][x + 1] == 'W')) - return (1); - if (x > 0 && map[y][x - 1] && - (map[y][x - 1] == '0' || map[y][x - 1] == 'N' || - map[y][x - 1] == 'S' || map[y][x - 1] == 'E' || - map[y][x - 1] == 'W')) - return (1); - if (map[y + 1] && map[y + 1][x] && - (map[y + 1][x] == '0' || map[y + 1][x] == 'N' || - map[y + 1][x] == 'S' || map[y + 1][x] == 'E' || - map[y + 1][x] == 'W')) - return (1); - if (y > 0 && map[y - 1] && map[y - 1][x] && - (map[y - 1][x] == '0' || map[y - 1][x] == 'N' || - map[y - 1][x] == 'S' || map[y - 1][x] == 'E' || - map[y - 1][x] == 'W')) - return (1); - return (0); + if (c == '1' || c == '0' || c == ' ' || c == '\n') + return (0); + else if (c == 'S' || c == 'N' || c == 'E' || c == 'W') + { + (*p)++; + return (0); + } + else + return (2); } -int check_isolated_walls(char **map) +int check_map_char(char **map) { - int i = 0; - int j; - - while (map[i]) - { - j = 0; - while (map[i][j]) - { - if (map[i][j] == '1') - { - if (!has_playable_neighbor(j, i, map)) - return (0); // '1' isolé détecté - } - j++; - } - i++; - } - return (1); // Pas de '1' isolé + int i; + int j; + int p; + int ret; + + i = 0; + p = 0; + while (map[i]) + { + j = 0; + while (map[i][j]) + { + ret = check_char_and_count(map[i][j], &p); + if (ret != 0) + return (ret); + j++; + } + i++; + } + if (p != 1) + return (1); + return (0); } -int check_map_char(char **map) +void find_player_pos(char **map, int *player) { - int i = 0; - int j; - int p = 0; - - while (map[i]) - { - j = 0; - while (map[i][j]) - { - if (map[i][j] == '1' || map[i][j] == '0' || - map[i][j] == ' ' || map[i][j] == '\n') - j++; - else if (map[i][j] == 'S' || map[i][j] == 'N' || - map[i][j] == 'E' || map[i][j] == 'W') - { - j++; - p++; - } - else - return (2); - } - i++; - } - if (p != 1) - return (1); - return (0); + int i; + int j; + + i = 0; + while (map[i]) + { + j = 0; + while (map[i][j]) + { + if (map[i][j] == 'S' || map[i][j] == 'N' || + map[i][j] == 'E' || map[i][j] == 'W') + { + player[0] = j; + player[1] = i; + player[2] = map[i][j]; + return ; + } + j++; + } + i++; + } } -void find_player_pos(char **map, int *player) +int flood_fill(char **map_cp, int x, int y) { - int i = 0; - int j; - - while (map[i]) - { - j = 0; - while (map[i][j]) - { - if (map[i][j] == 'S' || map[i][j] == 'N' || - map[i][j] == 'E' || map[i][j] == 'W') - { - player[0] = j; - player[1] = i; - player[2] = map[i][j]; - return; - } - j++; - } - i++; - } + if (!map_cp[y] || !map_cp[y][x]) + return (1); + if (map_cp[y][x] == 'v') + return (0); + if (map_cp[y][x] == '1') + { + map_cp[y][x] = 'v'; + return (0); + } + if (map_cp[y][x] == '0' || map_cp[y][x] == 'N' || map_cp[y][x] == 'S' + || map_cp[y][x] == 'E' || map_cp[y][x] == 'W') + { + map_cp[y][x] = 'v'; + if (flood_fill(map_cp, x + 1, y)) + return (1); + if (flood_fill(map_cp, x - 1, y)) + return (1); + if (flood_fill(map_cp, x, y + 1)) + return (1); + if (flood_fill(map_cp, x, y - 1)) + return (1); + return (0); + } + return (1); } -int is_closed_at(int x, int y, char **map) +int rep_ex_wall(char **map_cp, int x, int y) { - if (!map[y] || !map[y][x] || map[y][x] == '\0') - return (0); - if (map[y][x] == ' ') - return (0); - return (1); + if (y < 0 || x < 0) + return (0); + if (!map_cp[y] || !map_cp[y][x]) + return (0); + if (map_cp[y][x] == '1') + map_cp[y][x] = 'v'; + if (map_cp[y][x] == 'v') + { + map_cp[y][x] = 'c'; + rep_ex_wall(map_cp, x + 1, y); + rep_ex_wall(map_cp, x - 1, y); + rep_ex_wall(map_cp, x, y + 1); + rep_ex_wall(map_cp, x, y - 1); + } + return (0); } - -int check_walls(char **map) -{ - int i = 0; - int j; - - while (map[i]) - { - j = 0; - while (map[i][j]) - { - if (map[i][j] == '0' || map[i][j] == 'N' || - map[i][j] == 'S' || map[i][j] == 'E' || map[i][j] == 'W') - { - if (!is_closed_at(j + 1, i, map) || - !is_closed_at(j - 1, i, map) || - !is_closed_at(j, i + 1, map) || - !is_closed_at(j, i - 1, map)) - return (0); - } - j++; - } - i++; - } - return (1); -} - -int validate_map(char **map, int *player) -{ - int result; - - result = check_map_char(map); - if (result == 1) - return (ft_error(ERROR_PLAYER), 1); - if (result == 2) - return (ft_error(ERROR_CHAR), 1); - - find_player_pos(map, player); - - if (!check_walls(map)) - return (ft_error(ERROR_NOT_CLOSE), 1); - // if (!check_isolated_walls(map)) - // return (ft_error("Isolated wall detected"), 1); - return (0); -} - diff --git a/srcs/parsing/check_map_2.c b/srcs/parsing/check_map_2.c new file mode 100644 index 0000000..b4de039 --- /dev/null +++ b/srcs/parsing/check_map_2.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map_2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/22 15:07:29 by lfirmin #+# #+# */ +/* Updated: 2025/10/07 12:09:03 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "cub.h" + +int hasinvalidchar(char **map) +{ + int y; + int x; + + y = 0; + while (map[y]) + { + x = 0; + while (map[y][x]) + { + if (map[y][x] != 'c' && map[y][x] != ' ' && map[y][x] != ' ' + && map[y][x] != '\n') + return (1); + x++; + } + y++; + } + return (0); +} + +int validate_map(char **map, int *player) +{ + int result; + char **map_cp; + + map_cp = ft_arrcpy(map); + result = check_map_char(map); + if (result == 1) + return (free_char_array(map_cp), ft_error(ERROR_PLAYER), 1); + if (result == 2) + return (free_char_array(map_cp), ft_error(ERROR_CHAR), 1); + find_player_pos(map, player); + if (flood_fill(map_cp, player[0], player[1])) + return (free_char_array(map_cp), ft_error(ERROR_NOT_CLOSE), 1); + rep_ex_wall(map_cp, player[0], player[1]); + if (hasinvalidchar(map_cp)) + return (free_char_array(map_cp), ft_error(ERROR_CHAR), 1); + free_char_array(map_cp); + return (0); +} diff --git a/srcs/parsing/get_map.c b/srcs/parsing/get_map.c index df06099..ed3c1a0 100644 --- a/srcs/parsing/get_map.c +++ b/srcs/parsing/get_map.c @@ -6,80 +6,89 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/23 13:29:28 by lfirmin #+# #+# */ -/* Updated: 2025/08/23 13:29:28 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 10:13:07 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int get_map(t_data *data) +int get_map(t_data *data) { - int nb_line; + int nb_line; - nb_line = line_counter(data->parsing.fd_map); - if (nb_line <= 0) - return (ft_error(ERROR_EMPTY), 1); - data->parsing.raw_map = ft_calloc(nb_line + 1, sizeof(char*)); - put_map_on_array(data); - //print_char_array_debug(data->parsing.raw_map, "debug"); - //printf("---deb_texture---\n%s\n%s\n%s\n%s\n", data->texture->north, data->texture->south, data->texture->west, data->texture->east); - // printf("---deb_colors_f---\n%d,%d,%d\n", data->texture->floor[0], data->texture->floor[1], data->texture->floor[2]); - // printf("---deb_colors_c---\n%d,%d,%d\n", data->texture->ceiling[0], data->texture->ceiling[1], data->texture->ceiling[2]); - return (0); + nb_line = line_counter(data->parsing.fd_map); + if (nb_line <= 0) + return (ft_error(ERROR_EMPTY), 1); + data->parsing.raw_map = ft_calloc(nb_line + 1, sizeof(char *)); + if (put_map_on_array(data)) + return (1); + return (0); } -int line_counter(int fd) +int line_counter(int fd) { - int nb_line; - char *line; + int nb_line; + char *line; - line = NULL; - nb_line = 0; - while ((line = get_next_line(fd)) != NULL) - { - nb_line++; - free(line); - } - free(line); - line = get_next_line(-1); // force cleanup - free(line); - return (nb_line); + line = NULL; + nb_line = 0; + line = get_next_line(fd); + while (line != NULL) + { + nb_line++; + free(line); + line = get_next_line(fd); + } + free(line); + line = get_next_line(-1); + free(line); + return (nb_line); } -int put_map_on_array(t_data *data) +int put_map_on_array(t_data *data) { - char *line; - char *cleaned; - int i; + char *line; + char *cleaned; + int i; + int j[6]; - i = 0; - while ((line = get_next_line(data->parsing.fd_map_dup)) != NULL) - { - if (is_config_line(line)) - { - cleaned = clean_line(line); - get_texture_path(cleaned, data->texture); - free(line); - free(cleaned); - } - else if (is_empty_line(line)) - free(line); - else - data->parsing.raw_map[i++] = line; - } - line = get_next_line(-1); - if (line) - free(line); - data->parsing.raw_map[i] = NULL; - return (0); + ft_memset(j, 0, sizeof(j)); + i = 0; + while ((line = get_next_line(data->parsing.fd_map_dup)) != NULL) + { + if (is_config_line(line)) + { + cleaned = clean_line(line); + if (get_texture_path(cleaned, data->texture, j)) + { + free(line); + free(cleaned); + line = get_next_line(-1); + if (line) + free(line); + return (1); + } + free(line); + free(cleaned); + } + else if (is_empty_line(line) && i == 0) + free(line); + else + data->parsing.raw_map[i++] = line; + } + line = get_next_line(-1); + if (line) + free(line); + data->parsing.raw_map[i] = NULL; + return (0); } -char *clean_line(char *raw_line) +char *clean_line(char *raw_line) { - char *cleaned; - if (!raw_line) - return (NULL); + char *cleaned; - cleaned = ft_strtrim(raw_line, " \t\n\r"); - return (cleaned); -} \ No newline at end of file + if (!raw_line) + return (NULL); + cleaned = ft_strtrim(raw_line, " \t\n\r"); + return (cleaned); +} diff --git a/srcs/parsing/get_textures.c b/srcs/parsing/get_textures.c index cfcea64..55b68a5 100644 --- a/srcs/parsing/get_textures.c +++ b/srcs/parsing/get_textures.c @@ -6,48 +6,86 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/24 12:37:11 by lfirmin #+# #+# */ -/* Updated: 2025/08/24 12:37:11 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 10:13:41 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int get_texture_path(char *line, t_textures *texture) +int get_texture_path(char *line, t_textures *texture, int *j) { - if (is_texture_line(line) == 1) - texture->north = ft_strtrim(line + 2, " \t\n\r"); - else if (is_texture_line(line) == 2) - texture->south = ft_strtrim(line + 2, " \t\n\r"); - else if (is_texture_line(line) == 3) - texture->west = ft_strtrim(line + 2, " \t\n\r"); - else if (is_texture_line(line) == 4) - texture->east = ft_strtrim(line + 2, " \t\n\r"); - else if (is_color_line(line) == 1) // F - get_rgb_values(line, texture->floor); - else if (is_color_line(line) == 2) // C - get_rgb_values(line, texture->ceiling); - return (0); + if (check_extension_2(line) && !is_color_line(line)) + return (ft_error(ERROR_NOT_XMP), 1); + else if (is_texture_line(line) == 1 && j[0]++ == 0) + texture->north = ft_strtrim(line + 2, " \t\n\r"); + else if (is_texture_line(line) == 2 && j[1]++ == 0) + texture->south = ft_strtrim(line + 2, " \t\n\r"); + else if (is_texture_line(line) == 3 && j[2]++ == 0) + texture->west = ft_strtrim(line + 2, " \t\n\r"); + else if (is_texture_line(line) == 4 && j[3]++ == 0) + texture->east = ft_strtrim(line + 2, " \t\n\r"); + else if (is_color_line(line) == 1 && j[4]++ == 0) + get_rgb_values(line, texture->floor); + else if (is_color_line(line) == 2 && j[5]++ == 0) + get_rgb_values(line, texture->ceiling); + else + return (ft_error(ERROR_DOUBLE), 2); + return (0); } -int get_rgb_values(char *line, int rgb[3]) +int is_valid_number(char *str) { - char *start; - char **parts; - int i; + int i; - if (!line || !rgb) - return (1); - start = ft_strchr(line, ' '); - if (!start) - return (1); - parts = ft_split(start + 1, ','); - if (!parts) - return (1); - i = 0; - while (parts[i] && i < 3) - { - rgb[i] = ft_atoi(parts[i]); - i++; - } - free_char_array(parts); - return (i == 3 ? 0 : 1); -} \ No newline at end of file + if (!str || !*str) + return (0); + i = 0; + while (str[i] == ' ' || str[i] == '\t') + i++; + if (!str[i] || !(str[i] >= '0' && str[i] <= '9')) + return (0); + while (str[i] >= '0' && str[i] <= '9') + i++; + while (str[i] == ' ' || str[i] == '\t') + i++; + if (str[i] != '\0') + return (0); + return (1); +} + +int validate_and_convert_rgb(char **parts, int rgb[3]) +{ + int i; + + i = -1; + while (++i < 3) + { + if (!is_valid_number(parts[i])) + return (free_char_array(parts), 1); + rgb[i] = ft_atoi(parts[i]); + if (rgb[i] < 0 || rgb[i] > 255) + return (free_char_array(parts), 1); + } + return (free_char_array(parts), 0); +} + +int get_rgb_values(char *line, int rgb[3]) +{ + char *start; + char **parts; + int i; + + if (!line || !rgb) + return (1); + start = ft_strchr(line, ' '); + if (!start) + return (1); + parts = ft_split(start + 1, ','); + if (!parts) + return (1); + i = 0; + while (parts[i]) + i++; + if (i != 3) + return (free_char_array(parts), 1); + return (validate_and_convert_rgb(parts, rgb)); +} diff --git a/srcs/parsing/init_parsing.c b/srcs/parsing/init_parsing.c index 2bc89c8..73a9414 100644 --- a/srcs/parsing/init_parsing.c +++ b/srcs/parsing/init_parsing.c @@ -6,45 +6,45 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/23 13:33:00 by lfirmin #+# #+# */ -/* Updated: 2025/08/23 13:33:00 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 10:14:37 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int init_parsing(t_data_parsing *parsing) +int init_parsing(t_data_parsing *parsing) { - if (!parsing) - return (ft_error(ERROR_INIT_PARS), 1); - parsing->fd_map = 0; - parsing->raw_map = NULL; - return (0); + if (!parsing) + return (ft_error(ERROR_INIT_PARS), 1); + parsing->fd_map = 0; + parsing->raw_map = NULL; + return (0); } -int init_textures(t_textures *textures) +int init_textures(t_textures *textures) { - int i; + int i; - if (!textures) - return (ft_error(ERROR_INIT_TEX), 1); - textures->north = NULL; - textures->south = NULL; - textures->east = NULL; - textures->west = NULL; - i = 0; - while (i < 3) - { - textures->floor[i] = -1; - textures->ceiling[i] = -1; - i++; - } - return (0); + if (!textures) + return (ft_error(ERROR_INIT_TEX), 1); + textures->north = NULL; + textures->south = NULL; + textures->east = NULL; + textures->west = NULL; + i = 0; + while (i < 3) + { + textures->floor[i] = -1; + textures->ceiling[i] = -1; + i++; + } + return (0); } -int free_textures(t_textures *textures) +int free_textures(t_textures *textures) { - free(textures->north); - free(textures->south); - free(textures->east); - free(textures->west); - return (0); -} \ No newline at end of file + free(textures->north); + free(textures->south); + free(textures->east); + free(textures->west); + return (0); +} diff --git a/srcs/parsing/line_detect.c b/srcs/parsing/line_detect.c index 3380ac3..a76b055 100644 --- a/srcs/parsing/line_detect.c +++ b/srcs/parsing/line_detect.c @@ -6,89 +6,99 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/24 11:58:39 by lfirmin #+# #+# */ -/* Updated: 2025/08/24 11:58:39 by lfirmin ### ########.fr */ +/* Updated: 2025/10/08 14:05:47 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int is_config_line(char *line) +int check_extension_2(char *str) { - char *trimmed; - int result; + size_t len; - result = 0; - if (!line) - return (0); - trimmed = ft_strtrim(line, " \t\n\r"); - if (!trimmed) - return (0); - if (ft_strncmp(trimmed, "NO ", 3) == 0 || - ft_strncmp(trimmed, "SO ", 3) == 0 || - ft_strncmp(trimmed, "WE ", 3) == 0 || - ft_strncmp(trimmed, "EA ", 3) == 0 || - ft_strncmp(trimmed, "F ", 2) == 0 || - ft_strncmp(trimmed, "C ", 2) == 0) - result = 1; - free(trimmed); - return (result); + len = strlen(str); + if (len < 4) + return (1); + return (ft_strcmp(str + len - 4, ".xpm")); } -int is_empty_line(char *line) +int is_config_line(char *line) { - int i; + char *trimmed; + int result; - i = 0; - if (!line) - return (1); // NULL = vide - while (line[i]) - { - if (line[i] != ' ' && line[i] != '\t' && - line[i] != '\n' && line[i] != '\r') - return (0); - i++; - } - return (1); // Que des whitespaces + result = 0; + if (!line) + return (0); + trimmed = ft_strtrim(line, " \t\n\r"); + if (!trimmed) + return (0); + if (ft_strncmp(trimmed, "NO ", 3) == 0 + || ft_strncmp(trimmed, "SO ", 3) == 0 + || ft_strncmp(trimmed, "WE ", 3) == 0 + || ft_strncmp(trimmed, "EA ", 3) == 0 + || ft_strncmp(trimmed, "F ", 2) == 0 + || ft_strncmp(trimmed, "C ", 2) == 0) + result = 1; + free(trimmed); + return (result); } -int is_color_line(char *line) +int is_empty_line(char *line) { - char *trimmed; - int result; + int i; - result = 0; - if (!line) - return (0); - trimmed = ft_strtrim(line, " \t\n\r"); - if (!trimmed) - return (0); - if (ft_strncmp(trimmed, "F ", 2) == 0) - result = 1; - else if (ft_strncmp(trimmed, "C ", 2) == 0) - result = 2; - free(trimmed); - return (result); + i = 0; + if (!line) + return (1); + while (line[i]) + { + if (line[i] != ' ' && line[i] != '\t' + && line[i] != '\n' && line[i] != '\r') + return (0); + i++; + } + return (1); } -int is_texture_line(char *line) +int is_color_line(char *line) { - char *trimmed; - int result; + char *trimmed; + int result; - result = 0; - if (!line) - return (0); - trimmed = ft_strtrim(line, " \t\n\r"); - if (!trimmed) - return (0); - if (ft_strncmp(trimmed, "NO ", 3) == 0) - result = 1; - else if (ft_strncmp(trimmed, "SO ", 3) == 0) - result = 2; - else if (ft_strncmp(trimmed, "WE ", 3) == 0) - result = 3; - else if (ft_strncmp(trimmed, "EA ", 3) == 0) - result = 4; - free(trimmed); - return (result); -} \ No newline at end of file + result = 0; + if (!line) + return (0); + trimmed = ft_strtrim(line, " \t\n\r"); + if (!trimmed) + return (0); + if (ft_strncmp(trimmed, "F ", 2) == 0) + result = 1; + else if (ft_strncmp(trimmed, "C ", 2) == 0) + result = 2; + free(trimmed); + return (result); +} + +int is_texture_line(char *line) +{ + char *trimmed; + int result; + + result = 0; + if (!line) + return (0); + trimmed = ft_strtrim(line, " \t\n\r"); + if (!trimmed) + return (0); + if (ft_strncmp(trimmed, "NO ", 3) == 0) + result = 1; + else if (ft_strncmp(trimmed, "SO ", 3) == 0) + result = 2; + else if (ft_strncmp(trimmed, "WE ", 3) == 0) + result = 3; + else if (ft_strncmp(trimmed, "EA ", 3) == 0) + result = 4; + free(trimmed); + return (result); +} diff --git a/srcs/parsing/parsing.c b/srcs/parsing/parsing.c index 9d2287a..d79190e 100644 --- a/srcs/parsing/parsing.c +++ b/srcs/parsing/parsing.c @@ -6,21 +6,28 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/22 14:17:58 by lfirmin #+# #+# */ -/* Updated: 2025/08/22 14:17:58 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 10:15:24 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int parsing(t_data *data) +int parsing(t_data *data) { - if (check_file(data->map_path, &data->parsing) == 1) - return (1); - get_map(data); - close(data->parsing.fd_map); - close(data->parsing.fd_map_dup); - if (check_colors(data->texture) == 1) - return (1); - if (validate_map(data->parsing.raw_map, data->parsing.player) == 0) - return (1); - return (0); + if (check_file(data->map_path, &data->parsing) == 1) + return (1); + if (get_map(data)) + { + close(data->parsing.fd_map); + close(data->parsing.fd_map_dup); + return (1); + } + close(data->parsing.fd_map); + close(data->parsing.fd_map_dup); + if (check_colors(data->texture) == 1) + return (1); + if (validate_map(data->parsing.raw_map, data->parsing.player)) + return (1); + data->map = data->parsing.raw_map; + data->parsing.raw_map = NULL; + return (0); } diff --git a/srcs/utils/debug.c b/srcs/utils/debug.c deleted file mode 100644 index 71c638f..0000000 --- a/srcs/utils/debug.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* debug.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: lfirmin +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/08/23 13:23:51 by lfirmin #+# #+# */ -/* Updated: 2025/08/23 13:23:51 by lfirmin ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub.h" - -void print_char_array_debug(char **arr, char *name) -{ - int i = 0; - - printf("=== %s ===\n", name ? name : "CHAR ARRAY"); - - if (!arr) - { - printf("Array is NULL\n"); - return; - } - - while (arr[i]) - { - printf("[%d] (%zu chars): '%s'\n", i, strlen(arr[i]), arr[i]); - i++; - } - printf("Total lines: %d\n", i); - printf("==============\n"); -} diff --git a/srcs/utils/init.c b/srcs/utils/init.c index bae7a86..77d21fd 100644 --- a/srcs/utils/init.c +++ b/srcs/utils/init.c @@ -6,29 +6,30 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/22 18:57:21 by lfirmin #+# #+# */ -/* Updated: 2025/08/22 18:57:21 by lfirmin ### ########.fr */ +/* Updated: 2025/10/08 16:21:46 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -int init_data(t_data *data, char *path) +int init_data(t_data *data, char *path) { - if (!data) - return (ft_error(ERROR_INIT_DATA), 1); - data->texture = malloc(sizeof(t_textures)); - if (!data->texture) - return (ft_error(ERROR_INIT_TEX), 1); - init_parsing(&data->parsing); - init_textures(data->texture); - data->map = NULL; - data->map_path = path; - return (0); + if (!data) + return (ft_error(ERROR_INIT_DATA), 1); + data->texture = malloc(sizeof(t_textures)); + if (!data->texture) + return (ft_error(ERROR_INIT_TEX), 1); + init_parsing(&data->parsing); + init_textures(data->texture); + data->map = NULL; + data->map_path = path; + return (0); } -void free_data(t_data *data) +void free_data(t_data *data) { - if (!data) - return; - if (data->texture) - free(data->texture); + if (!data) + return ; + if (data->texture) + free(data->texture); + free_char_array(data->map); } diff --git a/srcs/utils/utils.c b/srcs/utils/utils.c index 8254fc6..d48a8ef 100644 --- a/srcs/utils/utils.c +++ b/srcs/utils/utils.c @@ -6,40 +6,55 @@ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/22 14:56:25 by lfirmin #+# #+# */ -/* Updated: 2025/08/22 14:56:25 by lfirmin ### ########.fr */ +/* Updated: 2025/10/07 12:14:42 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub.h" -void ft_error(char *message) +void ft_error(char *message) { - int len; + int len; - len = 0; - while (message[len]) - len++; - write(2, ERROR_PREFIX, 31); - write(2, message, len); - write(2, "\n", 1); + len = 0; + while (message[len]) + len++; + write(2, ERROR_PREFIX, 6); + write(2, message, len); + write(2, "\n", 1); } -void free_char_array(char **array) +void free_char_array(char **array) { - int i; + int i; - if (!array) - return; - i = 0; - while (array[i]) - free(array[i++]); - free(array); + if (!array) + return ; + i = 0; + while (array[i]) + free(array[i++]); + free(array); } -int ft_arrlen(char **arr) +int ft_arrlen(char **arr) { - int i; - while(arr[i]) - i++; - return (i); -} \ No newline at end of file + int i; + + while (arr[i]) + i++; + return (i); +} + +void print_array(char **array) +{ + int i; + + i = 0; + if (!array) + return ; + while (array[i]) + { + printf("%s", array[i]); + i++; + } +} diff --git a/test.cub b/test.cub index e9e371b..5b32dae 100644 --- a/test.cub +++ b/test.cub @@ -1,34 +1,29 @@ - - - - - - NO textures/test/north.xpm +EA textures/test/east.xpm +WE textures/test/west.xpm +SO textures/test/sud.xpm + - EA textures/test/east.xpm +C 200,200,200 +F 200,200,200 - - - - WE textures/test/west.xpm - -C 200,200,200 -F 200,200,200 - 11 + 1111 1001 -10S01 +10001 10001 10101 -10001 -10001 -10001 +1S001 +1001 10001 10001 +100011 10001 10001 +111111 + 1111 11 + 1111