From 13f100fbfcaab43e61325e80ceb38e7dca92d054 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Sat, 1 Apr 2023 20:46:51 +0800 Subject: [PATCH] Initial commit: the original DAT2 v2.32 --- dat2.exe | Bin 0 -> 282624 bytes src/DatFile1.cpp | 991 ++++++++++++++++++++++++++++++++++++++++++++ src/DatFile1.h | 91 ++++ src/DatFile2.cpp | 868 ++++++++++++++++++++++++++++++++++++++ src/DatFile2.h | 90 ++++ src/DatFileBase.cpp | 163 ++++++++ src/DatFileBase.h | 71 ++++ src/LZ77C.cpp | 304 ++++++++++++++ src/LZ77C.h | 7 + src/OnAdd.cpp | 98 +++++ src/OnDelete.cpp | 31 ++ src/OnExtract.cpp | 69 +++ src/OnList.cpp | 28 ++ src/OnShrink.cpp | 31 ++ src/Resource.h | 15 + src/Util.cpp | 177 ++++++++ src/Util.h | 24 ++ src/XGetopt.cpp | 219 ++++++++++ src/XGetopt.h | 23 + src/dat2.cpp | 320 ++++++++++++++ src/dat2.h | 31 ++ src/dat2.rc | 114 +++++ src/dat2.sln | 20 + src/dat2.vcproj | 310 ++++++++++++++ src/stdafx.cpp | 8 + src/stdafx.h | 19 + 26 files changed, 4122 insertions(+) create mode 100644 dat2.exe create mode 100644 src/DatFile1.cpp create mode 100644 src/DatFile1.h create mode 100644 src/DatFile2.cpp create mode 100644 src/DatFile2.h create mode 100644 src/DatFileBase.cpp create mode 100644 src/DatFileBase.h create mode 100644 src/LZ77C.cpp create mode 100644 src/LZ77C.h create mode 100644 src/OnAdd.cpp create mode 100644 src/OnDelete.cpp create mode 100644 src/OnExtract.cpp create mode 100644 src/OnList.cpp create mode 100644 src/OnShrink.cpp create mode 100644 src/Resource.h create mode 100644 src/Util.cpp create mode 100644 src/Util.h create mode 100644 src/XGetopt.cpp create mode 100644 src/XGetopt.h create mode 100644 src/dat2.cpp create mode 100644 src/dat2.h create mode 100644 src/dat2.rc create mode 100644 src/dat2.sln create mode 100644 src/dat2.vcproj create mode 100644 src/stdafx.cpp create mode 100644 src/stdafx.h diff --git a/dat2.exe b/dat2.exe new file mode 100644 index 0000000000000000000000000000000000000000..0b31f3d94fa897888629401717838fe61a28e98d GIT binary patch literal 282624 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%0A^V8^SRhgI!fFC&#GwOp7!nWoFeDMkOcO*0 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 z z)M0g3e12YPMP`Y9VhM;+C;=T-4AurptA>^!eF%Sp4>3;8&nwQ)NmWPz4`d+JLc=Jv zq98T7BsB#bGKicB4j)5s_>|_s)#R4ulw_8G8xRWMbCJO3@F2{@9WGE!pu>B3xfpmM zQI3=?!I{1&wXig`7~~jGrVWA?FeUj4C87^ir#o)jJnG4QOX*v0cpcx;9 z0?_b~0!S;USW5+`Tm}aCw1`4jCfIk*+S&@RaPWZ?cAzqziwktltR90+K~a8sQDUw_ z9_Zv~=!sKy3=A+WuAqaI6uGzpAj+&j^R}S=W+v#^BZnnMQp2Q(F3#~1)= z&^G-4@9yYX3~dJF7rCV-mXsEy1{9?hgQw9Lf=ly!^YcPVQ^QkJLNZF-iZX-2XM%Yp z=DDRN`6d=Q78Lm=R(h4@d6nikmZk@%7WgNZ_~nxGIn7+?@p z96QegWT3yvKj#f zWFCmk2=0nCG&VK2w6?W(bar+3^!D{nm^f+jl&RCE&zL!D_MEx%<}X;dXz`Mz%a*TL zxoY*Awd>Yz*tlu)maW^i@7TF(_ny7`_8&NS=aq_n*K2{=?UKk=vod z-C-iCLp9L;A87k24u3)&THNyB4(&ku-^0TyH`fX@+Q7h&l9H05qu}f7>#G1_R9042 zGWh!Hr=;jtg4at0_%bj!`Z6%Mq$a0=E{p*cqkj2iaJGMPNq$ml5kqilK?zLIu{6E3 zxP*bht275}hF57GX!?!8v7jgubpMENVo`Di0|SFwYEn@t=wM0)1_rOhJTMc~T=B~< zWAINd0h!6*Segzphrz2fkHI&w5@ZI0Z(TZ=Zq8?kj+nZAX&N+$2#R?vosYM_kS1KUxasWv)D1dHs zP=F``4@s#rpok%qD81f(%IjcS{wDOA<>mlR;~|QWH}Y(n}MIQq&m| zauf3s(^FFv%D|VUC?w|>RDuQw;GJObxwH_+CP3AcB_$Svy6?DEGBCi@;x#X&GA}VV zGg$%JWkakvQvi)UfSk^d08@kL%ND_86H+r^&L-$2B(?aQgb^M{ZbAwP1`Ktez9e+P zoC31KgaXj=B~X7y0dk*3bgV*hPJVG|Q7XiL=<-Oi3HiBsnF^rpZ*gWiDBfWvfYMD~ zYI$@l0|PW}%hJI8U6h!ETZ5`bogpD8Bm}fDFTvG=A)z#-M4>3Pq_ik6GcR48Aps+F z;Knc@g&{1w5rZX2o<>rKHTaO^aRnPg0&Ex{1-#fGITaj)xrqhph_r>z5wP@!)d8UX z7c?#7azH|Ha$-(m5hT(;<46dDAn^vhOAC95Bism%GHm)Gjz=*yp|}JzJ_a!#CC@@L zE6ClTW0mvMAZp4$X+xbMp)3g;`yjytXi5OF<7^oiYHS%8)NC0TY;0^9?CfkARBag; z^lcd!bZr?Jv~3v}v_NWV7#P&l7#M087#QLh7{GHd8k&$fA3IwH20PFk637e&1_o6I z2JoDeuALTx8Uq7(ehoC&qpi)rplip#kYA8mlvt7v8h&K}rB6j$1_oPO1_nit88!?I zc6JP)vzbAqA%j9*YB{K`h>tJLOU%hk&r3~Vh>tIVu3Thbh>tHQDKax*h>uUsDFS(w z0VI}|SX=_(#K(h%7h&w;k`xFNq%RQ^eGs#gQ&N+27~#3zN~j~Y{ znW1C7Geg6AXNHpX&I~E*of$mVJ2PmkcV=J!sbA;Juwk7uL(4j6hKzO23@+=O85Gtz zGkjU=%y43@GsBv-kT7*mh0SL`mih#PDyRHB&{`tUsy9eQ30h7B9e4%}fViiY_#_sW zfS1{(2ILo%7J%0WLHH137<^NUK{uy4U^5KxTmSz~&7>b|C8m$*mD^VMstTt6-ZmLk*Hy zAT`*`Le>W|>x6&{!x|*BK=W#QK;~?7W_SUjq5cD@1BDq#53<`pdLIb5fTqnrQVhs) zETDV6z@iM`Ic|~dsAfW?z?6ib3xf%gdXPI@wmUO~Yc4vkgNNxbB!4|g2`as6@2)ZzE>_Clki5<=iDmxJV z0ja@e7P3B&St|rx7($TD0)7lt!P_JZ~j-Pz&H@L`8D1J6!p29KQxzkt+&+y&ByY&S^%6(JXJ8bFuR*og=q zkY0u8FpZ?52P047LZ%}f-hA+FE83cAi+ze8K z%`A|M1j1d>`%cxLQ&W~kWh%rIp)!apE&Ab*1N zA%_h}uYef#w6p=qT#()aXl8=Uf?*Xg7lsE&>Ot=K0OIdKjU$jckXayo$nHSa3zEAa z=E7jG2NHfDJ}7NE>~UrY+2hPmu*aEU%^rl`Kx#qufz%&$QkiGew+=YQDCNh)a+fPgj2h885VKx(j=g{%)` zmW6~1!xl8Nj_h}4xPW99NDVf#koAGgijZ(&U^sy4M}Y&*3^E50VFFTv%`9YnAhQ}I zTo`kCTOi@WFbB=NH3ys-_Mn*uQishvWW6Bs z4oJ8#yg@VX&jDu!o`a}i2U3U4JdoZOpzs12h8Ev02N7Wi3agNV&I}qzVo)s%dn8>L z3XsG>Y8wtZGju@3K=LrP$YF!52PA(-(uH9MR1b&`GUo)yA5bxnJV+dbkObJ&^T$YE!O2OzN{knk#yasi#-05S%pFTruxnPH0* z_WCX7Fhnm%6DX`}kj#grmkUzZ>$eq1dO`l$0d*HlAGWj!-qUx`nc)T0Oi&$!?B_pd zX7U_yW{^07NV_n7Aorr{gV~2{Cd@vNdKl)Ac40_?h8ZZ_c^DWNN{%=)tT^J#aO8+H zgThf~h80I~hxL)8&I}UAAmIiw3v?b4$ZTZyfXsK0b^))aMwfd4wHp+#AiW>Rus1^* z5+|Uu2axTxISO$X$WBn4_#Aa+h&bxZPy!W)=>y55>std|!;3CA0jd`y4hpXYNan%x zpt}R4=L*z~p!L1Tc0E8c59G!VN1Yk|97V)2OdrTTbbYWmMm7^UjzMt`(g%tcP#l2R zAhjSGSq#JnVNkmdxs3-B1Lb+-{0$QOBkjU40~+TbKFHlGjyW@IIfiJHfYgA(2PBW| zZe)ERISCmTh9^j7f%JSi=FIR1Dh84VsRLnTbCC6bG5`Ff)8pU}msZWM(*^$jp$S z#LUp4#LRG6iJ5^znVG>snVI3RGBX2<3NwST3Nu5Y3NyoO6=sHKD$EQ4s>}=xs>}?B zRhb!nt1>fas4+8aQ)gxn&|qe8&|qe`q`}M}pvlbOpvlZopvlazK$Dr_h$b_`b4_Lj zRV`))UoB>aVl8Hdg<8xEXSA3Z{%bKaC}}e@1ZgufG-xw3Y|v(Ac%jYAz^B8^V64N; z;HSgPkg3DWFhz%%;iwKX!wVf|25ntthIn0OhUvP@47+ui8Sd#aGcf5fGid5DGq~t6 zGoJSEv;S?erKvY0TkQ_)2s4NY@qXuN&0a<5o zy?9gB89e6pP}UhduJRH}e}u{_$U*GVkb|f*fYKIn5chz}mP&z^h;->~BL>M}pgZLjgY(Q*K_<-m?0xk?a|NsA= zkP5nsl>vN?1gJ~_$>*Gdm;>5twB;Nm{A$q51E~Y0w+%`Vdv+*6)E!WQg!5^r+dy`K z{SNC-C_~H!>3@P|CP*y^gXBOo$c+#F|Ns9r(*az5fzlDkERejwd5E74lp*$m)Puw= zkocgq0xDBX&O_X$a2}x+rXJ*n1Z9X>RZw~%)Qup!D$w+R^nozQE|A^_P_-cb76NJ& zR3P?is6fI1(YV~~E3c>!t=`3N0mgZhUcKFH6G>dxSE z-+Z8SxH@FdbdtI=gCGL~L$10r`2O#Hbx3@FP=~nh2b5;efbcmqAmISYk4Fgj(EzH) z0;&g;COIxc%s~zl5E~ROps)kEIRTFvP}n6v&CS+;gk6~iB|0SUY5P3~X9k|D&I}q?A>qg%1nGBx z>;dTm#W9Em*{y&_4wQdE>agi^z@sk$haAW(7!J7#adXa9>~78=!i*VEGdAEbV*(B{ zK>pbc4QEgooVkiSZeZ>O(Hz$x=}+bwW*ECb=fgl|gVe&p7{tGiWS7M?+;)M~GHF5N zxwIf@R!9qy2V}J%X%=K|3LY~+c3%;7VF1<32W1_>{R@y7$ZQY|!ytcy@QP~?b3u7w z$2CZLIe}(ANF7Lj2Gk88KErj0J7MO*XpkI8Z6DMhGogAw=Ih|m1JVylZ%_XJ|G!Da z5!{{tnFT82Ky<=&NO5dQ?48km_N zIgnZ@ZAkcl_+JR9^+Hmsa07Svfb979AF@OH43viPXPQCQy1>HXwH0Pq$C7R0}TrUv9r5C+MCXpoy;{Qv)dmp#OdAiH4k z!*CPgCXhN1zM&1V_klJ-98?d0+@x|7A}4SY)%_rQKyG5zL48KF&E_b79_um+{W#9klOV+5cyqDJs@{G5YY1gsutvr54V4GwGf*15+6(ayC`>`|4x(Wg6mKA`au4DrP#Q3~2T5x#_fY)|QU}r>kL3Ou zG&RWPg4iH8fa?FGd4%1t0?7?Kpl&#UW1qpkQ*`Tlj(FOM*c>$yjggNvPd{8|D%J)<5L+oxqvj?Of zqz7a^D6Zy1%?F9W%)fwSJ}CS_av*)W`j9vSng0c9{sS!LgY?8g)q?aHJb;7;$Q)!0 zk^`x2KvElnM=eM%$lXW&|Np;sE#dg>cmQ!P$X_!aK*D1Mn)xs{>_c+H12i=tdqEha z7DR)}+B^UM|5rJT88R4L|oDUqD~RY2hpJT z1*M-HG`%3ZKp195AXHBb)QofkNLYa4ZUY{@ATvN=4628t&JYgcHxD7^g2MO@)L%T0 zAnpg51;QXVfoNFyas{pYNW2UQM_ls!cks(^A|QVSx`rB;`ONoG&A))=zKjQ`@}Tqw z^AGnsM+W(KsPgFkd+-fa9=-fr_5&ghGV|_tM+RK(ocFQRUIy5&Z{M z9$o*F|ETil`WG;PW_KBIx-W?ZRUSPY7qgLgjJi0&a4e`srLz720e}^Ngesq6$xuVLW>!0m`Uw)z& zsyuo+u=7ELjTaId-Jeb25OZ9@of!PW5qgl#(~fXrFo|$t0ImNAg*ymyM>-Mgo4Y(i zlq(_6Amw1nGyLVs7PS1}90hUT=13=oJ&_3aA%~Y%j1z-i3`89)zLDL3IL3+LI8^>? zC`6sebI7=a!gFT^o97TWf#$wJegl=?AR090*PIAZ51P9Mi6P5{-$J+t*}nNnP7I5a zAo{Sm=Y5hB!)G*kWdDHd`IU;QA6>p69aSFL{)%!ZhMsa%dC*)8$Xt+nrZqV+%xXfF zM@gTZP7LCmsPgFPCbA2^{GM+7^4I6$m#t)X3&&`DL#0<|tcItb&MSIi6vaP^SW zxr0km9Fvn%i;FXpa#A6?!WbABe2T#5e1T4mhKnK0zwsJjr^XLvh7Jd2hA(dsVlVzO zGc0jpW~e|?7xkZ+LBoNWA>%zlUCDoD1_>8th6p6F9sijbI9!++0+98BW+NS#86F_n zv4w$!VS*Dg!v!R<0}Lz-4NeI25iVw6@L*tJuwr0g&|+X=kYHe8U}Iom`1YTf;n9C) zhAaP>8IJvj=+pVn%wX}KnIYvLGlK`negBym*#0v!eE7%AaOWR0!?AzN44eKjGc5YY z%rN60Geg%uW`??d%nV=tGBbqyV`gys$IM{ykC{Q^A2Wm0KV}BLf6NRl|CkvH{z1(D z^@W*1;wv+Q+E-=ic3+tpyuLCsgneaZNczgmQ1F$Rq2Vht!=$gw3`@Q;Gi>?F z%y8%{GsA_i%nWzFGBbSm%FMv?jhR8~8#BX;FU$-c-nc-oYTh$!BH;h0n|k9G{sPzIE(&F*8JbVrKC9#LQs#iJ3v`6ElOzCuW8}ADI~*ePm|1 z@R6C}z(;0=O&^&V=6z&l==;dbQ1g+QA?+hGL)1rR2A_}240a!x84Nx$GbnsyX5jnC z%)s=Knc>q1W`=tom>EudU}o6%ftg|12WEy@AD9`sJ}@(sePCwD_`u8%_JNtfFdLFf$1JVP^RCo0;L+Z)S!Y zznK|M{AOlY_M4eu+HYotw%^PQCBK;&(ta~D1pH=Zu=~x-p!b`ZLFG3ygV1kg28Q3v z3?F_mGu->d%y8ltGsB)=%nTcTF*7Xq#mvz6iGbsFGW)S$r%)s)Cnc>q-(skjmtfpPY^0hco%)C#E3yj~U!D^Wc0(hAGV9nJKBx8Hq(9`M#jj z>YOS|QW?%L=M; zpg3b-_`wK~bp#(T`X9;z8^v${93#oOprg!dL9ToC)lkrpkYmW2Iu^|vecpy=*=<^Z43-45qV6#Sr|e+?1~%g-sz1&14aw|XW>+^sYx2b3zI@#YK?L)Gt@!Vm#+ ze_{?KDKG>w`J^V6p&vlVz>vxul2Z&nnRW()D<}`59aG4_zy?iaL8%bqn4o;9ml%|p zaGr6Oa`(2U45Mc7#OZI1(oE4=9OpWr7#FEd88&5KmuM2 z%mxP`gA|wz3-m_jFvz*65QPlOnSv5Ci;=G#S`0EDnk+#kGBB8f(tmJC3M}^1Kq|oD zP+5@5u#*A#P-z*kZQzW-5XT$>J5>~F9s@%jb7)=$xKcpeHt3d_Qvy0@*$ZS3PH9Uf z&tjLqq6 z3MdR90S!GSbUR3Ga7kiONofHn0XQ-&W(q7#EvgJiEdrmXoR^#mR+?JGa37>LBr`c1 zEWp5U3dBbwZpUJ9tby)xPy)#~Lk_M5g`Y7JA5!)|0*QdKL{xqra+$=yunQyu@jd92 zC`Sf{y{IDL3=A_NsT*p8BZDbO1(fGsT2fG20V=U*-RmcNlB?GA*mH5{-vOaxIGLm zMTzAgz9Yk4I2%+t)H1pkC00TL&5^-@!8s>0HLoNjKRCH4H8qccfd^#1i!*~36ZEz} z7iWejkXUeKv2%V-J}7RXt^uD(a)iMZeE2f-xDtkSjGo01HbgvyK?9^4)MkR5YXUvz zBo8DCQRtJOm+lCyR|673R|7IwGX;kO;cGswB0j7?MkxnSxVGASMOm7c($4Aox(9 zOEWkp=Hx(?6y+y7GW0RHq^2PYK-#S?IqA+NMLC`>3=BL>0VSS!V5c#7F*xTJR6^KH z42~&TrNvMSL1Li$WW<<)QqwbwOHzx#C$Bj&Fnj}*SYQssmETeLpp=pTZ8Jig0TR&x zg#jq_GW>_A1|=Pk6$~5Uu^yHQ9@$_B2l>)1zbG}mD8Do>1!4$;BFF^q)JjNlzs2aA zSOAd$w}^@v7?=W5Q?n8AZUa&e<$?mw7Kslk5*Qd}GC)gBh&c@4Hc?1E)K~@vL68oY zoODnoWMEjx0J`fdu_QSIYN#UvgE&Y9hD+DNeZ;^Z22qh*S`4b&Ar}S)6y+BN8~S7HI^RAdH* zi%j8}dC)6?_A!D|GAQLaGN{Aj7NQ;Dvm;Dli8+}mi6yDvNMhgyxfYWAL4nEe8e~2s zS36#DZc5 zcBbIOvQ!t)z#tRozR~<55Jwbbr&Bhh@MEw6@j!M%`Pv}9Z(;$Yu1Wxz=$w;T;FMp% zz|aqESHgz$J~9TB!1BjeMo^rw)?U6jJKYQUVfP3=B&_ArM@WpPUVIr@M=%G2}8_c2IhQ)chr&&UiBP zQdG#PQqqv#N(vjgihzD-4fN#bC6=)1^Kw?l8Ac2b@ zKBVF0omvSJVFBeXSkD0@z;Fem2GS7)n|l|;2VD^e=6wV45VklnFgUt|IR?OjfWeRf z)PVxE$3X!BDIN6TVy+b>klf(Nz)%Yo1=Z9AA^Ac1`Jj3|6fEXh9O~!n$iNWn;S=r{ z;0X>s(D_`UA<%#ZkGzZ$qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd72r zA;8JNz~C_(H1xy3pcmj6<_tQu+ZA>hrUQ6sCtTj%G0a}Y8GL<(LzpwDBagVC0(8HH zgM*_}n4tqm7qT8_$dCv~7-1KtSs_KKsh|-s2e8SYJADly1{#4)L~^ISBgA&78jzn* z>~l#3FAFeqa6qxo87dBODw261f8+5p*gXiJ8i725Vjs4UKn_<-zoM813p5NfLH+~V zhU8X|-=Y2hNj20sGZ<7mGk|V8l4E3G;0Fapqcg*fYDk=d?uQ18F)%O~)Ih{QcS(cJ z8kxuKhzK8082F~<<`-3>gaq78Ao<|T+=3j$TqR04faI~obATi0xN}r{{PIhJAvctQ zSDvI6lw{`TflNd4C&)a{yfV;0t|MrWFBzcgW<59O4+_ikx=r9m7DBtI@!XgapA1B9P*LbL_;jTe( zZ>T5qaxah#aQ&dXf+cNNy!rpX{LTOWWpDofFMad>f61Hw|BK)J|6lax|Np`_|Nj@f z`Tsxv&Hw*-Z~p(!ee?f+&YS=Lv)}yxpY`Vd|I9c4|7X1U|3CfB|Nm)kAm<{qOmJqH zF~ON(%LHeJ6BC>nZcK1ycr(G7foGyKgUm!{27`&t3=R{W8Db_nGqg-}W|%S2nPJOB zXNDUSof+OtbY@_gDUZbIgfiq}U+QEUr@0r8yjgtFaOlG5|XVCRn@tJvP`4DG=yamQH zDj@q?z#Il}6#!#`X;57x20fz{R4ss3V}oeWzFG+e1_sbsbG)E?pBWgy=TL##!8{BM z3>*v$3?LfR9|F;!v;IJGpmT#^av*a-dO)k$)Nar{Ss-y! zC?B-@62u3!20{7)7#P6kSOqaKFo48^p>#L{0|UtXNCpN5klmm=6hZR2pu6H27#Ipb zbs_@;1L$HdkXu3LK7iDN>O_#68yOhD=V~=U{nrdNuLWxULc z?OP5N2VH;!^3yq}{B@|j1Un?0Kw$(5mn-~E45c#|7>Z|rgP&o6fh(8+qCtHUFb70{ z0t!SUVNf`L;tNR#g$a@eVHCkp&S(hW34tZEof)P;+v<3fQ79#V6F>}BzzHDoL!HEZ zDKW%nxG%+p$PWh+XA*#xbU2d$sGBn!0s!KNA)XX&D7Y{%GO=(hVP;@RXsT=i)!QJC zExQjQ85kBWh0u-jAN&Ea9O@dt^a^GMhJ%Z5Eyfj@jsHNZ85kU(^j0F(J3`fOV`gAD zzv#&#DTb$uUMz}+7=}c`&97Ss))C0czz}#V?v?^W{H?58Mo20l%*M+%?mhU)z+hMh z(RpW?Gx&@IPClnxf6uJWp|}LpnL?IFmxGxFqCw_? zXb^_E6Gnr?Kp4h{(I7DphVjv9kQ@lZ#6fHjhVjv9kQ@l3i^KRJxq-&eLK1vtyT>BP z7?8{&$oZxp7DCR3jaUd7`_WklIrH_;0?3)KHx@WEfX1-bEO2H3wdqS1I5S9sc9Sn~ zW{_fFU=Ug0%plFcz;I{2GlL8R1H+d2&J3V&@G0}18RS9Z;PWA4O+V&2gYUCtnCHx( z1iF)Vt}{ag0|P_ATxSN*W#$fZof)b?>gPH$fHJ+#TxW*=p!WA%$hobcFl1$5H~?y= zgV?eR3%dy!67gs$f5&WDATW@?ZS|u z?E*hr1>^`&oP%f(2C+eD+?s)bA&P+koQ|h6FfeRoU|_hyz`*bs)Zb)eU@%~0VDMvP zV8~^Jj0J%7STQg#fcl%|3=9m@K>3A%f#EU(1H&f<(7s^?27N{b246-7h8#u)22lBW zYnd|x$699wmbK0d3~QYk{;Y9k__4;B;maClh7W6;8D6Y$W_Ym1nc>D7XNEItoEZ+R zac0=D#+hNw8fS(TYn&ODtZ`;ou*R8T&KhTi8Ec#wrmS&hn6So~p=XUVL&q9thL$zX z3=M0X8EV!zGnA}xX2@9M%#g6gnIQtIK46VAgU1?Y28T7y3?^%w8Fbb-GbpTaW)NB9 z%pkDFnSp1GGXujKXNEVcof#gic4pvYfy5;!oIrJg9s>iz7abRd7Cl#jxE=~XbquKd z1nC9QAhSRiRNgDFP6ib}ATAgq_gO*bY=AIm>pkP2|NlYb0if~%GQkvcf63R)4u#XMPj%*F z?bTdA&*A6(1ukzJh58$tb~^00xw`E9e^2>}Lzf-$k3Hyl*>KW**W?wBds?$Y)h&C! z7d)tO+H<$>-p{$eU)QY)bYA$Z?D3gTn))q`YAzZA;;VkF6L@^|$S;@I%ddR?{`#R; z)ztH@sb`K)SU*)wO)K)`SNLR+ruiwi)+5BsPT>-+w_)ANLyzuF(ZtdlDFC_;Su#gFzE_?27S zrQO#YUH;DAVcE9Kob{}G&D&nv8{6)2s(N~L%KmH5?GOF^doHm>u>8#GC-(Y2(GPu( z?3*(6*-86JM}nOW>pLA09MT(KJZ@XYY<;Z7)ro!E%u@5) zdRE4TGMAKZ8@=Qnwj_quRE8m z+8@cX0HTvX{$Oxn5Mp3taAwG7$Ym&CNMy)ksATYCNMy)mNClhk$dJd7 z%#gv54>r4mA(cUaL4zTLAr-790=$MMi$Rfr5pJgoLn=ctLo!%>0YeExCPO|$9@s25 zhD3%Oh8%``hEj$S1_g!`hD3%E23>|UsB0C#E=Xp`W=LfyV$f$OWynJj0U2V(z>Q>A z7+7U7k{w12It&U7#$Xb{HUMd3NCLYN6doWy6fxw1-GcBbHQZLkpv}O@;KPv0kPbE- z6siRbmEe#_XUJeEVPF7 + MakeLower(m_FileTree[m_FileTree.GetUpperBound()].m_strDirectoryName)) { + // Greater than last + nDirectoryIndex = m_FileTree.Add(directory); + } + else if (MakeLower(strDirectoryName) == + MakeLower(m_FileTree[0].m_strDirectoryName)) { + // Equal first + nDirectoryIndex = 0; + } + else if (MakeLower(strDirectoryName) == + MakeLower(m_FileTree[m_FileTree.GetUpperBound()].m_strDirectoryName)) { + // Equal last + nDirectoryIndex = m_FileTree.GetUpperBound(); + } + else { + // Other + BOOL bNeedInsert = TRUE; + INT_PTR nLeft = 0; + INT_PTR nRight = m_FileTree.GetUpperBound(); + INT_PTR nCurrent; + + while(nRight - nLeft > 1) { + nCurrent = (nRight + nLeft) >> 1; // divide by 2 + + if (MakeLower(strDirectoryName) == MakeLower(m_FileTree[nCurrent].m_strDirectoryName)) { + bNeedInsert = FALSE; + break; + } + else if (MakeLower(strDirectoryName) < MakeLower(m_FileTree[nCurrent].m_strDirectoryName)) { + nRight = nCurrent; + } + else { + nLeft = nCurrent; + } + } + + if (bNeedInsert) { + m_FileTree.InsertAt(nLeft + 1, directory); + nDirectoryIndex = nLeft + 1; + } + else { + nDirectoryIndex = nCurrent; + } + } + + // ========= File ========= + INT_PTR nFileIndex; + + + if (m_FileTree[nDirectoryIndex].m_FileList.IsEmpty()) { + // No elements + nFileIndex = m_FileTree[nDirectoryIndex].m_FileList.Add(newElement); + } + else if (MakeLower(newElement.m_strFileName) < + MakeLower(m_FileTree[nDirectoryIndex].m_FileList[0].m_strFileName)) { + // Less than first + m_FileTree[nDirectoryIndex].m_FileList.InsertAt(0, newElement); + nFileIndex = 0; + } + else if (MakeLower(newElement.m_strFileName) > + MakeLower(m_FileTree[nDirectoryIndex].m_FileList[m_FileTree[nDirectoryIndex].m_FileList.GetUpperBound()].m_strFileName)) { + // Greater than last + nFileIndex = m_FileTree[nDirectoryIndex].m_FileList.Add(newElement); + } + else if (MakeLower(newElement.m_strFileName) == + MakeLower(m_FileTree[nDirectoryIndex].m_FileList[0].m_strFileName)) { + // Equal first + m_FileTree[nDirectoryIndex].m_FileList[0] = newElement; + nFileIndex = 0; + } + else if (MakeLower(newElement.m_strFileName) == + MakeLower(m_FileTree[nDirectoryIndex].m_FileList[m_FileTree[nDirectoryIndex].m_FileList.GetUpperBound()].m_strFileName)) { + // Equal last + m_FileTree[nDirectoryIndex].m_FileList[m_FileTree[nDirectoryIndex].m_FileList.GetUpperBound()] = newElement; + nFileIndex = m_FileTree[nDirectoryIndex].m_FileList.GetUpperBound(); + } + else { + // Other + BOOL bNeedInsert = TRUE; + INT_PTR nLeft = 0; + INT_PTR nRight = m_FileTree[nDirectoryIndex].m_FileList.GetUpperBound(); + INT_PTR nCurrent; + + while(nRight - nLeft > 1) { + nCurrent = (nRight + nLeft) >> 1; // divide by 2 + + if (MakeLower(newElement.m_strFileName) == MakeLower(m_FileTree[nDirectoryIndex].m_FileList[nCurrent].m_strFileName)) { + m_FileTree[nDirectoryIndex].m_FileList[nCurrent] = newElement; + bNeedInsert = FALSE; + break; + } + else if (MakeLower(newElement.m_strFileName) < MakeLower(m_FileTree[nDirectoryIndex].m_FileList[nCurrent].m_strFileName)) { + nRight = nCurrent; + } + else { + nLeft = nCurrent; + } + } + + if (bNeedInsert) { + m_FileTree[nDirectoryIndex].m_FileList.InsertAt(nLeft + 1, newElement); + nFileIndex = nLeft + 1; + } + else { + nFileIndex = nCurrent; + } + } + + INT_PTR nResult = 0; + + for(INT_PTR i = 0; i < nDirectoryIndex; i++) { + nResult += m_FileTree[nDirectoryIndex].m_FileList.GetSize(); + } + + nResult += nFileIndex; + + return nResult; +} + +void CFileList1::RemoveAt(INT_PTR nIndex) +{ + ASSERT(nIndex >= 0); + ASSERT(nIndex < GetSize()); + + for(INT_PTR nDirectoryIndex = 0; nDirectoryIndex < m_FileTree.GetSize(); nDirectoryIndex++) { + if (nIndex < m_FileTree[nDirectoryIndex].m_FileList.GetSize()) { + m_FileTree[nDirectoryIndex].m_FileList.RemoveAt(nIndex); + + if (m_FileTree[nDirectoryIndex].m_FileList.IsEmpty()) { + m_FileTree.RemoveAt(nDirectoryIndex); + } + + break; + } + else { + nIndex -= m_FileTree[nDirectoryIndex].m_FileList.GetSize(); + } + } +} + +CFileDescriptorBase& CFileList1::operator [] (INT_PTR nIndex) +{ + ASSERT(nIndex >= 0); + ASSERT(nIndex < GetSize()); + + for(INT_PTR nDirectoryIndex = 0; nDirectoryIndex < m_FileTree.GetSize(); nDirectoryIndex++) { + if (nIndex < m_FileTree[nDirectoryIndex].m_FileList.GetSize()) { + return m_FileTree[nDirectoryIndex].m_FileList[nIndex]; + } + else { + nIndex -= m_FileTree[nDirectoryIndex].m_FileList.GetSize(); + } + } + + // Fake return (avoid warning) + return m_FileTree[0].m_FileList[0]; +} + +CFileDescriptorBase CFileList1::operator [] (INT_PTR nIndex) const +{ + ASSERT(nIndex >= 0); + ASSERT(nIndex < GetSize()); + + for(INT_PTR nDirectoryIndex = 0; nDirectoryIndex < m_FileTree.GetSize(); nDirectoryIndex++) { + if (nIndex < m_FileTree[nDirectoryIndex].m_FileList.GetSize()) { + return m_FileTree[nDirectoryIndex].m_FileList[nIndex]; + } + else { + nIndex -= m_FileTree[nDirectoryIndex].m_FileList.GetSize(); + } + } + + // Fake return (avoid warning) + return m_FileTree[0].m_FileList[0]; +} + +#ifdef _DEBUG +void CFileList1::AssertValid() const +{ + CObject::AssertValid(); + m_FileTree.AssertValid(); + + for(INT_PTR i = 0; i < GetSize(); i++) { + (operator [] (i)).AssertValid(); + } +} + +template<> +void AFXAPI DumpElements(CDumpContext& dc, const CFileDescriptorBase* pElements, INT_PTR nCount) +{ + ASSERT(nCount == 0 || + AfxIsValidAddress(pElements, (size_t)nCount * sizeof(CFileDescriptorBase), FALSE)); + + for(INT_PTR i = 0; i < nCount; i++) { + dc << "Element " << i << ":\n"; + pElements[i].Dump(dc); + } +} + +void CFileList1::Dump(CDumpContext& dc) const +{ + CObject::Dump(dc); + dc.SetDepth(1); + m_FileTree.Dump(dc); +} +#endif + + +// CDatFile1 +IMPLEMENT_DYNAMIC(CDatFile1, CObject) + +CDatFile1::CDatFile1() +{ +} + +CDatFile1::~CDatFile1() +{ + Close(); +} + +BOOL CDatFile1::Open(LPCTSTR lpszFileName, UINT nOpenFlags) +{ + if (!m_Dat.Open(lpszFileName, nOpenFlags)) { + return FALSE; + } + + if (m_Dat.GetLength() == 0) { + return TRUE; + } + + CArchive arFileList(&m_Dat, CArchive::load); + + TRY { + m_FileList.Serialize(arFileList); + } + + CATCH(CUserException, e) { + return FALSE; + } + + END_CATCH + + return TRUE; +} + +void CDatFile1::Close() +{ + Flush(); + + if (m_Dat.m_hFile != CFile::hFileNull) { + m_Dat.Close(); + } +} + +void CDatFile1::Flush() +{ + if (m_bNeedFlush) { + FreeSpaceForCatalog(); + m_Dat.SeekToBegin(); + CArchive arFileList(&m_Dat, CArchive::store); + m_FileList.Serialize(arFileList); + arFileList.Flush(); + m_bNeedFlush = FALSE; + } +} + +INT_PTR CDatFile1::GetFileCount() +{ + return m_FileList.GetSize(); +} + +CFileDescriptorBase CDatFile1::operator [](INT_PTR nIndex) const +{ + return m_FileList[nIndex]; +} + +INT_PTR CDatFile1::FindNext() +{ + for(++m_nCurrent; m_nCurrent < m_FileList.GetSize(); m_nCurrent++) { + if (MatchPattern(m_FileList[m_nCurrent].m_strFileName, m_strPattern, FALSE)) { + break; + } + } + + if (m_nCurrent == m_FileList.GetSize()) { + m_nCurrent = -1; + } + + return m_nCurrent; +} + +BOOL CDatFile1::Inflate(CArchive& ar) +{ + if (m_nCurrent == -1) { + return FALSE; + } + + CFileDescriptorBase descriptor = m_FileList[m_nCurrent]; + + m_Dat.Seek(descriptor.m_dwOffset, CFile::begin); + + const DWORD c_dwBufferSize = 65536; + BYTE buffer[c_dwBufferSize]; + + DWORD dwBytesLeft = descriptor.m_dwPackedFileLength; + DWORD dwBytesToRead; + DWORD dwRead; + DWORD dwBytesOut = 0; + + // Uncompressed file + if (descriptor.m_nType == 0) { + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwRead = m_Dat.Read(buffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + return FALSE; + } + + ar.Write(buffer, dwBytesToRead); + dwBytesOut += dwRead; + } while((dwBytesLeft -= dwRead ) > 0); + + return TRUE; + } + + BOOL bResult = TRUE; + BOOL bEndLoop = FALSE; + + do { + WORD wBlockDescriptor; + + if (ReadMSBWord(m_Dat, wBlockDescriptor) != sizeof(WORD)) { + bResult = FALSE; + break; + } + + dwBytesToRead = wBlockDescriptor & 0x7FFF; + + dwRead = m_Dat.Read(buffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + bResult = FALSE; + break; + } + + if (wBlockDescriptor & 0x8000) { + // Uncompressed block + ar.Write(buffer, dwRead); + } + else { + // Compressed block + LZSSDecodeBuffer(buffer, dwRead, ar); + } + } while((dwBytesLeft -= dwRead + sizeof(WORD)) > 0); + + return bResult; +} + +BOOL CDatFile1::Deflate(CArchive& ar, DWORD dwLength, LPCTSTR lpszName, int level) +{ + ULONGLONG ullDatLength = m_Dat.SeekToEnd(); + + // File descriptor + CFileDescriptorBase descriptor; + descriptor.m_dwFileLength = dwLength; + descriptor.m_strFileName = lpszName; + descriptor.m_dwOffset = DWORD(ullDatLength); + + // Buffers + const DWORD c_dwBufferSize = 65536; + BYTE buffer[c_dwBufferSize]; +// BYTE outBuffer[c_dwBufferSize]; + + DWORD dwBytesLeft = dwLength; + DWORD dwBytesToRead; + DWORD dwRead; + DWORD dwBytesOut = 0; + + // Flags + BOOL bResult = TRUE; + BOOL bUseInputArchive = TRUE; + + // Temporary file + char lpszTempFileName[MAX_PATH]; + CFile fileTemp; + BOOL bDeleteTempFile = FALSE; + + // Try compress file + if (level != 0) { + // Save position in input archive + ar.Flush(); + ULONGLONG ullArPosition = ar.GetFile()->GetPosition(); + + // Create temporary file + char lpszTempPath[MAX_PATH - 14]; + HANDLE hTempFile; + + GetTempPath(MAX_PATH - 14, lpszTempPath); + GetTempFileName(lpszTempPath, "DAT", 0, lpszTempFileName); + + hTempFile = ::CreateFile(lpszTempFileName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_TEMPORARY, + NULL); + + if (hTempFile == INVALID_HANDLE_VALUE) { + return FALSE; + } + + fileTemp.m_hFile = hTempFile; + bDeleteTempFile = TRUE; + + // Deflate file + const DWORD c_dwBlockSize = 0x4000; + WORD wBlockDescriptor = 0; + ULONGLONG ullBlockDescPos; + + do { + // Read block of data + dwBytesToRead = (dwBytesLeft < c_dwBlockSize) ? dwBytesLeft : c_dwBlockSize; + + dwRead = ar.Read(buffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + bResult = FALSE; + break; + } + + // Write descriptor placeholder + ullBlockDescPos = fileTemp.GetPosition(); + WriteMSBWord(fileTemp, wBlockDescriptor); + + // Compress block + LZSSEncodeBuffer(buffer, dwRead, fileTemp); + + // Check length of compressed block + DWORD dwBlockLength = DWORD(fileTemp.GetPosition()) - DWORD(ullBlockDescPos) - sizeof(WORD); + + // More than uncompressed + if (dwBlockLength > dwRead) { + fileTemp.SetLength(ullBlockDescPos + sizeof(WORD)); + fileTemp.SeekToEnd(); + fileTemp.Write(buffer, dwRead); + wBlockDescriptor = WORD(dwRead) | 0x8000; + } + else { + wBlockDescriptor = WORD(dwBlockLength); + } + + // Patch descriptor + fileTemp.Seek(ullBlockDescPos, CFile::begin); + WriteMSBWord(fileTemp, wBlockDescriptor); + fileTemp.SeekToEnd(); + } while((dwBytesLeft -= dwRead) > 0); + + fileTemp.SeekToBegin(); + + // Check compression result + if (!bResult) { + fileTemp.Close(); + CFile::Remove(lpszTempFileName); + return FALSE; + } + + // Check length + ULONGLONG ullTempFileLength = fileTemp.GetLength(); + + if (ullTempFileLength < dwLength) { + bUseInputArchive = FALSE; + descriptor.m_dwPackedFileLength = DWORD(ullTempFileLength); + descriptor.m_nType = 1; + dwBytesLeft = DWORD(ullTempFileLength); + } + else { + ar.Flush(); + ar.GetFile()->Seek(ullArPosition, CFile::begin); + descriptor.m_dwPackedFileLength = dwLength; + descriptor.m_nType = 0; + dwBytesLeft = dwLength; + } + } + else { + descriptor.m_dwPackedFileLength = dwLength; + descriptor.m_nType = 0; + } + + // Set source archive + CArchive arTemp(&fileTemp, CArchive::load); // Temporary archive + CArchive* pArSource; + + if (bUseInputArchive) { + pArSource = &ar; + } + else { + pArSource = &arTemp; + } + + // Write data + TRY { + m_Dat.SeekToEnd(); + + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwRead = pArSource->Read(buffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + bResult = FALSE; + break; + } + + m_Dat.Write(buffer, dwBytesToRead); + dwBytesOut += dwRead; + } while((dwBytesLeft -= dwRead ) > 0); + + if (bResult) { + // Add descriptor + m_FileList.Add(descriptor); + m_bNeedFlush = TRUE; + } + else { + // Restore dat-file length on error + m_Dat.SetLength(ullDatLength); + } + + // Destroy temporary file + if (bDeleteTempFile) { + arTemp.Abort(); + fileTemp.Close(); + CFile::Remove(lpszTempFileName); + } + + return bResult; + } + + CATCH_ALL(e) { + m_Dat.SetLength(ullDatLength); + THROW_LAST(); + } + + END_CATCH_ALL +} + +BOOL CDatFile1::Delete() +{ + if (m_nCurrent == -1) { + return FALSE; + } + + m_FileList.RemoveAt(m_nCurrent); + m_nCurrent = -1; + m_bNeedFlush = TRUE; + + return TRUE; +} + + +CDatFile1* g_pDatFile1ForSort; + +int CompareDescriptorIndex1(const void* pIndex1, const void* pIndex2) +{ + INT_PTR nIndex1 = *((INT_PTR*)pIndex1); + INT_PTR nIndex2 = *((INT_PTR*)pIndex2); + + CFileDescriptorBase descriptor1; + CFileDescriptorBase descriptor2; + + descriptor1 = (*g_pDatFile1ForSort)[nIndex1]; + descriptor2 = (*g_pDatFile1ForSort)[nIndex2]; + + if (descriptor1.m_dwOffset < descriptor2.m_dwOffset) { + return -1; + } + else if (descriptor1.m_dwOffset > descriptor2.m_dwOffset) { + return 1; + } + else { + return 0; + } +} + +BOOL CDatFile1::Shrink(void (*pCallback)(INT_PTR nIndex)) +{ + if (m_Dat.GetLength() == 0) { + return FALSE; + } + + // Sort files by offset + INT_PTR nFileCount = GetFileCount(); + INT_PTR* pIndexArray = new INT_PTR[nFileCount]; + + if (pIndexArray == NULL) { + return FALSE; + } + + for(INT_PTR i = 0; i < nFileCount; i++) { + pIndexArray[i] = i; + } + + g_pDatFile1ForSort = this; + qsort(pIndexArray, nFileCount, sizeof(INT_PTR), CompareDescriptorIndex1); + + // Move files + const DWORD c_dwBufferSize = 65536; + BYTE buffer[c_dwBufferSize]; + + DWORD dwWritePos = m_FileList.GetLength(); + DWORD dwShift; + DWORD dwBytesToRead; + DWORD dwBytesLeft; + DWORD dwReadPos; + DWORD dwRead; + + CFileDescriptorBase descriptor; + + for(INT_PTR i = 0; i < nFileCount; i++) { + descriptor = (*this)[pIndexArray[i]]; + dwShift = descriptor.m_dwOffset - dwWritePos; + + if (dwShift > 0) { + m_bNeedFlush = TRUE; + + if (pCallback) { + pCallback(pIndexArray[i]); + } + + dwBytesLeft = descriptor.m_dwPackedFileLength; + dwReadPos = descriptor.m_dwOffset; + + descriptor.m_dwOffset = dwWritePos; + + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + + m_Dat.Seek(dwReadPos, CFile::begin); + dwRead = m_Dat.Read(buffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + delete [] pIndexArray; + return FALSE; + } + + m_Dat.Seek(dwWritePos, CFile::begin); + m_Dat.Write(buffer, dwRead); + dwWritePos += dwRead; + dwReadPos += dwRead; + } while((dwBytesLeft -= dwRead ) > 0); + + // Patch offsets + m_FileList[pIndexArray[i]].m_dwOffset = descriptor.m_dwOffset; + } + else { + dwWritePos += descriptor.m_dwPackedFileLength; + } + } + + m_Dat.SetLength(dwWritePos); + delete [] pIndexArray; + + Flush(); + return TRUE; +} + +void CDatFile1::FreeSpaceForCatalog() +{ + if (m_FileList.GetSize() != 0) { + DWORD dwCatalogSize = m_FileList.GetLength(); + + // Find offset + CFileDescriptorBase descriptor; + DWORD dwMinimalOffset = m_FileList[0].m_dwOffset; + + for(INT_PTR i = 1; i < m_FileList.GetSize(); i++) { + descriptor = m_FileList[i]; + + if (dwMinimalOffset > descriptor.m_dwOffset) { + dwMinimalOffset = descriptor.m_dwOffset; + } + } + + // Free space + if (dwMinimalOffset < dwCatalogSize) { + printf("Freeing space for catalog...\n"); + DWORD dwShift = dwCatalogSize - dwMinimalOffset; + DWORD dwBytesLeft = DWORD(m_Dat.GetLength()) - dwMinimalOffset; + DWORD dwTotalBytesToMove = dwBytesLeft; + DWORD dwReadPos = DWORD(m_Dat.GetLength()); + DWORD dwWritePos; + + const DWORD c_dwBufferSize = 65536; + BYTE buffer[c_dwBufferSize]; + DWORD dwBytesToRead; + DWORD dwRead; + + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwReadPos -= dwBytesToRead; + dwWritePos = dwReadPos + dwShift; + + m_Dat.Seek(dwReadPos, CFile::begin); + dwRead = m_Dat.Read(buffer, dwBytesToRead); + + m_Dat.Seek(dwWritePos, CFile::begin); + m_Dat.Write(buffer, dwRead); + + dwBytesLeft -= dwRead; + printf("Moved: %d of %d byte(s)\r", dwTotalBytesToMove - dwBytesLeft, dwTotalBytesToMove); + } while(dwBytesLeft > 0); + + // Patch offsets + for(INT_PTR i = 0; i < m_FileList.GetSize(); i++) { + m_FileList[i].m_dwOffset += dwShift; + } + } + + printf("\nSpace are freed.\n"); + } +} diff --git a/src/DatFile1.h b/src/DatFile1.h new file mode 100644 index 0000000..325880b --- /dev/null +++ b/src/DatFile1.h @@ -0,0 +1,91 @@ +#pragma once + +#include "DatFileBase.h" + +// CFileList1 +class CFileList1 : public CObject { +public: + CFileList1(); + virtual ~CFileList1(); + + DECLARE_DYNAMIC(CFileList1) + + virtual void Serialize(CArchive& ar); + INT_PTR GetSize() const; + + DWORD GetLength(); + + INT_PTR Add(const CFileDescriptorBase& newElement); + void RemoveAt(INT_PTR nIndex); + + CFileDescriptorBase& operator [] (INT_PTR nIndex); + CFileDescriptorBase operator [] (INT_PTR nIndex) const; + +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +private: + // Assignment and copy not allowed + CFileList1(const CFileList1&); + CFileList1& operator = (const CFileList1&); + +private: + // CFileDescriptorBaseArray + typedef CArray CFileDescriptorBaseArray; + + // CFileTreeItem + class CFileTreeItem { + public: + CFileTreeItem(); + CFileTreeItem(const CFileTreeItem& item); + + public: + CFileTreeItem& operator = (const CFileTreeItem& item); + + public: + CString m_strDirectoryName; + CFileDescriptorBaseArray m_FileList; + }; + + // CFileTree + typedef CArray CFileTree; + + CFileTree m_FileTree; +}; + +// CDatFile1 +class CDatFile1 : public CDatFileBase { +public: + CDatFile1(); + virtual ~CDatFile1(); + + DECLARE_DYNAMIC(CDatFile1) + + virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags); + virtual void Close(); + virtual void Flush(); + + virtual INT_PTR GetFileCount(); + virtual CFileDescriptorBase operator [] (INT_PTR nIndex) const; + + virtual INT_PTR FindNext(); + + virtual BOOL Inflate(CArchive& ar); + virtual BOOL Deflate(CArchive& ar, DWORD dwLength, LPCTSTR lpszName, int level); + virtual BOOL Delete(); + virtual BOOL Shrink(void (*pCallback)(INT_PTR nIndex)); + +private: + void FreeSpaceForCatalog(); + +private: + // Restricted operations + CDatFile1(const CDatFile1&); + CDatFile1& operator = (const CDatFile1&); + virtual void Serialize(CArchive&) {}; + +private: + CFileList1 m_FileList; +}; diff --git a/src/DatFile2.cpp b/src/DatFile2.cpp new file mode 100644 index 0000000..2538107 --- /dev/null +++ b/src/DatFile2.cpp @@ -0,0 +1,868 @@ +// DatFile2.cpp : implementation file +// + +#include "stdafx.h" +#include "DatFile2.h" + +#include + +#if defined(_UNICODE) || defined(UNICODE) +#error UNICODE not supported +#endif + + +// CFileDescriptor2 +IMPLEMENT_DYNAMIC(CFileDescriptor2, CFileDescriptorBase) + +CFileDescriptor2::CFileDescriptor2() +{ +} + +CFileDescriptor2::CFileDescriptor2(const CFileDescriptor2& item) : + CFileDescriptorBase(item) +{ +} + +CFileDescriptor2::~CFileDescriptor2() +{ +} + +CFileDescriptor2& CFileDescriptor2::operator = (const CFileDescriptor2& item) +{ + CFileDescriptorBase::operator = (item); + return (*this); +} + +void CFileDescriptor2::Serialize(CArchive& ar) +{ + if (ar.IsStoring()) { + ASSERT(!m_strFileName.IsEmpty()); + + DWORD dwFileNameLength = m_strFileName.GetLength(); + + ar.Write(&dwFileNameLength, sizeof(dwFileNameLength)); + ar.WriteString(m_strFileName); + ar.Write(&m_nType, sizeof(m_nType)); + ar.Write(&m_dwFileLength, sizeof(m_dwFileLength)); + ar.Write(&m_dwPackedFileLength, sizeof(m_dwPackedFileLength)); + ar.Write(&m_dwOffset, sizeof(m_dwOffset)); + } + else { + DWORD dwFileNameLength; + LPTSTR lpszFileName; + + ar.Read(&dwFileNameLength, sizeof(dwFileNameLength)); + lpszFileName = m_strFileName.GetBufferSetLength(dwFileNameLength); + ar.Read(lpszFileName, dwFileNameLength); + m_strFileName.ReleaseBufferSetLength(dwFileNameLength); + + ar.Read(&m_nType, sizeof(m_nType)); + ar.Read(&m_dwFileLength, sizeof(m_dwFileLength)); + ar.Read(&m_dwPackedFileLength, sizeof(m_dwPackedFileLength)); + ar.Read(&m_dwOffset, sizeof(m_dwOffset)); + } +} + +int CFileDescriptor2::GetSize() const +{ + return sizeof(DWORD) + + m_strFileName.GetLength() + + sizeof(m_nType) + + sizeof(m_dwFileLength) + + sizeof(m_dwPackedFileLength) + + sizeof(m_dwOffset); +} + +#ifdef _DEBUG +void CFileDescriptor2::AssertValid() const +{ + CObject::AssertValid(); + ASSERT(!m_strFileName.IsEmpty()); + ASSERT(m_nType <= 1); + ASSERT(m_dwFileLength != 0); + ASSERT(m_dwPackedFileLength != 0); + ASSERT(m_dwPackedFileLength >= m_dwFileLength); +} + +void CFileDescriptor2::Dump(CDumpContext& dc) const +{ + CFileDescriptorBase::Dump(dc); + dc << "Size of descriptor:\t" << GetSize() << " bytes\n"; +} +#endif + + +// CFileList2 +IMPLEMENT_DYNAMIC(CFileList2, CObject) + +CFileList2::CFileList2() +{ +} + +CFileList2::~CFileList2() +{ +} + +void CFileList2::Serialize(CArchive& ar) +{ + if (ar.IsStoring()) { + DWORD dwFileCount = DWORD(m_FileList.GetSize()); + ar.Write(&dwFileCount, sizeof(dwFileCount)); + + CFileDescriptor2 descriptor; + DWORD dwListLength = 0; + + for(DWORD i = 0; i < dwFileCount; i++) { + descriptor = m_FileList[i]; + descriptor.Serialize(ar); + dwListLength += descriptor.GetSize(); + } + + dwListLength += sizeof(DWORD); + ar.Write(&dwListLength, sizeof(dwListLength)); + } + else { + DWORD dwFileCount; + ar.Read(&dwFileCount, sizeof(dwFileCount)); + m_FileList.SetSize(dwFileCount); + + CFileDescriptor2 descriptor; + DWORD dwListLength; + + for(DWORD i = 0; i < dwFileCount; i++) { + descriptor.Serialize(ar); + m_FileList[i] = descriptor; + } + + ar.Read(&dwListLength, sizeof(dwListLength)); + } +} + +INT_PTR CFileList2::GetSize() const +{ + return m_FileList.GetSize(); +} + +INT_PTR CFileList2::Add(const CFileDescriptor2& newElement) +{ + // No elements + if (m_FileList.GetSize() == 0) { + return m_FileList.Add(newElement); + } + + // Less than first + if (MakeLower(newElement.m_strFileName) < + MakeLower(m_FileList[0].m_strFileName)) { + m_FileList.InsertAt(0, newElement); + return 0; + } + + // Greater than last + if (MakeLower(newElement.m_strFileName) > + MakeLower(m_FileList[m_FileList.GetUpperBound()].m_strFileName)) { + m_FileList.Add(newElement); + return m_FileList.GetUpperBound(); + } + + // Equally first + if (MakeLower(newElement.m_strFileName) == + MakeLower(m_FileList[0].m_strFileName)) { + m_FileList[0] = newElement; + return 0; + } + + // Equally last + if (MakeLower(newElement.m_strFileName) == + MakeLower(m_FileList[m_FileList.GetUpperBound()].m_strFileName)) { + m_FileList[m_FileList.GetUpperBound()] = newElement; + return m_FileList.GetUpperBound(); + } + + // Other + INT_PTR nLeft = 0; + INT_PTR nRight = m_FileList.GetUpperBound(); + INT_PTR nCurrent; + + while(nRight - nLeft > 1) { + nCurrent = (nRight + nLeft) >> 1; // divide by 2 + + if (MakeLower(newElement.m_strFileName) == MakeLower(m_FileList[nCurrent].m_strFileName)) { + m_FileList[nCurrent] = newElement; + return nCurrent; + } + else if (MakeLower(newElement.m_strFileName) < MakeLower(m_FileList[nCurrent].m_strFileName)) { + nRight = nCurrent; + } + else { + nLeft = nCurrent; + } + } + + m_FileList.InsertAt(nLeft + 1, newElement); + return (nLeft + 1); +} + +void CFileList2::RemoveAt(INT_PTR nIndex) +{ + m_FileList.RemoveAt(nIndex); +} + +CFileDescriptor2& CFileList2::operator [] (INT_PTR nIndex) +{ + return m_FileList[nIndex]; +} + +CFileDescriptor2 CFileList2::operator [] (INT_PTR nIndex) const +{ + return m_FileList[nIndex]; +} + +#ifdef _DEBUG +void CFileList2::AssertValid() const +{ + CObject::AssertValid(); + m_FileList.AssertValid(); + + for(INT_PTR i = 0; i < m_FileList.GetSize(); i++) { + m_FileList[i].AssertValid(); + } +} + +template<> +void AFXAPI DumpElements(CDumpContext& dc, const CFileDescriptor2* pElements, INT_PTR nCount) +{ + ASSERT(nCount == 0 || + AfxIsValidAddress(pElements, (size_t)nCount * sizeof(CFileDescriptor2), FALSE)); + + for(INT_PTR i = 0; i < nCount; i++) { + dc << "Element " << i << ":\n"; + pElements[i].Dump(dc); + } +} + +void CFileList2::Dump(CDumpContext& dc) const +{ + CObject::Dump(dc); + dc.SetDepth(1); + m_FileList.Dump(dc); +} +#endif + + +// CDatFile2 +IMPLEMENT_DYNAMIC(CDatFile2, CObject) + +CDatFile2::CDatFile2() +{ +} + +CDatFile2::~CDatFile2() +{ + Close(); +} + +BOOL CDatFile2::Open(LPCTSTR lpszFileName, UINT nOpenFlags) +{ + if (!m_Dat.Open(lpszFileName, nOpenFlags)) { + return FALSE; + } + + if (m_Dat.GetLength() == 0) { + return TRUE; + } + + DWORD dwDatLength; + DWORD dwFileListLength; + + ULONGLONG ullFileLength = m_Dat.GetLength(); + + if (ullFileLength < 12) { + m_Dat.Close(); + return FALSE; + } + + m_Dat.Seek(-8, CFile::end); + m_Dat.Read(&dwFileListLength, sizeof(dwFileListLength)); + m_Dat.Read(&dwDatLength, sizeof(dwDatLength)); + + if ((dwDatLength < 12) || (dwDatLength != ullFileLength)) { + m_Dat.Close(); + return FALSE; + } + + m_Dat.Seek(dwDatLength - dwFileListLength - 8, CFile::begin); + + CArchive arFileList(&m_Dat, CArchive::load); + + m_FileList.Serialize(arFileList); + return TRUE; +} + +void CDatFile2::Close() +{ + Flush(); + + if (m_Dat.m_hFile != CFile::hFileNull) { + m_Dat.Close(); + } +} + +void CDatFile2::Flush() +{ + if (m_bNeedFlush) { + ULONGLONG ullLength; + + TRY { + ullLength = m_Dat.SeekToEnd(); + CArchive arFileList(&m_Dat, CArchive::store); + m_FileList.Serialize(arFileList); + arFileList.Flush(); + DWORD dwTotalLength = DWORD(m_Dat.GetLength()) + 4; + m_Dat.Write(&dwTotalLength, sizeof(dwTotalLength)); + m_bNeedFlush = FALSE; + } + + CATCH_ALL(e) { + m_Dat.SetLength(ullLength); + THROW_LAST(); + } + + END_CATCH_ALL + } +} + +INT_PTR CDatFile2::GetFileCount() +{ + return m_FileList.GetSize(); +} + +CFileDescriptorBase CDatFile2::operator [](INT_PTR nIndex) const +{ + return m_FileList[nIndex]; +} + +INT_PTR CDatFile2::FindNext() +{ + for(++m_nCurrent; m_nCurrent < m_FileList.GetSize(); m_nCurrent++) { + if (MatchPattern(m_FileList[m_nCurrent].m_strFileName, m_strPattern, FALSE)) { + break; + } + } + + if (m_nCurrent == m_FileList.GetSize()) { + m_nCurrent = -1; + } + + return m_nCurrent; +} + +BOOL CDatFile2::Inflate(CArchive& ar) +{ + if (m_nCurrent == -1) { + return FALSE; + } + + CFileDescriptorBase descriptor = m_FileList[m_nCurrent]; + + m_Dat.Seek(descriptor.m_dwOffset, CFile::begin); + + const DWORD c_dwBufferSize = 65536; + BYTE inBuffer[c_dwBufferSize]; + BYTE outBuffer[c_dwBufferSize]; + + DWORD dwBytesLeft = descriptor.m_dwPackedFileLength; + DWORD dwBytesToRead; + DWORD dwRead; + DWORD dwBytesOut = 0; + + // Uncompressed file + if (descriptor.m_nType == 0) { + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwRead = m_Dat.Read(inBuffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + return FALSE; + } + + ar.Write(inBuffer, dwBytesToRead); + dwBytesOut += dwRead; + } while((dwBytesLeft -= dwRead ) > 0); + + return TRUE; + } + + int rc; + z_stream stream; + + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + stream.opaque = Z_NULL; + stream.next_in = Z_NULL; + stream.avail_in = 0; + + rc = ::inflateInit(&stream); + + if (rc != Z_OK) { + return FALSE; + } + + stream.next_out = outBuffer; + stream.avail_out = c_dwBufferSize; + + BOOL bNeedData = TRUE; + BOOL bResult = TRUE; + BOOL bEndLoop = FALSE; + BOOL bWriteOutData = FALSE; + + do { + if (bNeedData) { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwRead = m_Dat.Read(inBuffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + bResult = FALSE; + bWriteOutData = FALSE; + break; + } + else { + dwBytesLeft -= dwRead; + } + + stream.next_in = inBuffer; + stream.avail_in = dwRead; + bNeedData = FALSE; + } + + rc = ::inflate(&stream, Z_SYNC_FLUSH); + + switch(rc) { + case Z_OK: { + if (stream.avail_in == 0) { + if (dwBytesLeft != 0) { + // Need more input + bNeedData = TRUE; + } + else { + // All data inflated, but Z_STREAM_END not returned + bEndLoop = TRUE; + bWriteOutData = TRUE; + break; + } + } + + if (stream.avail_out == 0) { // Need more output + bWriteOutData = TRUE; + } + + break; + } + + case Z_STREAM_END: { // Inflated + bEndLoop = TRUE; + bWriteOutData = TRUE; + break; + } + + default: { // Error + bEndLoop = TRUE; + bResult = FALSE; + } + } + + if (bWriteOutData) { + ar.Write(outBuffer, c_dwBufferSize - stream.avail_out); + bWriteOutData = FALSE; + stream.next_out = outBuffer; + stream.avail_out = c_dwBufferSize; + } + } while(!bEndLoop); + + rc = ::inflateEnd(&stream); + return bResult; +} + +BOOL CDatFile2::Deflate(CArchive& ar, DWORD dwLength, LPCTSTR lpszName, int level) +{ + // Cut tail of file with files list + if (m_Dat.GetLength() != 0) { + if (!m_bNeedFlush) { + DWORD dwDatLength; + DWORD dwFileListLength; + + m_Dat.Seek(-8, CFile::end); + m_Dat.Read(&dwFileListLength, sizeof(dwFileListLength)); + m_Dat.Read(&dwDatLength, sizeof(dwDatLength)); + m_Dat.SetLength(dwDatLength - dwFileListLength - 8); + } + } + + ULONGLONG ullDatLength = m_Dat.SeekToEnd(); + + // File descriptor + CFileDescriptor2 descriptor; + descriptor.m_dwFileLength = dwLength; + descriptor.m_strFileName = lpszName; + descriptor.m_dwOffset = DWORD(ullDatLength); + + // Buffers + const DWORD c_dwBufferSize = 65536; + BYTE inBuffer[c_dwBufferSize]; + BYTE outBuffer[c_dwBufferSize]; + + DWORD dwBytesLeft = dwLength; + DWORD dwBytesToRead; + DWORD dwRead; + DWORD dwBytesOut = 0; + + // Flags + BOOL bResult = TRUE; + BOOL bUseInputArchive = TRUE; + + // Temporary file + char lpszTempFileName[MAX_PATH]; + CFile fileTemp; + BOOL bDeleteTempFile = FALSE; + + // Try compress file + if (level != 0) { + // Save position in input archive + ar.Flush(); + ULONGLONG ullArPosition = ar.GetFile()->GetPosition(); + + // Create temporary file + char lpszTempPath[MAX_PATH - 14]; + HANDLE hTempFile; + + GetTempPath(MAX_PATH - 14, lpszTempPath); + GetTempFileName(lpszTempPath, "DAT", 0, lpszTempFileName); + + hTempFile = ::CreateFile(lpszTempFileName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_TEMPORARY, + NULL); + + if (hTempFile == INVALID_HANDLE_VALUE) { + return FALSE; + } + + fileTemp.m_hFile = hTempFile; + bDeleteTempFile = TRUE; + + // Deflate file + if (level < 0 || level > 9) { + level = 9; + } + + int rc; + z_stream stream; + int flush; + + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + stream.opaque = Z_NULL; + stream.next_in = Z_NULL; + stream.avail_in = 0; + + rc = ::deflateInit(&stream, level); + + if (rc != Z_OK) { + return FALSE; + } + + stream.next_out = outBuffer; + stream.avail_out = c_dwBufferSize; + + BOOL bNeedData = TRUE; + BOOL bEndLoop = FALSE; + BOOL bWriteOutData = FALSE; + + do { + if (bNeedData) { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwRead = ar.Read(inBuffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + bResult = FALSE; + bWriteOutData = FALSE; + break; + } + else { + dwBytesLeft -= dwRead; + flush = (dwBytesLeft == 0) ? Z_FINISH : Z_SYNC_FLUSH; + } + + stream.next_in = inBuffer; + stream.avail_in = dwRead; + + bNeedData = FALSE; + } + + rc = ::deflate(&stream, flush); + + switch(rc) { + case Z_OK: { + if (stream.avail_in == 0) { // Need more input + bNeedData = TRUE; + } + + if (stream.avail_out == 0) { // Need more output + bWriteOutData = TRUE; + } + + break; + } + + case Z_STREAM_END: { // Deflated + bEndLoop = TRUE; + bWriteOutData = TRUE; + break; + } + + default: { // Error + bEndLoop = TRUE; + bResult = FALSE; + } + } + + if (bWriteOutData) { + fileTemp.Write(outBuffer, c_dwBufferSize - stream.avail_out); + bWriteOutData = FALSE; + stream.next_out = outBuffer; + stream.avail_out = c_dwBufferSize; + } + } while(!bEndLoop); + + rc = ::deflateEnd(&stream); + fileTemp.SeekToBegin(); + + // Check compression result + if (!bResult) { + fileTemp.Close(); + CFile::Remove(lpszTempFileName); + return FALSE; + } + + // Check length + ULONGLONG ullTempFileLength = fileTemp.GetLength(); + + if (ullTempFileLength < dwLength) { + bUseInputArchive = FALSE; + descriptor.m_dwPackedFileLength = DWORD(ullTempFileLength); + descriptor.m_nType = 1; + dwBytesLeft = DWORD(ullTempFileLength); + } + else { + ar.Flush(); + ar.GetFile()->Seek(ullArPosition, CFile::begin); + descriptor.m_dwPackedFileLength = dwLength; + descriptor.m_nType = 0; + dwBytesLeft = dwLength; + } + } + else { + descriptor.m_dwPackedFileLength = dwLength; + descriptor.m_nType = 0; + } + + // Set source archive + CArchive arTemp(&fileTemp, CArchive::load); // Temporary archive + CArchive* pArSource; + + if (bUseInputArchive) { + pArSource = &ar; + } + else { + pArSource = &arTemp; + } + + // Write data + TRY { + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + dwRead = pArSource->Read(inBuffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + bResult = FALSE; + break; + } + + m_Dat.Write(inBuffer, dwBytesToRead); + dwBytesOut += dwRead; + } while((dwBytesLeft -= dwRead ) > 0); + + if (bResult) { + // Add descriptor + m_FileList.Add(descriptor); + m_bNeedFlush = TRUE; + } + else { + // Restore dat-file length on error + m_Dat.SetLength(ullDatLength); + } + + // Destroy temporary file + if (bDeleteTempFile) { + arTemp.Abort(); + fileTemp.Close(); + CFile::Remove(lpszTempFileName); + } + + return bResult; + } + + CATCH_ALL(e) { + m_Dat.SetLength(ullDatLength); + THROW_LAST(); + } + + END_CATCH_ALL +} + +BOOL CDatFile2::Delete() +{ + if (m_nCurrent == -1) { + return FALSE; + } + + // Cut tail of file with files list + if (m_Dat.GetLength() != 0) { + if (!m_bNeedFlush) { + DWORD dwDatLength; + DWORD dwFileListLength; + + m_Dat.Seek(-8, CFile::end); + m_Dat.Read(&dwFileListLength, sizeof(dwFileListLength)); + m_Dat.Read(&dwDatLength, sizeof(dwDatLength)); + m_Dat.SetLength(dwDatLength - dwFileListLength - 8); + } + } + + m_FileList.RemoveAt(m_nCurrent); + m_nCurrent = -1; + m_bNeedFlush = TRUE; + + return TRUE; +} + + +CDatFile2* g_pDatFile2ForSort; + +int CompareDescriptorIndex2(const void* pIndex1, const void* pIndex2) +{ + INT_PTR nIndex1 = *((INT_PTR*)pIndex1); + INT_PTR nIndex2 = *((INT_PTR*)pIndex2); + + CFileDescriptorBase descriptor1; + CFileDescriptorBase descriptor2; + + descriptor1 = (*g_pDatFile2ForSort)[nIndex1]; + descriptor2 = (*g_pDatFile2ForSort)[nIndex2]; + + if (descriptor1.m_dwOffset < descriptor2.m_dwOffset) { + return -1; + } + else if (descriptor1.m_dwOffset > descriptor2.m_dwOffset) { + return 1; + } + else { + return 0; + } +} + +BOOL CDatFile2::Shrink(void (*pCallback)(INT_PTR nIndex)) +{ + if (m_Dat.GetLength() == 0) { + return FALSE; + } + + // Sort files by offset + INT_PTR nFileCount = GetFileCount(); + INT_PTR* pIndexArray = new INT_PTR[nFileCount]; + + if (pIndexArray == NULL) { + return FALSE; + } + + for(INT_PTR i = 0; i < nFileCount; i++) { + pIndexArray[i] = i; + } + + g_pDatFile2ForSort = this; + qsort(pIndexArray, nFileCount, sizeof(INT_PTR), CompareDescriptorIndex2); + + // Move files + const DWORD c_dwBufferSize = 65536; + BYTE buffer[c_dwBufferSize]; + + DWORD dwWritePos = 0; + DWORD dwShift; + DWORD dwBytesToRead; + DWORD dwBytesLeft; + DWORD dwReadPos; + DWORD dwRead; + + CFileDescriptorBase descriptor; + + for(INT_PTR i = 0; i < nFileCount; i++) { + descriptor = (*this)[pIndexArray[i]]; + dwShift = descriptor.m_dwOffset - dwWritePos; + + if (dwShift > 0) { + if (pCallback) { + pCallback(pIndexArray[i]); + } + + if (!m_bNeedFlush) { + DWORD dwDatLength; + DWORD dwFileListLength; + + m_Dat.Seek(-8, CFile::end); + m_Dat.Read(&dwFileListLength, sizeof(dwFileListLength)); + m_Dat.Read(&dwDatLength, sizeof(dwDatLength)); + m_Dat.SetLength(dwDatLength - dwFileListLength - 8); + m_bNeedFlush = TRUE; + } + + dwBytesLeft = descriptor.m_dwPackedFileLength; + dwReadPos = descriptor.m_dwOffset; + + descriptor.m_dwOffset = dwWritePos; + + do { + dwBytesToRead = (dwBytesLeft < c_dwBufferSize) ? dwBytesLeft : c_dwBufferSize; + + m_Dat.Seek(dwReadPos, CFile::begin); + dwRead = m_Dat.Read(buffer, dwBytesToRead); + + if (dwRead != dwBytesToRead) { + delete [] pIndexArray; + return FALSE; + } + + m_Dat.Seek(dwWritePos, CFile::begin); + m_Dat.Write(buffer, dwRead); + dwWritePos += dwRead; + dwReadPos += dwRead; + } while((dwBytesLeft -= dwRead ) > 0); + + // Patch offsets + m_FileList[pIndexArray[i]].m_dwOffset = descriptor.m_dwOffset; + } + else { + dwWritePos += descriptor.m_dwPackedFileLength; + } + } + + m_Dat.SetLength(dwWritePos); + delete [] pIndexArray; + + m_bNeedFlush = TRUE; + + Flush(); + + return TRUE; +} diff --git a/src/DatFile2.h b/src/DatFile2.h new file mode 100644 index 0000000..ac5c146 --- /dev/null +++ b/src/DatFile2.h @@ -0,0 +1,90 @@ +#pragma once + +#include "DatFileBase.h" + +// CFileDescriptor2 +class CFileDescriptor2 : public CFileDescriptorBase { +public: + CFileDescriptor2(); + CFileDescriptor2(const CFileDescriptor2& item); + virtual ~CFileDescriptor2(); + + DECLARE_DYNAMIC(CFileDescriptor2) + + virtual void Serialize(CArchive& ar); + int GetSize() const; + + CFileDescriptor2& operator = (const CFileDescriptor2& item); + +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif +}; + + +// CFileList2 +class CFileList2 : public CObject { +public: + CFileList2(); + virtual ~CFileList2(); + + DECLARE_DYNAMIC(CFileList2) + + virtual void Serialize(CArchive& ar); + INT_PTR GetSize() const; + + INT_PTR Add(const CFileDescriptor2& newElement); + void RemoveAt(INT_PTR nIndex); + + CFileDescriptor2& operator [] (INT_PTR nIndex); + CFileDescriptor2 operator [] (INT_PTR nIndex) const; + +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +private: + // Assignment and copy not allowed + CFileList2(const CFileList2&); + CFileList2& operator = (const CFileList2&); + +private: + typedef CArray CFileDescriptor2Array; + + CFileDescriptor2Array m_FileList; +}; + +// CDatFile2 +class CDatFile2 : public CDatFileBase { +public: + CDatFile2(); + virtual ~CDatFile2(); + + DECLARE_DYNAMIC(CDatFile2) + + virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags); + virtual void Close(); + virtual void Flush(); + + virtual INT_PTR GetFileCount(); + virtual CFileDescriptorBase operator [](INT_PTR nIndex) const; + + virtual INT_PTR FindNext(); + + virtual BOOL Inflate(CArchive& ar); + virtual BOOL Deflate(CArchive& ar, DWORD dwLength, LPCTSTR lpszName, int level); + virtual BOOL Delete(); + + virtual BOOL Shrink(void (*pCallback)(INT_PTR nIndex)); + +private: + // Restricted operations + CDatFile2(const CDatFile2&); + CDatFile2& operator = (const CDatFile2&); + virtual void Serialize(CArchive&) {}; + +private: + CFileList2 m_FileList; +}; diff --git a/src/DatFileBase.cpp b/src/DatFileBase.cpp new file mode 100644 index 0000000..8f5acaf --- /dev/null +++ b/src/DatFileBase.cpp @@ -0,0 +1,163 @@ +// DatFile.cpp : implementation file +// + +#include "stdafx.h" +#include "DatFileBase.h" +#include ".\datfilebase.h" + +#if defined(_UNICODE) || defined(UNICODE) +#error UNICODE not supported +#endif + +// Utility function +CString MakeLower(CString str) +{ + return str.MakeLower(); +} + +// CFileDescriptorBase +IMPLEMENT_DYNAMIC(CFileDescriptorBase, CObject) + +CFileDescriptorBase::CFileDescriptorBase() : + m_strFileName(""), + m_nType(0), + m_dwFileLength(0), + m_dwPackedFileLength(0), + m_dwOffset(0) +{ +} + +CFileDescriptorBase::CFileDescriptorBase(const CFileDescriptorBase& item) : + m_strFileName(item.m_strFileName), + m_nType(item.m_nType), + m_dwFileLength(item.m_dwFileLength), + m_dwPackedFileLength(item.m_dwPackedFileLength), + m_dwOffset(item.m_dwOffset) +{ +} + +CFileDescriptorBase::~CFileDescriptorBase() +{ +} + +CFileDescriptorBase& CFileDescriptorBase::operator = (const CFileDescriptorBase& item) +{ + if (&item != this) { + m_strFileName = item.m_strFileName; + m_nType = item.m_nType; + m_dwFileLength = item.m_dwFileLength; + m_dwPackedFileLength = item.m_dwPackedFileLength; + m_dwOffset = item.m_dwOffset; + } + + return (*this); +} + +void CFileDescriptorBase::Serialize(CArchive& ar) +{ + ASSERT(FALSE); +} + +#ifdef _DEBUG +void CFileDescriptorBase::AssertValid() const +{ + CObject::AssertValid(); + ASSERT(!m_strFileName.IsEmpty()); + ASSERT(m_nType <= 1); + ASSERT(m_dwFileLength != 0); + ASSERT(m_dwPackedFileLength != 0); + ASSERT(m_dwPackedFileLength >= m_dwFileLength); +} + +void CFileDescriptorBase::Dump(CDumpContext& dc) const +{ + CObject::Dump(dc); + dc << "File name length:\t" << m_strFileName.GetLength() << "\n"; + dc << "File name:\t\t\t" << m_strFileName << "\n"; + dc << "Type:\t\t\t\t" << m_nType << "\n"; + dc << "File length:\t\t\t" << m_dwFileLength << " ("; + dc.DumpAsHex(m_dwFileLength); + dc << ")\n"; + dc << "Packed file length:\t" << m_dwPackedFileLength << " ("; + dc.DumpAsHex(m_dwPackedFileLength); + dc << ")\n"; + dc << "Offset:\t\t\t\t" << m_dwOffset << " ("; + dc.DumpAsHex(m_dwOffset); + dc << ")\n"; +} +#endif + +// CDatFileBase +IMPLEMENT_DYNAMIC(CDatFileBase, CObject) + +CDatFileBase::CDatFileBase() : + m_strPattern("*"), + m_bNeedFlush(FALSE), + m_nCurrent(-1) +{ +} + +CDatFileBase::~CDatFileBase() +{ +} + +DWORD CDatFileBase::GetLength(void) +{ + return DWORD(m_Dat.GetLength()); +} + +INT_PTR CDatFileBase::FindFirst(LPCTSTR lpszPattern) +{ + m_strPattern = lpszPattern; + m_nCurrent = -1; + return FindNext(); +} + +INT_PTR CDatFileBase::GetCurrentFileIndex() +{ + return m_nCurrent; +} + +CString CDatFileBase::GetFindFilePattern() +{ + return m_strPattern; +} + +BOOL CDatFileBase::MatchPattern(LPCTSTR lpszString, LPCTSTR lpszPattern, BOOL bCaseSensitive) +{ + char c, p; + + for(; ;) { + switch(p = ConvertCase(*lpszPattern++, bCaseSensitive)) { + case 0: // end of lpszPattern + return *lpszString ? FALSE : TRUE; // if end of lpszString TRUE + + case '*': + while (*lpszString) { // match zero or more char + if (MatchPattern(lpszString++, lpszPattern, bCaseSensitive)) + return TRUE; + } + + return MatchPattern (lpszString, lpszPattern, bCaseSensitive ); + + case '?': + if (*lpszString++ == 0) // match any one char + return FALSE; // not end of lpszString + + break; + + default: + c = ConvertCase(*lpszString++, bCaseSensitive); + + if (c != p) // check for exact char + return FALSE; // not a match + + break; + } + } +} + +char CDatFileBase::ConvertCase(char c, BOOL bCaseSensetive) +{ + return bCaseSensetive ? c : char(CharUpper(LPTSTR(c))); +} diff --git a/src/DatFileBase.h b/src/DatFileBase.h new file mode 100644 index 0000000..dcad5a1 --- /dev/null +++ b/src/DatFileBase.h @@ -0,0 +1,71 @@ +#pragma once + +// CFileDescriptorBase +class CFileDescriptorBase : public CObject { +public: + CFileDescriptorBase(); + CFileDescriptorBase(const CFileDescriptorBase& item); + virtual ~CFileDescriptorBase(); + + DECLARE_DYNAMIC(CFileDescriptorBase) + + virtual void Serialize(CArchive& ar); + + CFileDescriptorBase& operator = (const CFileDescriptorBase& item); + +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +public: + CString m_strFileName; + BYTE m_nType; + DWORD m_dwFileLength; + DWORD m_dwPackedFileLength; + DWORD m_dwOffset; +}; + + +// CDatFileBase +class CDatFileBase : public CObject { +public: + CDatFileBase(); + virtual ~CDatFileBase(); + + DECLARE_DYNAMIC(CDatFileBase) + + virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags) = 0; + virtual void Close() = 0; + virtual void Flush() = 0; + + DWORD GetLength(); + + virtual INT_PTR GetFileCount() = 0; + virtual CFileDescriptorBase operator [](INT_PTR nIndex) const = 0; + + INT_PTR FindFirst(LPCTSTR lpszPattern); + virtual INT_PTR FindNext() = 0; + INT_PTR GetCurrentFileIndex(); + CString GetFindFilePattern(); + + virtual BOOL Inflate(CArchive& ar) = 0; + virtual BOOL Deflate(CArchive& ar, DWORD dwLength, LPCTSTR lpszName, int level) = 0; + virtual BOOL Delete() = 0; + virtual BOOL Shrink(void (*pCallback)(INT_PTR nIndex)) = 0; + +protected: + BOOL MatchPattern(LPCTSTR lpszString, LPCTSTR lpszPattern, BOOL bCaseSensitive); + char ConvertCase(char c, BOOL bCaseSensetive); + +protected: + CString m_strPattern; + CFile m_Dat; + + BOOL m_bNeedFlush; + INT_PTR m_nCurrent; +}; + + +// Utility function +CString MakeLower(CString str); diff --git a/src/LZ77C.cpp b/src/LZ77C.cpp new file mode 100644 index 0000000..47be675 --- /dev/null +++ b/src/LZ77C.cpp @@ -0,0 +1,304 @@ +#include "stdafx.h" + +#define N 4096 /* size of ring buffer */ +#define F 18 /* upper limit for match_length */ +#define THRESHOLD 2 /* encode string into position and length if match_length is greater than this */ +#define NIL N /* index for root of binary search trees */ + +//unsigned long int textsize = 0; /* text size counter */ +//unsigned long int codesize = 0; /* code size counter */ + +BYTE text_buf[N + F - 1]; /* Ring buffer of size N, with extra F-1 bytes to facilitate string comparison */ + +int match_position; /* Longest match. These are set by the InsertNode() procedure. */ +int match_length; + +int lson[N + 1]; /* left children */ +int rson[N + 257]; /* right children */ +int dad[N + 1]; /* parents -- These constitute binary search trees. */ + +void InitTree() +{ + int i; + + for(i = N + 1; i <= N + 256; i++) { + rson[i] = NIL; + } + + for(i = 0; i < N; i++) { + dad[i] = NIL; + } +} + +void InsertNode(int r) +{ + int i; + int p; + int cmp; + BYTE* key; + + cmp = 1; + key = &text_buf[r]; + p = N + 1 + key[0]; + + rson[r] = lson[r] = NIL; + match_length = 0; + + for( ; ; ) { + if (cmp >= 0) { + if (rson[p] != NIL) { + p = rson[p]; + } + else { + rson[p] = r; + dad[r] = p; + return; + } + } + else { + if (lson[p] != NIL) { + p = lson[p]; + } + else { + lson[p] = r; + dad[r] = p; + return; + } + } + + for (i = 1; i < F; i++) { + if ((cmp = key[i] - text_buf[p + i]) != 0) { + break; + } + } + + if (i > match_length) { + match_position = p; + + if ((match_length = i) >= F) { + break; + } + } + } + + dad[r] = dad[p]; + lson[r] = lson[p]; + rson[r] = rson[p]; + + dad[lson[p]] = r; + dad[rson[p]] = r; + + if (rson[dad[p]] == p) { + rson[dad[p]] = r; + } + else { + lson[dad[p]] = r; + } + + dad[p] = NIL; /* remove p */ +} + +void DeleteNode(int p) +{ + int q; + + if (dad[p] == NIL) { + return; /* not in tree */ + } + + if (rson[p] == NIL) { + q = lson[p]; + } + else if (lson[p] == NIL) { + q = rson[p]; + } + else { + q = lson[p]; + + if (rson[q] != NIL) { + do { + q = rson[q]; + } while (rson[q] != NIL); + + rson[dad[q]] = lson[q]; + dad[lson[q]] = dad[q]; + lson[q] = lson[p]; + dad[lson[p]] = q; + } + + rson[q] = rson[p]; + dad[rson[p]] = q; + } + + dad[q] = dad[p]; + + if (rson[dad[p]] == p) { + rson[dad[p]] = q; + } + else { + lson[dad[p]] = q; + } + + dad[p] = NIL; +} + +#define GETBYTE() ((dwInputCurrent < dwInputLength) ? int(buffer[dwInputCurrent++]) & 0xFF : (-1)) + +void LZSSEncodeBuffer(BYTE* buffer, DWORD dwInputLength, CFile& fileOut) +{ + ASSERT(buffer); + + int i; + int c; + int len; + int r; + int s; + int last_match_length; + int code_buf_ptr; + + BYTE code_buf[17]; + BYTE mask; + + DWORD dwInputCurrent = 0; + + InitTree(); + + code_buf[0] = 0; + code_buf_ptr = mask = 1; + s = 0; + r = N - F; + + for(i = s; i < r; i++) { + text_buf[i] = ' '; + } + + for(len = 0; len < F && (c = GETBYTE()) != (-1); len++) { + text_buf[r + len] = c; + } + + if (len == 0) { + return; + } + + for(i = 1; i <= F; i++) { + InsertNode(r - i); + } + + InsertNode(r); + + do { + if (match_length > len) { + match_length = len; + } + + if (match_length <= THRESHOLD) { + match_length = 1; + code_buf[0] |= mask; + code_buf[code_buf_ptr++] = text_buf[r]; + } + else { + code_buf[code_buf_ptr++] = (BYTE) match_position; + code_buf[code_buf_ptr++] = (BYTE)(((match_position >> 4) & 0xf0) | (match_length - (THRESHOLD + 1))); + } + + if ((mask <<= 1) == 0) { + for (i = 0; i < code_buf_ptr; i++) { + fileOut.Write(code_buf + i, 1); + } + + code_buf[0] = 0; + code_buf_ptr = mask = 1; + } + + last_match_length = match_length; + + for (i = 0; i < last_match_length && (c = GETBYTE()) != (-1); i++) { + DeleteNode(s); + text_buf[s] = c; + + if (s < F - 1) { + text_buf[s + N] = c; + } + + s = (s + 1) & (N - 1); + r = (r + 1) & (N - 1); + InsertNode(r); + } + + while (i++ < last_match_length) { + DeleteNode(s); + s = (s + 1) & (N - 1); + r = (r + 1) & (N - 1); + + if (--len) { + InsertNode(r); + } + } + } while(len > 0); + + if (code_buf_ptr > 1) { + for (i = 0; i < code_buf_ptr; i++) { + fileOut.Write(code_buf + i, 1); + } + } +} + +void LZSSDecodeBuffer(BYTE* buffer, DWORD dwInputLength, CArchive& arOut) +{ + ASSERT(buffer); + + int i; + int j; + int k; + int r; + int c; + unsigned int flags; + + DWORD dwInputCurrent = 0; + + for (i = 0; i < N - F; i++) { + text_buf[i] = ' '; + } + + r = N - F; + flags = 0; + + for ( ; ; ) { + if (((flags >>= 1) & 256) == 0) { + if ((c = GETBYTE()) == (-1)) { + break; + } + + flags = c | 0xff00; /* uses higher byte cleverly */ + } /* to count eight */ + + if (flags & 1) { + if ((c = GETBYTE()) == (-1)) { + break; + } + + arOut.Write(&c, 1); + text_buf[r++] = c; + r &= (N - 1); + } + else { + if ((i = GETBYTE()) == (-1)) { + break; + } + + if ((j = GETBYTE()) == (-1)) { + break; + } + + i |= ((j & 0xf0) << 4); + j = (j & 0x0f) + THRESHOLD; + + for (k = 0; k <= j; k++) { + c = text_buf[(i + k) & (N - 1)]; + arOut.Write(&c, 1); + text_buf[r++] = c; + r &= (N - 1); + } + } + } +} diff --git a/src/LZ77C.h b/src/LZ77C.h new file mode 100644 index 0000000..e5d260f --- /dev/null +++ b/src/LZ77C.h @@ -0,0 +1,7 @@ +#ifndef LZ77C_H +#define LZ77C_H + +void LZSSEncodeBuffer(BYTE* buffer, DWORD dwInputLength, CFile& fileOut); +void LZSSDecodeBuffer(BYTE* buffer, DWORD dwInputLength, CArchive& arOut); + +#endif /* LZ77C_H */ diff --git a/src/OnAdd.cpp b/src/OnAdd.cpp new file mode 100644 index 0000000..e0f1e37 --- /dev/null +++ b/src/OnAdd.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" +#include "dat2.h" +#include "Util.h" + +extern CString g_strTargetDir; + +DWORD g_dwTotalAdded; + +BOOL ProcessTree(CString strPattern, CString strRoot, BOOL bRecursive) +{ + BOOL bResult = TRUE; + + CString strPath = ExtractFilePath(strPattern); + CString strFilePattern = ExtractFileName(strPattern); + + WIN32_FIND_DATA fd; + HANDLE hSearchHandle = FindFirstFile(strPattern, &fd); + + if (hSearchHandle != INVALID_HANDLE_VALUE) { + do { + if (CString(fd.cFileName) != CString(_T(".")) && + CString(fd.cFileName) != CString(_T(".."))) { + + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + if (bRecursive) { + ProcessTree(strPath + fd.cFileName + "\\" + strFilePattern, + strRoot.IsEmpty() ? fd.cFileName : strRoot + "\\" + fd.cFileName, // + _T("\\"), + bRecursive); + } + } + else { + CFile fileIn; + + if (fileIn.Open(strPath + fd.cFileName, CFile::modeRead | CFile::shareDenyWrite)) { + CArchive arIn(&fileIn, CArchive::load); + CString strFileDescriptorName = g_strTargetDir; + strFileDescriptorName += strRoot.IsEmpty() ? fd.cFileName : strRoot + _T("\\") + fd.cFileName; + + printf("Adding: %s", strFileDescriptorName); + + if (g_pDatFile->Deflate(arIn, DWORD(fileIn.GetLength()), + strFileDescriptorName, g_nCompressMethod)) { + printf("\n"); + g_dwTotalAdded++; + } + else { + printf(" Error!!!\n"); + bResult = FALSE; + break; + } + } + else { + bResult = FALSE; + break; + } + } + } + } while(FindNextFile(hSearchHandle, &fd)); + + FindClose(hSearchHandle); + return bResult; + } + else { + return FALSE; + } +} + +int OnAdd() +{ + g_dwTotalAdded = 0; + + if (g_pDatFile->Open(g_strDatFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyWrite)) { + for(INT_PTR j = 0; j < g_FileList.GetCount(); j++) { + CString strRoot = ExtractFilePath(g_FileList[j], FALSE); + + if (strRoot[0] == '\\') { + strRoot = strRoot.Right(strRoot.GetLength() - 1); + } + + if (strRoot.Right(1) == '\\') { + strRoot = strRoot.Left(strRoot.GetLength() - 1); + } + + if (!ProcessTree(g_FileList[j], strRoot, g_bRecurseIntoDir)) { + return 4; + } + } + + printf("----------\n"); + printf("%u file(s) added\n", g_dwTotalAdded); + + return 0; + } + else { + printf("Error: Unable open file %s\n", LPCTSTR(g_strDatFileName)); + return 1; + } +} \ No newline at end of file diff --git a/src/OnDelete.cpp b/src/OnDelete.cpp new file mode 100644 index 0000000..5b4bb31 --- /dev/null +++ b/src/OnDelete.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "dat2.h" + +int OnDelete() +{ + CFileDescriptorBase descriptor; + DWORD dwTotalDeleted = 0; + + for(INT_PTR j = 0; j < g_FileList.GetCount(); j++) { + if (g_pDatFile->FindFirst(g_FileList[j]) != -1) { + do { + descriptor = (*g_pDatFile)[g_pDatFile->GetCurrentFileIndex()]; + printf("Deleting: %s", descriptor.m_strFileName); + + if (g_pDatFile->Delete()) { + dwTotalDeleted++; + printf("\n"); + } + else { + printf(" Error!!!\n"); + return 2; + } + } while(g_pDatFile->FindNext() != -1); + } + } + + printf("----------\n"); + printf("%u file(s) deleted\n", dwTotalDeleted); + + return 0; +} \ No newline at end of file diff --git a/src/OnExtract.cpp b/src/OnExtract.cpp new file mode 100644 index 0000000..dd5b23c --- /dev/null +++ b/src/OnExtract.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "dat2.h" +#include "Util.h" + +int OnExtract() +{ + CFileDescriptorBase descriptor; + DWORD dwTotalExtracted = 0; + CString strDirectory; + CString strFileName; + int nLastSlashPos; + CString strOutFileName; + CFile fileOut; + + // Create output directory + if (!g_strOutFolder.IsEmpty()) { + if (!ForceCreateDirectory(g_strOutFolder)) { + printf("Error: Unable create output directory\n"); + return 3; + } + } + + for(INT_PTR j = 0; j < g_FileList.GetCount(); j++) { + if (g_pDatFile->FindFirst(g_FileList[j]) != -1) { + do { + descriptor = (*g_pDatFile)[g_pDatFile->GetCurrentFileIndex()]; + printf("Extracting: %s", descriptor.m_strFileName); + nLastSlashPos = descriptor.m_strFileName.ReverseFind('\\'); + strDirectory = descriptor.m_strFileName.Left(nLastSlashPos + 1); + strFileName = descriptor.m_strFileName.Right(descriptor.m_strFileName.GetLength() - nLastSlashPos - 1); + + + if (g_bExtractWithoutPaths) { + strOutFileName = g_strOutFolder + strFileName; + } + else { + if (!ForceCreateDirectory(g_strOutFolder + strDirectory)) { + return 3; + } + + strOutFileName = g_strOutFolder + strDirectory + strFileName; + } + + if (fileOut.Open(strOutFileName, CFile::modeCreate | CFile::modeWrite)) { + CArchive arOut(&fileOut, CArchive::store); + + if (g_pDatFile->Inflate(arOut)) { + dwTotalExtracted++; + printf("\n"); + } + else { + printf(" Error!!!\n"); + return 3; + } + } + else { + printf(" Error!!! Unable open out file %s\n", strOutFileName); + return 3; + } + + fileOut.Close(); + } while(g_pDatFile->FindNext() != -1); + } + } + + printf("----------\n"); + printf("%u file(s) extracted\n", dwTotalExtracted); + return 0; +} \ No newline at end of file diff --git a/src/OnList.cpp b/src/OnList.cpp new file mode 100644 index 0000000..8e032c8 --- /dev/null +++ b/src/OnList.cpp @@ -0,0 +1,28 @@ +#include "stdafx.h" +#include "dat2.h" + +int OnList() +{ + CFileDescriptorBase descriptor; + DWORD dwTotalSize = 0; + + printf(" Length Packed Type Name\n"); + printf(" ---------- ----------- -------- ---------------\n"); + + for(INT_PTR i = 0; i < g_pDatFile->GetFileCount(); i++) { + descriptor = (*g_pDatFile)[i]; + dwTotalSize += descriptor.m_dwFileLength; + printf("%11u %11u %s %s\n", + descriptor.m_dwFileLength, + descriptor.m_dwPackedFileLength, + (descriptor.m_nType) ? "Packed" : "Stored", + descriptor.m_strFileName); + } + + printf(" ---------- ---------------\n"); + printf("%11u %u file(s)\n", + dwTotalSize, + DWORD(g_pDatFile->GetFileCount())); + + return 0; +} \ No newline at end of file diff --git a/src/OnShrink.cpp b/src/OnShrink.cpp new file mode 100644 index 0000000..71b1e65 --- /dev/null +++ b/src/OnShrink.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "dat2.h" + + +DWORD dwTotalMoved = 0; + +void OutInfo(INT_PTR nIndex) +{ + CFileDescriptorBase descriptor; + descriptor = (*g_pDatFile)[nIndex]; + + + dwTotalMoved++; + printf("Moving: %s\n", descriptor.m_strFileName); +} + + +int OnShrink() +{ + DWORD dwOldLength = g_pDatFile->GetLength(); + + if (g_pDatFile->Shrink(OutInfo)) { + printf("----------\n"); + printf("%u file(s) moved. Old size: %u bytes. New size: %u bytes \n", dwTotalMoved, dwOldLength, g_pDatFile->GetLength()); + return 0; + } + else { + printf("Error: Unable shrink file\n"); + return 5; + } +} \ No newline at end of file diff --git a/src/Resource.h b/src/Resource.h new file mode 100644 index 0000000..65f5d14 --- /dev/null +++ b/src/Resource.h @@ -0,0 +1,15 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by dat2.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/Util.cpp b/src/Util.cpp new file mode 100644 index 0000000..25de972 --- /dev/null +++ b/src/Util.cpp @@ -0,0 +1,177 @@ +#include "stdafx.h" +#include "Util.h" + +CString ExtractFilePath(const CString& strFileName, BOOL bIncludeDrive) +{ + CString strDrive; + CString strDirectory; + LPTSTR lpszDrive = strDrive.GetBufferSetLength(_MAX_DRIVE); + LPTSTR lpszDirectory = strDirectory.GetBufferSetLength(_MAX_DIR); + _splitpath(strFileName, lpszDrive, lpszDirectory, NULL, NULL); + strDrive.ReleaseBuffer(); + strDirectory.ReleaseBuffer(); + + if (bIncludeDrive) { + return (strDrive + strDirectory); + } + else { + return strDirectory; + } +} + +CString ExtractFileName(const CString& strFileName) +{ + CString strName; + CString strExtension; + LPTSTR lpszName = strName.GetBufferSetLength(_MAX_FNAME); + LPTSTR lpszExtension = strExtension.GetBufferSetLength(_MAX_EXT); + _splitpath(strFileName, NULL, NULL, lpszName, lpszExtension); + strName.ReleaseBuffer(); + strExtension.ReleaseBuffer(); + return (strName + strExtension); +} + +BOOL DirectoryExist(const CString& strDirectory) +{ + DWORD dwResult = ::GetFileAttributes(strDirectory); + return ((dwResult != INVALID_FILE_ATTRIBUTES) && + ((dwResult & FILE_ATTRIBUTE_DIRECTORY) != 0)); +} + +BOOL ForceCreateDirectory(CString strDirectory) +{ + if (strDirectory.GetLength() == 0) { + return TRUE; + } + + if (strDirectory.Right(1) == _T("\\")) { + strDirectory = strDirectory.Left(strDirectory.GetLength() - 1); + } + + if ((strDirectory.GetLength() < 3) || + DirectoryExist(strDirectory) || + (ExtractFilePath(strDirectory) == strDirectory)) { + return TRUE; + } + + return (ForceCreateDirectory(ExtractFilePath(strDirectory)) && + ::CreateDirectory(strDirectory, NULL)); +} + +UINT ReadMSBWord(CArchive& ar, WORD& wValue) +{ + BYTE* pBuffer = reinterpret_cast(&wValue); + return (ar.Read(pBuffer + 1, 1) + ar.Read(pBuffer, 1)); +} + +UINT ReadMSBDWord(CArchive& ar, DWORD& dwValue) +{ + BYTE* pBuffer = reinterpret_cast(&dwValue); + return (ar.Read(pBuffer + 3, 1) + ar.Read(pBuffer + 2, 1) + + ar.Read(pBuffer + 1, 1) + ar.Read(pBuffer, 1)); +} + +UINT ReadMSBWord(CFile& file, WORD& wValue) +{ + BYTE* pBuffer = reinterpret_cast(&wValue); + return (file.Read(pBuffer + 1, 1) + file.Read(pBuffer, 1)); +} + +UINT ReadMSBDWord(CFile& file, DWORD& dwValue) +{ + BYTE* pBuffer = reinterpret_cast(&dwValue); + return (file.Read(pBuffer + 3, 1) + file.Read(pBuffer + 2, 1) + + file.Read(pBuffer + 1, 1) + file.Read(pBuffer, 1)); +} + +BOOL ReadString(CArchive& ar, CString& strString) +{ + BYTE nStrLength; + + if (ar.Read(&nStrLength, 1) != 1) { + return FALSE; + } + + LPTSTR lpszString = strString.GetBufferSetLength(nStrLength + 1); + DWORD dwRead = ar.Read(lpszString, nStrLength); + strString.ReleaseBuffer(nStrLength); + + if (dwRead != nStrLength) { + return FALSE; + } + else { + return TRUE; + } +} + +BOOL ReadString(CFile& file, CString& strString) +{ + BYTE nStrLength; + + if (file.Read(&nStrLength, 1) != 1) { + return FALSE; + } + + LPTSTR lpszString = strString.GetBufferSetLength(nStrLength + 1); + DWORD dwRead = file.Read(lpszString, nStrLength); + strString.ReleaseBuffer(nStrLength); + + if (dwRead != nStrLength) { + return FALSE; + } + else { + return TRUE; + } +} + +void WriteMSBWord(CArchive& ar, WORD wValue) +{ + BYTE* pBuffer = reinterpret_cast(&wValue); + + ar.Write(pBuffer + 1, 1); + ar.Write(pBuffer, 1); +} + +void WriteMSBDWord(CArchive& ar, DWORD dwValue) +{ + BYTE* pBuffer = reinterpret_cast(&dwValue); + + ar.Write(pBuffer + 3, 1); + ar.Write(pBuffer + 2, 1); + ar.Write(pBuffer + 1, 1); + ar.Write(pBuffer, 1); +} + +void WriteMSBWord(CFile& file, WORD wValue) +{ + BYTE* pBuffer = reinterpret_cast(&wValue); + + file.Write(pBuffer + 1, 1); + file.Write(pBuffer, 1); +} + +void WriteMSBDWord(CFile& file, DWORD dwValue) +{ + BYTE* pBuffer = reinterpret_cast(&dwValue); + + file.Write(pBuffer + 3, 1); + file.Write(pBuffer + 2, 1); + file.Write(pBuffer + 1, 1); + file.Write(pBuffer, 1); +} + +void WriteString(CArchive& ar, CString& strString) +{ + BYTE nStrLength = BYTE(strString.GetLength()); + + ar.Write(&nStrLength, 1); + ar.Write(LPCTSTR(strString), nStrLength); +} + +void WriteString(CFile& file, CString& strString) +{ + BYTE nStrLength = BYTE(strString.GetLength()); + + file.Write(&nStrLength, 1); + file.Write(LPCTSTR(strString), nStrLength); +} diff --git a/src/Util.h b/src/Util.h new file mode 100644 index 0000000..35d8c4d --- /dev/null +++ b/src/Util.h @@ -0,0 +1,24 @@ +#pragma once + +CString ExtractFileName(const CString& strFileName); +CString ExtractFilePath(const CString& strFileName, BOOL bIncludeDrive = TRUE); +BOOL DirectoryExist(const CString& strDirectory); +BOOL ForceCreateDirectory(CString strDirectory); + +UINT ReadMSBWord(CArchive& ar, WORD& wValue); +UINT ReadMSBDWord(CArchive& ar, DWORD& dwValue); + +UINT ReadMSBWord(CFile& file, WORD& wValue); +UINT ReadMSBDWord(CFile& file, DWORD& dwValue); + +BOOL ReadString(CArchive& ar, CString& strString); +BOOL ReadString(CFile& file, CString& strString); + +void WriteMSBWord(CArchive& ar, WORD wValue); +void WriteMSBDWord(CArchive& ar, DWORD dwValue); + +void WriteMSBWord(CFile& file, WORD wValue); +void WriteMSBDWord(CFile& file, DWORD dwValue); + +void WriteString(CArchive& ar, CString& strString); +void WriteString(CFile& file, CString& strString); diff --git a/src/XGetopt.cpp b/src/XGetopt.cpp new file mode 100644 index 0000000..0ba3d7a --- /dev/null +++ b/src/XGetopt.cpp @@ -0,0 +1,219 @@ +// XGetopt.cpp Version 1.2 +// +// Author: Hans Dietrich +// hdietrich2@hotmail.com +// +// Description: +// XGetopt.cpp implements getopt(), a function to parse command lines. +// +// History +// Version 1.2 - 2003 May 17 +// - Added Unicode support +// +// Version 1.1 - 2002 March 10 +// - Added example to XGetopt.cpp module header +// +// This software is released into the public domain. +// You are free to use it in any way you like. +// +// This software is provided "as is" with no expressed +// or implied warranty. I accept no liability for any +// damage or loss of business that this software may cause. +// +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// if you are using precompiled headers then include this line: +#include "stdafx.h" +/////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// if you are not using precompiled headers then include these lines: +//#include +//#include +//#include +/////////////////////////////////////////////////////////////////////////////// + + +#include "XGetopt.h" + + +/////////////////////////////////////////////////////////////////////////////// +// +// X G e t o p t . c p p +// +// +// NAME +// getopt -- parse command line options +// +// SYNOPSIS +// int getopt(int argc, TCHAR *argv[], TCHAR *optstring) +// +// extern TCHAR *optarg; +// extern int optind; +// +// DESCRIPTION +// The getopt() function parses the command line arguments. Its +// arguments argc and argv are the argument count and array as +// passed into the application on program invocation. In the case +// of Visual C++ programs, argc and argv are available via the +// variables __argc and __argv (double underscores), respectively. +// getopt returns the next option letter in argv that matches a +// letter in optstring. (Note: Unicode programs should use +// __targv instead of __argv. Also, all character and string +// literals should be enclosed in _T( ) ). +// +// optstring is a string of recognized option letters; if a letter +// is followed by a colon, the option is expected to have an argument +// that may or may not be separated from it by white space. optarg +// is set to point to the start of the option argument on return from +// getopt. +// +// Option letters may be combined, e.g., "-ab" is equivalent to +// "-a -b". Option letters are case sensitive. +// +// getopt places in the external variable optind the argv index +// of the next argument to be processed. optind is initialized +// to 0 before the first call to getopt. +// +// When all options have been processed (i.e., up to the first +// non-option argument), getopt returns EOF, optarg will point +// to the argument, and optind will be set to the argv index of +// the argument. If there are no non-option arguments, optarg +// will be set to NULL. +// +// The special option "--" may be used to delimit the end of the +// options; EOF will be returned, and "--" (and everything after it) +// will be skipped. +// +// RETURN VALUE +// For option letters contained in the string optstring, getopt +// will return the option letter. getopt returns a question mark (?) +// when it encounters an option letter not included in optstring. +// EOF is returned when processing is finished. +// +// BUGS +// 1) Long options are not supported. +// 2) The GNU double-colon extension is not supported. +// 3) The environment variable POSIXLY_CORRECT is not supported. +// 4) The + syntax is not supported. +// 5) The automatic permutation of arguments is not supported. +// 6) This implementation of getopt() returns EOF if an error is +// encountered, instead of -1 as the latest standard requires. +// +// EXAMPLE +// BOOL CMyApp::ProcessCommandLine(int argc, TCHAR *argv[]) +// { +// int c; +// +// while ((c = getopt(argc, argv, _T("aBn:"))) != EOF) +// { +// switch (c) +// { +// case _T('a'): +// TRACE(_T("option a\n")); +// // +// // set some flag here +// // +// break; +// +// case _T('B'): +// TRACE( _T("option B\n")); +// // +// // set some other flag here +// // +// break; +// +// case _T('n'): +// TRACE(_T("option n: value=%d\n"), atoi(optarg)); +// // +// // do something with value here +// // +// break; +// +// case _T('?'): +// TRACE(_T("ERROR: illegal option %s\n"), argv[optind-1]); +// return FALSE; +// break; +// +// default: +// TRACE(_T("WARNING: no handler for option %c\n"), c); +// return FALSE; +// break; +// } +// } +// // +// // check for non-option args here +// // +// return TRUE; +// } +// +/////////////////////////////////////////////////////////////////////////////// + +TCHAR *optarg; // global argument pointer +int optind = 0; // global argv index + +int getopt(int argc, TCHAR *argv[], TCHAR *optstring) +{ + static TCHAR *next = NULL; + if (optind == 0) + next = NULL; + + optarg = NULL; + + if (next == NULL || *next == _T('\0')) + { + if (optind == 0) + optind++; + + if (optind >= argc || argv[optind][0] != _T('-') || argv[optind][1] == _T('\0')) + { + optarg = NULL; + if (optind < argc) + optarg = argv[optind]; + return EOF; + } + + if (_tcscmp(argv[optind], _T("--")) == 0) + { + optind++; + optarg = NULL; + if (optind < argc) + optarg = argv[optind]; + return EOF; + } + + next = argv[optind]; + next++; // skip past - + optind++; + } + + TCHAR c = *next++; + TCHAR *cp = _tcschr(optstring, c); + + if (cp == NULL || c == _T(':')) + return _T('?'); + + cp++; + if (*cp == _T(':')) + { + if (*next != _T('\0')) + { + optarg = next; + next = NULL; + } + else if (optind < argc) + { + optarg = argv[optind]; + optind++; + } + else + { + return _T('?'); + } + } + + return c; +} diff --git a/src/XGetopt.h b/src/XGetopt.h new file mode 100644 index 0000000..7e75f26 --- /dev/null +++ b/src/XGetopt.h @@ -0,0 +1,23 @@ +// XGetopt.h Version 1.2 +// +// Author: Hans Dietrich +// hdietrich2@hotmail.com +// +// This software is released into the public domain. +// You are free to use it in any way you like. +// +// This software is provided "as is" with no expressed +// or implied warranty. I accept no liability for any +// damage or loss of business that this software may cause. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef XGETOPT_H +#define XGETOPT_H + +extern int optind, opterr; +extern TCHAR *optarg; + +int getopt(int argc, TCHAR *argv[], TCHAR *optstring); + +#endif //XGETOPT_H diff --git a/src/dat2.cpp b/src/dat2.cpp new file mode 100644 index 0000000..db70ff6 --- /dev/null +++ b/src/dat2.cpp @@ -0,0 +1,320 @@ +// dat2.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" +#include "dat2.h" +#include "DatFile1.h" +#include "DatFile2.h" +#include "XGetopt.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif /* _DEBUG */ + +// Globals +Command g_Command = COMMAND_UNKNOWN; +int g_nCompressMethod = 9; +BOOL g_bRecurseIntoDir = FALSE; +BOOL g_bExtractWithoutPaths = FALSE; +CString g_strOutFolder; +CString g_strDatFileName; +CStringArray g_FileList; +BOOL g_bFallout1Dat = FALSE; +CString g_strTargetDir = ""; + +// Dat-file +CDatFile1 g_DatFile1; +CDatFile2 g_DatFile2; +CDatFileBase* g_pDatFile = NULL; + +// Functions +void PrintUsage(char* lpszFileName); +int ParseCommandLine(int argc, char* argv[]); + +// The one and only application object +CWinApp theApp; + +int main(int argc, char* argv[]) +{ + if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { + printf("Fatal Error: MFC initialization failed\n"); + return 1; + } + else { + printf("Fallout DAT-files packer/unpacker, version 2.32\n"); + printf("Copyright (C) Anchorite (TeamX), 2004-2006\n"); + printf("anchorite2001@yandex.ru\n"); + printf("\n"); + +// for(int i = 0; i < argc; i++) { +// printf("argv[%d] = %s\n", i, argv[i]); +// } + + if (argc < 3) { + PrintUsage(argv[0]); + return 0; + } + + int nResult = ParseCommandLine(argc, argv); + + switch(nResult) { + case -1: { + printf("Error: Invalid command\n"); + return 1; + } + + case -2: { + printf("Error: Name of output directory is omitted\n"); + return 1; + } + + case -3: { + printf("Error: Name of dat-file is omitted\n"); + return 1; + } + + case -4: { + printf("Error: List of files is omitted\n"); + return 1; + } + + case -5: { + printf("Error: Unable open response file\n"); + return 1; + } + } + + nResult = 0; + UINT nOpenMode; + + switch(g_Command) { + case COMMAND_EXTRACT: + nOpenMode = CFile::modeRead | CFile::shareDenyWrite; + break; + + case COMMAND_DELETE: + nOpenMode = CFile::modeReadWrite | CFile::shareDenyWrite; + break; + + case COMMAND_LIST: + nOpenMode = CFile::modeRead | CFile::shareDenyWrite; + break; + + case COMMAND_SHRINK: + nOpenMode = CFile::modeReadWrite | CFile::shareDenyWrite; + } + + if (g_Command == COMMAND_ADD) { + if (g_bFallout1Dat) { + g_pDatFile = &g_DatFile1; + } + else { + g_pDatFile = &g_DatFile2; + } + } + else { + if (g_DatFile2.Open(g_strDatFileName, nOpenMode)) { + g_pDatFile = &g_DatFile2; + } + else if (g_DatFile1.Open(g_strDatFileName, nOpenMode)) { + g_pDatFile = &g_DatFile1; + } + else { + printf("Error: Unable open file %s\n", LPCTSTR(g_strDatFileName)); + return 1; + } + } + + switch(g_Command) { + case COMMAND_ADD: + nResult = OnAdd(); + break; + + case COMMAND_EXTRACT: + nResult = OnExtract(); + break; + + case COMMAND_DELETE: + nResult = OnDelete(); + break; + + case COMMAND_LIST: + nResult = OnList(); + break; + + case COMMAND_SHRINK: + nResult = OnShrink(); + } + + printf("\n"); + printf("Flushing buffers...\n"); + g_pDatFile->Flush(); + + return nResult; + } +} + +void PrintUsage(char* lpszFileName) +{ + printf("Usage: %s [options] [-t dir] [-d dir] dat-file [list | @response-file]\n", lpszFileName); + printf("\n"); + printf("Commands\n"); + printf(" a: Add files to dat-file. Create new if dat-file not exist\n"); + printf(" x: Extract files from dat-file\n"); + printf(" d: Delete files from dat-file (only info about files)\n"); + printf(" l: List files in dat-file\n"); + printf(" k: Shrink dat-file\n"); + printf("\n"); + printf("Options\n"); + printf(" -s: create Fallout 1 dat-file\n"); + printf(" -r: recurse into directories\n"); + printf(" -0..9: Compression method\n"); + printf(" (Fallout1: 0 - store, other numbers - compress (default)\n"); + printf(" (Fallout2: 0 - store, 1 - best speed, 9 - best compression (default)\n"); + printf(" -p: extract without paths\n"); + printf(" -d: extract files into specified directory\n"); + printf(" -t: add files to specified directory of dat-file\n"); + printf(" --: end of options\n"); + + printf("\n"); +} + +int ParseCommandLine(int argc, char* argv[]) +{ + // Command + if (memcmp(argv[1], "a", lstrlen(argv[1])) == 0) { + g_Command = COMMAND_ADD; + } + else if (memcmp(argv[1], "x", lstrlen(argv[1])) == 0) { + g_Command = COMMAND_EXTRACT; + } + else if (memcmp(argv[1], "d", lstrlen(argv[1])) == 0) { + g_Command = COMMAND_DELETE; + } + else if (memcmp(argv[1], "l", lstrlen(argv[1])) == 0) { + g_Command = COMMAND_LIST; + } + else if (memcmp(argv[1], "k", lstrlen(argv[1])) == 0) { + g_Command = COMMAND_SHRINK; + } + else { + return -1; + } + + // Options + argc--; + argv++; + + int c; + + while((c = getopt(argc, argv, "r0123456789pd:st:")) != EOF) { + switch(c) { + case 'r': + g_bRecurseIntoDir = TRUE; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + g_nCompressMethod = c - '0'; + break; + + case 'p': + g_bExtractWithoutPaths = TRUE; + break; + + case 'd': + g_strOutFolder = optarg; + + if ((!g_strOutFolder.IsEmpty()) && (g_strOutFolder.Right(1) != "\\")) { + g_strOutFolder += "\\"; + } + + break; + + case 's': + g_bFallout1Dat = TRUE; + break; + + case 't': + g_strTargetDir = optarg; + + if ((!g_strTargetDir.IsEmpty()) && (g_strTargetDir.Right(1) != "\\")) { + g_strTargetDir += "\\"; + } + + break; + + case '?': + return -2; + + default: // No more options + break; + } + } + + // Dat-file + if (optind < argc) { + g_strDatFileName = argv[optind]; + } + + if (g_strDatFileName.IsEmpty()) { + return -3; + } + + if ((g_strDatFileName.Right(4).MakeLower() != ".dat") || (g_strDatFileName == ".dat")) { + g_strDatFileName += ".dat"; + } + + // List of files + CString strArgument; + + for(int i = optind + 1; i < argc; i++) { + strArgument = argv[i]; + + int nArglength = strArgument.GetLength(); + + if ((i == optind + 1) && (nArglength > 1) && (strArgument[0] == '@')) { + CStdioFile fileResponse; + + if (!fileResponse.Open(strArgument.Right(nArglength - 1), CFile::modeRead | CFile::shareDenyWrite | CFile::typeText)) { + return -5; + }; + + CArchive arResponse(&fileResponse, CArchive::load); + + while(arResponse.ReadString(strArgument)) { + if (!strArgument.IsEmpty()) { + g_FileList.Add(strArgument); + } + } + + break; + } + else { + g_FileList.Add(strArgument); + } + } + + if ((g_FileList.GetSize() == 0)) { + if (g_Command == COMMAND_EXTRACT) { + g_FileList.Add("*"); + } + else if ((g_Command != COMMAND_LIST) && (g_Command != COMMAND_SHRINK)) { + return -4; + } + } + +// for(int i = 0; i < g_FileList.GetSize(); i++) { +// printf("g_FileList[%d] = %s\n", i, g_FileList[i]); +// } + + return 0; +} \ No newline at end of file diff --git a/src/dat2.h b/src/dat2.h new file mode 100644 index 0000000..a28b82e --- /dev/null +++ b/src/dat2.h @@ -0,0 +1,31 @@ +#pragma once + +#include "DatFileBase.h" +#include "resource.h" + +// Commands +enum Command { + COMMAND_UNKNOWN, + COMMAND_ADD, + COMMAND_EXTRACT, + COMMAND_DELETE, + COMMAND_LIST, + COMMAND_SHRINK +}; + +// Globals +extern Command g_Command; +extern int g_nCompressMethod; +extern BOOL g_bRecurseIntoDir; +extern BOOL g_bExtractWithoutPaths; +extern CString g_strOutFolder; +extern CString g_strDatFileName; +extern CStringArray g_FileList; +extern CDatFileBase* g_pDatFile; + +// Functions +int OnAdd(); +int OnExtract(); +int OnDelete(); +int OnList(); +int OnShrink(); diff --git a/src/dat2.rc b/src/dat2.rc new file mode 100644 index 0000000..d61738f --- /dev/null +++ b/src/dat2.rc @@ -0,0 +1,114 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 2,3,2,0 + PRODUCTVERSION 2,3,2,0 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Anchorite (TeamX)" + VALUE "FileDescription", "Fallout dat-file packer/unpacker" + VALUE "FileVersion", "2, 3, 2, 0" + VALUE "InternalName", "Fallout dat-file packer/unpacker" + VALUE "LegalCopyright", "Copyright (C) Anchorite (TeamX), 2004-2006" + VALUE "OriginalFilename", "dat2.exe" + VALUE "ProductName", "Fallout dat-file packer/unpacker" + VALUE "ProductVersion", "2, 3, 2, 0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/dat2.sln b/src/dat2.sln new file mode 100644 index 0000000..89698d6 --- /dev/null +++ b/src/dat2.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dat2", "dat2.vcproj", "{00920866-F659-4AF7-87AF-FE86A97044CC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {00920866-F659-4AF7-87AF-FE86A97044CC}.Debug|Win32.ActiveCfg = Debug|Win32 + {00920866-F659-4AF7-87AF-FE86A97044CC}.Debug|Win32.Build.0 = Debug|Win32 + {00920866-F659-4AF7-87AF-FE86A97044CC}.Release|Win32.ActiveCfg = Release|Win32 + {00920866-F659-4AF7-87AF-FE86A97044CC}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/dat2.vcproj b/src/dat2.vcproj new file mode 100644 index 0000000..db6c74b --- /dev/null +++ b/src/dat2.vcproj @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/stdafx.cpp b/src/stdafx.cpp new file mode 100644 index 0000000..dd4fd0b --- /dev/null +++ b/src/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// dat2.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/src/stdafx.h b/src/stdafx.h new file mode 100644 index 0000000..a28a211 --- /dev/null +++ b/src/stdafx.h @@ -0,0 +1,19 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#define WINVER 0x0410 +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + +#include +#include // MFC core and standard components +#include // MFC extensions + +#include