From 847fccfc66e17511dfb042b14128af2d3f10b024 Mon Sep 17 00:00:00 2001 From: Pentium44 Date: Fri, 9 Apr 2021 21:12:52 -0700 Subject: [PATCH] Almost there, LZ77 file compression algorithm with decompress and compress --- Makefile | 4 +- src/comp | Bin 0 -> 22416 bytes src/comp.1 | Bin 0 -> 22416 bytes src/comp.ss | Bin 0 -> 9629 bytes src/compression.c | 230 ++++++++++++++++++++++++++++++++++++++++++++++ src/compression.h | 3 + src/deps.h | 3 + src/functions.c | 131 +++++++++++++++++++++----- src/tar.c | 2 +- 9 files changed, 349 insertions(+), 24 deletions(-) create mode 100755 src/comp create mode 100644 src/comp.1 create mode 100644 src/comp.ss create mode 100644 src/compression.c create mode 100644 src/compression.h diff --git a/Makefile b/Makefile index d9dac6b..13a9b27 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,9 @@ VERSION_EXTRA = \"$(EXTRA)\" PREFIX ?= /usr CC ?= gcc -CFLAGS += -O2 -pedantic -g -Wall -Wextra --param=ssp-buffer-size=2 -fstack-protector-all +CFLAGS += -pedantic -g -Wall -Wextra CPPFLAGS += -DVERSION=$(VERSION) -D_FORTIFY_SOURCE=2 -LDFLAGS += -Wl,-O1 -Lsrc/libutil +LDFLAGS += -Wl,-O1 -lm BIN ?= slidescript SRCS=$(wildcard src/*.c) diff --git a/src/comp b/src/comp new file mode 100755 index 0000000000000000000000000000000000000000..cecc3ea231ad53206816db9202eadcd4c19207d6 GIT binary patch literal 22416 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 literal 0 HcmV?d00001 diff --git a/src/comp.1 b/src/comp.1 new file mode 100644 index 0000000000000000000000000000000000000000..cecc3ea231ad53206816db9202eadcd4c19207d6 GIT binary patch literal 22416 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 literal 0 HcmV?d00001 diff --git a/src/comp.ss b/src/comp.ss new file mode 100644 index 0000000000000000000000000000000000000000..ebab87d0e5b9ba10de5250f9cf1f59384ff9a5a5 GIT binary patch literal 9629 zcmcI~i+dZ@weQ-G*)tkRqp>V2cI+gIlaROVydOBt9!Zwvyn%!!K%)4W80^^fBMIp( z*(2FbTtgbTlu|xQp@o+Aq;1+mX$q9?k!&YC8(L1Ab52iB$_<>fKye|Zp|s&{bN_^X z*WY~ejYl*4vG!WO^;^F^CqE0o0FDCG0c-+D0bl^c0qTJW_>2IQz(pG6jGYJAa?Svx ztrptqi=Tjhn4Pz=$>q*9*v~UG8D;P#5rY}^&R+s?LgQ{(?eU@fY zu<-W)Om)Y!XadI=iv{sHw&)z2yrbT`0I*o2>bx$9PqV-o%figMJb45zGdz)sPcUqZ zhbTj%EHY~0Br}s{0OGI>;7x!&fEGedv*o8P+``Nj%enzuY-$s10h{3)S;d8DY93oO zPxZvCYJd)ac7P^;l>p0K)B;uq#|HrV0S*gvSU$QE&`O|H0KEWR5|+|AHuKlRcXt>M zVsmkXY4zBc395f6l|Q%y@B+YytauKf2jCjO7{KEIA%O1!bOX!h1Wj#@riLz}`_MIr}h_boSnxSam&M0e( zvOQ6DPn4~U&VC4^%A49c(235%@Jeq(1Hg8G&7h{!(<5M?q`myHR*ANAk^sF+-lwh` z!RX*fc|nG2oes$$)(ET*5g0XlZZf+CK2(S_k41VV>2bf=hgP+5(k(=dxungFHlo)v9GdwL8v(T;yAef>PYGv5FbUhiXu$u67BG}(m7Y?ECz zS&_*~Sxjdir~rtWjF@bm$*9R{Os1J^waJ*txXE;rrA_AZU*bd zH<@L!Zj*(I$0x(-|KHIDX@DHSI{+#gM*uW{{{pDa<3RxVspn&WPXNxlbX3rSVW{gB z0B_`(x|joSDT|aJ&QQk5;y1E*e}Vl0;36lVIFrBr2cd}2^OXLQP)w+#^hH7mp{FU$ z6G{nvl+tGi)d)RF>5m9ygbGT(OQ=q0H>KYo)F5;(r4JG6BXk?3_YrCm$|?OKp?*SZ zD8-nz$*IcJO90*lP+mF=pgeyMtQ!_9(sG>&p9yX&*HwsgkEr}2E>24n1ei67)&aQL z>1rY+08ax{x#)_wJ~>KnARF%ib3*~G0k|qRmE^acz(zX1)hEr1u1}C?f#Ea?%%lNj zim3%OUqz(^PXh7ECp>gnc?cjC2ICT56GWj$ByP8+Y{RkJ=+pwUg$(^Z&lG(1^Uw}w zo*G7~fYUtmrt}58z&g0G3K7-F;_ULvVwJMwxU_$YscLYyZmF)7g+CwHci>>!IkL?| zUjR5KpI6oP{#&mMc{RV4kjK-`IX9g5Dhvl-OllW5D941=u&YlxZwq{q z*;fG$ioKz1nL>kW19aG>A%w3EM5kw?e-~z`pkMFQ_VQ(+EMDWx3<<3zyY=l+`>H^7 zKu0{dUcxBfw$Al`!K+paw6cJZMCFdY!;L)ct{ax+zY_Njd)4`bKgUfBx%1r8L{cGg zn>+PySu3YteZ=J> zqGH%%={OEai_7lg61|Q0YlYUQJ^cRoT|Htdcz116XPcf|cK=0}d_H(kkZyy9(q$J_Xs>|G;>yl{47EWhz`K6n}7vw&^}_}J0Y z@snvxpOHau;CcG-u*+`Cv5`Sv&7f}r(anPJg*h1C z32>{JRv0?W<9pA=_sY6ouYkBw7yD|$8jgQH7yn~F+p|yGb2VZ72f#lP>#t--(pj=$ z%zqi5N~i96USIaAB%feCpEK78)K}PZxuAVJubmk!v0p6tVZuKW4?{!$yGgswSu!G~ zTo?@fx}eR^zq!UW`rvcvp~wy`q{h>5e9DjN4$Al{E4Avmy2$zXs`F#}RZ}IV?bGeI z!5B&2cYf1-59uo|krfM%*}nq#>#%)RBgz8*sVs23{d|F*8`Ccn^6-nnlWKNe$qVD> zT(Limrz!OQnOt-&QSoE`&@~U`l0@O&Q8}I#%h$nS-Oa5OL$62&J7;GhMohEI|qD&jZ^B z8!X!~RkGWL-$=U^Di5-OiZi2ume3qKZps|Fhnp{KG_SAY7YCmDm@FK}GyWxSoT0|E z03Z5{FJUq+@q423ZN>LIjj@LymR`80Hn~{$y(7p*hl=rQpjcT1@awKej2&G5@G@rRqm6}BT%D&HpQh8Js?phptS-k z&Rh-9tY|af?xdp7`eC6m1EhvnOyVvMlV^$d2|5R?DgnJYw1lIr5NZe7?&=+!DUx{v zhvsnHqJV-`B;rLqipqMWEkc_owRV8{Snmf|1gJ%j=5yLw%=&?uug>RVXks$6FDeHh z0M~<0VU!=EZh-d`N8)fgp-&)ufmExrz*u3?pAnuQsnhOt_; z4-xLe_%A9t5WXMdlL{peK7;WD#xRyplZxo+BLFudbl5FYod#6ZGs)9Tq|!HG6&Rhv zGZt=`7l{Ob!)#U80Q?CB&L<2D^pu2BP<&sN2{nhLE`Y38Tm_ab09YoBO5ILkv=>JW zGpgFT4Wo5y*d1x*DV#I4FE&tYX@BkQ;86t@&Mfu)H0D)QPzRfyqjj|IveP8zYg`_u$?;hVqe zH`2K1ZmlSp*Jfk=Jl?&V1mei|CGgdG@e{(R<0z(>n_}w@nkP&R0+wtaa)OrP12U)# zQqK_wxE)~!sYh5G8F6IBQ6MhCkU=|db>Q%297acf{!cmW(SMqUcfmz~A`L$}Stl}N z;q43u>MeT=1;@$bYIQVR_Gx{wPQ&Gl8Vpa>r>pA<%TP|D>OK{!U5YhpRMP`g)gX-4 zOx7RtWrqC>moi*p)slLw92Jj~SZZyAQJvu_44+R;*UzqJ!79nH&x(C4mwiH)!?<~k z(etU5pD>D3z6nN8G2_yLB$#qiS%k2Cyh zhTl>pb_xXRs0T=JSPOT|Q^4|RI5&M-1vi2UXS`am>q*Ch8bxbmY<`{c7g%K6Xbhk? z*^hVCx2wYP>+xQy1rSsb{F6m-^k?|kTtWqD zPHGy!cgE1;ioyZ@7d(pq(#3L=BZ^^vFH2Ml@f@22MYk1@k^_EPpnuQ#=1Q+QH|6Gn zIbS7uSOaV+5gW^tC_#vh=MaFe$X{+DqlO3@0MF4<)znkir&D4`v@5aX&N#imXDtDI zGsZrC0^;+QamJHR7zwgcqNj5{AHaVn$f_i<1uDu%sod&IkWzu(NRTy25)H0C`32Nzdjr%hdBu($Yy|W zVzc1nwSsTUr%J-@agya^b;91t*L)spIZi@3c7s48d32nUEhM;0VS<>WqWdH#m`{%E>Ph3wDprdXkf`6nuLmdI|?m3$!-JG74$oVfF4APNtFI zUOHED;^bHppZ0C6jkS5oZB%U?fk1 zyFvdr<-3TfhbCe>jT*#QziBUo5}^1LfJUM1=w4<}6Y`F{^;TI6y6EAc|~g zHOWz%^3Rz9v|3|_1K<>VBFt3uwlVrG5lzomoaxG2`zEma3 z0YY}>!-g~>atq*xl{cQueNTBsOX=mhAaK#RTCL6UQ$>#-!;pke{WNCr%RKMd#+ z;4Ywd=lm}L{fN@j!e0Wa@SLmKKQR7>Vi^Ld|6a_DxkN@N8fq9Q2N(StW zg&!zuJcyJIVC>CJQP=km*0c}R>{RE08iH3x2IkzJnxEDd-wsfzhBUbRj@0VyTJ0UO zZ_#Mf$qJ7j`GiBtIG% zU3jZR#d!^>x?5DoM#;^Rd^xAr@vG|kfFutmmetA4F}CVw1Nz#rN#iu;qN$9`eqM;+1#DbK<$uY8btRW?5E*d4b0h*#W zTqraUQpR}-(Sy{uMKhjE^@aGB$k_PNx~ih_6{_p6jFR#((jm$7xsbYZd)+#<7VE~y z{?U(+B%8-b+u)k;(3-uH{AiR^vZayay0F;0XgpalO0KWZ%})An7$e)1%u^tH#>gf~ zoB}US&EFu&s)WB-j;jf#$xJozIb1ImPbl~;7f|G?)cp7q%%a{Z3-@jS3SW~g#VQ_vC%A{VKBzgixINxC;%% ztFr-fcnY9Uah%iwlsT$$^CM43I1uDN1_xK?nTq=58?5!xsEzxS)Bs#bwM_G|A`q%_ zCn^72fg7Y&lwHb|$_nrRJYJTIgx#N$bQlXwJzt!)jg2(&(o`I$C0!s1_e9QMU(B2mHPX&^|?0`6OjM4Dprl{gp6n zu}2OF?XW=m98?Xo+QZF~^vi#3b^pB|o9%U^+BTa6?(^QQzGzfSxKn<&b+f6)(=7hp z$+aF=>*cgdDC$d;&3c8e1+g|D`^mh%M4-yUxS;hwpcznxzt$j6)Ws=rXzDobbp!1p zq#mGoe5a!HBGAJX@ut0?RgDK*CUuxte;gecq@D2NKEPE;KZqL;%HsNq#7S$s#}ErO zdE+?=B@%@JO;zkpkxYp;0GgwK(V_QBs8Aw?gzLl-4XEPq5ha^&=tIUWi0qRv-BYA_ zfd=dr31yzI6n1ICRQH1(DHba=S*fHrD&T7prSb^zF^#uC9-Wft_5ylDqCJBoI7mv| z;*hM+0Hy&vDk0{S7kki|u!vmnh*tum*6utaE=d>A2FFkMH&3D1ED3&YXtEj5wnp5JyxLc5+fl@kYQZ2c4FXbjfc5*!_$6P*!R*V_T>H;MNRP7X?usq{dYq^RI zid4JrKI86IHR%#($6wu@_j;SZ=Y|eSC2-x6MK`>URt=EPmZR-!ywDU}-tTSSh{C^i zd>bWf9b8^YKLhy)Qw2(P{?38?)vu zR05Q?(a}u6UslX&(xs8@kuvAl6xS@9B;>2!bndCmYJKkETO9VR=YP~;&jDOPw&G6r zjha4)J)6_YWT^)0YlnQ#4p5D==Nx5(G9>LoDEim4B~!eT5^wUX3eQ!59`Ur=mr68Q zbg#qS!v3m4k(Srgz#bbZGo0(!)d!zFQMM#*9!Kmxuf-6h8m~B&CA$(8#VBgT$tjl& zc*GDylRb~2;3=nFjpT(%Fo74dGmGLy8wP$ryuHdGhS%k*%fu#`AuN}Mc5LhZ?0;hy z?*e4He?#JUM!eF-Rj|~8f+Kk(Bi?J}r&~Dc_C5xVn!(qI{-o${Kag$@GVqr!4tGcu zjCv1O8xtS40~`@3g9E*ScBzD@R065Dxi~{UTFr`@T$%yY$n{pP@L4|~Yhy{ZAAx$g zp^V%rL$SOMc%&``;%2UQ2-JzzXE1B_=ClGjI8@Oj@qVYg1xO1DHMvD_a{6I6(4|^S+|(;+AFErY zI77UyS<+7KpDe3gt>x?raFWdpS|6apgIhYGs7I8wI(n}lE%`keS=0lhHEU!Bb~d>B zAx_#|Gn3fYHQ3r)SktAE?o?F4>77pC0Kz>E-XGr=+q9>xetmo0s$L)m5oyZZu6BGn z+||u>kxUlf!RnVH+?nN&o!u4R)RwYAq9gogt8jhiKn)y=cRO8~QKzAPVQYS4_mJMj zQVovYkuA-P;S``vDt&uXdI7h1ySm1U+dREd4K=>B6)o-Hq29RJnN0QOH}{S$Yj(fg zGrqb#yE2ojXh%gE3608zE;;C+CU-$*sG`>iH|tY65>+j}^2|W{5+yR{W+_it$zRB9 z$TyMt%&`rv@ny{^tKIv?B$#`FZr8WML;ale%-)-QcSRtp^pgL$KTYGTaJ8021(|O7q1G3mADg^{+1A)TbAQfb$XN6JUE`b>Bn*R?PekvWr0uD!5nSkRFHZ}Tid6ZQ|*|aE|9%VCZ4PliF;Lob)4zU16828jzJr-ko zEjE*}M=iFBmX#@`fw2@N5xcFEg)ds+J87WUKKx*`21VJos2)ZWl|^Y94m>r0itPns zG+bhze3b<*SnT&|i`IVX3Jp)OAGqFezyrU1$&9ZIlUt?+w@;-Ew!tFIVqtcfvQqo| z>1g;?%xoMuZUvgy><_%!NnVppBkY#@u?s%`w4HQdibks z_8?=GY{6a@7>SlX5@r7yWoOy;zYP5VTCn z2&5HYpHdQB(yH(cP^W}uP`pJ6fN((IUan=hdJ<=Z)&ZzVq&i%zQeKas8IJpT4!GXM zjc%Z=uGu1ks}!A97^OBbcla_;($4L62P-1fs6a+2n4Nt0PU&m&aHqf-ZuE17fh6PU zJ;zBVYxcctHpfeQycxYxQ+QtGUZ;9bDUD9trE2Orp>~%h<231EwV>@U`CA;CR5BN5 zj?^0f68ErPjvLV`@Mt|Kwbn`x*=cFsIQcIq@YxCw=Za&at&*x{ReWuiXuHI5Aa%Kt z4rw*XsTrke^4Xb06?k)7IdBg3k~IiD!Rb<%xm3Uk*JzODX0)iazF~5AzL4H7%9`9b zWc`hj@mKtM<16l{MnvVs0z3nZ&qHc~4 zS>>5zb#I|I!&S z@0Du90JZSq12_T{_o?t2UTxiF8V-~r2EIu?+4m5tUiRWGNTd(0vSeH+*0+uM7#5=s%)exS=K_sP1yrg z_;a1v-vQEEy=D9I0hLqsWj|3RVLK;nV8B_{#Gyxl@G;Wiu~wb*#@8xEpd2HGSD4W! zQ}{`y1j7Kb=q!wM(;iLXQ5ED?fLe5kWnW6+OAODRJ}Lix_^E2$rBCuS62!AreWV*o zh}(jZ-;C8TtA^pzsanR?8_ZPd;>{Ql)4rIRcah61GpUI#xg14&o`( z#js_^m=#l^r4_I(e7|K+q}YV|KF6{R3x6$CQxwFH0r*N{D)7E(*^jFf5X8Re{5#eJ z)c-cdPD4qJ`ss(3eOk9-8g7{$`?+OLCI$8J&z9#@J1<~lvDXwHUQmTF!;9za{Wpw4 zYHG~Bc%A)wmLZH@X0|#em@ zJzadnH1+OrW~;;abQP{Kt;S- pointer_length) + { + pointer_pos = temp_pointer_pos; + pointer_length = temp_pointer_length; + if(pointer_length == pointer_length_max) + break; + } + } + coding_pos += pointer_length; + if((coding_pos == uncompressed_size) && pointer_length) + { + output_pointer = (pointer_length == 1) ? 0 : ((pointer_pos << pointer_length_width) | (pointer_length - 2)); + output_lookahead_ref = coding_pos - 1; + } + else + { + output_pointer = (pointer_pos << pointer_length_width) | (pointer_length ? (pointer_length - 1) : 0); + output_lookahead_ref = coding_pos; + } + *((uint16_t *) (compressed_text + compressed_pointer)) = output_pointer; + compressed_pointer += 2; + *(compressed_text + compressed_pointer++) = *(uncompressed_text + output_lookahead_ref); + output_size += 3; + } + + return output_size; +} + +uint32_t lz77_decompress (uint8_t *compressed_text, uint8_t *uncompressed_text) +{ + uint8_t pointer_length_width; + uint16_t input_pointer, pointer_length, pointer_pos, pointer_length_mask; + uint32_t compressed_pointer, coding_pos, pointer_offset, uncompressed_size; + + uncompressed_size = *((uint32_t *) compressed_text); + pointer_length_width = *(compressed_text + 4); + compressed_pointer = 5; + + pointer_length_mask = pow(2, pointer_length_width) - 1; + + for(coding_pos = 0; coding_pos < uncompressed_size; ++coding_pos) + { + input_pointer = *((uint16_t *) (compressed_text + compressed_pointer)); + compressed_pointer += 2; + pointer_pos = input_pointer >> pointer_length_width; + pointer_length = pointer_pos ? ((input_pointer & pointer_length_mask) + 1) : 0; + if(pointer_pos) + for(pointer_offset = coding_pos - pointer_pos; pointer_length > 0; --pointer_length) + uncompressed_text[coding_pos++] = uncompressed_text[pointer_offset++]; + *(uncompressed_text + coding_pos) = *(compressed_text + compressed_pointer++); + } + + return coding_pos; +} + +long fsize (FILE *in) +{ + long pos, length; + pos = ftell(in); + fseek(in, 0L, SEEK_END); + length = ftell(in); + fseek(in, pos, SEEK_SET); + return length; +} + +uint32_t ss_compress (const char *filename_in, char *filename_out, size_t malloc_size, uint8_t pointer_length_width) +{ + FILE *in, *out; + uint8_t *uncompressed_text, *compressed_text; + uint32_t uncompressed_size, compressed_size; + + in = fopen(filename_in, "r"); + if(in == NULL) + return 0; + uncompressed_size = fsize(in); + uncompressed_text = malloc(uncompressed_size); + if((uncompressed_size != fread(uncompressed_text, 1, uncompressed_size, in))) + { + free(uncompressed_text); + return 0; + } + fclose(in); + + compressed_text = malloc(malloc_size); + + compressed_size = lz77_compress(uncompressed_text, uncompressed_size, compressed_text, pointer_length_width); + + out = fopen(filename_out, "w"); + if(out == NULL) + { + free(uncompressed_text); + free(compressed_text); + return 0; + } + + if((compressed_size != fwrite(compressed_text, 1, compressed_size, out))) + { + free(uncompressed_text); + free(compressed_text); + fclose(out); + return 0; + } + fclose(out); + + free(compressed_text); + free(uncompressed_text); + + return compressed_size; +} + +uint32_t ss_decompress (char *filename_in, char *filename_out) +{ + FILE *in, *out; + uint32_t compressed_size, uncompressed_size; + uint8_t *compressed_text, *uncompressed_text; + + in = fopen(filename_in, "r"); + if(in == NULL) + { + return 0; + } + + compressed_size = fsize(in); + compressed_text = malloc(compressed_size); + if(fread(compressed_text, 1, compressed_size, in) != compressed_size) + { + free(compressed_text); + return 0; + } + fclose(in); + + uncompressed_size = *((uint32_t *) compressed_text); + uncompressed_text = malloc(uncompressed_size); + + if(lz77_decompress(compressed_text, uncompressed_text) != uncompressed_size) + { + free(compressed_text); + free(uncompressed_text); + return 0; + } + + out = fopen(filename_out, "w"); + if(out == NULL) + { + free(compressed_text); + free(uncompressed_text); + return 0; + } + if(fwrite(uncompressed_text, 1, uncompressed_size, out) != uncompressed_size) + { + free(compressed_text); + free(uncompressed_text); + fclose(out); + return 0; + } + fclose(out); + + free(compressed_text); + free(uncompressed_text); + + return uncompressed_size; +} + +/* +int main (int argc, char const *argv[]) +{ + FILE *in; + + char filename[129]; + char filedecout[141]; + + if(argc < 2) + { + printf("Please enter a filename: ./comp file.txt"); + } + + in = fopen(argv[1], "r"); + if(in == NULL) + return 0; + + if(strlen(argv[1]) > 128) + { + printf("Filename too long"); + return 1; + } + + sprintf(filename, "%s.ss", argv[1]); + sprintf(filedecout, "%s.1", argv[1]); + + printf("Original size: %ld\n", fsize(in)); + fclose(in); + for(uint8_t i = 1; i <= 6; ++i) + printf("Compressed (%i): %u, decompressed: (%u)\n", i, ss_compress(argv[1], filename, 20000000, i), ss_decompress(filename, filedecout)); + return 0; +} +*/ diff --git a/src/compression.h b/src/compression.h new file mode 100644 index 0000000..138a16e --- /dev/null +++ b/src/compression.h @@ -0,0 +1,3 @@ +uint32_t ss_compress (const char *filename_in, char *filename_out, size_t malloc_size, uint8_t pointer_length_width); +uint32_t ss_decompress (char *filename_in, char *filename_out); +long fsize (FILE *in); diff --git a/src/deps.h b/src/deps.h index 01f81d5..fe425b5 100644 --- a/src/deps.h +++ b/src/deps.h @@ -29,6 +29,9 @@ #include // For string searching #include +// Math for compression algorithm +#include +#include #define MAX_VAR_NAME_LEN 512 #define MAX_VAR_NAME_BUFSIZE (MAX_VAR_NAME_LEN + 1) diff --git a/src/functions.c b/src/functions.c index 08513bb..03cbd98 100644 --- a/src/functions.c +++ b/src/functions.c @@ -15,7 +15,9 @@ #include "network.h" #include "search.h" #include "inset.h" +// For slidescript compression algorithm #include "tar.h" +#include "compression.h" char *process_line(char *line) { @@ -25,11 +27,13 @@ char *process_line(char *line) static char concatbuf[MAX_CONCAT_BUF+1]; static char filebuf[MAX_READFILE_LEN+1]; + static char retbuf[MAX_STRING_BUFSIZE]; // Make sure static buffers are empty before initialize // This was a big bug here for a minute. bzero(filebuf, MAX_READFILE_LEN); bzero(concatbuf, MAX_CONCAT_BUF); + bzero(retbuf, MAX_STRING_LEN); tok_srch = strtok(line, "=\" |"); @@ -70,15 +74,34 @@ char *process_line(char *line) filename = parse_vars(tok_srch); + FILE *in; + + char origsize[128]; + char filedecout[MAX_FILENAME_LEN+5]; + + in = fopen(filename, "r"); + if(in == NULL) + { + syn_warn("ss:warn:compress, failed to open tar for compression"); + return NULL; + } + + sprintf(filedecout, "uncompressed.tar"); + + sprintf(origsize, "%ld", fsize(in)); + + sprintf(retbuf, "ss: %s: compressed: %s, decompressed: %u", filename, origsize, ss_decompress(filename, filedecout)); + + fclose(in); + // open existing file - if ((fd = open(filename, O_RDWR)) < 0) { - syn_warn("ss:warn:decompress, failed to open archive"); + if ((fd = open(filedecout, O_RDWR)) < 0) { + syn_warn("ss:warn:decompress, failed to tar open archive"); return NULL; } // read in data if (tar_read(fd, &archive, '1') < 0) { - tar_free(archive); close(fd); syn_warn("ss:warn:decompress, failed to read archive"); return NULL; @@ -92,18 +115,20 @@ char *process_line(char *line) tar_free(archive); close(fd); // don't bother checking for fd < 0 - return NULL; + remove(filedecout); + + return retbuf; + } /* Compression function of tar */ else if(strncmp("compress",tok_srch,8) == 0) { - char files[2][MAX_FILENAME_LEN+1]; // Files to be added into the archive + char filename[MAX_FILENAME_LEN+1]; // Files to be added into the archive + char passval[3]; struct tar_t *archive = NULL; int fd; - bzero(files[0], MAX_FILENAME_LEN); - tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { @@ -117,9 +142,43 @@ char *process_line(char *line) return NULL; } + // Save tarball filename + // Collect how many compress passes we do from first argument + // No more than 10 passes needed. + if((strlen(parse_vars(tok_srch)) < 3) && (atoi(parse_vars(tok_srch)) <= 10) && (atoi(parse_vars(tok_srch)) >= 5)) + { + sprintf(passval, "%s", parse_vars(tok_srch)); + } + else + { + syn_warn("ss:warn:compress, pass value too long, 5 to 10 are accepted values."); + return NULL; + } + + tok_srch = strtok(NULL, "\""); + if(tok_srch == NULL) + { + syn_warn("ss:warn:compress syntax error, missing quote?"); + return NULL; + } + + tok_srch = strtok(NULL, "\""); + if(tok_srch == NULL) + { + syn_warn("ss:warn:compress syntax error, missing quote?"); + return NULL; + } + + if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) + { + syn_warn("ss:warn:compress syntax error, missing archive name..."); + return NULL; + } + + // Save tarball filename if(strlen(parse_vars(tok_srch)) < MAX_FILENAME_LEN) { - sprintf(files[0], "%s", parse_vars(tok_srch)); + sprintf(filename, "%s", parse_vars(tok_srch)); } else { @@ -127,7 +186,7 @@ char *process_line(char *line) return NULL; } - if ((fd = open(files[0], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) == -1){ + if ((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) == -1){ syn_warn("ss:warn:compress, failed to open new archive"); return NULL; } @@ -158,29 +217,59 @@ char *process_line(char *line) return NULL; } - if(strlen(parse_vars(tok_srch)) < MAX_FILENAME_LEN) + int argc = 0; + char *argv[MAX_FILES]; + + char *p2 = strtok(tok_srch, " "); + while (p2 && argc < MAX_FILES-1) { - sprintf(files[1], "%s", parse_vars(tok_srch)); - } - else - { - syn_warn("ss:warn:comrpress, filename too long!"); - return NULL; + argv[argc++] = p2; + p2 = strtok(NULL, " "); } - const char **tarin = (const char **) &files[1]; + argv[argc] = 0; - //printf("%s", files[0]); + const char **tarin = (const char **) &argv[0]; - if (tar_write(fd, &archive, 0, tarin, '1') < 0) { - syn_warn("ss:warn:compress, failed to create archive"); + if (tar_write(fd, &archive, argc, tarin, '1') < 0) { + syn_warn("ss:warn:compress, failed to create tar archive"); return NULL; } tar_free(archive); close(fd); // don't bother checking for fd < 0 - return NULL; + syn_warn("ss:warn:compressing..."); + + FILE *in; + + char origsize[128]; + char file_comp[MAX_FILENAME_LEN+4]; + char filedecout[MAX_FILENAME_LEN+5]; + + in = fopen(filename, "r"); + if(in == NULL) + { + syn_warn("ss:warn:compress, failed to open tar for compression"); + return NULL; + } + + sprintf(file_comp, "%s.ss", filename); + sprintf(filedecout, "%s.1", filename); + + sprintf(origsize, "%ld", fsize(in)); + + fclose(in); + for(uint8_t i = 1; i <= atoi(passval); ++i) + { + sprintf(retbuf, "ss: %s: compressed: %u, decompressed: %u", file_comp, ss_compress(filename, file_comp, 20000000, i), ss_decompress(file_comp, filedecout)); + } + + // Remove the decompressed version for sanity check + remove(filedecout); + remove(filename); + + return retbuf; } /* mkdir function, and mkfile functions */ diff --git a/src/tar.c b/src/tar.c index 21f6414..9d9cf91 100644 --- a/src/tar.c +++ b/src/tar.c @@ -42,7 +42,7 @@ int tar_read(const int fd, struct tar_t ** archive, const char verbosity){ char update = 1; for(count = 0; ; count++){ - *tar = malloc(sizeof(struct tar_t)); + *tar = malloc(sizeof(struct tar_t) + 1); if (update && (read_size(fd, (*tar) -> block, 512) != 512)){ V_PRINT(stderr, "Error: Bad read. Stopping"); tar_free(*tar);