Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

BinHex. Yes, this posting *is* BinHex.

23 views
Skip to first unread message

zab...@tiger.uucp

unread,
Apr 6, 1987, 6:39:38 PM4/6/87
to

Here is BinHex. Just save this file and then run xbin on it(I posted xbin
about a week ago) and you should get BinHex.data, BinHex.rsrc, and BinHex.info.

Then type macput BinHex and it will start a download to your mac.

(This file must be converted with BinHex 4.0)

:"d*TENKPH$3!39"36%*Z5(%J!*!((B'f9`#3"!%!N!-F*`!!'bF!!!&DBQ8JBfp
ZGQ9bG'9N)(GTG'JJ3QPZ5'9i,NKPH#N0#L0"8&"-3Qj)F53b-*!$$3SUN!05490
299*$45"'6e*,$3S`N!8a-*!'-8-b-c#3"$&#-M-`N!8a08%b-$3i0$8e1$)`-M!
b-$)`-M!c-$8a-M#3"68b06-0#M8b0$-`N!Ba1$3b0%8d1$8a-*!'-M#3"6%h0$)
f16C&0$Jf06Fi-M!h0M-d-N8c-$)`-N3b4$)`$3Sc-$-b-NBc-6-i-NBc1$-e06)
e-c8b0$-`N!8a-$!d163c0%8b-c!`1!#3!aJA3QPZ5'9i)(Bd,M!J,5dJ-$)[-6N
[1$8!!!%!$rrq!!J!!`!)!!+!#!"#3!J!BL!)Ir)3#(rlq!Krm!J)F'!)#("!#!K
`!!J)F!!)#(!!#!K`!!J)F$m)#Ia!L!MiJ%J)F6!S##()'!J1I`m%!M!(!J%!"`%
!J!F!J'!(!%!Ij`!J!Km!%!3(!!J)!!!%%!!!!L!!!!&!!*!$J!!2rri!$rrr!!r
rri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rq3!`IrN!-$rj!$!Iq3!`$rN!-!Irrr!$rq(`!
Ir!F!$rJ!!!I`!!!$i!!!!F!!N!1!!*!$!3!2rri!#!!$!!T)!S!*8!*!#!!#)!X
B!K!)!!2i#9!!#!T)!!J)!!!)#!!!#!J!!!J)!!!)#!#!#!J"3!J)!L!)#!3i#*!
$4BJ)%,1)#!RpL!J%XBJ)!X')#!&rL!J!JBJ)!!!)#!!!#!J!!!J)!!!)#!!!#!J
!!!J)!!!)$rrrq!rrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri!*!$"d&
38%`!N!B(9%9B9!!"!*!%*%*Z5(%!N!-"5801)`!"!*!$J!!"!)&'8N9'!!%!N!1
!!!%!J3#3!i!!N!82!*!$#B!!!!P!!!!*i!!!##!!!!JJ!!!))!!!Ir`!!#!)!!"
rr!!!3!3!!&!8!!"!"!!"`!H!!%!%J!"!")!!8"5!!%!%J!"rr*i!)!Mq!(rm(J!
#J!!!"%!!!!K`!!!3L`!!)@F!!"2l!!!*B`!!"B-!!!,r!!!"!`#3"#N!!3#3#2q
3!rX"&!e"BQpeG#"#D@j)CAM*!*!%!5d!N!L#!!)!N!MrN!1h"%CTE'893A"`E'P
MBA4TEfiJ,6iJ9A"XEf&N!&8!!"G%EhGZE'pKC#!Y2L""F("XD@0KG'P[EJ"%!!!
",3#3"!Y849K8)'CTE(4PFJ!!%J!13@4N)'aTEQ8JCQ9PC(-!N!3",3#3"!44G@P
d!&%!N!C)!!-!N!MrN!2l"%9NDA3%9@jNE`"D!!!",3#3"!0$GA3!@!!!"%0[F(N
!3`!!"9"KFh4P!&B!!!9$E'9KFJ#3#"8!4J"N!+i"N!!!!3#3#3%!N!55!!3!N!9
!!1B!9!%L"!*25`#3"43!p!!d!45J!J#!!*!&&!!+!#3!b)J53QPZ5'9i)(Bd,M!
J)#K)FAJT!*!&,!!+!$`!b)JCGh*TG(4PEL"LH5"CGQ9c)%aPEA"PFQ9eFJ#3"N3
!#J"8!-L)'N0[F(PbD@GSG#!a16Je)'*j)%eKD@jcG'&j!*!$$!"N!'3![J'3!!!
*998!N!-U!!%!N!8m!1B!8!%L"!*25`#3"4X!5!!V!4L)#9i`)'9bFQpb,J#3""-
!4J"N!,S"N!!!!3%!N!X6!#J!&!%B!H`!!3%!N!X6!%B!D3"T!BB!!3%!N!S9m!#
3!`&)EIrmU'kSrUN5U6#Tc%+RUAYK!"(b)$`!!2rrS$)r2!!#UHP#Tbmm8%&$5cm
m!!HTS#"IS%T#Tbmm4Np19$mm!BbTS#"IS%T#Tbmm4Np19$mm!JQTS#"IS%SEI!!
"rbiEI!!!rbeK!"(3F!"K!!eqUE4#*cmm$rp)EIlNUA"+(fIZ-#hqj0"!-$X!"Nl
l!!,ri!!drq!!'2rJrq$ri!&Lrq$ri2rJrq"K!"*Z-#hqmJJ!!!KRZN+R)#hqjMm
!U6jJ!!!dB3!58N*R,bhqlNKYr[5T,$!Id%!`1`!'6[X!![q3!!!1!36rN!$rN!$
rN!$rN!"#TbmYrZkT25YIr[J`,Ilid%!`1`!'6[X!!J!)!"B!EJ$'3QHT1(!!B3!
-e'!!re3`,Ilk$%!!!@B`3UFr2!!"3UF[22q3"+Pm+eIr++N93UG)EIlmUC%`,Il
m$%!!!@EZ,bhr++Q$B,K#Tcmm!!'T56mYr[T)EIkNU8C#CdKYrU5TYNTIB*S`,Il
kd%!`1`!'6[X!![q-!*3"l[q-!"!!,2q-!%J+,3!"rbj#Tcmm!!+T56mm!!3I,Im
ZU89J!2pL#Ld!!ImY3UFr2!!#U8Nr2!!&(bhr,DP&B!$r4URd-#hqqQF!rca63%)
R2`#T`NSIB!$r,NKYrZ3[,IldUE0J!2k!B3!4*$!YrZCR!2jd3QFr2!"N2c`!C#m
YrZBr2!!!UHP+Af!!rPSr2!"'2c`!4NKk%5K#Tcmmrrp#Td+R5'hq$$mm!!+TkNS
YrJaR!2l5B3!,)$mm!'3r2!"'5(S3r8KYrU4#TdKYrPJr2!!"UHT+,IjBC`$qUR!
%B3!,J%RYrJaK!!ibCJ!1VLYS!#$qrLYS!#6r!M!S!#J#32J!1d$r"LYS!$Er##Y
S!%$r$'%!#jK*lIjBB3!0e'B!$RCK!!h#CJ!1BQ%!$HjQ!!jD)Aa849K8!#!KI%*
Z5(%!*+!02LJ!%'B!$N"`!NAYqM**lIjBB3!00QB!$L*K!!C1CJ!1'Q%!"@aQ!!i
5F!&&q!!!5Hhq$'%!$44Q!!hd+fhr#2mNB3!&c'B!$HC*lIi-B3!0+QB!$GT`!8A
i!!"*lIi-B3!0!'B!$FJVEIm-rb4K!!@JCJ!0ZNRYrJaK!!cqCJ!0VQ%!"T!!CJ!
0XNRYrPKK!!cUCJ!0TQ%!#XKK!!pSB!$pS$mm!%Br2!"'5(S2cN+R5Lhr,QB)2cc
rrd+RB!Jr2!!"5(S$A%+R5'hq$$mm!!+TkNSYrJaR!2eSF!&&q!!!5Hhq$'%!$'4
Q!!dfB3!*,QB!$5iq22rC5N&R!!dN3Hhm2'!3%"J-!!!kC`i-!!!MC`!"#&(*rqj
JdLY)raJl3Im@B3!'('B!$2KK!!5HCJ!-m$mm!'3r2!"'5(S22dKYrU4#TdKYrPJ
r2!!"UHT+,IjBC`!!YR!%B3!*`Q%!#Ka*lIjBB3!-4QB!$,*K!!`dCJ!-S'%!$'"
Q!!bB)@hqrJ!J)@hr!J!N-#hr"S&S!#LJ$6iS!""Q!!akF!*&lISb5Hhq@'%!#k4
Q!!aF+fhr#2mNB3!%LQB!$%j*lIjBB3!,ZQB!$%*`!NAYqM**lIjBB3!,N!"Q!!`
`+fhr$2mNB3!%AQB!$#**lIjBB3!,MQB!$"C*lIi-B3!,JQB!$#"K!!PJB3!1!'!
!r$K*lIi-B3!,DQB!$!aJ!2`S+ha849K8r[iVI%*Z5((r!N*Yr`B-33!)C4"K!!,
++d$qrQ%!!X)V32m#$%%!"@83$"J!*'B+B3!#['8%1d$r"Q%!#'Sr2!"N2c`!4NK
k$K0)EIkN3UG)EIjB2c`!!DRU5Lhq@'H+F!4K!!LBB3!*"%RYrPKK!!XFCJ!,L'%
!#`TQ!!YfB3!,0QB!#fiKEIlq!#!KEIm#!#3`,Im'J@J!++!02LJ!%'B!#e"#,Im
[3Lhr-8*Yra*K!!H%CJ!,2%2k!8jK!!+DCJiEI!!"rbpK!!GXCJ!,*%2k!84K!!+
#CJjK!!LDB3!(9QB!#`jJ+N2k!6PK!!*UCL"K!!L8B3!(2QB!#[C`!NAYqM**lIj
BB3!+1'B!#YKJ%R!#4Hhk-NRYrPKK!!S-CJ!+a'%!#U"Q!!UmB3!'KQ!)B3!(!QB
!#Uj+,I`mCbC$qJ$#B3!#%QF+B3!"$'B!#TCJhN2k!0jK!!(qCJKK!!E@CJ!+JQ%
!"L*Q!!Tk5Hhq@'%!#HCQ!!TZ3rS!QQ%!!GKR!2p@3rS!Qf%!!FaR!2pL5Hhq$'%
!#F*Q!!TJB3!(S%2k!*pK!!'`CKjK!!&%C8#`,ImaCd""qJXr%#hr-@%!!@*q!Q!
!#Qj$qJ#%B3!"L'BHB3!"''8BX'hr%QFB3IS,)M!Yra*K!!%bIJ&J!!T'IJ0J!!T
!B3!,kQ!!qL*849K8!bU3!`dUN!0$6de38N968d9%$#U3!d4"9%%J4Np55a!UN!0
5490299*$45"'6e*,$LU3!d914#"24L"%394"$#U3!d0)480,8e901JFUN!0$8N-
kB3!!jNSYrbpQ'!`"!!*P1Q%!!)KP00%Yrc&K!!!bCqTJ+M`m!)"#3'%!!$)d!'!
@B3!!+MBYra,@31GE1d2r%Q%!!!aQ"P(+rqK#4dje51H!J'%!"-*-h`%"6R9f"``
'!)"Q'N*'5N&R%&0"("J%"J!J$!B!3'6Xj3i!"J!#i`lM%&(,rpT1GA3$iBJ3'&0
"8FVrq%jeB3!!!Q%!!!)8'&0"#J)!-!`#!!TP#JB#!)N-!J$kC3`#!J!2k8L!!J)
m!2j1G6m!i%KK!M!I(`$S#'%#%"m#!!!2!*!$-!`!!$TP!Pi!%-"1G8(Yr$a#34)
BC``-%!!+CJC5L&0"C[41G@(Q3N)8'E*#C3aJ",-)CJC4b[rk3N"1G8*Yra*$lIi
@3N%5%4!CB3!!l'BN8FRrpK!YrK9K!!$HCKC$lIlqFK%3'@%!!0"Q#&(*rrCK!!#
X6R9#EIm5B3!"QQBkIJ%-!!!rBM*#34)!3qhqT'!'B3!"JQBL%X"4bIrfB3!"GQB
@3qhqrR)4B3!"DQB+%X"4bIrfB3!"2%je3Qhr%NUYrb4R(Q%!!mKQ(*1Yrb4$lI`
mB!J3'@%!!&jQ#P(*rrCJh'%!!$K1G@%!!j4#EIm55Uhr*'F5B3!"('B@B3!$1QB
38khr*'EZB3!!k'B%B3!$4%je3Qhr%'!!!6T`!'%!!+KK!!#N-#hr%M)!i%KK!!!
'CN!`!8MR3!!5!'%!!)T+EIm3C`b`,Im`Ca"K!!!SCKiE3Im`B3!!5QB88Qhr%!a
Y!2rr%'8'B3!!$'B#3NG-h`!#6R8-E3!#ra"P(Q))B3!!)'F@B"J32!#3!'%!!24
Q$M!Yra"K!!$UCJ4#EIm36R83,Im`B3!!fQB3$!!!N!"Q#(!!B3!!c'B#3NG1G@'
fCJ4K!!%'6R9)jq!!0#hr%R)(i`MM8Q3%#N)3)9(*rr3l3[m560m!"dje3Qhr%'!
!!@jK!!!JCKTK!!!DCK4+EIm5C`j"qJI)-#hr%Q%!rGKq!8je5Qhr%'BJB3!"FQB
b$!!!N!"Q)Q%!!@CQ*NS!Ca46!!*!!2ml32m38fhr%"!Yrc"J#"!m!*!!'d$r-'%
!rhT#4dje1h`!"2m83Qhr&Q%!!Kj$qJ$-B3!"RQB8B3!"RQB1F$TK!!(#CJC5EIm
@3NG1G8MRi!!d,Im8FJIM#1-5C#J81b"F`8*K!!'HCLC5EIm@$'d!32m@C3TK!!&
JCK4#EIm@`8)d2!!%8FRrd$Y#ra4#4dcI!!G1G6!Yra6M#'6m%$X!('%!!@"Q%R!
kB3!"@'B+B3!"*QB%B3!"D%je)5)M*#8Q*bJT+LXX,6!a-M-d06Bi18""3N0%48C
(5%P+5da06P"48P0899CB@9TEB'&LBf4PCQKTDQYXEA"aFLdS9'KTFb"QD@aP)'e
eFh3JBQ8JBfpZGQ9bG'9N)(GTG'JJ3QPZ5'9i)$3Z-#P"lIdmF(m3r!#!8FMrqN(
kri*$lIdm3N&`2a)`!!!6J"!!8FMrpMYm!)$r&%*(6R9)jf!!0#hr&()($!)!J'B
X5Qhr&QB%B6KQ-#"YraK5VImB8fhr&N*#&""Vj%(Yr6`8-#!!DpVP#J!#!!,M#Z-
38FRrb$Y#ra4#4dcI!!C1G8MR`!"K!!$LCK*+3@F83Hhm2#Y)raJl3Im@3NG-h`!
$6R8q22rCB24K!!!DCK4`$@%!!#KQ$%SYrbeR"R!+B3!!'Nje3N%5'@!)%"PK!!!
-CJC4bIrf3NG1G5"Yra`3J&+Yraa5VImJ$+d!!#!!rb"N"%*(6R9"lIfm3UJ!$$&
YrU)!'%KYfM)KA`!J)@hr)!!N3QJ!,%+S!#kJ!ciS!"")EGSb+err(%+Yrb"+4dj
e3Hhp[%+S!!`aEIj@!"K)EI`m)9m!)#&m!!!"!!!N3QJ!,%+S!#kJ!L)S!#Jq+!!
3C`3-4rrC6R9"lIfm3UJ!$$&YrPB!'%KYr$`KA`!J)A`!!!%!!#3aI!f!!#a#U!!
ZS!)L+!!S2LJ!%'F%$%Irf8je3Hhp[%+S!!`aEIj@!"K)EI`p)9m!)#&m!*!$r`!
N-A`0J!!X3UJ!,U!#'fJ!+r`m2LJ!%'F%$%Irf8je3Hhq&N2YrU4#3"!B$%!!1f-
#F$X5`'!#%YK4b2rm3IS!%(!$%YK4b2rm@#hqT%je,NKaH%(YrKC$lIkN3N%5%",
B$%%!"'BU%"!-!!!ZCL)3+!!"B3!!)J`!!%KQ&"!S!!0K!!!8$!!!@'B'@5hqT'!
%8FRrc%je$!!!HQ)+$!!!B@8%!J!!Adje5N"Q"+K3B!a#Tcm!UENJAbm3U&&1G8+
R2c`!!8+R,ccrN!5T[5YArbLSFcmm!!1SKcmm!!bSLN*RU)Jr2!!"U)P1G5mYrbL
T&%jeBFKK!!"1B3!!LQ%!!+CJ!!$#BECK!!"FB3!!H'%!!*4J!!#`BD4K!!"+B!!
!TMmm!"3r2!!`U*0&qJ&3B!!"G$mm!"3r2!"!U*0&qJ&*B!!"BMmm!"3r2!!JU*0
)HJ$+U)4&lIi@B3!"5NKk!0+SK%je2c`!&$mm!##SNdKk!+USK%AYrQ*K!!%U5(S
!XUL%6R8r2!!82c`!-+L65(S!SkL%)#hr#'%!!2a)HJ#SU)41G6mm!"3r2!"!U*0
)HJ#HU)3J,Im-B3!!h%Kk!)LSK%je2c`!&$mm!&#SNdKk!*@SK"Ym!!6m25YYr[l
m2NAYr$eK!!#q5(S!4UL%2c`!&$mm!'#SNdKk!(@SK"Ym!!6m25YYr`,m2NAYr$e
K!!#85(S!(+L%6R893fpZGQ9bG'PZCb"dD'8JCQPXC5!L!L)Z%N4KG'%JCQpbDb"
cDATP)'Pc)!FJBRPdCA-Z&P*PFfpeFQ0P)'C[FQXJFfPkC5"TFb!*9(P`C5"TFb!
L$%0bC@&dEh)JDA-J)JT%BA4K)'C[FQXK$P*PFfpeFQ0P)'C[FQXK3Hhm2$mm!!#
TlNAYr$`r2!!!U)F[#UL%2c`!!kL(6R9"lIfm3UJ!$%KX!!SKA`!5-@`!"J!@%@`
!#3!D6R9Ki"&!!"XK5J!FS!!jD!!B!%Sq+!!36R9Kb"&!!"XK5J!FS!SjD!!B!%S
q+!!36R9"lIfm3UJ!$$&X!%S!'+!"2LJ!%'B33UJ!%M&X!!B!&U!62LJ!%%jeBBL
J#$iS!""1G@%!rhj#D!!FS!`q+!!3C`B-4rr9B")q22r6##J!"`!SCJDJ#6iS!""
1G@%!re4#D!!FS!`q+!!36R9"lIfm3UJ!$$&X!%S!&M&m!!)!,%+S!#kJ4$iS!""
1G6m(5Hhq@'%!rf`q(cm(5Hhq@''52KpK!2e#2`G*lIi-B3$r8MiIB#Jr"dRYrJa
K!2p%2Kmr"dRYrPKK!2mi2Kmr"dRYrPKK!2pH2KpK!2d-3IS!0"!BC`j)J,j!C`K
#3"!Bd-"JlLm)3UG#Td+RUBY`!'%!r+*#Ccmm!!P#TkQ'5PpJ!1qfh`j%DA*PBh4
[FRNJCR9XE0i*4'PcDb"QG@aXh!K%DA0V)%N[6pN,4@jN)'pQ)'CTE'A8'&GbDA4
P)("bEh4PBh4PC#"NDA0VCA4dCG-,4QPXC5"XEf0VC@65$9C[E(9YC5"XEf0VC@6
4#8CTE'8JBR9cH3-,6QmJBfKPBfYcG@d#$N0SC@0VFh9Y)#JN-$!T!3Y$8N-J+#3
`N!3T!!Y'D@aP)(0jFh4PE8+R2c`!!DQr,aG#CkNe,ca%8PC5U8e#Tcmm!!+T[d*
RU69#Tcmm!!1T[d*RU6@T0dje3UFr2!!#3UF[22q3"+Qp+eIr++Kc2c`!!+L(2c`
!$+L+2c`!!DL)2c`!!DL*5(S"(5mm!*!$#dKk!,Jr2!!"UFir2!!$U)G#CkL)5(S
"#Lmm!*!$%8Kk!+)r2!!"UFir2!!%U)Fr2!!*U)T)HJ$l,c`!!!)+5(S!LMmm!!#
TcNKk![%[2!#3!d&)HJ"q2c`!!DR1'h`!!ImX6R9#Tcmm!!0#Tbmmrj!%UEdV9rm
SU(-r2!!!U)Fr2!!-U)T#CkL)2c`!!DL*2c`!#Mmm!"DSNdKk!&'SK"Ym!!(r,%j
e5Lhr,'F+,bhr++N83Lhr,%je!!S!#J!D!Fi!'J!+!$S"cJ"+!!S!Z!(1!,J!#J$
N!Fi!%90KGQ8JC'pMG@ePER3JBA-k*dCTE'8JBfpZGQ9bFfP[EL"cG@0MCA0cCR9
XE(NJBfpYF'aPG'9N)8*TENKPH#"f0#i`BRN0@ACPFb"-C@e`CA*PGA*8D'Pc)'j
PGb"KEQ3JD@e`FQpfC@3JGQ9bFfP[EL"[CL"#D@j)CAJJDA-JBR*[G@GSG#"dEb"
jEh8JBA-JB5"`G@*XD@-JFf9bGQPMC5"LH5"0B@PZFh4KH5iJ3QPZ5'9i)'Pc)'&
Z)'PZG'9RFQ&dC@3JF'&bG#"[CL"dD'8J9'9XCA0MBA"P)'0[E@eeEQPMBA4TEfj
c)("KBfYKCf8X)(0[EfiJG'mJBQ8JFQ9XC@&cC@3JBRNJ6@&TER0dBANZ$3e8C@a
PFf0KF'8JCfPfCA-JH@pe)(4SC5"QGA4eFQ8JD@iJBfpYEA9ZD@0KG'P[EL!Y,5"
dEf4KH5%J8f9ZC#"YCA0cB@GPFb"hDA4S)(CKFQP[GA-JG'9iG#"cDATPFb`JCQp
ZG(-JB@jN)'GbBA"SD@-JFfKKF'9c,L"2G'KPFL"QC@&dGA*PFb"TEQ0XG@4P1L"
[ELecBh*PC@iJBfpYEA9ZD@0KG'P[ER-JC'PbC@0dEh*j,#"TER4PE'aTCf9ZG#"
YB@0bEh-X)(9ZDACPFR0KE#"dCA*YD@jKE#"PEA9XBA4TEfiX)'9bFQpb)'0SC@0
VD@jR)("bEh4[BfpXFb"KEQ3JB@iJG@jKG(4PEQ4PC#"YCA0cB@GP)(0PFRCTBf8
Z$3e'Eh)JCR9bG'KPFL"TEQC[FQeKG'P[EL`JBfpZG'&MG$T0B@PZFh4KH3db1$B
a-8)J3f&ZGfp[C#"6G#i03@G[GA*K)%KTE'ac,#"$35!j-6-`-3dS1$%i+5!j16%
Y0M8d-!#3!aJ!N!-S!!!PcJ#3!`J!N!-J!!!r2!!"UI!!!!%!N!-F*`!!'bF!!!&
D!!$-(!"F!*!$(!&D!!T#ENKa!*!$@NP$6L-!!3"Q4P*&4J!"!(j#6N4-!*!$PNP
$6di!N!1L689193!#!+j%6%p(!*!$dN4*9%`!!3$H38a59!#3!rCA58j%!!)"!N0
24%8!!3%Q!!$rrb!!N!A,d!#"rrmJ!!%J!!$,b!#!rrmJ!!!F!!$,c!#"rrmJ!!)
[!!$,`!#!rrmJ!!)N!!$,a!#!rrmJ!!)k!!$,[!#!rrm%!!*L!!$,Z!!$rrm%!!1
C!!$,V!!#rrm%!!-6!!$,X!!"rrm%!!,Q!!$,Y!!"rrm%!!2P!!$,U!!*rrm%!!5
N!!$,R!!"rrm%!!2q!!$,T!!*rrm%!!58!!$,S!!$rrm%!!8!N!2,N!!!![rr"!!
%k3!!bj3!!Irr"!!%dJ!!bjJ!!2rr)!!E#`!!biJ!!Irr&!!&&`!!biaH8J:
--
Mahboud Zabetian allegra! --\ zab...@tiger.princeton.edu
232 Pyne Hall mhuxi! -----\ (609) 452-2285
Princeton University seismo! -----\ (609) 734-0246
Princeton, NJ 08544 attunix! ------ princeton!zabetia

zab...@tiger.uucp

unread,
Apr 6, 1987, 6:42:59 PM4/6/87
to

Before you complain about macput, here it is. Along with a couple other
goodies.


#! /bin/sh
# This archive created: Mon Apr 6 17:41:23 1987
# by Mahboud Zabetian (Princeton U., EE) on
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# macbin.c
# macget.c
# macput.c
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'macbin.c'" '(3976 characters)'
if test -f 'macbin.c'
then
echo shar: "will not over-write existing file 'macbin.c'"
else
cat << \SHAR_EOF > 'macbin.c'
/*--------------------------------------------------------------------*
| Version : 2.0 |
| Author : Jim Budler |
| Copyright Oct 13, 1986 |
| Placed in public domain Oct 14, 1986 |
| Enjoy |
*--------------------------------------------------------------------*/

#include <stdio.h>
#include <errno.h>

extern int errno;

main(argc,argv)
int argc;
char **argv;
{
/* structure of the info file - from MacBin.C
char zero1;
char nlen;
char name[63];
char type[4]; 65 0101
char creator[4]; 69
char flags; 73
char zero2; 74 0112
char location[6]; 80
char protected; 81 0121
char zero3; 82 0122
char dflen[4];
char rflen[4];
char cdate[4];
char mdate[4];
*/
FILE *fd, *ofd;
char bname[128];
char iname[128];
char dname[128];
char rname[128];
char oname[128];
char buf[128];
char * charp, * cmd;
char * rindex();
int verbose = 0;
if ((cmd = rindex(argv[0], '/')) != NULL)
++cmd;
else
cmd = argv[0];
if (argc > 1)
if (!strcmp(argv[1], "-v")) {
verbose = 1;
--argc;
++argv;
}
if (argc < 2) {
fprintf(stderr,"Usage:\n\t%s [-v] filename(s)\n",cmd);
exit(EINVAL);
}
while ( argc > 1 ) {
(void) bzero(buf,128);
if (( charp = rindex (argv[1], '.')) == NULL)
strcpy(bname, argv[1]);
else {
*charp = '\0';
if ( strcmp(++charp,"data") && strcmp (charp, "info")
&& strcmp (charp, "rsrc")) {
*(--charp) = '.'; /* put it back */
strcpy(bname, argv[1]);
} else {
strcpy(bname,argv[1]);
--argc;
++argv;
}
}
strcpy(oname,bname);
strcat(oname,".bin");
strcpy(iname,bname);
strcat(iname,".info");
strcpy(dname,bname);
strcat(dname,".data");
strcpy(rname,bname);
strcat(rname,".rsrc");
if (verbose)
fprintf (stderr, "Converting %s\n", bname);
while ( argc > 1 && (!strcmp(argv[1], iname) ||
!strcmp(argv[1], dname) || !strcmp(argv[1], rname))) {
--argc;
++argv;
}
if ((ofd = fopen( oname, "w")) == NULL){
perror(oname);
--argc;
++argv;
continue;
}
if ((fd = fopen(iname,"r")) == NULL){
if ( verbose )
fprintf ( stderr, "No %s\n", iname);
fclose(ofd);
unlink(oname);
--argc;
++argv;
continue;
}
if (fread(buf, sizeof(*buf), 128, fd) > 0){
if (buf[74] & 0x40) buf[81] = '\1'; /* protected */
buf[74] = '\0'; /* clear zero2 */
fwrite(buf, sizeof(*buf),128, ofd);
(void) bzero(buf,128);
}
fclose(fd);
if ((fd = fopen(dname,"r")) == NULL){
if ( verbose )
fprintf ( stderr, "No %s\n", dname);
fclose(ofd);
unlink(oname);
--argc;
++argv;
continue;
}
while (fread(buf, sizeof(*buf),128, fd) > 0){
fwrite(buf, sizeof(*buf),128, ofd);
(void) bzero(buf,128);
}
fclose(fd);
if ((fd = fopen(rname,"r")) == NULL){
if ( verbose )
fprintf ( stderr, "No %s\n", rname);
fclose(ofd);
unlink(oname);
--argc;
++argv;
continue;
}
while (fread(buf, sizeof(*buf),128, fd) > 0){
fwrite(buf, sizeof(*buf),128, ofd);
(void) bzero(buf,128);
}
fclose(fd);
fclose(ofd);
}
}

#ifdef BZERO
/* File : bzero.c
Author : Richard A. O'Keefe.
Updated: 23 April 1984
Defines: bzero()

bzero(dst, len) moves "len" 0 bytes to "dst".
Thus to clear a disc buffer to 0s do bzero(buffer, BUFSIZ).

Note: the "b" routines are there to exploit certain VAX order codes,
but the MOVC5 instruction will only move 65535 characters. The asm
code is presented for your interest and amusement.
*/

#include "strings.h"

#if VaxAsm

void bzero(dst, len)
char *dst;
int len;
{
asm("movc5 $0,*4(ap),$0,8(ap),*4(ap)");
}

#else ~VaxAsm

void bzero(dst, len)
register char *dst;
register int len;
{
while (--len >= 0) *dst++ = 0;
}

#endif VaxAsm

#endif /* BZERO */
SHAR_EOF
if test 3976 -ne "`wc -c < 'macbin.c'`"
then
echo shar: "error transmitting 'macbin.c'" '(should have been 3976 characters)'
fi
fi
echo shar: "extracting 'macget.c'" '(7646 characters)'
if test -f 'macget.c'
then
echo shar: "will not over-write existing file 'macget.c'"
else
cat << \SHAR_EOF > 'macget.c'
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <sgtty.h>

#ifdef NO_RENAME
#define rename(old, new) link(old, new); unlink(old)
#endif

/* Mac time of 00:00:00 GMT, Jan 1, 1970 */
#define TIMEDIFF 0x7c25b080

#define RECORDBYTES 132
#define DATABYTES 128
#define NAMEBYTES 63

#define RETRIES 10
#define SOHTIMO 10
#define LINTIMO 20
#define CHRTIMO 2

#define MAXRECNO 0xff
#define BYTEMASK 0xff

#define TMO -1
#define DUP '\000'
#define SOH '\001'
#define EOT '\004'
#define ACK '\006'
#define NAK '\025'
#define CAN '\030'
#define EEF '\032'
#define ESC '\033'

#define H_NLENOFF 1
#define H_NAMEOFF 2
/* 65 <-> 80 is the FInfo structure */
#define H_TYPEOFF 65
#define H_AUTHOFF 69

#define H_LOCKOFF 81
#define H_DLENOFF 83
#define H_RLENOFF 87
#define H_CTIMOFF 91
#define H_MTIMOFF 95

#define H_OLD_DLENOFF 81
#define H_OLD_RLENOFF 85

#define TEXT 0
#define DATA 1
#define RSRC 2
#define FULL 3

int mode, txtmode;
int pre_beta; /* -o flag; for compatibility with MacTerminal Version -0.15X */

struct macheader {
char m_name[NAMEBYTES+1];
char m_type[4];
char m_author[4];
long m_datalen;
long m_rsrclen;
long m_createtime;
long m_modifytime;
} mh;

struct filenames {
char f_info[256];
char f_data[256];
char f_rsrc[256];
} files;

char tmpname[16];

int lastack;
char buf[DATABYTES];

/*
* macget -- receive file from macintosh using xmodem protocol
* Dave Johnson, Brown University Computer Science
*
* (c) 1984 Brown University
* may be used but not sold without permission
*
* created ddj 5/22/84
* revised ddj 6/29/84 -- added [-rdu] options
* revised ddj 7/16/84 -- protocol changes for MacTerminal Beta Version 0.5X
* revised ddj 7/31/84 -- pre-4.2 signal bugs fixed in timedout()
* revised ddj 11/7/84 -- renamed send_sync() -> get_sync()
*/
char usage[] = "usage: \"macget [-o] [-rdu] [filename]\"\n";

main(ac, av)
char **av;
{
char *name;

mode = FULL;
name = "";
ac--; av++;
while (ac) {
if (av[0][0] == '-') {
switch (av[0][1]) {
case 'r':
mode = RSRC;
break;
case 'd':
mode = DATA;
break;
case 'u':
mode = TEXT;
break;
case 'o':
pre_beta++;
break;
default:
fprintf(stderr, usage);
exit(1);
}
}
else {
name = av[0];
}
ac--; av++;
}

setup_tty();
if (get_sync() == ACK) {
txtmode = 0;
recv_hdr(name);
if (mode == TEXT) txtmode++;
recv_file(files.f_data, mh.m_datalen, 1);
txtmode = 0;
recv_file(files.f_rsrc, mh.m_rsrclen, 0);
}
reset_tty();
}

recv_hdr(name)
char *name;
{
long get4();
int n;
FILE *fp;
char *np;

strcpy(tmpname, "#machdrXXXXXX");
mktemp(tmpname);
recv_file(tmpname, (long)DATABYTES, 1);

fp = fopen(tmpname, "r");
if (fp == NULL) {
perror("temp file");
cleanup(-1);
}
fread(buf, 1, DATABYTES, fp);
fclose(fp);

if (name && *name) {
n = strlen(name);
if (n > NAMEBYTES) n = NAMEBYTES;
strncpy(mh.m_name, name, n);
mh.m_name[n] = '\0';
}
else {
n = buf[H_NLENOFF] & BYTEMASK;
if (n > NAMEBYTES) n = NAMEBYTES;
strncpy(mh.m_name, buf + H_NAMEOFF, n);
mh.m_name[n] = '\0';
}
for (np = mh.m_name; *np; np++)
if (*np == ' ') *np = '_';

if (mode == FULL) {
sprintf(files.f_info, "%s.info", mh.m_name);
rename(tmpname, files.f_info);
tmpname[0] = '\0';
sprintf(files.f_data, "%s.data", mh.m_name);
sprintf(files.f_rsrc, "%s.rsrc", mh.m_name);
}
else {
unlink(tmpname);
tmpname[0] = '\0';
switch (mode) {
case RSRC:
sprintf(files.f_data, "/dev/null");
sprintf(files.f_rsrc, "%s.rsrc", mh.m_name);
break;

case DATA:
sprintf(files.f_data, "%s.data", mh.m_name);
sprintf(files.f_rsrc, "/dev/null");
break;

case TEXT:
sprintf(files.f_data, "%s.text", mh.m_name);
sprintf(files.f_rsrc, "/dev/null");
break;
}
}

strncpy(mh.m_type, buf + H_TYPEOFF, 4);
strncpy(mh.m_author, buf + H_AUTHOFF, 4);
if (pre_beta) {
mh.m_datalen = get4(buf + H_OLD_DLENOFF);
mh.m_rsrclen = get4(buf + H_OLD_RLENOFF);
}
else {
mh.m_datalen = get4(buf + H_DLENOFF);
mh.m_rsrclen = get4(buf + H_RLENOFF);
mh.m_createtime = get4(buf + H_CTIMOFF);
mh.m_modifytime = get4(buf + H_MTIMOFF);
}
}

recv_file(fname, bytes, more)
char *fname;
long bytes;
int more;
{
register int status, n;
FILE *outf;
int naks = 0;

lastack = 0;
outf = fopen(fname, "w");
if (outf == NULL) {
perror(fname);
cleanup(-1);
}
for (;;) {
status = rec_read(buf, DATABYTES);
switch (status) {
case EOT:
if (!pre_beta)
tputc(ACK);
if (more)
tputc(NAK);
fclose(outf);
return;
case ACK:
tputc(ACK);
naks = 0;
n = (bytes > DATABYTES) ? DATABYTES : bytes;
bytes -= n;
fwrite(buf, n, 1, outf);
break;
case DUP:
tputc(ACK);
naks = 0;
break;
case NAK:
purge(CHRTIMO);
if (naks++ < RETRIES) {
tputc(NAK);
break;
}
/* fall through */
case CAN:
tputc(CAN);
fclose(outf);
/* unlink fname? */
cleanup(-1);
/* NOTREACHED */
}
}
}

get_sync()
{
int c;

for (;;) {
c = tgetc(60);
switch (c) {
case ESC:
break;
case CAN:
case EOT:
case TMO:
return c;
default:
continue;
}
c = tgetc(1);
if (c != 'a')
continue;
tputc(ACK);
return ACK;
}
}

rec_read(buf, recsize)
char buf[];
int recsize;
{
int c, rec, rec_bar, cksum;

c = tgetc(SOHTIMO);
switch (c) {
case TMO:
default:
return NAK;
case EOT:
return EOT;
case CAN:
return CAN;
case SOH:
/* read header */
rec = tgetc(CHRTIMO);
if (rec == TMO)
return NAK;
rec_bar = tgetc(CHRTIMO);
if (rec_bar == TMO)
return NAK;

/* check header */
if (rec != MAXRECNO - rec_bar) return NAK;

/* fill buffer */
cksum = tgetrec(buf, recsize, LINTIMO);
if (cksum == TMO)
return NAK;

/* get checksum */
c = tgetc(CHRTIMO);
if (c == TMO)
return NAK;
if (c != (cksum & BYTEMASK))
return NAK;

/* check record number */
if (rec == lastack)
return DUP;
if (rec != ((lastack + 1) & MAXRECNO))
return CAN;
else {
lastack = rec;
return ACK;
}
}
/* NOTREACHED */
}

purge(timeout)
int timeout;
{
int c;

do {
c = tgetc(timeout);
} while (c != TMO);
}

static int ttyfd;
static FILE *ttyf;
jmp_buf timobuf;

tgetrec(buf, count, timeout)
char *buf;
int count, timeout;
{
char *bp;
int i, cksum;

if (setjmp(timobuf))
return TMO;

alarm(timeout);
i = fread(buf, 1, count, ttyf);
alarm(0);
if (i != count)
return TMO;

cksum = 0;
bp = buf;
for (i = 0; i < count; bp++, i++) {
cksum += *bp;
if (txtmode && *bp == '\r')
*bp = '\n';
}
return cksum;
}

tgetc(timeout)
int timeout;
{
int c;

if (setjmp(timobuf))
return TMO;

alarm(timeout);
c = getc(ttyf);
alarm(0);

if (c == -1) /* probably hung up or logged off */
return EOT;
else
return c & BYTEMASK;
}

tputc(c)
char c;
{
write(ttyfd, &c, 1);
}

timedout()
{
signal(SIGALRM, timedout); /* for pre-4.2 systems */
longjmp(timobuf, 1);
}

static struct sgttyb otty, ntty;
/* should turn messages off */

setup_tty()
{
int cleanup();
int timedout();

ttyf = stdin;
ttyfd = fileno(stdout);
ioctl(ttyfd, TIOCGETP, &otty);
signal(SIGHUP, cleanup);
signal(SIGINT, cleanup);
signal(SIGQUIT, cleanup);
signal(SIGTERM, cleanup);
signal(SIGALRM, timedout);
ntty = otty;
ntty.sg_flags = RAW|ANYP;
ioctl(ttyfd, TIOCSETP, &ntty);
}

reset_tty()
{
sleep(2); /* should wait for output to drain */
ioctl(ttyfd, TIOCSETP, &otty);
}

cleanup(sig)
int sig;
{
if (tmpname[0] != '\0')
unlink(tmpname);
reset_tty();
exit(sig);
}

long
get4(bp)
char *bp;
{
register int i;
long value = 0;

for (i = 0; i < 4; i++) {
value <<= 8;
value |= (*bp & BYTEMASK);
bp++;
}
return value;
}
SHAR_EOF
if test 7646 -ne "`wc -c < 'macget.c'`"
then
echo shar: "error transmitting 'macget.c'" '(should have been 7646 characters)'
fi
fi
echo shar: "extracting 'macput.c'" '(8100 characters)'
if test -f 'macput.c'
then
echo shar: "will not over-write existing file 'macput.c'"
else
cat << \SHAR_EOF > 'macput.c'
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <sgtty.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/timeb.h>

/* Mac time of 00:00:00 GMT, Jan 1, 1970 */
#define TIMEDIFF 0x7c25b080

#define RECORDBYTES 132
#define DATABYTES 128
#define NAMEBYTES 63

#define RETRIES 10
#define ACKTIMO 10

#define MAXRECNO 0xff
#define BYTEMASK 0xff

#define TMO -1
#define DUP '\000'
#define SOH '\001'
#define EOT '\004'
#define ACK '\006'
#define NAK '\025'
#define CAN '\030'
#define EEF '\032'
#define ESC '\033'

#define H_NLENOFF 1
#define H_NAMEOFF 2
/* 65 <-> 80 is the FInfo structure */
#define H_TYPEOFF 65
#define H_AUTHOFF 69

#define H_LOCKOFF 81
#define H_DLENOFF 83
#define H_RLENOFF 87
#define H_CTIMOFF 91
#define H_MTIMOFF 95

#define H_OLD_DLENOFF 81
#define H_OLD_RLENOFF 85

#define TEXT 0
#define DATA 1
#define RSRC 2
#define FULL 3

int mode, txtmode;
int pre_beta; /* -o flag; for compatibility with MacTerminal Version -0.15X */

struct macheader {
char m_name[NAMEBYTES+1];
char m_type[4];
char m_author[4];
long m_datalen;
long m_rsrclen;
long m_createtime;
long m_modifytime;
} mh;

struct filenames {
char f_info[256];
char f_data[256];
char f_rsrc[256];
} files;

int recno;
char buf[DATABYTES];

/*
* macput -- send file to macintosh using xmodem protocol
* Dave Johnson, Brown University Computer Science
*
* (c) 1984 Brown University
* may be used but not sold without permission
*
* created ddj 6/17/84
* revised ddj 7/16/84 -- protocol changes for MacTerminal Beta Version 0.5X
* revised ddj 7/31/84 -- pre-4.2 signal bugs fixed in timedout()
* revised ddj 7/31/84 -- fixed timeout problem in initial handshake
*/
char usage[] =
"usage: \"macput [-o] [-rdu] [-t type] [-a author] [-n name] filename\"\n";

main(ac, av)
char **av;
{
int n;
char *filename;

if (ac == 1) {
fprintf(stderr, usage);
exit(1);
}

mode = FULL;
ac--; av++;
while (ac) {
if (av[0][0] == '-') {
switch (av[0][1]) {
case 'r':
mode = RSRC;
strncpy(mh.m_type, "APPL", 4);
strncpy(mh.m_author, "CCOM", 4);
break;
case 'u':
mode = TEXT;
strncpy(mh.m_type, "TEXT", 4);
strncpy(mh.m_author, "MACA", 4);
break;
case 'd':
mode = DATA;
strncpy(mh.m_type, "TEXT", 4);
strncpy(mh.m_author, "????", 4);
break;
case 'n':
if (ac > 1) {
ac--; av++;
n = strlen(av[0]);
if (n > NAMEBYTES) n = NAMEBYTES;
strncpy(mh.m_name, av[0], n);
mh.m_name[n] = '\0';
break;
}
else goto bad_usage;
case 't':
if (ac > 1) {
ac--; av++;
strncpy(mh.m_type, av[0], 4);
break;
}
else goto bad_usage;
case 'a':
if (ac > 1) {
ac--; av++;
strncpy(mh.m_author, av[0], 4);
break;
}
else goto bad_usage;
case 'o':
pre_beta++;
break;
default:
bad_usage:
fprintf(stderr, usage);
exit(1);
}
}
else {
filename = av[0];
}
ac--; av++;
}

setup_tty();
find_files(filename, mode);
if (mode != FULL)
forge_info();

if (send_sync() == ACK) {
txtmode = 0;
sleep(1); /* added to make sure info block is recieved */
send_file(files.f_info, 1);

if (mode != FULL)
unlink(files.f_info);

if (mode == TEXT) txtmode++;
send_file(files.f_data, 1);

txtmode = 0;
send_file(files.f_rsrc, 0);
}
reset_tty();
}

find_files(filename, mode)
char *filename;
{
int n, tdiff;
struct tm *tp;
struct timeb tbuf;
struct stat stbuf;

sprintf(files.f_data, "%s.data", filename);
sprintf(files.f_rsrc, "%s.rsrc", filename);

if (mode == FULL) {
sprintf(files.f_info, "%s.info", filename);
if (stat(files.f_info, &stbuf) != 0) {
perror(files.f_info);
cleanup(-1);
}
return;
}
else {
strcpy(files.f_info, "#machdrXXXXXX");
mktemp(files.f_info);
}

if (mode == RSRC) {
strcpy(files.f_data, "/dev/null");
if (stat(files.f_rsrc, &stbuf) != 0) {
strcpy(files.f_rsrc, filename);
if (stat(files.f_rsrc, &stbuf) != 0) {
perror(files.f_rsrc);
cleanup(-1);
}
}
mh.m_datalen = 0;
mh.m_rsrclen = stbuf.st_size;
}
else {
strcpy(files.f_rsrc, "/dev/null");
if (stat(files.f_data, &stbuf) != 0) {
sprintf(files.f_data, "%s.text", filename);
if (stat(files.f_data, &stbuf) != 0) {
strcpy(files.f_data, filename);
if (stat(files.f_data, &stbuf) != 0) {
perror(files.f_data);
cleanup(-1);
}
}
}
mh.m_datalen = stbuf.st_size;
mh.m_rsrclen = 0;
}

if (!pre_beta) {
ftime(&tbuf);
tp = localtime(&tbuf.time);
tdiff = TIMEDIFF - tbuf.timezone * 60;
if (tp->tm_isdst)
tdiff += 60 * 60;
mh.m_createtime = stbuf.st_mtime + tdiff;
mh.m_modifytime = stbuf.st_mtime + tdiff;
}

if (mh.m_name[0] == '\0') {
n = strlen(filename);
if (n > NAMEBYTES) n = NAMEBYTES;
strncpy(mh.m_name, filename, n);
mh.m_name[n] = '\0';
}
}

forge_info()
{
int n;
char *np;
FILE *fp;

for (np = mh.m_name; *np; np++)
if (*np == '_') *np = ' ';

buf[H_NLENOFF] = n = np - mh.m_name;
strncpy(buf + H_NAMEOFF, mh.m_name, n);
strncpy(buf + H_TYPEOFF, mh.m_type, 4);
strncpy(buf + H_AUTHOFF, mh.m_author, 4);
if (pre_beta) {
put4(buf + H_OLD_DLENOFF, mh.m_datalen);
put4(buf + H_OLD_RLENOFF, mh.m_rsrclen);
}
else {
put4(buf + H_DLENOFF, mh.m_datalen);
put4(buf + H_RLENOFF, mh.m_rsrclen);
put4(buf + H_CTIMOFF, mh.m_createtime);
put4(buf + H_MTIMOFF, mh.m_modifytime);
}
fp = fopen(files.f_info, "w");
if (fp == NULL) {
perror("temp file");
cleanup(-1);
}
fwrite(buf, 1, DATABYTES, fp);
fclose(fp);
}

send_sync()
{
int c, i;

for (i = 0; i < 3; i++) {
tputc(ESC);
tputc('a');
while ((c = tgetc(ACKTIMO)) != TMO) {
switch (c) {
case CAN:
case EOT:
case ACK:
return c;
default:
continue;
}
}
fprintf(stderr, "starting handshake timeout\r\n");
}
fprintf(stderr, "giving up\r\n");
return CAN;
}

send_file(fname, more)
char *fname;
int more;
{
register int status, i, n;
FILE *inf;

inf = fopen(fname, "r");
if (inf == NULL) {
perror(fname);
cleanup(-1);
}
recno = 1;
for (;;) {
n = fread(buf, 1, DATABYTES, inf);
if (n > 0) {
for (i = 0; i < RETRIES; i++) {
send_rec(buf, DATABYTES);
status = tgetc(ACKTIMO);
if (status != NAK)
break;
}
if (status == NAK || status == CAN) {
fclose(inf);
cleanup(-1);
/* NOTREACHED */
}
}
if (n < DATABYTES) {
tputc(EOT);
if (!pre_beta) {
status = tgetc(ACKTIMO);
}
if (more) {
status = tgetc(ACKTIMO);
}
return;
}
recno++;
recno &= MAXRECNO;
}
}

send_rec(buf, recsize)
char buf[];
int recsize;
{
int i, cksum;
char *bp;

cksum = 0;
bp = buf;
for (i = 0; i < recsize; i++, bp++) {
if (txtmode && *bp == '\n')
*bp = '\r';
cksum += *bp;
}

tputc(SOH);
tputc((char)recno);
tputc((char)(MAXRECNO - recno));
tputrec(buf, recsize);
tputc((char)cksum);
}

static int ttyfd;
static FILE *ttyf;
static jmp_buf timobuf;

tgetc(timeout)
int timeout;
{
int c;

if (setjmp(timobuf))
return TMO;

alarm(timeout);
c = getc(ttyf);
alarm(0);

if (c == -1) /* probably hung up or logged off */
return EOT;
else
return c & BYTEMASK;
}

tputrec(buf, count)
char *buf;
int count;
{
write(ttyfd, buf, count);
}

tputc(c)
char c;
{
write(ttyfd, &c, 1);
}

timedout()
{
signal(SIGALRM, timedout); /* for pre-4.2 systems */
longjmp(timobuf, 1);
}

static struct sgttyb otty, ntty;
/* should turn messages off */

setup_tty()
{
int cleanup();
int timedout();

ttyf = stdin;
ttyfd = fileno(stdin);
ioctl(ttyfd, TIOCGETP, &otty);
signal(SIGHUP, cleanup);
signal(SIGINT, cleanup);
signal(SIGQUIT, cleanup);
signal(SIGTERM, cleanup);
signal(SIGALRM, timedout);
ntty = otty;
ntty.sg_flags = RAW|ANYP;
ioctl(ttyfd, TIOCSETP, &ntty);
}

reset_tty()
{
if (ttyf != NULL) {
sleep(2); /* should wait for output to drain */
ioctl(ttyfd, TIOCSETP, &otty);
}
}

cleanup(sig)
int sig;
{
reset_tty();
exit(sig);
}

put4(bp, value)
char *bp;
long value;
{
register int i, c;

for (i = 0; i < 4; i++) {
c = (value >> 24) & BYTEMASK;
value <<= 8;
*bp++ = c;
}
}
SHAR_EOF
if test 8100 -ne "`wc -c < 'macput.c'`"
then
echo shar: "error transmitting 'macput.c'" '(should have been 8100 characters)'
fi
fi
exit 0
# End of shell archive

0 new messages