howard@erix.ericsson.se (Howard Gayle) (09/12/88)
I am working on yet another version of shar, called trshar because it uses the tr command when necessary. Trshar will archive any files containing any bytes, using tr if necessary to encode unprintable characters in printable form. It will automatically switch to a binary encoding such as btoa or uuencode if that is more compact than a tr encoding. (Files containing the NUL character must use a binary encoding since tr can not handle NULs.) Lines in trshar archives will always be less than 80 columns, regardless of the line lengths of the input files. No leading Xs or other characters will be added to lines, thus making archives more human-readable, and also saving a little space. I intend to release trshar as free software when it is finished. I expect it to be especially useful for transmitting "almost ASCII" files such as documents written in the ISO 8859 character sets. To finish trshar, I need your help. Below is a trshar archive of a test file, together with the same file in btoa and uuencode encodings. You can help by unsharing this archive and comparing the test file with one of its binary-encoded versions. Any difference reveals a problem I need to take into account. I have provided shell files to perform the comparisons easily. Just create a directory, cd to it, run the Bourne shell on the archive there, and read the README. Trshar currently makes the following assumptions about mail and news systems. If you know of a mail or news system for which one or more of these assumptions does not hold, please let me know. 1) Backspace, tab, newline, and form feed are passed unchanged. 2) Any printable character except '.' may appear alone on a line. 3) Articles or messages may be at least 65535 bytes long. 4) Lines may be at least 79 bytes long (with tab stops set 8 spaces apart). I posted this to comp.sources.d to avoid having it archived. Please respond by mail. Howard Gayle TN/ETX/TX/UMG Ericsson Telecom AB S-126 25 Stockholm Sweden howard@ericsson.se {mcvax, uunet}!enea!ericsson.se!howard Phone: +46 8 719 5565 FAX : +46 8 719 9598 Telex: 14910 ERIC S CUT HERE : trshar1.8 export PATH||(echo 'sh (Bourne shell) extracts this archive';kill $$) a='README' b=1288 if test -f "$a" then echo "Will not overwrite $a" else echo "$a.." cat<<'Z'>"$a" The following files should be present: t.t - Test file delivered by trshar. t.b.b - The same test file, encoded by btoa. t.u.u - The same test file, encoded by uuencode. t-btoa - Bourne shell file to decode t.b.b and compare it with t.t. t-uuencode - Bourne shell file to decode t.u.u and compare it with t.t. To run the test, simply execute either of the shell files t-btoa or t-uuencode. If all goes well, the shell file will print out a message. No further action is required. If the test file as delivered by trshar differs from the binary-encoded copy, the shell file will print an error message and will also binary-encode the test file so you can mail it back to me. In your mail message, please include what kind of hardware and software you have, for example VAX-11/750 running 4.3BSD. If you can diagnose the problem, or even just have a hunch, please include it. If you don't mind my contacting you for further information if necessary, please include your electronic and snail addresses, phone, etc. Thank you very much for your help! Howard Gayle TN/ETX/TX/UMG Ericsson Telecom AB S-126 25 Stockholm Sweden howard@ericsson.se {mcvax, uunet}!enea!ericsson.se!howard Phone: +46 8 719 5565 FAX : +46 8 719 9598 Telex: 14910 ERIC S Z if test $b -ne `wc -c<"$a"` then echo "*** Error: $a should be $b bytes ***" else echo "$a..$b bytes" fi fi a='t-btoa' b=187 if test -f "$a" then echo "Will not overwrite $a" else echo "$a.." cat<<'Z'>"$a" atob<t.b.b>t.b if cmp -s t.t t.b then echo 'All is well.' else btoa<t.t>t.t.b echo 'Something is wrong. Please mail t.t.b back.' fi echo 'Thank you very much for your help.' Z if test $b -ne `wc -c<"$a"` then echo "*** Error: $a should be $b bytes ***" else chmod +x $a echo "$a..$b bytes" fi fi a='t-uuencode' b=209 if test -f "$a" then echo "Will not overwrite $a" else echo "$a.." cat<<'Z'>"$a" chmod 777 . uudecode t.u.u if cmp -s t.t t.u then echo 'All is well.' else uuencode t.t t.t.u>t.t.u echo 'Something is wrong. Please mail t.t.u back.' fi echo 'Thank you very much for your help.' Z if test $b -ne `wc -c<"$a"` then echo "*** Error: $a should be $b bytes ***" else chmod +x $a echo "$a..$b bytes" fi fi a='t.b.b' b=2711 if test -f "$a" then echo "Will not overwrite $a" else echo "$a.." cat<<'Z'>"$a" xbtoa Begin <+oue+DGm>@3BZ'F*&O:Bl%?'AoD]4FE2G9@<*t-$:,eNBl7K)GA2/4+?:Qd@:F:=$4/En1'o`C1^Q #G2@2;K3!hSP$:,eNBl7K)GA2/4+>GPmFCAX"3XQ0J#r2fC#rDrG#rW)K#ri5O#qu\n5p0uXDIjr7B ln#2@;Ka&@X3',F!,%=@qBV$+APp1+CT.u+Dtb7Ch[cu3XPlh!sAc3#7(VD$k3[W&.oNg'GVB"(`=5 2*$$(B+<_pR,UFcb-n-Vr/1iJ-0JP==1c70M3&s#]4?Ykm5X@_(6q'R884cEH9MJ8X:f1+h<)lt#=B Sg3>[:ZC?t!MSA7]@cBPD3sCi+'.E,fo>FEMbNG^4U^I!pHnJ:W<)KS>/9Ll%"IN/`jYOHG]iPa.Q$ R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GZd*^:jeCE .%f\,!5gtgiEi8N\UjQ5OekiqBum-X60nF?)@o_%qPq"ad`r;HWp$49'ACh[cu+EqOABHT#`1,L+_H $!V=3XRu$/M/\//M/P//M/P+.kN>)/M\n0/M/J)/M/P1/M/P+.kN>)/Mo%2/M/J)/M/P3/M/P+.kN> )/N,14/M/J)/M/P5/M/P+.kN>)/N>=6/M/J)/M/P7/M/P+.kN>)0eb12/M/J)/M/\3/M/P+.kN>)0e t=4/M/J)/M/\5/M/P+.kN>)0f1I6/M/J)/M/\7/M/P+.kN>)0fCU8/M/J)/M/\9/M/P+.kN>)0fUa: /M/J)/M/\;/M/P+.kN>)1,(:3/M/J)/M/_4/M/P+.kN>)1,:F5/M/J)/M/_6/M/P+.kN>)1,LR7/M/ J)/M/_8/M/P+.kN>)1,^^9/M/J)/M/_:/M/P+.kN>)1,pj;/M/J)/M/_</M/P+.kN>)1GCC4/M/J)/ M/b5/M/P+.kN>)1GUO6/M/J)/M/b7/M/P+.kN>)1Gg[8/M/J)/M/b9/M/P+.kN>)1H$g:/M/J)/M/b ;/M/P+.kN>)1H6s</M/J)/M/b=/M/P+.kN>)1b^L5/M/J)/M/e6/M/P+.kN>)1bpX7/M/J)/M/e8/M /P+.kN>)1c-d9/M/J)/M/e:/M/P+.kN>)1c?p;/M/J)/M/e</M/P+.kN>)1cR'=/M/J)/M/e>/M/P+ .kN>)2)$U6/M/J)/M/h7/M/P+.kN>)2)6a8/M/J)/M/h9/M/P+.kN>)2)Hm:/M/J)/M/h;/M/P+.kN >)2)[$</M/J)/M/h=/M/P+.kN>)2)m0>/M/J)/M/h?/M/P+.kN>)2D?^7/M/J)/M/k8/M/P+.kN>)2 DQj9/M/J)/M/k:/M/P+.kN>)2Dd!;/M/J)/M/k</M/P+.kN>)2E!-=/M/J)/M/k>/M/P+.kN>)2E39 ?/M/J)/M/k@/M/P+.kN>)2_Zg8/M/J)/M/n9/M/P+.kN>)2_ls:/M/J)/M/n;/M/P+.kN>)2`**</M /J)/M/n=/M/P+.kN>)2`<6>/M/J)/M/n?/M/P+.kN>)2`NB@/M/J)/M/nA/M/P+.kN>)3%up9/M/J) /M/q:/M/P+.kN>)3&3';/M/J)/M/q</M/P+.kN>)3&E3=/M/J)/M/q>/M/P+.kN>)3&W??/M/J)/M/ q@/M/P+.kN>)3&iKA/M/J)/M/qB/M/P+.kN>)3A<$:/M/J)/M/t;/M/P+.kN>)3AN0</M/J)/M/t=/ M/P+.kN>)3A`<>/M/J)/M/t?/M/P+.kN>)3ArH@/M/J)/M/tA/M/P+.kN>)3B/TB/M/J)/M/tC/M/P +.kN>-0JG(1/M/J)/MSq6/M/P+.kN>-0JY43/NsLK6#:?[@X3',F!,%=@qBV$+APp1+CT.u+=Ach/0 HYiE+O&4Ch[cu3XPlp!X]#:":>;>"ptSB#RUkF$4@1L$4R=P$4dIT$5!UX$53a\$5Em`$5X$d$5j0h $6'<l$69Hp$6KTt$6]a#$6om'$7-$+$7?0/$7Q<3$7cH7$7uT<$8;fA$8MrE$8`)I$8r5M$9/AQ$9A MU$9SYY$9ee]$:"qa$:5(e$:G4i$:Y@m$:kLq$;(Xu$;:e$$;Lq($;_(,$;q40$<.@4$<@L8$<RX<$ <dd@$=!pD$=4'H$=F3L$=X?P$=jKT$>'WX$>9c\$>Ko`$>^&d$>p2h$?->l$??Jp$?QVt$?cc#$?uo '$@3&+$@E2/$@W>3$@iJ7$A&V;$A8b?$AJnC$A]%G$Ao1K$B,=O$B>IS$BPUW$Bba[$Btm_$C2$c$C D0g$CV<k$ChHo$D%Ts$D7a"$DIm&$D\$*$Dn0.$E+<2$E=H6$EOT:$Ea`>$EslB$F1#F$FC/J$FU;N $FgGR$G$SV$G6_Z$GHk^$G["b$Gm.f$H*:j$H<Fn$HNRr$H`_!$Hrk%$I0")$IB.-$IT:1$IfF5$J# R9$J5^=$JGjA$JZ!E$Jl-I$K)9M$K;EQ$KMQU$K_]Y$Kqi]$L.ua$LA,e$LS8i$LeDm$M"Pq$M4\u$ MFi$$MXu($Mk,,$N(80$N:D4$49'ACh[cu+EMX5Ecc#5B-;D4FD)dE/gi[e/hRJ<5p0uXDIjr7Bln# 2@3BB)DIjq</gi[e/d_qSDIal.Afu2,F*&O:Bl%?5$31&+ xbtoa End N 2093 82d E 5a S 22100 R 8a6644ae Z if test $b -ne `wc -c<"$a"` then echo "*** Error: $a should be $b bytes ***" else echo "$a..$b bytes" fi fi a='t.u.u' b=2906 if test -f "$a" then echo "Will not overwrite $a" else echo "$a.." cat<<'Z'>"$a" begin 644 t.u M5&AI<R!I<R!A('1E<W0@9FEL92!F;W(@=')S:&%R+@H*02!L:6YE('=I=&@@ M.2!T86)S.@H),0DR"3,)- DU"38)-PDX"3D*"D$@;&EN92!W:71H(#$P('1A M8G,Z"@DQ"3(),PDT"34)-@DW"3@).0DP"@I!(&QI;F4@=VET:"!A;&P@8GET M97,@97AC97!T($Y53"!A;F0@;F5W;&EN93H* 0(#! 4&!P@)"PP-#@\0$1(3 M%!46%Q@9&AL<'1X?("$B(R0E)B<H*2HK+"TN+S Q,C,T-38W.#DZ.SP]/C] M04)#1$5&1TA)2DM,34Y/4%%24U155E=865I;7%U>7V!A8F-D969G:&EJ:VQM M;F]P<7)S='5V=WAY>GM\?7Y_@(&"@X2%AH>(B8J+C(V.CY"1DI.4E9:7F)F: MFYR=GI^@H:*CI*6FIZBIJJNLK:ZOL+&RL[2UMK>XN;J[O+V^O\#!PL/$Q<;' MR,G*R\S-SL_0T=+3U-76U]C9VMO<W=[?X.'BX^3EYN?HZ>KK[.WN[_#Q\O/T M]?;W^/GZ^_S]_O\*"D$@;&EN92!W:71H(#$P,C0@8GET97,Z"CPM+2TQ+2TM M+3$M+2TM*RTM+2TR+2TM+2LM+2TM,RTM+2TK+2TM+30M+2TM*RTM+2TU+2TM M+2LM+2TM-BTM+2TK+2TM+3<M+2TM*RTM+2TX+2TM+2LM+2TM.2TM+2TK+2TM M,3 M+2TM*RTM+3$Q+2TM+2LM+2TQ,BTM+2TK+2TM,3,M+2TM*RTM+3$T+2TM M+2LM+2TQ-2TM+2TK+2TM,38M+2TM*RTM+3$W+2TM+2LM+2TQ."TM+2TK+2TM M,3DM+2TM*RTM+3(P+2TM+2LM+2TR,2TM+2TK+2TM,C(M+2TM*RTM+3(S+2TM M+2LM+2TR-"TM+2TK+2TM,C4M+2TM*RTM+3(V+2TM+2LM+2TR-RTM+2TK+2TM M,C@M+2TM*RTM+3(Y+2TM+2LM+2TS,"TM+2TK+2TM,S$M+2TM*RTM+3,R+2TM M+2LM+2TS,RTM+2TK+2TM,S0M+2TM*RTM+3,U+2TM+2LM+2TS-BTM+2TK+2TM M,S<M+2TM*RTM+3,X+2TM+2LM+2TS.2TM+2TK+2TM-# M+2TM*RTM+30Q+2TM M+2LM+2TT,BTM+2TK+2TM-#,M+2TM*RTM+30T+2TM+2LM+2TT-2TM+2TK+2TM M-#8M+2TM*RTM+30W+2TM+2LM+2TT."TM+2TK+2TM-#DM+2TM*RTM+34P+2TM M+2LM+2TU,2TM+2TK+2TM-3(M+2TM*RTM+34S+2TM+2LM+2TU-"TM+2TK+2TM M-34M+2TM*RTM+34V+2TM+2LM+2TU-RTM+2TK+2TM-3@M+2TM*RTM+34Y+2TM M+2LM+2TV,"TM+2TK+2TM-C$M+2TM*RTM+38R+2TM+2LM+2TV,RTM+2TK+2TM M-C0M+2TM*RTM+38U+2TM+2LM+2TV-BTM+2TK+2TM-C<M+2TM*RTM+38X+2TM M+2LM+2TV.2TM+2TK+2TM-S M+2TM*RTM+3<Q+2TM+2LM+2TW,BTM+2TK+2TM M-S,M+2TM*RTM+3<T+2TM+2LM+2TW-2TM+2TK+2TM-S8M+2TM*RTM+3<W+2TM M+2LM+2TW."TM+2TK+2TM-SDM+2TM*RTM+3@P+2TM+2LM+2TX,2TM+2TK+2TM M.#(M+2TM*RTM+3@S+2TM+2LM+2TX-"TM+2TK+2TM.#4M+2TM*RTM+3@V+2TM M+2LM+2TX-RTM+2TK+2TM.#@M+2TM*RTM+3@Y+2TM+2LM+2TY,"TM+2TK+2TM M.3$M+2TM*RTM+3DR+2TM+2LM+2TY,RTM+2TK+2TM.30M+2TM*RTM+3DU+2TM M+2LM+2TY-BTM+2TK+2TM.3<M+2TM*RTM+3DX+2TM+2LM+2TY.2TM+2TK+2TQ M,# M+2TM*RTM,3 Q+2TM+2LM+3$P,BTM+3X*"D%L;"!B>71E<R!E>&-E<'0@ M3E5,(&%N9" G+B<L(#$@<&5R(&QI;F4Z"@$* @H#"@0*!0H&"@<*" H)"@H+ M"@P*#0H."@\*$ H1"A(*$PH4"A4*%@H7"A@*&0H:"AL*' H="AX*'PH@"B$* M(@HC"B0*)0HF"B<** HI"BH**PHL"BT*+PHP"C$*,@HS"C0*-0HV"C<*. HY M"CH*.PH\"CT*/@H_"D *00I""D,*1 I%"D8*1PI("DD*2@I+"DP*30I."D\* M4 I1"E(*4PI4"E4*5@I7"E@*60I:"EL*7 I="EX*7PI@"F$*8@IC"F0*90IF M"F<*: II"FH*:PIL"FT*;@IO"G *<0IR"G,*= IU"G8*=PIX"GD*>@I["GP* M?0I^"G\*@ J!"H(*@PJ$"H4*A@J'"H@*B0J*"HL*C J-"HX*CPJ0"I$*D@J3 M"I0*E0J6"I<*F J9"IH*FPJ<"IT*G@J?"J *H0JB"J,*I JE"J8*IPJH"JD* MJ@JK"JP*K0JN"J\*L JQ"K(*LPJT"K4*M@JW"K@*N0JZ"KL*O J]"KX*OPK M"L$*P@K#"L0*Q0K&"L<*R K)"LH*RPK,"LT*S@K/"M *T0K2"M,*U K5"M8* MUPK8"MD*V@K;"MP*W0K>"M\*X KA"N(*XPKD"N4*Y@KG"N@*Z0KJ"NL*[ KM M"NX*[PKP"O$*\@KS"O0*]0KV"O<*^ KY"OH*^PK\"OT*_@K_"@I!(&QI;F4@ M<W1A<G1I;F<@=VET:" G+B<Z"BXN"@I!(&QI;F4@=VET:"!A(&QO;F4@)RXG 7.@HN"@I%;F0@;V8@=&5S="!F:6QE+@I! end Z if test $b -ne `wc -c<"$a"` then echo "*** Error: $a should be $b bytes ***" else echo "$a..$b bytes" fi fi a='t.t' b=2093 if test -f "$a" then echo "Will not overwrite $a" else echo "$a.." cat<<'Z'>"$a" This is a test file for trshar. A line with 9 tabs: 1 2 3 4 5 6 7 8 9 A line with 10 tabs: Z tr -d '\12'<<'Z'|tr '\\' '\12'>>"$a" 1 2 3 4 5 6 7 8 9 0\ Z cat<<'Z'>>"$a" A line with all bytes except NUL and newline: Z c='bcdefghijklmnopqrstuvwxyz{|}' d='\12\1\2\3\4\5\6\7\13\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36' e='\37' tr -d '\12'<<'Z'|tr "$c" "$d$e">>"$a" cdefghi jklmnopqrstuvwxyz{|} !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI JKLMNOPQRSTUVWXYZ[\]^_`a Z c='!"#$%&\47()\*+,\-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`' d='\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220' e='\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242' f='\243\244\245\246\250\251\252\253\254\255\256\257\260\261\262\263\264\265' g='\266\267\270\271\272\12\247\273\274\275' tr -d '\12'<<'Z'|tr "$c" "$d$e$f$g">>"$a" bcdefghijklmnopqrstuvwxyz{|}~!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH]IJKLMNOPQ RSTUVWXYZ[^_` Z c='!"#$%&\47()\*+,\-./356789;<=>?@BCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`acdf{|}' d='~' e='\276\300\301\302\303\305\306\307\310\312\313\314\315\316\317\320\322\323' f='\324\325\326\327\330\331\332\333\311\335\336\340\342\343\345\346\347\350' g='\352\353\354\355\356\357\360\362\363\364\365\366\367\370\371\372\304\321' h='\277\334\373\351\374\375\376\377\344\361\341\337' tr "$c$d" "$e$f$g$h"<<'Z'>>"$a" !]"#$%[&'()@*+,-./3\56789;<=>?^BC~D}EF{GHIJ`KLMNOPQ|RSTUVWXYZ_acdf A line with 1024 bytes: Z tr -d '\12'<<'Z'|tr '\\' '\12'>>"$a" <---1----1----+----2----+----3----+----4----+----5----+----6----+----7----+---- 8----+----9----+---10----+---11----+---12----+---13----+---14----+---15----+--- 16----+---17----+---18----+---19----+---20----+---21----+---22----+---23----+-- -24----+---25----+---26----+---27----+---28----+---29----+---30----+---31----+- --32----+---33----+---34----+---35----+---36----+---37----+---38----+---39----+ ---40----+---41----+---42----+---43----+---44----+---45----+---46----+---47---- +---48----+---49----+---50----+---51----+---52----+---53----+---54----+---55--- -+---56----+---57----+---58----+---59----+---60----+---61----+---62----+---63-- --+---64----+---65----+---66----+---67----+---68----+---69----+---70----+---71- ---+---72----+---73----+---74----+---75----+---76----+---77----+---78----+---79 ----+---80----+---81----+---82----+---83----+---84----+---85----+---86----+---8 7----+---88----+---89----+---90----+---91----+---92----+---93----+---94----+--- 95----+---96----+---97----+---98----+---99----+--100----+--101----+--102--->\ Z c='STVWXY\[\\\]^_`fghjkmoquvwz{|}' d='\1\2\3\4\5\6\7\13\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37' tr "$c" "$d"<<'Z'>>"$a" All bytes except NUL and '.', 1 per line: S T V W X Y [ \ ] ^ _ ` f g h j k m o q u v w z { | } ! " # $ % & ' ( ) * + , - / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R Z c='"#$%&\47()\*+,\-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ' d='\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220' e='\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242' f='\243\244\245\246\247\250\251\252\253\254\255\256' tr "$c" "$d$e$f"<<'!'>>"$a" S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q ! c='!"#$%&\47()\*+,\-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY\[\\\]^_`ab' d='cdefghijklmn{|}~' e='\257\261\262\263\264\265\266\267\270\271\272\273\274\275\276\300\301\302' f='\303\305\306\307\310\312\313\314\315\316\317\320\322\311\323\324\325\326' g='\327\330\331\332\333\335\336\340\342\343\344\345\346\347\350\352\353\354' h='\355\356\357\304\321\277\334\360\351\362\363\364\365\366\367\370\371\372' i='\373\374\375\376\377\260\361\341\337' tr "$c$d" "$e$f$g$h$i"<<'Z'>>"$a" ! { " # $ % & ' ( ) * + , - . / ] 0 1 2 3 [ 4 5 6 7 @ 8 9 : ; < = > \ ? A B C D E F G H I ^ J K ~ L } M N O P Q R S ` T U V W X Y _ | a b c d e f g h i j k l m n Z tr ',' '.'<<'Z'>>"$a" A line starting with '.': .. A line with a lone '.': , End of test file. Z if test $b -ne `wc -c<"$a"` then echo "*** Error: $a should be $b bytes ***" else echo "$a..$b bytes" fi fi exit 0
rick@pcrat.UUCP (Rick Richardson) (09/13/88)
In article <1823@erix.ericsson.se> howard@erix.ericsson.se (Howard Gayle) writes: >I am working on yet another version of shar, called trshar >because it uses the tr command when necessary. Trshar will >archive any files containing any bytes, using tr if necessary >to encode unprintable characters in printable form. It will >automatically switch to a binary encoding such as btoa or >uuencode if that is more compact than a tr encoding. (Files I took Rich $alz's 'cshar' package a while back and modified it to compress and then uuencode binary files. I hacked it in quickly, and haven't sent the changes to Rich to approve as an official patch. I would suggest, however, that anything you do be based upon Rich's package. The quick hack I did will be readily apparent in the upcoming JetRoff shar's in comp.sources.misc. I had to change findsrc.c (to indicate to makekit that a file is binary), makekit.c (to figure out what the compressed/uuencoded size of a file will be), and shar.c (to compress/uuencode the file and put the proper wrapper around it). -- Rick Richardson, PC Research, Inc. rick%pcrat.uucp@uunet.uu.net (INTERNET) uunet!pcrat!rick (UUCP, Personal Mail) ..!pcrat!jetroff (JetRoff Info) ..!pcrat!dry2 (Dhrystone Submissions)
rsalz@bbn.com (Rich Salz) (09/13/88)
=In <1823@erix.ericsson.se> howard@erix.ericsson.se (Howard Gayle) writes: =I am working on yet another version of shar, called trshar =because it uses the tr command when necessary. Trshar will =archive any files containing any bytes, using tr if necessary =to encode unprintable characters in printable form. In <574@pcrat.UUCP> rick@pcrat.UUCP (Rick Richardson) writes: =I took Rich $alz's 'cshar' package a while back and modified it =to compress and then uuencode binary files. ... =... I would suggest, however, that anything =you do be based upon Rich's package. Thanks for the compliment, Rick. Lemme just throw out a few words on shars. As comp.sources.unix moderator I've seen many different types, and with the release of my cshar package I seem to have had a great influence on what the world uses. There seem to be three major shar philosophies: 1. Use a generator that's dumb and simple and elegant. Can't get any easier than this little fellow from Kernighan and Pike, "bundle": #! /bin/sh echo '#To unpack, delete all lines before this and feed to /bin/sh' for I do echo "echo $I 1>&2" echo "cat >$I <<'END'" cat <$I echo "END" done Easy to use: "bundle *.[ch] | mail user@site.domain" 2. Write a generator that will split large files, wrap long lines, convert binary to ASCII for transmission, walk directories, etc. Kind of easy to use: mondoshar -n '/tmp/files' /unix /etc/termcap for I in /tmp/files* ; do mail user@site.domain <$I ; rm $I done 3. Write a generator that is fairly robust about shipping text files around in today's networks. Method #1 is cool -- ultimate Unix philosophy. It's also guaranteed to generate files that are too big to mail around, or will otherwise cause problems for some sites (lines with just a period in them, for example). Method #2 is big and bulky. Often easy to use, except when you run across the one thing it can't handle ("whaddya mean it doesn't followed the symlink?"). The resultant shars are often useless on non-Unix systems, and can be subject to dialect differences even there. Method #3 seems like a reasonable compromise. Not surprisingly, it's the one I took. It works real well at getting SOURCES from here to there. It includes multi-part checks, is fairly easy to parse, and does some limited error-checking. Coupled with a "shar parser", this method gives you something that works on a wide variety of systems -- MSDOS, VMS, Unix. If you want to send binary or really big files, you have to special-case it and do some work by hand. I don't mind that, because I've yet to find a tool that really handles every one of those special cases -- and certainly nothing that works on all kinds of systems. In conclusion, if you think the world really needs another shell archive generator, give some serious thought to what problem you're trying to solve, and where it will be solved. Hope this info is useful. /rich $alz -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.