[comp.sources.atari.st] v02i019: uw -- Unix Windows windowing terminal software part01/05

koreth@ssyx.ucsc.edu (Steven Grimm) (03/03/89)

Submitted-by: sun.com!laidbak!katzung (Brian Katzung)
Posting-number: Volume 2, Issue 19
Archive-name: uw/part01

		   **** Client-Side Information ****

			  UW (Unix (tm) Windows) ST
		A Windowing Terminal Emulator for the Atari ST

This program was written by Hans-Martin Mosner at the University of
Dortmund in West Germany.  It has since been enhanced by Brad Bosch
and Brian Katzung at Lachman Associates, Inc., in Naperville, Illinois.
We have added quite a lot, including

	o keyboard and mouse locking,
	o simple text capture,
	o kermit file transfer in a uw window,
	o subprocess execution,
	o function-key support,
	o RS232 configuration,
	o additional fonts, and
	o printer support.

Limitations:
	o only supports monochrome systems
	o only supports adm31 emulation
	  (but the emulation has been "enhanced"--see README)
	o only supports the minimum UW protocol

We have spent a great deal of effort trying to work out or around bugs
in GEM, HMM's code, and our code, but I'm sure some have succeeded in
eluding us even though this code has been in use at Lachman Associates
for over a year.

		    **** Server Information ****

The latest Unix(tm)-side server that we know of is version 4.1.2.
The author and contact person is:

	John D. Bruner
	ARPANET/MILNET: jdb@s1-c.ARPA
	UUCP: {seismo,ut-sally,dual,lll-crg}!mordor!jdb

-- Brian Katzung  ...!laidbak!katzung
   Brad Bosch	  ...!laidbak!brad

   Lachman Associates, Inc.
   1901 North Naper Blvd.
   Naperville, IL 60540
   (312) 505-9100

[This contains the source code, as well as a uuencoded arcfile with
 resources, fonts, and so on.  The binaries are being posted to the
 binaries group. -sg]

#!/bin/sh
# shar:	Shell Archiver  (v1.22)
#
# This is part 1 of a multipart archive                                    
# do not concatenate these parts, unpack them in order with /bin/sh        
#
#	Run the following text with /bin/sh to create:
#	  BINARC.UUE
#	  BLDMFORM.C
#	  KERMIT.C
#	  LASTCHG
#	  LCKBLK1.ICN
#	  MAKE.BAT
#	  MAKEFILE
#	  MFORM.C
#	  README
#	  RESETAUX.S
#	  RMBBLK1.ICN
#	  STARTGEM.S
#	  UW.H
#	  VERSION
#	  WIN-.CNF
#	  WIN.CNF
#	  WIND.H
#	  WINDEFS.H
#	  WINHASH.C
#	  WINIO.C
#	  WINMAIN.C
#	  WINPROC.C
#	  WINPROTO.C
#	  WINSUBR.C
#
if test -r s2_seq_.tmp
then echo "Must unpack archives in sequence!"
     next=`cat s2_seq_.tmp`; echo "Please unpack part $next next"
     exit 1; fi
sed 's/^X//' << 'SHAR_EOF' > BINARC.UUE &&
Xbegin 600 bin.arc
XM&@A724Y$+E)30P`"&H@`8!@``#D2V[8:K,8O```,``)8,#'!R<""!0&00.CD
XMA:,`#P`X`*`!`"0$+XR!(%)FSAH0`$`82<.F#$@03^#02?/&S9R3*<O(";.R
XMY<N05]*X(?/FSDDC+>F<A")')QV9)T$$$?.FCE`Z:-*\G$.GCADS(%M`HA!R
XM8\>/0<:,Z3CGC9P\(&*`2,K1HU*Q9,VBE;&V:UNP<.>4/0MB1MVU=]^.U2L7
XM!(V_7MV&';P7;0W$@1?'Y6L#<90Z:816N0("CIPW=-X`T"JA*Y,W8<B`&-/2
XM3)HS7:>$L6.2M1O7L-<.":.RCAR3D`ITO9PYZ>DQ']>4R<,TC!S5!=9T+8*G
XMS!BG)H>T(1.[C%`H--&`0#&&3(JN2V2VR1P;34^1OTTV*=.F:\Z=[XVP:5IT
XM#IK8;*1!ADPO0;)`5U1D5A((0C@'`B0*3$=&<4;4X<880J67QQQ=!5''A&(L
XM*$09;+#QH`%=62%5&B&:-&*))R+X!AP@M,0@B29"<D"'>LDDE!143/$"$51(
XML58!W*TE14?>@0"DD$0:"<D`!?RG6VNO^6:2%%/(,`-=4W:UY!Q-<NDEF#MJ
XMQ=5:3]`F!U5%*0="$V\,*&89;H31!G`'%"!'>T6Y\9&.!7"X%A("FD3%C`\6
XM4``=[;TG!&BAM7&D&%T]`1524Z2A!W!4BK86G;0]F$`!]>FV'YD/(E#`&-V5
XMA"$(2;@!AU,/$A"K=72L`!Y5)A6`1U=#E.3@%&/$Y\:=<WA:1E=.E.'3?3SY
XM-&4!=T`K;5]TX0$"#C#DJJU/,ASF+;A'/KM6M#[%T.VWX4*BZ[K;X@""MS8<
XM%MRX*&TJ1ZX%++O6<6&8.,2,>71EK[<Q5#;'AB"8$92X:U7F[0UK/?R2Q&X(
XM)6]7&#/L5T]N1#PQ"`6PT97%:85;L%`<"X5R&%V9"P+&(-#A!EHQ'YE&5UC<
XM"T(6:X$F7L\?#_S&&0Q2^H:EU\)AVM(@+$KC15T1910(U+X7YEI3A';UJ7$`
XMT$0=;*S40M<^4:&>3@6#4$0;:-/$TK)")(Q$&"ZUT(1S*Y5,YQQNR`1`%6ZD
XMX6:S=*#U!E9$F$4'W3L!\(1T=/Y&ZVVB47>42XJ3B-;>R)6A6MX`"%$4WR`L
XM09,>%L*F>FI-SS'&?TR$<7L;K`=!V!AIT-01"YN/X0(`7T!2`?+*`X!%\^R"
XMX(2>9>A@^1(`#!&$$T,4P00`4Y#(:\YHF&2&A1C>#8)R:(4&@NG%U=&L&[!-
XMN2D(8C@5FDLU_BL&6K^!`QMTIQ.FW>]\%ZK)LJ:4ISVY8"U4*%_)X/>4\D4,
XM?0I<WW+P5Z<\'&]*T<*#4-@'`**4P0X:3-@4W.,3II`A83PI'`!$X`41@&!/
XM?'N);>CP&3;L8"U>\%8/5L-#-K0`#\3S@A=`,$0O6&0`&@)!`ZLG$N1]P8K.
XMPT+J.FB]Y*&`>5]\WA>-H!80M$`D,7"9YBSDGS28X2BJ06#Z;,2^.7QP`&14
XMRQF-(`,UFD1WC#$=".Z0&?'LL(=WY*,>13*#<+7QC2#@FVJ,,(-%&H$&+DN;
XM3/)TE#L6H6-(F=0+`?#)H_SK?FZH0QO$@)3'@>`S=WB))%?S!C:HTB4`D-@I
XM+5@XGQ`2/W<XGA1Z,@?K'<R6;7"),?DV%I4]`7M?N&(TL\B\`533>6&*H%1`
XM0*8XU`%/8ZD15FRGK)>(H2AE,`,;8-B19+&H(]Q\FDE<>;^2Z(5\K'N#&.S`
XM$OF!Q`QEH(F67D+/J+S$,TN;21L>R"!8SH]ICS/;$Z10A.L!X'Y[2J4L=_(^
XM/,!!)FG(*!WL9B/GF"0J9T##.@'P&]9D=$!D8"CXY'E#/-7A@@F\VTO0,)L_
XMEBP,OPL>'`$`@)>U@'WXT\F$Z,?0)&`E#"#(#'U`P-.IU.%VD00`VW3(.E9R
XM4WP8$N3_I*A*5OZ+D%`!B1B46D#B%6>;;@"-('5"/I-D]*9H%4\!CG>_EZ5P
XM/`50"YED18>7_+)::2%>`60`@,&.[[#OH8MWQI`"AFXUDK\IJEY>4SC5'#`-
XM;Q+*;,)`DC"TB*RK-!Q5`%?`018R+8.48%W18M(:?;2SQQN1+DU2!Y]L<[5R
XM@&.-2G8_]U"%FXEB`0!:LL[AF@2ROI6E'4@[P!8Q-"4*Y%"MR+?-Q=V->`'%
XM*G3?1[<!'F6C%^6I:#4'U&:=H;.1%,J,\)2SD-:FJ\^*(),Z^KEFV02S\W1*
XM@.!+UTT5E0QMJ&3.WI8G$^4UGGOB+Y[\ZY+C/5.B%`7`[?AV!D'JDKN&5>I[
XMQNK8]-&OKNG](T(](U2[VC2J1VG#'(BWJ9*-854%3'%4$[>2N$%7F$4(`A&:
XM4(2(D<0D4*'):JCGVK1"99L(/8-"+8R])DRTHL5*`W):>[^BI%0H;6@*J_)'
XMA_WM&,53NBO^'#0@,H%N)9]Z"49?+`;GW#'+R(GD&4A+W#>\LB.A^<T=.T6_
XM!=U8RVO@L@6]C`8PB]DD9-[?$W72K`%%TK7`_"IA93E(L\31+$^\CAQ^TS$0
XM#+@,Q)LE&69RAC.TML2%S>J4?N/JEMR1-7#(0UM!P),ZG/;06SXQK.5<OB<2
XM^@R&#E"P#;CHUS3ZAH_&G_Y:\L228AJQ3'F.3(@WAP`-2`[$,TM]Z;"@.O]I
XM2L.NZ[7?\V&=W(H.#(V<KTL2:F4G6MAX(L-&T2)J4I,;+;`VW1./(L([7MC*
XM&=8O@W2WACG`07>H]DI)CD(\`J2:HP-(X4MXES"ORD^0[@MSJ9S3%([.DH)-
XMCLJR)E0PJKF&1/K&IU#\\Y[[\6$U/)U)6.5P/-V94I::H[2/!!F&-R+%YL=3
XM>!%L]]<;!_1-ZGXY&V)*+Y]L6`XM`$`,(8T6SY!%T299^AC^*K$2]42L"5.X
XM:PS-FZIH;D89W*;;X?LXK/Q/P\8*%+/-=V0I4H^AVGS)-@/:K)7>;TES3R&5
XM,5Q1H/PKS$'GG!QXI\!PG]+/^API76F&:\=A93/$VZ'/&TJ[2=E./.)67?"6
XMY3HZP.[$2CY@+??S2Z:E9M5DL5X,<@`#M3A!<N*9WD?_-2FTG=`YW,G=[GH7
XM5.%Q2/@RX6>)(IX$)E0,!C7`Y(,&@((J3"$(YT%!)660`A#4`/LMR$$:89"]
XM[77O>Q<VTY=`,(0G.,$(23A"%:00!"HDP?ZI$P8?XB3"DSJ9,0<O,`0Y!P"[
XMUT?L!P(Y8`,P\(`T`"X/.`,2^(#E,H$AT4=?$P,6&!+NPH'7]X!]08(@X(!=
XM$0/GMX(S0`,KF$8KV$<A,27@`@`U```V```W```X4$+.D1D)\WLR5`2TL2Q/
XM0`;<$3:,(@0'"`#Z\1X'TS$]Q(`,Z`(YR%A$^"Q88'\OT(5&8`0`\"0)&"0`
XM(`,UL(,R@#T-@SVU\FX,8A4`]2^=\BDE9"RLTC@?=6D/IQ=WX&FQI67B03?'
XMQ4H`\'&>Y6<6LA]Y=C_LTQS/$4D<%68?EW1YL(?WTX=S\(>12`>$%$YD\G`S
XM(5QW1U%4L'].((F?9G9W@'9.4@2G*`5.`'CE0R8`0&D\=%79Y5HP\AN\0U<6
XMLA(F<C^>*!J:R(DQ1WFWPU!*(#]"X77W9(JH>%&?B&1^-@;,1"(@9ELR05)N
XMP%`FI!<`$`1&MTLF<8R>!G2U818M]6\`@">F9#HT9D&/B!J1.$N4R"J$!".&
XMR(C*H1K!2!+JAHZ1.'B@]!LQ14I,YSX?IVX#=%P$F9"_=Q0ZL!:.MXW^F#-^
XMYE5D(FH1EP=-T5CN@3:JX29NU#[JU1F_L5DGUF5,`BF19B.FM!Z<!$_[X6HE
XM0R:;91/'4P184`1#4`54@&7NYSU@=)1B!(0*Y1T$8CW481W807]/PSN5$SX<
XM-1+TMB1C$3HB<60<LAL70B+@`U89\C;?X1S4\W,`D`2\TV%S4B?/XCO`DP9O
XM:2=3Z"9"@94F,3U[PB'R4@!50%31(9B!``#6A"(`$`&`0%3_\`\`8`&/*9BK
XM()C1()C28)@`@)B*R9B.:0(!(9C3()C\()C]@)F:N9@`T)@`<!X!()C^0%0&
XMX)F9>0*F252;F9J.^46MF9E)`)MEDYE_<IBVB9JJJ9NP^0>P*0BP60BUF9C$
XMZ9C69$V9Z0BP>0NP"0[->9NJ>1[G`0`'D`!$=0#LYYTQD)W/"0"TN9L'P%C>
XM>07AJ47"Z9R<"0`E\)G>F07AJ9S>.0CF.9^L&9[A$)[D$)[GT)^XB9G2>0#J
XM$)[N$)[R8*"JJ2NZ`@`+T`5$M0"$<*',&9_:Z9CI>:&&<*&J<*&3R:'G20+V
XMN0"L<*'$<*'%`*&.B0$I:@P7V@X7VJ`F.I\?2J'O0%0,4!H`P``3`*,`,`+V
XMR0!<$:0YX*/6DZ,'6I^[R0`[X*-#X*-$0*0(<*05%:1JX*/2X:2J":4^JC)!
XM.@D^2@E$NJ,,4`D^Z@L^^@M$^I]!"@P^:@X^6J!@VIE'B@Y$U0`3`0`-$!%Y
XM"@">N9L-``%]"IF`>@%$BB*[*0&!"0`2X`=$)0&G$*>KJ9JM&2$98!$-``4`
XMT*D1(@``0*I<`0D&$`$680!0(`"MV9K6!)Z="@D)0*HV.`"M20#_D#06<0`H
XM&AP&@*L`4`"[.B^]N@*9^43!VIH&4*PAT:N,Q0!/E`#">@#."A(ZP@,`L#Q3
XMP@#"B@#7VJN]&0)/A`#"F@#AJB-2L)K**JP"D*X'@)\O,*W".B4'TINSJ@#"
XM"JI#RA72VJ\60:RJ6JI/Q!59V@#.R@&]"BO!P16MZ0`)6ZY/E"U3TIH."P`/
XM$+$ZP@A/9*J?"0$:>P"A\$36=+$1$+*V\$2Z<K$2$+++\$3"<;$3$++8.24H
XM<K$+$++U\$0[<K$@L3P?``"G*K!$E:534AH'8@$::P`!$"'!41JM>0$:.P!9
XM&A`5,276!+4`@`%+&P!9=RV2^ID9T+53.B6ZHK4:T+6]:;-AVYH;T+5:5+%M
XM"P`<T+5@T+%SVP%=ZY<#`)Y:ZP%=6YA3DJ5:^P%=&PD\.[<4T+6:\$01HK7'
XM0ZY9-[3_,+`3,25<T0`S-+43&@`C"K87.P*<2U0!P`L!>[$D,+H!49ER>[$E
XMT+4%.KA"^YDFH+H!D`]X>[$GH+H"<+D#4+*?B0)+*P!&:K:SVYHI,+P_."7@
XM>;$J,+Q-X+C'"P`K,+R88J_3RP+#2[$#(*T7VP)36[4"P+%3TK.?"0+#.[)L
XM>['6,Z]+2KD#RZA3HJH'`@/#.PL!JZJM&0/#^Z)RJ[]G.+S7@+<`/`/#FPXD
XMFYB?20/#NP\JJ\"M60-+.P":"[8`;`,3'+1L"\`W,,'E6;X0[(,3?*6R"\`Y
XM,,%6,*TA[`(3_"Q3$B$`+`0`,*5!,+O!4;E$5;P#H*H[P@,3O$`%`,`],,&+
XM^;^?Z0,3+`D$_)D_,,&DD,``#`03G++&"\!!,,'(`+,AK`,3K`W*&L*]6:5(
XM8,-$2[U/M#PH0@03'+L%L#RM60037)IRZ\90N+0$,*130JIT?`1V?!Y8NZV?
XMB01V_`,/3,="8,>!";9T'"%*8#9DC,-6.+\`H"M+8,?2$1P`S`1VW`=/U)H`
XMW`1V_`A+W)I)$+'82@`$H+Z_"\&:"@`1<JH#@*@"H*JH:J2J^JX?H["H2@#X
XM2ZJM&;2P:L>AB:C6Y,N3;,?6``#@*1Q:2ZRYO*H$@,`[@B*0R:S.6A$[\I>"
XMB;$`D*6M::T?4Q'"\9?`&Q$1TIK@^LRH6@":NR-92L?HJLX&4`!&>B`'HKF;
XMNK2!%:2NW,^[:<H600`%H*TH(JTR&@"MO+)/),NT;`!&BB*XK"L=T,T!G1#2
XMVIIT/`#Z?`D$VYK@F:O7[)T!70`C2ZJZXLV,&<[T.=)/W*DG'1"MC*BPS-"K
XMRE@1$=&`C*H3T*76U)IBJM$?PZT&,`$A6LP`8)RZ&M2K.@&B@*#H^9G.K"OB
XM'-`&\$76I+DHW:PJ/<X$8`#E.1%8_9G@+-7#2M76TZF:>\[='-)<;0!7ZIEA
XM[='.*M03X*;6I"L?J@!+:P`<$JL4^IDY^S$3;;1W[,43`9[&S`![C0B8>2#"
XMT9H(*]@4+2\38`\4?2#&";%*C:H44!K6)!R%BK%SO:H4<#S"B:*M";*;;0`4
XMT,C6M"/&F9HJ79_R<@`9VJG@><ZMG*4S7:H-K5Q9BM.Z;``'(,H]K1"?"=2Z
XM,MP'0`N82:I#"M+R?`!9#)ZZ\MC#NK0'X`S)BB)9S=8!?0`#O`&33-'?'-+9
XM3``'X`T`0-[>_9GI+-&330`48`8`@*BZ8LRR+=]?)"\4H)R(BB(]'=,V',N^
XMO:KE.:3"O:H'8-G8#1+!+,\(P*C"0:I(O;0(``1E;4VA'=44(=+R@@"P8<OF
XMG9G@'>(J(QRJBM)C3;>KB@"B(1RZ8ISQ[>*HB@"84-;"@<_*C.&F4-8[$MIZ
XM+>'-4-81PN.!O=POSMW"D:6AK=@2OK/"<2`?&ME*CJH),-'"`9Z9O;0)((;"
XM(:VH+=KRG`#2L>,S]+%>3IW",1%&^L_/?,H)(`ME'1%0VLK>N]`'CJH)7JI>
XMC@UEC2*AK=PV;@#H"N2$^IE)?>4&H`">B=W&Z>'#K0!/4-99*J9:S>@*4`<;
XMCMSG+<\*T+@5[NEKO=4!K0!PJN(E'L]DG=X*(`Q%JL`H/>2:?@QES>6`O;0*
XM``]&_M2M">6,O@`R.N4`$-TIK>2GO`#*)>-'#=..V9H1T=NSC.#%[N>F+B\+
XM$)BJCM*$CLT!O0!:A*(KKNBCS=F>4-:MV>'ESMJZ4-:D^N8FOMH4D,S"84V,
XM^NFZ(M04\*#"`=KPO>X5,!'"@2(B\)FLGM,&4`$J8.FD3NL(7P%@KLPBW9I)
XM_O"8(AP[,N;`_O"42NRA;>4/+^K\W.6K70$IB^9BFK$E?YEMOM)PGN_/*B\5
XMT*#"$1&/W<H'(NT-W><X/=7RT@##+NO)C=X!W0#D+>XEONB%W@`@H2NM&>E+
XMVP"]F=^);LWRW`!2HRO69)PM/MP-D`GE+1P07NJ,W@#M+J'-+M=7/P[EC>OY
XM+,\.(*VZ`MNY#O<Y^-(["M#RX@`6JBL1$A$(_>P2K_/4KN!$O_?UL>U#?^T$
XMX`!2@_0HK?3#[0"<;LQC+NFKZ@"-2ZJD^J&97N@.`.ND:DWDBN^@/Z"DBB(5
XM@<Y+"[$$R\P&O[0/4!JDNB,3_?(N?LH/P'ZDFJ43$?B?.:^$CZH]R!4]#^($
XM\`"$7!JEP>TGGOQB>+9)+_N]J;7&COFH^@`6>B!^;?6,_@"P09O=#P",NB.0
XM2;F[2:K"H;!96N,50<O)7S;`&OLJ#?\/D"W9/`".ZLHA;?^<[+O[7_'O']`/
XMP)_<JO^?N?'O']`/D`AXN_\@__X!_0"BO".I_YF:3=;VSZ83D?J?J?)D;?^;
XM`,BIK^;U']`/H,JZLO\G6_\!_0"7NB.ZLO\M6_\!_0"M(!'EO?\S6_\!_0#X
XMNSRZLO^+6_\!_0"Y\,7[7P']']`/`*?3G*RMJ;3U']`/\*(3@2+[__GO']`/
XM\+)HG*RMJ;`R2M[H3U0%'[,$.[;U']`/P+H%X/04T?\!_0"A.<X#X/3MW?\!
XM_0#5T,_&&[7]']`/,,`18;RMJ;?R_`#9P*[3_)GDZ@'/BOXY+/&T#P"&6_\!
XM_0`UZRCGV_\!_0#ED*Q@VYIZ6_\!_0`+*JU@VYHB(/L-2IL'\M%%*OOX(/&:
XM>]%/C:*>B?XY#*AA2ZJO6_\!#0'C["BTV_\!#0'3K,6M*;KU']`0<"#2"K:M
XMB:Q?M/#H3U2D&A'D3:K)6_\!#0$57`#[_[SU']`04!KY_]'HV?\!#0'D3<M]
XM&_P`H%S'@_Y$1:ZJ:ORCT?\!#0'%6P#[S\+U']`00)OYO__56_\!#0$+[[O[
XMO]^Y']`0<#P%'Q%0V\H3,?P&D'6TO[00H.''/>:$/MP0\"Q&'=J2OZH0P+'1
XM2>K8;P`0$`N8J2N8OK00,,"?7?7>N;00\)K"">\U/MP14/"O7?4]+L\1T)O6
XM%"&ES__R'`%?^M<?6O'#'0%F:DW2*J8;/]P1D`N8F:6W#ZA+&P$#;$T3$=J:
XMS>@1\)K69.?VJ?<$(`$H:DV(6OJM'+-Z/NVHJER(??@$(`%B")[NO/ADS=42
XMX`0?[L[D+MF$;0&C6M90+\\2``T$:TT'@OL*>\H2P`W\#.W._IF:._P&P'X"
XM3[`*?</J*?$%K_4AS:T$(`'L$+"`?\PJS:T$(`&6C<<#`/@PS?@3H"L384W?
XM_<RV>L<'<M%;:_`BS=L!^P_JB9D%S_KU7]&_6@`7'>]D#?\3,*^0V:V?Z?"K
XM7]'6$Q$W6_<*W9I3\@^MB:J)[:P7.R7_L)MW9,P@?[%3\@^[>3R:J]_.RA7D
XM.B7_T)H_W]%$-1!$U0%V0%0>0*D`X`&6'1+4"0`A8-\S])H*L8/TF;*$FLSH
XM2:,`P`)B.!JN0%0NX`,:"%=)3D0N4E-$``(:B``^!```.!+1LO4&0`@```P`
XM"`&`5$!`DR).J@@)(F6@@0$!`!`I,F7)P`0,(A()(N1)%2H##U2(:"1*E214
XMJEQQ>"$BDR=!B`QYXL3(P`(8(DX)8J7(S)HW,T0<$@1*2BE%'&H@:1+E0`0;
XM2+X<LF1)D2PW.0Q]TJ1)$"=$'';0680*E"!4D#CT$-&JE"9.(1WX$+&)$:1)
XM(2$(4==(D"D@]8J(>"6)$\!9F.0M,(*P82HH%=\D0;**DR%4K&(E6")BD"I$
XMD@@IPH3)31,1K229(IJT:8(G(E)Y`H7FZ-<%4'B>,D5*6+TI(B+M_1N!"K)4
XM?MJ$9&"%<(IE/V.YV2+BDYY2`$M)<O,%8:1.@AQT"$,G$BE.EA1V<C-&1"1)
XM)JYW*"-B1RJSF\R^.<,Z:RU%S$<0#75=%Z!A#M4PU$M3',@>039$9!@4'PE8
XMP`T1G0587@C@X-AEBC%T4PX?#I>$%C?M\%P34R#AVDT\F.?:##(XU(.,I<E`
XM@T,^X,A$##4R]X./.(0$A(]/I'53$"X],<1,4&QFP!`D.4&%$$D<$1(155(Q
XM1193A%1$ET]<\>`!1G09!!.!'7!$EY`Y(24275JVA!,K$:1$AE)<F217-RW!
XM)WZTA<3$H.O]9D`3@P)6*',1#<"11VT&4(!]'\WVH`$!<`I`$T\@99@1,=PD
XM```#.!%@>.,1)$``4A%1JEX"0`3`$TN`)]YB`Z!JA&68%4%$8`0,0$!EEZF*
XM!;$#7`K`KY=!@905`Q7K*;1#M%AFM0,<@.P016`15[$*?,MJ7L5F]"RP'1&Q
XM6;$0?(M08`80@&JB_Z%+@+.)$G59M01XFBBN#A'@+0")2E%FF)`00``"'\KT
XM!!,,%U``JJ,^,>L!!1P+P$]4S(J``1C7]$20!Q@`\<<T41$D`@>4;,03,X1T
XMP*LL6UFS7@C(_,2.<B&`,\A`(Y"`SS6$E,#0+2>MEP*H9J><0^4*]^17(2F`
XMLQ0S6?3TP4(($4,.,L!`]<IAYV"#V7(ID(!]0M"``]L'*%`N`&'/L';6"\"M
XM(]T*J!MVV8`W`'<,<V?MP.%E9_T`W'L_'2_>0LS`-@(*1.#WY0I(<+C3F$]P
XM^,Z84W"XR`J,1/D-%RE@`=Q.)Z!`3G@/(03H"@A5NQ`V/*7`4KNS_G14NQ?Y
XM-%L`0"&$$S3E98`"="4_6D^;*@!"ANW^5C=E`$P1-NJ==?^]TW6C)KX0+RN@
XMV[.V,Z_J30H$Q[X06-!$]7'S]\GP\RQ@:L1_LRJ``JJ#MRK\[T1!$J`+_/<?
XM&MUD`:B:RA(R=A,&H.HL4A!/2#)B':M@P2<.88"M,"@>[=RD`:AR2Q,PV(1J
XM-0!G#0*+$9(@F88UP%9(&<(,:UB`!GA,A>$:5P,.E@2O'*$(H/H-`1JPLK\,
XM(0E%?((2&_"VG%GA7"Z\VT2$4(4CAL>%?9-($;AXA%D9H`'JVF(7=W9&PXF1
XMC#4"`!H(5TE.1$%,5"Y&3E0``","``!T"Y1&'2:`"```#``@03`0\(&"@/\"
XMQ@,!J0``$`$30($2T,%$?%`P4H24``0>4'!0P(/($1@R"""`8,(0$0@H4$!0
XM00*`)B(,&"D#,D`)!-(`$!!:`O69$Y("*"#P@=BX`$12IP5O%E6`+V"$FP$5
XM(.`)*"L<1)A0(4,$)R((,`P)E.7X=6O*JFP1(8"!@&Q$"#"@S,0'(2A'?(#@
XM(:B[-@$,(($1V?WK%G'7N&05%_Z*",]6,`$78,4*23,,`%*!!#S0&"B"S%7A
XM+@`$!&C*QPG:HGP8\2LN5+@`X3$+13$^Q1'A*1:."%YM1(!\+DX@O*'QOX``
XM@8L.-P%@Z<D''`>$2W)$1#Y_^ZS-L$!A!`V7@P<`"ABHF8@B)C=0'1$V5.`)
XM?$>$#!4FX'$U5!AQ\&1WG$\RT13<<.\!$%]<@,!!6$1*04(01^`94!AX!2#U
XM'20$H(+*1@DHAE1O#Y:("%(@4M@8(-7!T9-Y6;%FFE<0",C;@Q-4!P9:?CD@
XM(1Z5R9>83\\M\%5TNW$T&)$^-:ED<;K9!`0X/>G7V5=1(K#6`=$UIV5'`*#E
XM4V%!P9`C`1Y"`F9R[+DW4T1FTM@9-#)IN0`L8XVW)7@#K+5`<P,4"!N4`UAV
XM&D=\&M@9'A$B\%P"0%Q9:9L+`(I)39T!BJEB(C*UXE(/9@JB987Q]=9=3K4&
XME%GC,:0=1ZZB5!2EJ/CUP:B]998?JA3R5)VMM<*JG:Q"N79K3'YQ`!H(5TE.
XM1$]42"Y&3E0```<"``!T"Z1&,[,`"```#``@03`0\`&"@/\"Q@,!B0``$`$7
XMH$`1T`$2?!>1!%0``@\H."C@140&#0063!O!@$&""A.<C0P'!&P``DA#B)`X
XM0K@9$00J.*AP+@`!`A_1BC`@0`C(`%]`"#!@1$0`H2:@C7@PH4*%3&1.$&!`
XM$76:$PZBJD#(*L"'``\"1"]S(H(T@.W!G/@`P4.`P*L"((#TPMW(%NW5LHB@
XMF(VKP*Q;NCT!/&0*\6'-C6A!+(6T`(]DSY`8:*:*LS$B!%)+XT.$"Q8@M681
XMK4:T$1XBV[<WF@T\."<X2``0S04`CK#>P&KS`@(7N'9@3+(WSJTKG#!#`FH1
XM-.RM`!,H8,!`H<P)"%(!M8BPH9HN'5E+Z(3G8J\M'%YSO,)1`4=W-P%N>*``
XMIQLB8$#`G5'F26<>8]-!`45ITZ&"#6UR)08"%!0J(-R#D.%%6EH;X7`=#A$!
XM`L1H&X%S77%?`1734V0E<.)F#\`!''!H;`0$$'`@@41<#."P(XDY\86#CT0N
XM8%9>C,&`!!#@[,B4DSCT)B./2'0XU$-:+J44<&`$="448$"A44Y@7`<D%%M1
XMR``4:/C(5&Q`]H@&%$!$9",`L$"!0418@"$E9W```@<"C!$%!U%2A9;E`$0R
XMX..#3"&R%11,(1'5F9(B@0-J$>%1%6A#00!'59MQ!-&+7_%X8IZ<V141/I`0
XM!$D"&@A724Y$4U1$+D9.5```5`(``'0+FT:PL0((```,`"!!.!#P08.`_P+&
XM@P&)(`P8`0VP@30@8`,D2/CQPZ@18\2'>)@!P\.`&9Z'`0LP8X8!PT,P8%8&
XM/``'&SPP=+@AXT8GHDLP%G]",@`#0T0P18?"``H)P4H\&D,R"XB`X0"-5@,Z
XM>`B':0)\^`)&@!F1`8.6+\$``Q8Q)$5N[)A1Q/,1#CR&!OBU7<F``PXXX(#I
XM'<KO+`P<9AF9](D!!PX\6+#Q:QF1WUI\#"@^W7M9+@&ZA,VB74IQ[US/H`VX
XM)<`G,>@$9`&0A;0`I=6N`0D@^+D6*08$5#4"`""\*2!@OGD#VLMHMVV(#:5R
XMH\9M+1_3!/AYCHA/[H#ND`B$'>IV`##-BX?"PR;7@,W*Y[^?SPZ?(K[S!3@#
XMXX8ZHF?MD.1''D,(I):94ZFMA(U-Z[$WU5#G)3"8`80PHU%[_C'##CL:<</?
XM@ZK)52!WWMT7H&D%4,->3T.!]YU<`H9(##APX,"!8JGQPU`"_D&20()#(7$2
XM=`:T=R$A/0XP9'D]%G!2>)6=Y=)2:DV(!QA-I=8;4D5A8%9;&&09$00XL&&,
XM(`%54!P!13$0$`0A,<#'2M=!:!^,X_THDF8&4C1G@'7J:2$PZ1E0)DSX8"E@
XM`G\6T-IX!,0'G@$?000'0TXR!@`.8;H'1V[Q,<,@>\1$=*F8/N+##S7H!?05
XMACZZE6FJ>*XU4Z.MN=E0=_BY&M)():5FE8X!<N!J>X%Z)R1*/GI'BW9(-FL2
XM#%(=.]2C,Q7F%V"#'<"!53!996R`#"U@:I@#B$;1ITV1P0\F;\*`!"'=`AH(
XM5TE.1%1.62Y&3E0``)L!``!T"Z!&6QD`"```#``@02`0\,&!@/\"P@,"B2"0
XM@`M`@0KH`!0XBQ,A*0`"#A@8<`\A+0`$`@C)@`K`@`$""Q(`,"B!F`S8P&3#
XMD!M!W(3($61`!AQ#/@!1$B*X@!)4HB0J$Q"@F*!V:@0"C.&`HU-!E02$50&X
XMDB!`X00!QB)1E.```0N+TR0PB3B_EIRI\2(0B5WO@@)35.1#`"&!`J:[8"L0
XM$$8!8&T`Z##=C5H?QL7(->;%BQD5O'T+"AA4IV)1OFWHN:Y:IUW3`@,$:<!G
XMNRCQ1G5=ER&!KCH)A-8H$1AGE*P+=+5XL?52XJ">UHUZ&ZU%UK0AMP8'<WE'
XMB2C!-`Y;VBO#`K$A%:BN@+E/WM,OQA:K=[UMM',K:UQ-&GCCPX@U\FU(/FC#
XM@O#$=!A%:UU$'G27\93<;@KH=)5%"J;57W*K*9?27FP!U]IO4P'VGT:($<4@
XM:+YE5E5#6#&`448,J(4=)$#!!=%F3D%4%E_YJ5BAC=MU)Q-(0%2G8FM"SA:8
XC;#^QEU%$.`8&DGP;W==83,99%5`"CCGV$Q0L@@.)`2@!&@!(
X`
Xend
SHAR_EOF
chmod 0600 BINARC.UUE || echo "restore of BINARC.UUE fails"
sed 's/^X//' << 'SHAR_EOF' > BLDMFORM.C &&
X#include <stdio.h>
X
Xmain (ac, av)
Xchar	**av;
X{
X	char	**ap, *cp;
X	int	xhot, yhot, nplanes;
X	int	maskcolor, datacolor;
X	char	*datafn, *maskfn;
X	char	*name;
X	short	gemfmt = 0;
X	short	rename = 0;
X
X	if (ac < 2)
X	{
X		printf("usage:  -xypMDmdnG xhot yhot planes mcolor dcolor\n");
X		printf("\t\tmaskfn datafn mformname\n");
X		printf("or:     -dnR datafn newmformname\n");
X		exit(0);
X	}
X
X	xhot = 0;
X	yhot = 0;
X	nplanes = 1;
X	maskcolor = 0;
X	datacolor = 1;
X	maskfn = (char *) 0;
X	datafn = (char *) 0;
X	name = "mform";
X
X	for (ap = av + 1; *ap && **ap == '-'; )
X		for (cp = *ap++ + 1; *cp; ++cp)
X			switch (*cp)
X			{
X			case 'x':
X				xhot = atoi(*ap++);
X				break;
X			case 'y':
X				yhot = atoi(*ap++);
X				break;
X			case 'p':
X				nplanes = atoi(*ap++);
X				break;
X			case 'M':
X				maskcolor = atoi(*ap++);
X				break;
X			case 'D':
X				datacolor = atoi(*ap++);
X				break;
X			case 'm':
X				maskfn = *ap++;
X				break;
X			case 'd':
X				datafn = *ap++;
X				break;
X			case 'n':
X				name = *ap++;
X				break;
X			case 'G':
X				++gemfmt;
X				break;
X			case 'R':
X				++rename;
X				break;
X			}
X
X	if (rename)
X		chgname(datafn, name);
X
X	if (gemfmt)
X	{
X		printf("/* GEM Icon Definition: */\n");
X		printf("#define %s_W 0x0010\n", name);
X		printf("#define %s_H 0x0028\n", name);
X		printf("#define %sSIZE 0x0028\n", name);
X		printf("short %s[%sSIZE] =\n{ ", name, name);
X		hexw(5, xhot, yhot, nplanes, maskcolor, datacolor);
X	}
X	else
X	{
X		printf("#ifndef USER_DEF\n#include <gemdefs.h>\n#endif\n");
X		printf("MFORM\t%s[1] = {\n\t%d,\t%d,\t%d,\t%d,\t%d,\n",
X			name, xhot, yhot, nplanes, maskcolor, datacolor);
X	}
X
X	domask(maskfn, gemfmt);
X	if (!gemfmt)
X		fputs("\t },\n", stdout);
X	domask(datafn, gemfmt);
X
X	if (gemfmt)
X		fputs("0x0000, 0x0000, 0x0000", stdout);
X	else
X		fputs("\t }", stdout);
X	fputs("\n};\n\n", stdout);
X	exit(0);
X}
X
Xdomask (fn, gemfmt)
Xchar	*fn;
X{
X	char	line[80];
X	int	h0, h1, h2, h3;
X	FILE	*fd;
X
X	if (fd = fopen(fn, "r"))
X	{
X		*line = '\0';
X		while (fgets(line, sizeof(line), fd) && *line != '{');
X		if (*line == '{')
X		{
X			do
X				if (gemfmt)
X				{
X					sscanf(line + 1,
X						" 0x%x, 0x%x, 0x%x, 0x%x",
X						&h0, &h1, &h2, &h3);
X					hexw(4, h0, h1, h2, h3);
X				}
X				else
X					printf("\t %s", line);
X			while (fgets(line, sizeof(line), fd) && *line != '}');
X		}
X		fclose(fd);
X	}
X}
X
Xhexw (count, h0)
X{
X	int	*ap;
X	static	int	col;
X
X	for (ap = &h0; --count >= 0; )
X		printf("0x%04x,%s", *ap++, (++col % 4)? " ": "\n  ");
X}
X
Xchgname (datafn, name)
Xchar	*datafn, *name;
X{
X	FILE	*fd;
X	char	line[80];
X	register char	*cp;
X
X	if (fd = fopen(datafn, "r"))
X	{
X		while (fgets(line, sizeof(line), fd) != NULL &&
X			strncmp(line, "short", 5))
X			fputs(line, stdout);
X		printf("short %s", name);
X		for (cp = line; *cp && *cp != '['; ++cp);
X		fputs(cp, stdout);
X		while (fgets(line, sizeof(line), fd) != NULL)
X			fputs(line, stdout);
X		fclose(fd);
X	}
X
X	exit(0);
X}
SHAR_EOF
chmod 0600 BLDMFORM.C || echo "restore of BLDMFORM.C fails"
sed 's/^X//' << 'SHAR_EOF' > KERMIT.C &&
X#define EXTRADEBUG
X/*
X *  K e r m i t  File Transfer Utility seriously hacked for local use with uw
X *
X *  Currently allows only one kermit session to exist in one window concurent.
X *
X *  Adapted from UNIX Kermit, Columbia University, 1981, 1982, 1983
X *      Bill Catchings, Bob Cattani, Chris Maio, Frank da Cruz, Alan Crosswell
X *
X *  Also:   Jim Guyton, Rand Corporation
X *          Walter Underwood, Ford Aerospace
X *
X */
X
X/*
X * March 28, 1988
X *	    Hacked into form usable in uw.  Converted fsm's to be driven
X *	    by received packet events.  Rewrote rpack routine.
X */
X
X#include <obdefs.h>
X#include <gemdefs.h>
X#include <osbind.h>
X#include <stdio.h>          /* Standard UNIX definitions */
X#include <time.h>
X#include "wind.h"
X#include "windefs.h"
X
X#define error printmsg
X#define chari int	    /* items of type chari should be char, but, mwc
X				 insists on adjusting them to int anyway */
X/* Symbol Definitions */
X
X#define MAXPACKSIZ  94      /* Maximum packet size */
X#define SOH         1       /* Start of header */
X#define CR          13      /* ASCII Carriage Return */
X#define SP          32      /* ASCII space */
X#define DEL         127     /* Delete (rubout) */
X
X#define MAXTRY      10      /* Times to retry a packet */
X#define MYQUOTE     '#'     /* Quote character I will use */
X#define MYPAD       0       /* Number of padding characters I will need */
X#define MYPCHAR     0       /* Padding character I need (NULL) */
X
X#define MYEOL       '\r'    /* End-Of-Line character I need */
X
X#define MYTIME      10      /* Seconds after which I should be timed out */
X#define MAXTIM      60      /* Maximum timeout interval */
X#define MINTIM      10      /* Minumum timeout interval */
X
X#ifndef TRUE
X#define TRUE        -1      /* Boolean constants */
X#endif
X#define FALSE       0
X#define GETPACK     2	    /* return constant */
X
X/* Macro Definitions */
X
X/*
X *  f l u s h i n p u t
X *
X *  Dump all pending input to clear stacked up NACK's.
X */
X
X#define flushinput()	/* no explicit call to flush needed for uw */
X
X/*
X * tochar: converts a control character to a printable one by adding a space.
X *
X * unchar: undoes tochar.
X *
X * ctl:    converts between control characters and printable characters by
X *         toggling the control bit (ie. ^A becomes A and A becomes ^A).
X */
X#define tochar(ch)  ((ch) + ' ')
X#define unchar(ch)  ((ch) - ' ')
X#define ctl(ch)     ((ch) ^ 64 )
X#define abs(exp) (((exp) >= 0) ? (exp) : -(exp))
X
X
X/* Global Variables */
X
Xextern int	mouse;				/* is mouse visible ? */
Xextern	struct	wi_str	w[];
X
Xint     size,               /* Size of present data */
X        rpsiz,              /* Maximum receive packet size */
X        spsiz,              /* Maximum send packet size */
X        pad,                /* How much padding to send */
X        reqtimint,          /* timeout interval I request */
X        timint,             /* Timeout for foreign host on sends */
X        n,                  /* Packet number */
X        numtry,             /* Times this packet retried */
X        oldtry,             /* Times previous packet retried */
X        image,              /* -1 means 8-bit mode */
X        debug,              /* indicates level of debugging output (0=none) */
X        filnamcnv,          /* -1 means do file name case conversions */
X        filecount,          /* Number of files left to send */
X	kermwdes,	    /* Window descripter for kermit window */
X	kermport;	    /* port number for kermit window */
X
Xclock_t	timestamp;	    /* Time last packet was received */
X
Xchar    sflg, rflg;         /* flags for RECEIVE, SEND */
Xchar    state,              /* Present state of the automaton */
X        padchar,            /* Padding character to send */
X        eol,                /* End-Of-Line character to send */
X        quote,              /* Quote character in incoming data */
X        **filelist,         /* List of files to be sent */
X	*filnam,            /* Current file name */
X        recpkt[MAXPACKSIZ+1], /* Receive packet buffer */
X        packet[MAXPACKSIZ+1]; /* Packet buffer */
X
XFILE    *fp,                /* File pointer for current disk file */
X        *log;               /* File pointer for Logfile */
X
X
X/*
X *  kerminit
X *
X *  initalization routine - initalize and dispatch to the appropriate routine.
X */
X
Xint kerminit(curwin)
Xint curwin;
X{
X    OBJECT *obj_tmp;
X    static char path[40] = ".\*.*";
X    static char file[40] = "";
X    static char filename[80];	    /* space for file and directory */
X    int butt;
X
X/*  Initialize these values and hope the first packet will get across OK */
X
X    if (kermwdes && w[kermwdes].kerm_act) return (-1);
X    kermwdes = curwin;
X    					/* If kermit already active, return. */
X    w[kermwdes].kerm_act = TRUE;	/* mark current window to send output
X    					   to kermit instead of emulator */
X    kermport = find_port(curwin);
X    eol = CR;                           /* EOL for outgoing packets */
X    quote = '#';                        /* Standard control-quote char "#" */
X    pad = 0;                            /* No padding */
X    padchar = '\0';                     /* Use null if any padding wanted */
X    timint = MYTIME;                    /* default timint */
X
X 
X/*
X * Set direction and paramaters debug, filnamcnv, image with dialog
X */
X    rsrc_gaddr(R_TREE, KERMPARM, &obj_tmp);
X    if (obj_tmp[ASCIIMOD].ob_state == NORMAL &&
X      obj_tmp[IMAGEMOD].ob_state == NORMAL)
X    {					/* initalize object and statics */
X        objc_change(obj_tmp, ASCIIMOD, 0, 0, 0, 0, 0, SELECTED, 0);
X        objc_change(obj_tmp, CONVNAME, 0, 0, 0, 0, 0, SELECTED, 0);
X        objc_change(obj_tmp, RECFILE, 0, 0, 0, 0, 0, SELECTED, 0);
X
X	path[0] = Dgetdrv() + 'a';
X	path[1] = ':';
X	Dgetpath(path+2, 0);
X	strcat(path, "\\*.*");
X    }
X    if ((butt = s_dial(KERMPARM, 3)) == KERMEXIT) return(kermterm());
X    if (obj_tmp[DEBUGENA].ob_state == SELECTED)
X    {
X        debug = obj_tmp[DEBUG1].ob_state + obj_tmp[DEBUG2].ob_state
X	+ obj_tmp[DEBUG3].ob_state;
X    }
X    if (butt == RECFILE) obj_tmp[RECFILE].ob_state = SELECTED;
X    if (butt == SENDFILE) obj_tmp[SENDFILE].ob_state = SELECTED;
X    rflg = obj_tmp[RECFILE].ob_state;
X    sflg = obj_tmp[SENDFILE].ob_state;
X    image = (obj_tmp[IMAGEMOD].ob_state == SELECTED);
X    filnamcnv = obj_tmp[CONVNAME].ob_state; /* conversion for UNIX systems */
X    
X/* All set up, now execute the command that was given. */
X
X    if (debug)
X    {
X        printmsg("debuging level = %d\n",debug);
X
X        if (sflg) printmsg("Send command\n");
X        if (rflg) printmsg("Receive command\n");
X    }
X  
X    if (sflg)                           /* Send command */ 
X    {
X    	extern char * rindex();
X
X	if (!mouse)
X	{
X	    graf_mouse(M_ON, NULL);
X	    ++mouse;
X	}
X        fsel_input(path, file, &butt);
X	if (! butt) return(kermterm()); 
X	strcpy(filename, path);
X	if (debug > 2) printmsg("directory %s", filename);
X	filnam = rindex(filename, '\\');
X	if (filnam) *(++filnam) = '\0';
X	strcat(filename, file);
X        filnam = filename;		/* Get file to send */
X        if (debug > 2) printmsg("sending %s",filnam);
X        fp = NULL;                      /* Indicate no file open yet */
X        filelist = NULL;                /* Set up the rest of the file list */
X        filecount = 0;                  /* Number of files left to send */
X	state = 'S';                    /* Send initiate is the start state */
X	n = 0;                          /* Initialize message number */
X	numtry = 0;                     /* Say no tries yet */
X        w[kermwdes].kerm_act = TRUE;	/* mark current window to send output
X    					   to kermit instead of emulator */
X	timestamp = clock();		/* reset timer */
X	sendsw();
X    }
X
X    if (rflg)                           /* Receive command */
X    {
X	state = 'R';                    /* Receive-Init is the start state */
X	n = 0;                          /* Initialize message number */
X	numtry = 0;                     /* Say no tries yet */
X	timestamp = clock();		/* reset timer */
X    }
X    
X    return(0);
X}
X
X/*
X * kermterm - Terminate kermit and tell uw not to call us again.
X */
Xkermterm()
X{
X    sflg = rflg = 0;
X    w[kermwdes].kerm_act = FALSE;
X    kermwdes = 0;
X}
X
Xkermtimchk()
X{
X    if (!w[kermwdes].kerm_act)	/* is kermit active? */
X    {
X	kermwdes = 0;
X	return;
X    }
X    if ((clock() - timestamp) / CLK_TCK > timint)	/* timeout ? */
X    {
X	rpack(NULL, "", "");	/* tell FSM about time out */
X    }
X}
X
X/*
X *  s e n d s w
X *
X *  Sendsw is the state table switcher for sending files.  It loops until
X *  either it finishes, or an error is encountered.  The routines called
X *  by sendsw are responsible for changing the state.
X *
X */
X
Xint sendsw()
X{
X    chari sinit(), sfile(), sdata(), seof(), sbreak(), nstate;
X
X    nstate = state;
X    while(TRUE)                         /* Do this as long as necessary */
X    {
X        if (debug) printmsg("sendsw state: %c  nstate: %c\n",state,nstate);
X	while (nstate != 'I')
X	{
X            switch(nstate)
X            {
X                case 'S':   nstate = sinit();  break; /* Send-Init */
X                case 'F':   nstate = sfile();  break; /* Send-File */
X                case 'D':   nstate = sdata();  break; /* Send-Data */
X                case 'Z':   nstate = seof();   break; /* Send-End-of-File */
X                case 'B':   nstate = sbreak(); break; /* Send-Break */
X            }
X	    switch(nstate)
X	    {
X                case 'C':   printmsg("\aDone.\a");
X	    		    return (TRUE);           /* Complete */
X                case 'A':   printmsg("Send Failed.");
X	    		    return (FALSE);          /* "Abort" */
X	    }
X	    if (nstate != 'I')
X	    {
X	        state = nstate;
X	        if (numtry++ > MAXTRY) return(FALSE); /* If too many tries, give up */
X	    }
X	}
X	return(GETPACK);
X    }
X}
X
X
X/*
X *  s i n i t
X *
X *  Send Initiate: send this host's parameters and get other side's back.
X */
X
Xchari sinit()
X{
X    int num, len;                       /* Packet number, length */
X    static int sent = 0;
X
X    if (! sent) {
X	reqtimint = MYTIME;
X	spar(packet);                   /* Fill up init info packet */
X	flushinput();                   /* Flush pending input */
X	spack('S',n,6,packet);          /* Send an S packet */
X
X	sent = 1;
X	return('I');			/* get packet to read */
X    }
X    sent = 0;
X    switch(rpack(&len,&num,recpkt))     /* What was the reply? */
X    {
X        case 'N':  return(state);       /* NAK, try it again */
X
X        case 'Y':                       /* ACK */
X            if (n != num)               /* If wrong ACK, stay in S state */
X                return(state);          /* and try again */
X            rpar(recpkt);               /* Get other side's init info */
X
X            if (eol == 0) eol = '\n';   /* Check and set defaults */
X            if (quote == 0) quote = '#';
X            if(abs(timint - reqtimint) < 3) timint = reqtimint + 3;
X            /* guarentee diference of > 3 for sounds for timint */
X
X            numtry = 0;                 /* Reset try counter */
X            n = (n+1)%64;               /* Bump packet count */
X            return('F');                /* OK, switch state to F */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE: return(state);      /* Receive failure, try again */
X
X        default: return('A');           /* Anything else, just "abort" */
X   }
X }
X
X
X/*
X *  s f i l e
X *
X *  Send File Header.
X */
X
Xchari sfile()
X{
X    int num, len;                       /* Packet number, length */
X    char filnam1[50],                   /* Converted file name */
X        *newfilnam,                     /* Pointer to file name to send */
X        *cp;                            /* char pointer */
X    static int sent = 0;
X
X    if (! sent) {
X        if (fp == NULL)                     /* If not already open, */
X        {   if (debug) printmsg("   Opening %s for sending.\n",filnam);
X            fp = fopen(filnam, image ? "rb" : "r");         /* open the file to be sent */
X            if (fp == NULL)                 /* If bad file pointer, give up */
X            {
X                error("Cannot open file %s",filnam);
X                return('A');
X            }
X        }
X
X        strcpy(filnam1, filnam);            /* Copy file name */
X        newfilnam = cp = filnam1;
X        while (*cp != '\0')                 /* Strip off all leading directory */
X            if (*cp++ == '\\')               /* names (ie. up to the last /). */
X                newfilnam = cp;
X
X        if (filnamcnv)                      /* Convert lower case to upper  */
X            for (cp = newfilnam; *cp != '\0'; cp++)
X                if (*cp >= 'a' && *cp <= 'z')
X                    *cp ^= 040;
X
X        len = cp - newfilnam;               /* Compute length of new filename */
X
X        printmsg("Sending %s as %s",filnam,newfilnam);
X
X        spack('F',n,len,newfilnam);         /* Send an F packet */
X	sent = 1;
X	
X	return('I');			/* get packet to read */
X    }
X    sent = 0;
X    switch(rpack(&len,&num,recpkt))     /* What was the reply? */
X    {                   
X        case 'N':                       /* NAK, just stay in this state, */
X            num = (--num<0 ? 63:num);   /* unless it's NAK for next packet */
X            if (n != num)               /* which is just like an ACK for */ 
X                return(state);          /* this packet so fall thru to... */
X
X        case 'Y':                       /* ACK */
X            if (n != num) return(state); /* If wrong ACK, stay in F state */
X            numtry = 0;                 /* Reset try counter */
X            n = (n+1)%64;               /* Bump packet count */
X            size = bufill(packet);      /* Get first data from file */
X            return('D');                /* Switch state to D */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE: return(state);      /* Receive failure, stay in F state */
X
X        default:    return('A');        /* Something else, just "abort" */
X    }
X}
X
X
X/*
X *  s d a t a
X *
X *  Send File Data
X */
X
Xchari sdata()
X{
X    int num, len;                       /* Packet number, length */
X    static int sent = 0;
X
X    if (! sent) {
X        spack('D',n,size,packet);           /* Send a D packet */
X	sent = 1;
X	return('I');			/* get packet to read */
X    }
X    sent = 0;
X    switch(rpack(&len,&num,recpkt))     /* What was the reply? */
X    {               
X        case 'N':                       /* NAK, just stay in this state, */
X            num = (--num<0 ? 63:num);   /* unless it's NAK for next packet */
X            if (n != num)               /* which is just like an ACK for */
X                return(state);          /* this packet so fall thru to... */
X                
X        case 'Y':                       /* ACK */
X            if (n != num) return(state); /* If wrong ACK, fail */
X            numtry = 0;                 /* Reset try counter */
X            n = (n+1)%64;               /* Bump packet count */
X            if ((size = bufill(packet)) == EOF) /* Get data from file */
X                return('Z');            /* If EOF set state to that */
X            return('D');                /* Got data, stay in state D */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE: return(state);      /* Receive failure, stay in D */
X
X        default:    return('A');        /* Anything else, "abort" */
X    }
X}
X
X
X/*
X *  s e o f
X *
X *  Send End-Of-File.
X */
X
Xchari seof()
X{
X    int num, len;                       /* Packet number, length */
X    static int sent = 0;
X
X    if (! sent) {
X        spack('Z',n,0,packet);              /* Send a 'Z' packet */
X
X	sent = 1;
X	return('I');			/* get packet to read */
X    }
X    sent = 0;
X    switch(rpack(&len,&num,recpkt))     /* What was the reply? */
X    {
X        case 'N':                       /* NAK, just stay in this state, */
X            num = (--num<0 ? 63:num);   /* unless it's NAK for next packet, */
X            if (n != num)               /* which is just like an ACK for */
X                return(state);          /* this packet so fall thru to... */
X
X        case 'Y':                       /* ACK */
X            if (n != num) return(state); /* If wrong ACK, hold out */
X            numtry = 0;                 /* Reset try counter */
X            n = (n+1)%64;               /* and bump packet count */
X            if (debug) printmsg("   Closing input file %s, ",filnam);
X            fclose(fp);                 /* Close the input file */
X            fp = NULL;                  /* Set flag indicating no file open */ 
X
X            if (debug) printmsg("looking for next file...\n");
X            if (gnxtfl() == FALSE)      /* No more files go? */
X                return('B');            /* if not, break, EOT, all done */
X            if (debug) printmsg("   New file is %s\n",filnam);
X            return('F');                /* More files, switch state to F */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE: return(state);      /* Receive failure, stay in Z */
X
X        default:    return('A');        /* Something else, "abort" */
X    }
X}
X
X
X/*
X *  s b r e a k
X *
X *  Send Break (EOT)
X */
X
Xchari sbreak()
X{
X    int num, len;                       /* Packet number, length */
X    static int sent = 0;
X
X    if (! sent) {
X        spack('B',n,0,packet);              /* Send a B packet */
X
X	sent = 1;
X	return('I');			/* get packet to read */
X    }
X    sent = 0;
X    switch (rpack(&len,&num,recpkt))    /* What was the reply? */
X    {
X        case 'N':                       /* NAK, just stay in this state, */
X            num = (--num<0 ? 63:num);   /* unless NAK for previous packet, */
X            if (n != num)               /* which is just like an ACK for */
X                return(state);          /* this packet so fall thru to... */
X
X        case 'Y':                       /* ACK */
X            if (n != num) return(state); /* If wrong ACK, fail */
X            numtry = 0;                 /* Reset try counter */
X            n = (n+1)%64;               /* and bump packet count */
X            return('C');                /* Switch state to Complete */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE: return(state);      /* Receive failure, stay in B */
X
X        default:    return ('A');       /* Other, "abort" */
X   }
X}
X
X
X/*
X *  r e c s w
X *
X *  This is the state table switcher for receiving files.
X */
X
X
X
X
Xrecsw()
X{
X    chari rinit(), rfile(), rdata();     /* Use these procedures */
X
X    if (debug) printmsg(" recsw state: %c\n",state);
X    switch(state)                   /* Do until done */
X    {
X        case 'R':   state = rinit(); break; /* Receive-Init */
X        case 'F':   state = rfile(); break; /* Receive-File */
X        case 'D':   state = rdata(); break; /* Receive-Data */
X    }
X    if (numtry++ > MAXTRY) return(FALSE); /* If too many tries, give up */
X    switch(state)                   /* Do until done */
X    {
X        case 'C':   printmsg("\aDone.\a");
X		    return(TRUE);           /* Complete state */
X        case 'A':   printmsg("Receive Failed.");
X		    return(FALSE);          /* "Abort" state */
X    }
X    return(GETPACK);			    /* get the next packet */
X}
X
X    
X/*
X *  r i n i t
X *
X *  Receive Initialization
X */
X  
Xchari rinit()
X{
X    int len, num;                       /* Packet length, number */
X
X    switch(rpack(&len,&num,packet))     /* Get a packet */
X    {
X        case 'S':                       /* Send-Init */
X            rpar(packet);               /* Get the other side's init data */
X            if (timint > MYTIME + 3) reqtimint = timint - 4;
X            else reqtimint = timint + 4;
X            spar(packet);               /* Fill up packet with my init info */
X            flushinput();               /* get rid of unwanted nak's */
X            spack('Y',n,6,packet);      /* ACK with my parameters */
X            oldtry = numtry;            /* Save old try count */
X            numtry = 0;                 /* Start a new counter */
X            n = (n+1)%64;               /* Bump packet number, mod 64 */
X            return('F');                /* Enter File-Receive state */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE:                     /* Didn't get packet */
X            spack('N',n,0,NULL);        /* Return a NAK */
X            return(state);              /* Keep trying */
X
X        default:     return('A');       /* Some other packet type, "abort" */
X    }
X}
X
X
X/*
X *  r f i l e
X *
X *  Receive File Header
X */
X
Xchari rfile()
X{
X    int num, len;                       /* Packet number, length */
X    char filnam1[50];                   /* Holds the converted file name */
X
X    switch(rpack(&len,&num,packet))     /* Get a packet */
X    {
X        case 'S':                       /* Send-Init, maybe our ACK lost */
X            if (oldtry++ > MAXTRY) return('A'); /* If too many tries "abort" */
X            if (num == ((n==0) ? 63:n-1)) /* Previous packet, mod 64? */
X            {                           /* Yes, ACK it again with  */
X                spar(packet);           /* our Send-Init parameters */
X                spack('Y',num,6,packet);
X                numtry = 0;             /* Reset try counter */
X                return(state);          /* Stay in this state */
X            }
X            else return('A');           /* Not previous packet, "abort" */
X
X        case 'Z':                       /* End-Of-File */
X            if (oldtry++ > MAXTRY) return('A');
X            if (num == ((n==0) ? 63:n-1)) /* Previous packet, mod 64? */
X            {                           /* Yes, ACK it again. */
X                spack('Y',num,0,NULL);
X                numtry = 0;
X                return(state);          /* Stay in this state */
X            }
X            else return('A');           /* Not previous packet, "abort" */
X
X        case 'F':                       /* File Header (just what we want) */
X            if (num != n) return('A');  /* The packet number must be right */
X            strcpy(filnam1, packet);    /* Copy the file name */
X
X            if (filnamcnv)              /* Convert upper case to lower */
X                for (filnam=filnam1; *filnam != '\0'; filnam++)
X                    if (*filnam >= 'A' && *filnam <= 'Z')
X                        *filnam |= 040;
X
X            if ((fp=fopen(filnam1, image ? "wb" : "w"))==NULL) /* Try to open a new file */
X            {
X                error("Cannot create %s",filnam1); /* Give up if can't */
X                return('A');
X            }
X            else                        /* OK, give message */
X
X                printmsg("Receiving %s as %s",packet,filnam1);
X
X            spack('Y',n,0,NULL);        /* Acknowledge the file header */
X            oldtry = numtry;            /* Reset try counters */
X            numtry = 0;                 /* ... */
X            n = (n+1)%64;               /* Bump packet number, mod 64 */
X            return('D');                /* Switch to Data state */
X
X        case 'B':                       /* Break transmission (EOT) */
X            if (num != n) return ('A'); /* Need right packet number here */
X            spack('Y',n,0,NULL);        /* Say OK */
X            return('C');                /* Go to complete state */
X
X        case 'E':                       /* Error packet received */
X            prerrpkt(recpkt);           /* Print it out and */
X            return('A');                /* abort */
X
X        case FALSE:                     /* Didn't get packet */
X            spack('N',n,0,NULL);        /* Return a NAK */
X            return(state);              /* Keep trying */
X
X        default:    return ('A');       /* Some other packet, "abort" */
X    }
X}
X
X
X/*
X *  r d a t a
X *
X *  Receive Data
X */
X
Xchari rdata()
X{
X    int num, len;                       /* Packet number, length */
X
X    switch(rpack(&len,&num,packet))     /* Get packet */
X    {
X        case 'D':                       /* Got Data packet */
X#ifdef EXTRADEBUG
X	    if (debug > 2) printmsg("Got Data Packet");
X#endif
X            if (num != n)               /* Right packet? */
X            {                           /* No */
X                if (oldtry++ > MAXTRY)
X                    return('A');        /* If too many tries, abort */
X                if (num == ((n==0) ? 63:n-1)) /* Else check packet number */
X                {                       /* Previous packet again? */
X                    spack('Y',num,6,packet); /* Yes, re-ACK it */
X                    numtry = 0;         /* Reset try counter */
X                    return(state);      /* Don't write out data! */
X                }
X                else return('A');       /* sorry, wrong number */
X            }
X            /* Got data with right packet number */
X            spack('Y',n,0,NULL);        /* Acknowledge the packet */
X#ifdef EXTRADEBUG
X	    if (debug > 2) printmsg("Calling bufemp");
X#endif
X            bufemp(packet,len);         /* Write the data to the file */
X            oldtry = numtry;            /* Reset the try counters */
X            numtry = 0;                 /* ... */
X            n = (n+1)%64;               /* Bump packet number, mod 64 */
X            return('D');                /* Remain in data state */
X
X        case 'F':                       /* Got a File Header */
X            if (oldtry++ > MAXTRY)
X                return('A');            /* If too many tries, "abort" */
X            if (num == ((n==0) ? 63:n-1)) /* Else check packet number */
X            {                           /* It was the previous one */
X                spack('Y',num,0,NULL);  /* ACK it again */
SHAR_EOF
echo "End of part 1, continue with part 2"
echo "2" > s2_seq_.tmp
exit 0