[net.sources.mac] Macplot - plot the uucp map!

brad@gcc-milo.ARPA (Brad Parker) (10/07/86)

This is a shar file containing a quick hack mac application to plot
generic UNIX plot(5) files. It does not support all of the plot
options (unsupported ones are ignored). Adding code to suport these
should be simple - the source is ultra-simplistic. 

What is supported is sufficient to plot the uucp map provided by
uplot. uplot is a pd program posted a few days ago which reads the
uucp map and produces a plot(5) format file. I've included it's
slightly modified source also.

So, with this and LaserKey, you can plot the uucp map on your mac
and them print the screen to your laserwriter and get a nifty plot
of the uucp for all of your friend to enjoy.

Thanks to Larry Campbell for doing uplot. Great idea!

Enjoy!

Brad Parker
General Computer
harvard!gcc-milo!brad

caveat: this code is not intended to be a full mac application. It
is just enough to support enough events to let LaserKey work. I have
not tested it with DA's.

#!/bin/sh
# 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 the files:
#	macplot.Hqx
#	macplot.c
#	macplot.rc
#	README
#	Makefile
#	uplot.c
#	uplot.sed
#	uplot.sh
# This archive created: Tue Oct  7 14:56:08 1986
export PATH; PATH=/bin:$PATH
if test -f 'macplot.Hqx'
then
	echo shar: over-writing existing file "'macplot.Hqx'"
fi
cat << \SHAR_EOF > 'macplot.Hqx'
(This file must be converted with BinHex 4.0)

:"feKBh"XEh3!39"36%0$6dd!N!JbBXVN!*!%!3#3!c)!N!-a!*!%BJ#3mb!!N!-
`!*!(%!#3!b!!!$mm!!'Tm!!!2c`!!UR`!!!ZJJ#3!`'J0PQ2,ca%394"2c`!!+Q
J*PpCMbm,UD8S(cSmr"*)a85&)!A3K+-H+%MCa5(-!VBJ8b*-)!5J,Lm,UD01V3!
U3Hd!+MJSrri[#+Ra@Bm[2%024%8r"+QJ)&qJ5D!G3QHTG%SIC`!!%Mmm!!'Tb%*
RUA4+(fB!rrK)E2rk5'crrNkk#lC3MbmXrrSr,2rq6VSFm%kk#P4FMcmm!!"1ZL%
q6R96N!"Q!!!',`LTm8je8j!!CJ!!"Lm)UI&1d8j@rjJ-VJ#3"3KQ!!!+-$`!!'!
!"Ba1ZJ@k5'`!!#mZ!!K1ZKjd8)mY32rm$+i!N!6rr'B!!!S`2!!!B!!&BNkk#hj
+!'F!!"Br2!!$6VSXU&521A`!!Ir`3QcrlMmm!!41ZJ[L9)mr2!!*6VS,p&52,bl
rr%kk&f4BMae!rrYR!!8#%#lrqdL!B!!!!V"m!'9R!!!'B!!!($!Xrr"R!!!-5'`
!!Nkk&)"BMf!!"0*J!!!1X(`!FfF!!!CJ!!"Q,blrr%kk"0jBMcP!rrJ[,[rm6VS
%d&L218$rpLmZrra1ZJ6#@)mj32rd,blrr%kk",4BMcP!rr)`,2r`C`!!(MmXrr)
r,2rd2bcrpMmXrrK)E!!+6VS8%Ylm!!aJ!!4LB!!!$V"m!'eR!!!'B!!!GLmZrra
1ZJ4Z@)mr!%kk"2*8Mdkk*[K1ZLEJ28$rq#mZrra1ZJ43@)mr!%kk"8T8Mdkk*YT
1ZLE#28$rpM!XrqjR!!!32blrpMmZrrK1ZL6-@)m`,2r`C`!!&$mZrrBr,[ri5'`
!(Nkk%j!!8)pJ!!2LB!!!$V"m!("R!!!'B!!!J#mZrra1ZJ2Z@)mr!%kk"(*8Mdk
k*RK1ZLCJ28$rq#mZrra1ZJ23@)mr!%kk"-T8Mdkk*PT1ZLC#28$rpM!XrqjR!!!
D2blrpMmZrrK1ZL4-@)p#Cd*R6VSNH&L2-#crm'F!!"3r,[rf2blrq%KX!#T1ZK-
'8)pJ!!0BB!!!$V"m!'jR!!!'B!!!GLmZrra1ZJ0N@)mr!%kk!qK8Mdkk*Hj1ZLA
@28$rm#mZrra1ZJ0'@)mr!%kk"%"8Mdkk*G"1ZL@i28$rlM!XrqjR!!!32blrlMm
Zrr"1ZL2Q@)m`,2r`C`!!&$mZrqir,[r`5'`!1%kk%SC3Mf!!!YKJ!!!1X(`!E'F
!!!CJ!!$+,blrr%kk!Z4BMcm!6VS$D&526VSPENkk*9Bp32rd,blrr%kk!XCBMcm
!6VS$`&526VSP8%kk*6Jp32rb,blrr%kk!UKBMcm!6VS$,&526VSP-Nkk*4Sp32r
i,blrr%kk!STBMcm!6VS$K&526VSP&%kk*2`p32rf-#crlQF!!"ir,[rb2blrp%k
k)`CBMcmZrrBr,[ri6VSM(&L2-#crm'F!!"ir,[rf2blrq$mZrr)r,[rd5'`!5%k
k%E6Hr!!-B!!#"'!!!!k`I!"MC`!!"Q!!!&3[,[rm6VS#%&L228$rp#mZrra1ZJ)
#@)mp32rb,blrr%kk!I4BMce!rqJ`,2r`C`!!'MmZrqJr,[rb2blrp%KX!'*1ZK&
@h[`!#Q!!!DCJ!!!1X(`!B@F!!!CJ!!#+,blrr%kk!E*BMce!rr3[,[rm6VS"T&L
228$rmLmZrra1ZJ'@@)mp32r`,blrr%kk!BKBMce!rqi[,[rm6VS"HPL228$rl#m
Zrra1ZJ&X@)mp32rU-#crm'F!!#Br,[rU2blrl$mZrqir,[r`2blrmMmZrr4)E!#
!6VS3`Ylm!""J!!%5B!!!$V"m!(4R!!!'B!!!G#mZrr`r2!"35'lrQ%kk'p6Hr!!
+5'lrQ%kk*-KBMd(ZrjI3`"!35)#`I!!JE!!!&%KZrjK1ZL5X@)p"l[qAd-"#%$!
XrqjR!!!-5'lrQ%kk"l*BMc!Xrr"R!!!35'lrQ%KX!+T1ZK"#8)pJ!!#8B!!!$V"
m!'CR!!!'B!!!J#mZrr`r2!"35'lrQ%kk'eEHr!!+5'lrQ%kk*%TBMd(ZrjI3`"!
35)#`I!!JE!!!&%KZrjK1ZL3Z@)p"l[qAd-"#%$!Xrr"R!!!35'lrQ%KX!,41ZJr
@8)pJ!!!SB!!!!M!Xrr"R!!!8%#lrqdL!2`")E!$#6VS2Y&b2B!!!"Q!!rq"J!2V
`2c`!!Nkk*fj8MbmZrra1ZL&F@)m`2!!"B!!!!NjH6R919[rq,bi!#%kk%LjBMm"
m!2m[!#mZ!!K1ZK)H@)mL!#!Ii8'!3@!!!!*1ANje6PErr%KZrra1ZKHi@)mJE[r
m-#J!&L"Zrrb3!'J!%NM!6VSL)%kk)PJT32rS)'lrr$!S!"3JE[rmN!"S!"")`%k
k)J*1ZL)k+8$rj#!X!-`T32rJ)#`!d#P!rpa1ANje6PB!!$!Xrr"R!!!32bi!#%K
X!041ZJlLA)mJ,2rJ6VSKl%KXrqK)E2dD2c`3"+RV-Li!#**XrrJr!5m25'cp'Mm
m)!5Tke52-Lcrp**XrrK)`8kk)H"1ZL(`,`%[$dKXr4Sr2"!'UHYBMdkk)E4J!!!
#6Pj1G8j@rrB`,2r`C`!!%$mZ!!K)E!$D6VS1E&b2)#crh%kk)AC)E2rN5'cp'Mm
m%!5Tkc)Z!!L5E2rf2`%[$dKXr4Sr2#!%UHY8Mc)Xrr+5E2rf5-&1ZL&U6VSKHLm
",`p)E2dD2c`3"URV@)mYE2dDrrBYE2dHrrSpE2dLrriJ,2rN6VSK&%KZrrC)E2d
D2c`!!URV6VSK&Q!!!!*1ANje6PB!!$mZ!!K1Z[lL9)p1ZL$S6VSJd$e!!!Jr,J!
+6VVr3P526VSJdNkk),Sp3!!+2bi!#M!Z!!KE3$m!6VSHb&L23QFr2!!+6VSHmPL
2-#i!#PY!2`!r,J!)6VSHUPL22c`!#N*R6VSHe&L26Pj1G8j@!!![,J!)6VS9ZPL
26VSP#N*R2ccrrdkk"!*BMdkk""*1ZJ%L6VSFIN+R6VSPF&L26VS9I%jH6R919[r
d2c`!C$mm!-Jr2!!b2c`!-NKZrr41ZL%Qh[`!$%+R3QF[22q3"%*R2c`!!8KX!1"
)E[rd,c`!N!41ZJ2)h[`!'Le!rr`[,[rm6VS95&L22c`!&$mm!"j1ZKhq@)p)E!$
U6VS%,&L22c`!+$mm!"j1ZKhQ@)p)E!$i6VS%&&L22c`!2$mm!"j1ZKh1@)p)E!%
%6VS$r&L26VS$0%S!CJ!!"Q!!rr3[,[rm6VS$QPL26Pj1G8j@rr``2!"N28$rr$e
!rrj)E2q+3UG)E!%X2c`!!5mm!*!%5'`")NKZrra1ZK[Lh[`!'K!XriTR!!!-3Hc
rP#!)B!!!$#!m!*!%B!!!!NjH6R919[rq6VSMB"em!"6rrN)Zrrp)E[rq2c`!!8k
k)e4FMbP!rpK)E!%b,bcrf%kk)fa3MdKX!8B[,2rB6VSMK&#2,bcrf%kk$bKBMdK
X!8`r2!!#6VSM(&b2+8$re%KX!9)[,2r86VSM0&#2,bcre%kk$[jBMdkk$`T1ANj
e6PEqrM!Z!!KJ!!!#X(`!!@F!!!CJ!!!q$'i!!3!+CJ!!#NkkrP4J!!!N5'lr!$m
Z!!S[,2rB6VSM+Ylm!!T)E[m!6VSM6&L228$qrQ!!!&aJ!!!1X(`!!QF!!!CJ!!"
--#i!#Q!!!!+`I!!"C`!!"Q!!!"C1Z[kk,`"1Z[B-@)pJ!!!JB!!!$V"m!!0R!!!
'B!!!%$Pm!!(rl'!!!!CJ!!!#B!!!"Q!!!!*#Cdkk)ej8MdjH6R919[rF5'cq9Nk
krAjBMdKZrra1ZK08@)mJE[rm3qJ!%%(Zrr4`!dkk%Pir2!!82c`!#NKZrr41ZKl
S8)p#E2rX3UG#Cbmmrj!%3QFr2!!"5'`"C%KZrr3[2!#3"%kk!@VHr!!D,8$rm#m
Zrr"1ZK,U@)p1ZK@f5'lri$mmrrp1ZJ$LA)m`,[rJB!!!!V"m!!&R!!!'B!!!C%K
Zrpa)E[rU6VSL`&#2B!!!!V"m!!&R!!!'B!!!(%KZrqT1ZL+%@)m[!%kkrS4BMf!
!!#KJ!!!1X(`!!QF!!!CJ!!!B,blrh%KZrq"1ZJ"U8)pJ!!!'B!!!!Q!!!%aJ!!!
1X(`!"QF!!!CJ!!!m)#lriLe!rp`[,[rF6VSENPL2)#lrh,#Zrr"Q!!!-,blrm%k
k%LjBMbmZrpa1ZKZ!@)pJ!!!'B!!!!JaX!!$rl'F!rbT1ANje6R919J!!,bi!##m
Z!!bTXdjH6R919J!!98mr,J!),bi!#UP`%"p)J%jH6R919J!!98mr,J!),bi!#UP
a%"p)J%jH6R919J!!98qTG"!I5)"1ANje6PB!!$!Z!!VKL1')-#i!#+!b6Pj1G8j
@!!#T%MPm!!(qDNjH6R919J!!,bi!%%kk$P"BMeP2,bi!##mZ!!`[,J!3(bi!&6m
Z!"B[,J!B(bi!(5mZ!"kT%bmZ!""1ZJk-@)mJ(djH6R919J!!,bi!#+N86Pj1G8j
@!!!r,J!)U)G1ANje6PB!!$mZ!!LSL8jH6R919J!!2bi!#+L+6Pj1G8j@!!!3,J!
*5)!r!+L$6Pj1G8j@!!![,J!)6VS0a&L2,bi!#+L%,bi!#%kk$KjBMdjH6R919J!
!,bi!#$mZ!!`r,J!1U)91ANje6PB!!#mZ!!LSLdjH6R919[q`,`X[#LeZ!!Mr`Me
Z!!craN)ZrmT#CdKZrl"1ZJ`5A)p+3'B!!&T#E[r-3QG)E[q`6VSEU&b23Hlrd#C
)*'i!%KD5&fS!!3!"&fS!!J!#&fS!!`!$3Hlre#C)*'i!$KD5&fS!!3!"&fS!!J!
#&fS!!`!$3QG)E[q`6VSET&b2-#lr`#4I*Pp1ANje6PErX$eZ!!Mrb#eZ!!lrd#"
Z!!SY82r83Qlrh%*R5'lrX%kk$"*FMb"Z!!SJV[rB-#lr`%jH6R919[q`2@i!#2r
)3QG)E[q`6VS-*&b2)'i!#L#Zrpi`,[r!6Pj1G8j@rl!pEJ!)rmJpEJ!+rp`YEJ!
-rpj#CdKZrl"1ZJ`1A)p1ANje6PErX$eZ!!Mrb%*R5'lrX%kk$""FMb!Zrm`JEJ!
+))!`,[r!6Pj1G8j@rl!pEJ!)rmJJ,J!+,8$rc%*R5'lrX%kk#raFMdjH6R919[q
`2@i!#2r)3QG)E[q`6VS,rPb26Pj1G8j@rpB[#bCZ!!a#E[r@2`F`,J!)B!!!!V"
m!'4R!!!'B!!!$Mim!!TJ!!"+B!!!$V"m!(9R!!!'B!!!$Mim!!TJ!!!bB!!!$V"
m!'pR!!!'B!!!$Mim!!KJ!!!DB!!!$V"m!(KR!!!'B!!!#Mim!""J!!!#$+i!N!8
3E!!!-JaZ!'3!#'B!!"JJ8e+6%,`!,5!Z!""%J#e!!""J!!!5-#i!#QB!!!S#VJ!
!rrm!%!a(!!KQ!!!3)#i!%-#m!*!$"f!!!#`-4`!3CJ!!%#!Z!"$![!#3!`pJ!!!
@)#i!%#m!-!G)`#m!6VS*A&L2)"mb,[r@8QlreZ1"3Hlrf0$"-)!-4`!)CJ!!%L!
Z!"$QJ-#m(rq3!f!!!#i-4`!3CJ!!%L!Z!"$SJ-#m$rq3!f!!!"BJ,J!3,`!`"dM
!,`"1ZJN')"pBMbe!!"!J,J!3CJ$rB$!ZrpCR!!"38flreM!ZrpEMJ%(ZrpM3`!a
3!!TY!!!F-#lreZ1!3Hlrf0$!-"#3!(`!#Y"m!%&J!!!8-#lreZ1!3Hlrf0$!-"$
3I!!`)&05Na#!B!$rV$iI*Pp1ANje6PErj#m,*Qi!$$m(2`B-EJ%!!!TQ!!!)2A`
!"J!+2@i!#[rq$'i!CJ!)CJ!!$"em!!(rr'!!!"i-EJ"P!!KR!!!-$'i!C`!)CJ!
!#N)Zrra5E[rq5'lrr%KZ!"")E[rN2c`)#kRV5'lrk%kk#Q"BMa!Zrq4R!!!+)&0
5Na#m!#d3,[rS5)#`I!!`E3!!(K!ZrqK)J,"m!$PZ!!!3%#lrk%L!X(`!-'B!!"B
3,[rTCJ!!$L"68T-3V[rSB!!"!!aZ!'B!#'B!!)K)E[rS6VSBTPL2N!"Z!!Sq!%*
'$%F!!'m!!"S`"P*'3Hlrk0$!%"!J8e+6%)"64f!!rq)`,J!+C`!!#L"68T-3[!!
Z-!G54`a!!!"X!!!5)&05Na#m!$"6EJ!+B!$rjM!Z!!T6EJ!+5N"R!!!B-!C54N(
ZrqM3`"!3)&05Na#!B!$rhQ!!!(!J8e+6%+lrk$!Z!!TR!!!+)&05Na#m!#iq2!!
"-#i!#Y&ZrqB`,J!+8fi!#NT!C`!!'$!(8NG"l[rSd-!3%#"68T-3J'!!rpiJ8e+
6%,`!46mZrqC)E!&X,a01ZJ1Qh[`!#Lm66VSA`&L25-$4Nc`I2KmQAdjH6R919[r
q3QlrrL"Z!!JJ8"!35)#`I!!`E3!!1L"Z!!JJ8"!35)#`I!!jEJ!!+$!Zrrl"r!!
+)'i!##"3&K")Jp"$N!"m!$!p32rq)'i!#&+3!'!!rlJ`,[rqB!!!!NjH6R919[r
Q,`XQEJ!-,`Sr"cm',@i!#2rm)!XJ3#43@)X3%QF!!US3%QF!!"`3%NL!X(`!*@F
!!"!JEJ!)8Ui!#"#DB!$riK!55)#`I!!PCJ!#HP++3Qlrl$em!3$rk%*ZrqBGI!!
Jrqm3%NL!X(`!,@B!!!SpI!!"rqa5LK!55)#`I!!`CJ!!#Kem!$$rle++,8Vrm%K
Zrr"1Z[m+@)mp32rU*'lrm"!55)#`I!!ZCJ!!'P++,8Vrm%KZrr"1Z[lQ@)mp32r
S*'lrm"!55)#`I!"XCJ!!#Mem!!(rjP++%"*R!!!)%"T)J$i!,@i!#2ri$%F!C'F
!!"S-4`"[C`!!%Ja(!(KR!!!+$%F!G@B!!%``,[rQC`!!$#!,)%!J%'!!!!SJ#b"
!-"")`#m!5'i!#$mZrqBr"dkkq[EHr!!--#lrjQF!!!S`2!!%B!!!"M!m!!*)`0I
!B!!!`Ja(!'0Q!!!D)!Y5J#"!%"!JEJ!)8Ui!#"#!9)YJ!!#L$%F!FfB!!$iJ#b"
!,9$rp&L,2#lrk$!'C`!!*L"Zrr33%'F!!"`JE[rd8Ulrp"!3)'i!#&+Z!!J3J&0
'B!$rf'!!!&i-4`"PC`!!%Ja(!'CR!!!+$%F!CfB!!$SJ#b"!5&")E2dD2c`)$UR
V8Bp)E2dD5'm!"$mm#"#TkdKZ!!Jr,[rS2`G1Z[[Fh[`!%&#,B!!!$M!()'i!#&+
Z!!J3J#!Z!!L3!+lrq,"ZrqTX!!#L-#lrl'F!!#i`,[rU)Li!#*+ZrrL3!%%m!$!
'C`!!&#"Z!!K5VJ!)%+lrle0'B!$rkQ!!!'iJ,[ri-LlrkP0"5-(3J5e!rr3Y32r
`)#i!#*!!V[ri2!!`"QF!!#)J,[ri-JC638M"d)%J3"!3)'lrp&1Zrr33J&0'B!$
rh#!ZrrL`V[rdEJ!!%L"ZrrK5V[ri%+lrlf!!rqBJ,[r`8S!Y3!!)B!$p9#"Z!!K
#%#!Z!!L3!+lrr'!!!!)m(ciI*&mQAdjH6R919[lq,bi!$%KZr`"1Z[d)8)mp32l
q,bi!#%KZr`"1ZJpX8)m`,[lq6Pj1G8j@!!")EJ!)5'cqMNkkrmC3MdjH6R919J!
!5'i!$#mZ!!K1Z[c'8)p1ANje6PErr#m,*Qi!#$!V!!V!I!!"CJ!!#!"V!%!!#M!
V!!V!I!"JC`!!#M!mrrpJ!!$f$+X!N!8'CJ!!AM!V!!V!I!!)C`!!)L!,3HcqI*!
!L)(m!"*"l2jXdF""d#!)*S!R3!!'B!!!,Lmm!!!#!%kk%1TBMbD!*d!!"Jb!!*!
%CJ!!$!"V!!J!#Q!!!!J!D`!3!!TJ!2qD,8[rr#"Zrra"k!!1,`Jr+`!-6VVhMPb
2*UX!"M!V!!V!I!%)C`!!#M!m!!&J!!!'-$`#!$m!,a-r+`!-6VS93P#20d!!"&0
V!!3`+`!%$%!!!'`!!#J-Drrr!!4Q!!!-!'X!)!!+B!!!#!"V!%!!#N*V!!3`22r
rB!!!%L"68T-3%%L!`(`!rf!!!!)QAdjH6R919[rm,`XQEJ!+-#X!#X"m!!*Q!!!
)!'X!3!!+-#X!#X"m!%"R!!!+-$crrf!!!5S-U`#3"3CQ!!"H-#X!#X"m!!KR!!!
L)!Y"l2jmN!#)JI`!%N(XrQc4`%(3)!JQJ#G!!!CJ!!!Z,c`!!!)!6VS2`&L2*S!
R3!!'$)!!N!4Q!!!-!'X!#!!+B!!!#!"V!"!!#Q!!rjS`+`!+`(`!#'F!!"3J8e+
6%+i!#3"V!)!!#Q!!!%B`+`!+`(`"!'F!!$S!D`#!!!SJ8e+6%+i!#4!Z!!P)J,"
m!!TR!!!H)"13!+X!"V"m!J"X!!!3%#i!#8L!`(`!rf!!!'![#dkk$p4BMdT!C`!
!%!"V!%!!#M!mrrpJ!!"%-#X!#X"m!3KR!!!B3QX!""!Z!!P)J-"m!2pJ!!!QB!!
!)MGm!Im!"!"V!)!!#K!Z!!NJ8e+6%)")J-"m!2pJ!!!#*Pp1ANje6PB!!#"Z!!K
6D!!%-#J!"!a!!!"Y!!!B)'i!##!38T!!)%!3%%L!`(`!rf!!!!`[,J!)6VVp4&L
2B!!!!NjH6R919J!!)'i!#P0S!!3`+!!%$%!!!'d!!"`3,J!*)'i!#L)38T!!)%%
3J%L!`(`!rf!!!"3[,J!+%#i!#8L!2`"1Z[iLA)pJ!!!#6Pj1G8j@!!![,J!)2bi
!$+Ne6Pj1G8j@!!#T0djH6R919[rq51I`!#3Z!!JL,J!-3QlrrNU"E!!!#&CZrrj
%J8U#E!!!#&*Zrrj%JRB"Y)&N!!!+ii,MJf!!rr4#J,5"BJ!!"S#$NS,LLZ+,C!$
rm!aZ!!2rrQd!!!4%JH,ZrrjN!!!%4)!Y3!!),8%!$%cI!!p1ANje6PB!!#"Z!!J
[+!!56VS"5&L2)'i!#%SZ!!eR!!!)T!KJ!!!%S!JJEJ!),bJ!%Nkk!C!!@)mJEJ!
)-#J!%'!!!!*1ANje6PErrL"Z!!J[+!!56VS""&L2)'i!#%SZ!!eR!!!)T!"J!!!
%S!!p32rq)'i!##mS!"*1ZJ&)@)mJEJ!)-@lrrJ!3-#lrrQ!!!!*1ANje6PB!!#"
Z!!K+,J!0C`!!#+3#B!!!"+!#6Pj1G8j@!!!JEJ!)5Li!$@F!!!LN!f!!!!5J!dj
H6R919J!!)'i!#%SZ!!eR!!!)T"KJ!!!%S"K1ANje6PB!!#"Z!!K+,J!0C`!!#+4
%B!!!"+"%6Pj1G8j@!!!JEJ!)5Li!$@F!!!LN%@!!!!5J%8jH6R919J!!)'i!#%S
Z!!eR!!!)T"*J!!!%S"*1ANje6PB!!#"Z!!K+,J!0C`!!#+3"B!!!"+!"6Pj1G8j
@rr`J,J!)C`!!9#!Z!!M![!%!N!0Q!!"'3QlrrM!ZrriJEJ!)d-!G82rm-#lrrL"
Z!!M3`"#Zrre5E[rq(@lrr2rp%#lrr%L!X(`!!'B!rmi`,[rq8d!JEJ!)%)!J,J!
)B!!!!NjH6R919[rm)#i!#'F!!'!J,J!)`,`"!*!$CJ!!8L"Z!!J3%-"m!2mp32r
m3QlrrM!Zrrk`E[rmE!!!+$!ZrriJEJ!)d-!3+!!"-LlrrL"Z!!M3`4#!-#lrrP*
ZrrjJ!2r3-#lrr#"Z!!M3`%)3)#i!#'!!!!*1ANje6PErp$!XrQTQ!!#Q5'cq9Nk
k!MCBMdkk%BC1Z[#D6VS4%%kk#3C#Tdkk%IKBMdkk!J41ZJ)+2A`!+2rd2A`!"2r
f2A`"8[ri2A`"r2rk3UG#Cbmmrj!%3QFr2!!",bi!#%KZrr4#Tdkkm&cHr!!D,8$
rr#mZrra1ZJ(F@)p#Cdkkm+*8Mcmm!!41Z[#+9)mr2!!*6VV`R&526VS!'$!XrQ,
3E2jS2`"#Cdkk#S"BMdjH6R919[rm5'lrr%kk!DCBMdKXrQ*1Z[$#@)m[2!#3!`K
)E2jD)'lrr%(S!"![#%kk$(VHr!!-6Pj1G8j@rrC)E[rm6VS+&PL2-#lrr$)XrQM
5E2jLX%&X!!!H-#cqD0"XrQ)r!%*R6VS+!&L25'lrr%kk#HKBMc!Zrr`b,2jHNQc
qD**XrQ53!%&%3$e!rrS-EJ!!rrTX!!!f6VS+&Le!rrB[,[rf2blrqN*R5'cq@Nk
k%4EHr!!-,blrpNkk#J*BMcmZrrT#Cdkk#E*BMdjH6R919J!!,`N`f9()rr`LAdj
H6R919J!!6Pj1G8j@!!"1ANje6PErTLem484*92qX,Aa849K8rkK)E[qS5'lrV%*
R,bi!#%kklp$Hr!!1,@i!#2r#2@cpK2r'3LlrbKem!!,rbd+Zrma#CdKZrl"1Z[`
HA)mpE[r)rkBjE[r!rBCR!!!+-$crrf!!!#C#TcmZrkC1Z[#qA)m`,J!-`(`J!$m
!2blrTNkk"jTBMc!ZrkC1ANje6PB!!+K36Pj1G8j@!!#S8NjH6R919J!!,bi!#+K
Z6Pj1G8j@!!![,J!)U(01ANje6PB!!#mZ!!LSG%jH6R919[rf5'lrr$mZ!!K1ZZr
HA)p)E[ri2bi!#%kkm"aFM`aZ!!%!$QB!!")J,[rmd+i!#Le!!!TJ!!!Z$'i!!J!
1CJ!!%L!ZrrM3VJ!+,8!!#Q!!!"3`,J!1C`!!$#!mrj!%B!!!6#!Z!!U`V[riE`!
!%#mZ!!Sr,J!)6VV[j&b2,bi!#Mmm!!%r,J!)6VV[K&#218$pKQF!!"!J22q3"'!
!!!jJ!!!+)#i!#Q!!!!*1ANje6PB!!$mZ!!K1ZJEQ9)m-EJ#3!`K[!!!N2bi!#%k
kll"8McP!rBCR!!!+-$crrf!!!!B`2!!!B!!!"M!mrrp1ANje6PErq#m,*Qi!$$m
(,`T#E[ri%"0)J,"m!'*Q!!!+2A`J!2ri8SX3%dL!X(`!FQF!!#33%dL!X(`!GfF
!!"J3%dL!X(`!B@F!!!`J2!#3"'!!!@3J,2f)*%!-J!#3"'B!!$4"l2jm*%JJ#N(
XrR`L#0+m!!!"$V#"E!!!'M!U!!V!I!!$CJ!!"Q!!!!V8r!!5B!$reL!+3HcqI#)
)dV`!!!%1X)&Y!!!-)$`!N!4J!!%%3UcpL%*U!!SpI!!"rrS3+`!"5)#`I!!VCJ!
!$Mem!!2rqJ"U!!-!#K!65)#`I!"hCJ!!($mZrrJ[,J!)6VVp5Pb22J!!DJ!#!!T
J!!"`%"0)J,"m!'&Q!!")-$`!!i"ZrrJr!#mZ!!K1ZJAqA)mq!!a!rrpQ!!!52bl
rq#mZ!!K1Z[d'A)mq!$mm!!*#Tcm(6VVpa&#2!'S!"J!+B!!!(M!ZrrU!E[ri2`!
[,J!)6VS&Z&b22J!!DJ!"!!S-4rrrCJ!!%%*U!!SJ2!#3"'!!!$)e4`!-3QS!"#!
m!*!%*)!P3!!',8Vrr#"Zrra"k!!1,`Jr"dkkl8TFMb!+B!!!!L4I2KmQAdjH6R9
19J!!UE41ANje6PErrLm,*Qi!##m+*%Y6EJ!--#i!$!a!!!"[!!"D)'i!$P0S!!3
`+!!%$%!!!'d!!"JJEJ!1)""5N!!J3"!35)$!I!$rB!!!$#mZ!!j1Z[5N@)mp32r
q$%$rrfF!!"S`,[rq&-")J,"m!!TQ!!!'B!!!"Q!!rjT#%JaZrj!$rQB!!"3J#V#
,CJ!!$#!m!*!%B!!!"#!,B!!!!L4I*Pp1ANje6PErr#eY!"$rr#"Zrr`J8$#Z!!K
1ZJa'6Pj1G8j@rri[#d*Zrri-EJ!9rrjX!!!b-#lrrZ@!3Hcp-0$!$&!!!'m!!"B
`,[rqjB""l2d`d-!r%%kkl-a8Me*ZrrjJ!2r)2bi!#%kkrjT8MbCI6Pj1G8j@rq4
)E!&`6VVjXPL26VVkB$!Z!!aR!!(@5'lrkMmm!!K1ZZS3A)m-EJ!$rqTQ!!"U-#l
rq-"m!3"R!!"H5'lrkMmm!!K1ZZR8A)mJ,[rX`,`!N!0r$)!!N!0cCJ!!(NKZrqS
r2!!)6VVTXPb2$'i!!rrUCJ$rkQ!!!#!J,[rX`,`!N!0r$)!!N!-ZCJ!!$$mm!!*
1Z[m@9)mYEJ!)rqBJE[rQ8UlrjKe3rq83,[rP5)#`I!!+C`!!1"!Zrq9)J,"m!!K
R!!!U%#lrj8L!X(`!$@F!!"`3,[rP5)#`I!!*C`!!$P0Z!!``,J!-CJ$rXNkkqEB
J,[rQN!#Z!!K63$m!3QF[,J!)6VVU+&#2,@lrjJ!)-#i!$'F!!-4)E[rm6VS$U&L
2%#lrj8L!X(`!#QB!!#!`,[rmd'cqBY"XrQ63E2jS2`"#Cdkk!ijBMf!!!)B3,[r
P5)#`I!!*CJ!!2$!Zrrj)`)(XrQBp32rk-#lrqNM!JI`!#&*!`I`!#$e!rrSr,[r
m-#lrqX(XrQBr!%kk!dCBMf!!!$i3,[rP5)#`I!!)CJ!!&N*R-#cqCN4!2`"1ZJ-
f@)pJ!!!F%#lrj8L!X(`!$@B!!!ir,[rm3QG1ZJ-'@)p6EJ!-B!!!%"!Zrq9)J$m
!6VVT&P52B!$q*NjH6R919[qZ,`XQEJ!+,`SN5ceZ!!lrVJaZI3%!#'B!!")r,J!
1,`Y1Z[hSA)pJ!!#i2bi!#%kk!Hj8MdT!CJ!!*M!Zrkj6E[qZ5N"R!!!B%"*)J,"
m!!TQ!!!'&,`!$9++B!$rhN+Zrl`pEJ!)rmJY5rr3-#i!$X#m!!$rrbe!rp4#E[r
F3QG)E[q`6VVeZ&b218$pKJa!!!"X!!!+-$crrf!!!%`J,[rB28$rVMmZ!!K1ZJ&
b9)p+3'B!!#`pE[qZ!!i`,J!18fi!$NT!C`!!'"!65)#`I!!0CJ!!"KDm!!T5Lf!
!rpi`,[qZB!!!!L4I*Pp1ANje6PB!!+R-6Pj1G8j@!!")E2k1,bi!#%kk!"C3MdK
XrSir2!!+6VVcR&b26Pj1G8j@!!!JEJ!)%""R!!!H,bi!$#"Z!!K5VJ!)%"")J$m
!6VVcFPb2B!$rh%jH6R919J!!)'i!##m3,bi!$#mZ!"!r,J!8,bi!&LmZ!"S[,J!
H2c`!!URU)'i!(N(S!!S[#%kkpG"BMdjH6R919[rq3QlrrJaZ!"ArrQ`!!%!`,[r
qjB""l2d`d-!`%'B!!#B`,[rqjB""l2d`d-!`VJ!)-#lrrZ@!3Hcp-Y$!-+i!#Q!
!!!T5E[rqB!$rZNjH6R919[rq3QlrrJaZ!"ArrQ`!!#i`,[rqjB""l2d`d-!`%,"
Z!!KQ!!!3-#lrrZ@!3Hcp-0$!3P"5E[rqB!$rc%jH6R919J!!2`Fq,J!)3Hcp-#*
)d[`!9,j3C`!!#PK)XmKQ!2rd-#J!!MiI6Pj1G8j@rl!YEJ!)rm)pE2f%rmC#,[r
+)'i!#"!35)#`I!!ZCJ!!#M!m!!"J!!!+-#i!$-"m$rmG32r,3Ulrc%*R5'lrX%k
kmdCFMcP!rBCR!!!D)'i!#"!35)#`I!!ZC`!!#M!mrrpJ!!!H-#i!$-"m)!!r!$m
ZrmK1Z[l'@)m`,[r)B!!!!NjH6R919J!!,bi!#+LD6Pj1G8j@!!!r,J!)2bi!#UL
66Pj1G8j@!!!r,J!)2bi!#UL86Pj1G8j@!!!r,J!)2bi!#UL46Pj1G8j@!!!r,J!
)2bi!#UL56Pj1G8j@!!"C6kMB)"p1ANje6PB!!#mZ!!LSf8jH6R919J!!)#i!#+%
H18$m%L!)6Pj1G8j@!!!JEJ!)S"mj32`56Pj1G8j@!!![,J!)U5*1ANje6PB!!#m
Z!!LT)djH6R919J!!,`XQEJ!),`Y1ZJ"5@)p+3'F!!!S`22rrB!!!2$!V!!V!I!!
3C`!!$#mV!!C1Z[qJ@)p#D`!+2bX!$%kkpbC8MdT!C`!!#M!mrrpJ!!!+-$`!!'!
!!!)QAdjH6R919[rm,`XQEJ!)2`F`+`!+`(`!!fB!!!S`22rrB!!!RL!6N!#V!!B
q!$!V!!V!I!#!C`!!@$!V!!V!I!!#CJ!!#M!mrrpJ!!"f-#X!#X"m!!4R!!!52c`
!!N+R2bX!$%kkpI*3Mcm(,bX!"MmV!!a1Z[ZQ8)m-32rrCJ!!#M!mrrpJ!!!k!Q[
rI`!+,8[rr!aVI3!!$'`!!"BJE[rm3HJ!$Lm)2bX!$%kkjCCFMbDV!!C#D`!%-$`
!!'!!!!)q(bCI6Pj1G5P!r5C)E2dQ5'cp'Mmm+!kTkdje5'cp'NKXr5Br2#J3UHX
J,2dQ6R8T32dQ5'cp*NKXr4Sr2"!1UHY1G8KXr4T)E2dQ2c`3%+RV)#cp*Nje+8(
p*NKXr5C)E2d12c`S$URV6R9)E2d15'cp*Mmm%"#Tkb)Xr5C1G8j@!!!JEJ!))Qi
!$#!Z!"#J,MP!r"*1ANje6PB!!#"Z!!J[+!!56VVaR&L2)'i!#%SZ!!eR!!!)T!a
J!!!%S!`JEJ!),bJ!%NkkmH4BMb"Z!!J`+!!3B!!!!NjH6R919J!!)'i!##mS!"*
1Z[&B@)mJEJ!)5Li!$@F!!!LN$@!!!!5J$5"Z!!J[+!!56VVaS&L2)'i!#$!S!""
J!!!#6Pj1G8j@!!![,J!)2bi!$$mZ!!ir,J!32bi!%ULR6Pj1G8j@!!![,J!)2bi
!$$mZ!!kSU8jH6R919J!!,`XQEJ!)2`G#4a!EC`!!#&*(B!$rpM!(B!!!!MiI*Pp
1ANje6PErk$!Xr"D`E2`8C`!!($!Xr"45E2`83HcmZ0$!%"")J'!!!ETJ!!'f-$`
!!$P!r"3j32`@5'`"I%kkm@TBMdkkmP")E2k16VVpI&L25'lrk%kkr&jBMdKXrSi
r2!"I6VVZ-&b25'cqMNkkr9TBMcmZrqJr,[rU6VVm4PL25'lrlMmm!#K1ZZ&qA)p
+!'F!!3J-EJ!$rqjR!!!-$'i!"IrZCJ!!p#!Zrr$![!#3!rmp32rX$'i!#2rXCJ!
!+M!Xr"CR!!!H2blrk&0Xr"B`,2`@ii""l2`Bd-!r%%kkqq*BMf!!!,3-EJ!0rqa
Q!!!L-#cm&P*Xr"C"l2bid-!3[!!+5'`"K%kkqG*BMf!!!*J-EJ!ZrqaQ!!!B-#l
rr-"m!3"R!!!-2c`!!NkkpQT8M`aZ!'6rl'B!!#i`,[rm`(`"!'F!!#)`,2`@8Qc
m&N(Xr,M3`"#mrrp)E!')6VVjI&L2B!!!3M!Xr"EMJ%(Xr"M3`$#ZrqS`,[rX-Lc
m&P*Xr"C"l2bid-%3J%KXrSir,[rX6VVXrPb25'cqMNkkr#KBMf!!rT)`,2`83Hc
mZ0$!%"")J,"mrrpQ!!!1-$crrf!!!"aJ!!!B-#cm&&*Xr"4"l2bid-!3%%L!B!!
!!NjH6R919[rm,`XQEJ!+,`SN5c!Z!!l![!!!rrmY32rm$'jp!!!)CJ!!8N+Zrr`
`,J!18fi!$NT!C`!!*%kkrH38J%L!X(crrfB!!!TJ!!!3B!!!#&++8Ulrr'!!rp)
J,[rmCJ!!#M!mrrpJ!!#%)#lrr'!!!(aJ!!!d,`Y)E[rm2bi!#%kki@MHr!!+18$
pKJa!rpPQ!!!'3QcpKM!XrBCR!!!+-$crrf!!!%Br,J!)6VVjEP525N"Q!!!Z)#l
rr$e!!!i`,J!18fi!$NT!C`!!'"!65)#`I!!0CJ!!"KDm!!T5Lf!!rpiJ,[rmB!!
!!L4I*Pp1ANje6PB!!+N`6Pj1G8j@!!![,J!+6VVYh&L2@8mr,J!),bi!#UNa,bi
!#NkklM"BMb!I6Pj1G8j@!!![,J!-6VVYXPL2,bi!##mZ!!bT-bmZ!!a1ZZi)@)p
1ANje6PB!!#mZ!!JJEJ!-,a#T68jH6R919J!!U2j1ANje6PB!!#mZ!!Jr,J!-,bi
!$UP',bi!$NkklFTBMdjH6R919J!!2bi!#+R)6Pj1G8j@!!![#bCZ!!J3%fB!!!B
@[!!",`Y1ZZdb@)mJ#e+!)%!3%%L!X(`!!@B!!!SJ#e+!)%"#%&92,`ZTYLm,6VV
YG&L2-"mQAdjH6R919J!!,bi!#+Pl6Pj1G8j@!!"1ZZpQUI41ANje6PB!!&P2)'i
!##m3U6dJ(djH6R919J!!2bi!#+Ni6Pj1G8j@!!"96b"Z!!J[%#mZ!!bT,$!I6Pj
1G8j@!!![,J!)2bi!$$mZ!!i[,J!3U1p1ANje!*!$QJ!)!!%jI!!!rr!jI!!"rqi
jI!!!rqa$l2jm)[`!N!3br!!!)[`!N!3br!!*-[ap!#,m!*!%)[`!N!3br!!!)[`
!N!3br!%#-[ap!5,m!*!%)[`!N!3br!!!)[`!N!3br!%#-[ap!5,m!*!%d[`!f#P
m!*!%rBJjI!!!rB3TE!&ir3JjI!!!r"BjI!!!r"41G3!!!C*b!'9bBA0P#J!!Fh"
KBf8J*@3J*@3J*@3J*@3+!!"YEhCP)#9N)#9N#J"`EfPZG#!PC#!PC!S!!'aTEQ8
JG'mJ*@3J*@3+!!"XD@jP)'CbEfdJ*@3J*@3JG'mJ*@3J*@3+!'0TFQ0XC5"QFQp
Y)#9N)#9N)(*KC'PeFb!PC!S!!'0MGb"KFQ-JBf9ZG'9b)#9N)#9N)'CbEfdJ*@3
J*@3JG'mJ*@3J*@3+!'aKBQ9X)#9c#J"XD@jP)'e[C'8J*A-+!'KeD$mJ*@-+!!!
rJ!!!2fD3!hJJ*@3+!(NJ*@3+!%&LEh9d,T!$!!"0B@0`E'pd)(Ba,M!!!%*bB@3
J8'&bDf9b!%GPEQ9bB@`J3fpYF(9dCA)J3fpbF#iJ-6![1$B!!&"XEh4QD@aP!!"
849K8!!""BQpeG#"0B@0`E'pd,T!$1bJY!%459P)!!%CTE'8!!("XEh3JCQPXC6X
S,6Y4G@Pd!%eKBh"XEh3!*@3!!&0dC'peG!!!2i!!!&0dC'peG!!!)#!!!#!J!!"
$6d4&!*!p(!"H!!&$6d4&!!)!%N4"9%%!N!-f!*!0!3!"!*!$*!#3"3)!!J!!,US
!N!F$!!![5!#3#-8'!:
SHAR_EOF
if test -f 'macplot.c'
then
	echo shar: over-writing existing file "'macplot.c'"
fi
cat << \SHAR_EOF > 'macplot.c'
/*
 * macplot - plot unix "plot(5)" format files on mac screen
 *
 * Brad Parker
 * General Computer 10/86
 * harvard!brad@gcc-milo
 */

#include <stdio.h>
#include <qd.h>
#include <event.h>
#include <menu.h>
#include <win.h>
#include <pack.h>

typedef int word;

int x0, y0, x1, y1;
float scalex(), scaley();
int debug = 0;
int plot = 1;
int doneflag = 0;

plotfile(name)
char	*name;
	{
	FILE *f;
	char	c;
	int		x, y, xf, yf, xt, yt, xe, ye, r;
	char	label[80];

	if (name == (char *)0)
		return 0;

	setsize();					/* scale size to window */
	f = fopen(name, "r");		/* open plotfile file */
	if (f == (FILE *)0)
		return 0;

	if (Button())				/* for debug */
		{
		SysBeep(3);
		debug = 1;
		plot = 0;
		}

	TextFont(4);				/* use monoco */
	TextSize(9);				/* 9 point */

	while (c = fgetc(f))		/* loop through plotfile commands */
		switch (c)
			{
			case 'e':		/* erase */
				if (debug) printf("erase\n");
				break;
			case 's':		/* space */
				x0 = getword(f); y0 = getword(f);
				x1 = getword(f); y1 = getword(f);

				if (debug) printf("space %d %d %d %d\n", x0, y0, x1, y1);
/*				cross((x0+x1)/2, (y0+y1)/2); */
				break;
			case 'm':		/* move */
				x = scalex( getword(f) );
				y = scaley( getword(f) );
				if (plot) MoveTo(x, y);
				if (debug) printf("move %d %d\n", x, y);
				break;
			case 'p':		/* point */
				x = scalex( getword(f) );
				y = scaley( getword(f) );
				if (plot)
					{
					MoveTo(x,y);
					Line(0, 0);
					}
				if (debug) printf("point %d %d\n", x, y);
				break;
			case 'n':
				xt = scalex( getword(f) );
				yt = scaley( getword(f) );
				if (plot)
					LineTo(xt, yt);
				if (debug) printf("line to %d %d\n", xt, yt);
				break;
			case 'l':
				xf = scalex( getword(f) );
				yf = scaley( getword(f) );
				x = scalex( getword(f) );
				y = scaley( getword(f) );
				if (plot)
					{
					MoveTo(xf, yf);
					LineTo(x, y);
					}
				if (debug) printf("line from %d %d to %d %d\n", xf, yf, x, y);
				break;
			case 'c':
				xf = getword(f); yf = getword(f);
				r = getword(f);
				if (debug) printf("circle from %d %d radius %d\n", xf, yf, r);
				break;
			case 'a':
				xf = getword(f); yf = getword(f);
				xt = getword(f); yt = getword(f);
				xe = getword(f); ye = getword(f);
				if (debug) printf("ccw arc center %d %d from %d %d to %d %d\n",
						xf, yf, xt, yt, xe, ye);
				break;
			case 't':
				fgets(label, sizeof(label), f);
				if (label[strlen(label)-1] < ' ') label[strlen(label)-1] = 0;
				if (plot)
					DrawString(label);
				if (debug) printf("label %s\n", label);
				break;
			case 'f':
				fgets(label, sizeof(label), f);
				if (label[strlen(label)-1] < ' ') label[strlen(label)-1] = 0;
				if (debug) printf("line mode %s\n", label);
				break;
			default:
				if (debug) printf("huh? %c\n", c);
			}

	SysBeep(2);
	fclose(f);
	return 1;
	}

getword(f)
FILE *f;
	{
	int w;

	return (word)((fgetc(f) & 0xff) | (fgetc(f) << 8));
	}

/* max area you want for picture */

float	XSIZE, YSIZE;
float xratio, yratio;

setsize()
	{
	GrafPtr port;

	GetPort(&port);
	XSIZE = port->portRect.right - port->portRect.left;
	YSIZE = port->portRect.bottom - port->portRect.top;

	xratio = 1.0;
	yratio = 0.9;
	}

float scalex(xx)
int xx;
	{
	if (debug) printf("x %d\n", xx);
	return xratio * XSIZE * (xx - x0) / (float)(x1 - x0);
	}

/* note: y is inverted */
float scaley(yy)
int yy;
	{
	if (debug) printf("y %d\n", yy);
	return YSIZE - ( yratio * YSIZE * (yy - y0) / (float)(y1 - y0) );
	}

cross(x, y)
int	x, y;
	{
	x = scalex(x);
	y = scaley(y);
	MoveTo(x-5, y);
	Line(10,0);
	MoveTo(x, y-5);
	Line(0, 10);
	}

/* init mac environment */

i_mac(pport)
GrafPtr *pport;
	{
    InitGraf(pport);
    InitFonts();
    FlushEvents(everyEvent, 0);
    InitWindows();
    setupmenus();
    TEInit();
    InitDialogs(0L);
    InitCursor();
	}

#define	applemenu	1
#define	filemenu	2
MenuHandle	a_menu, f_menu;

doabout()
	{
	WindowPtr	AWindPtr;
    Rect		windowrect;

    SetRect(&windowrect, 50, 50, 200, 100);
    AWindPtr = NewWindow((WindowPtr *)0, &windowrect, "About...", 1, 0,
			 (long)-1, 0, (long)0);
	SetPort(AWindPtr);

	MoveTo(30,20);
	DrawString("Macplot v1.0");

	MoveTo(30,40);
	DrawString("Brad Parker");

	MoveTo(30,60);
	DrawString("General Computer Corp. 10/86");

	while (!Button());
	DisposeWindow(AWindPtr);
	}

/* Using SFGetFile, get name of plot file */
/* return pointer to file name */
SFReply 	reply;

char *getfilename()
	{
	Point 		point;

	point.h = point.v = 100;
	SFGetFile(&point, "Plotfile", (ProcPtr)0, 1, "TEXT", 0L, &reply);

	if (reply.good)
		return reply.fName;

	return (char *)0;
	}

setupmenus()
{
    char appletitle[2];

    InitMenus();
    appletitle[0] = appleMark; appletitle[1] = 0;
    a_menu = NewMenu(applemenu, appletitle);
	AppendMenu(a_menu, "About Macplot...;(-");
    AddResMenu(a_menu, "DRVR");
	InsertMenu(a_menu);

    f_menu = NewMenu(filemenu, "File");
    AppendMenu(f_menu, "plot file;(-;Quit");
	InsertMenu(f_menu);

    DrawMenuBar();
}

docommand(themenu, theitem)
int themenu, theitem;		/* nice hack - arg is passed as a long */
{
    char name[256];
    int refnum;

    switch (themenu)
		{
		case applemenu:
			if (theitem == 1)
				doabout();
			else
				{
	   			GetItem(a_menu, theitem, name);
	    		refnum = OpenDeskAcc(name);
				}
	    	break;
		case filemenu:
			switch (theitem)
				{
				case 1:
					plotfile( getfilename() );
					break;
				case 3: doneflag = 1; break;
				}
			break;
    	}
    HiliteMenu(0);
}

/* init mac environment */
main()
{
	GrafPtr port;
    Rect windowrect;
	WindowPtr mywindow;
	EventRecord myevent;
	WindowPtr whichwindow;

	i_mac(&thePort);				/* init mac Environ. */

	GetPort(&port);
	windowrect = port->portRect;	/* copy graf port's rect */
    InsetRect(&windowrect, 10, 20);	/* shrink a bit */
    doneflag = 0;

    mywindow = NewWindow((WindowPtr *)0, &windowrect, "Macplot", 1, 0,
			 (long)-1, 0, (long)0);
    SetPort(mywindow);

    do {
	SystemTask();
	GetNextEvent(everyEvent, &myevent);
	switch (myevent.what)
		{
	    case mouseDown:
			switch (FindWindow(&myevent.where, &whichwindow))
				{
		    	case inMenuBar:
					docommand(MenuSelect(&myevent.where)); break;
		    	case inSysWindow:
					SystemClick(&myevent, whichwindow); break;
				}
			break;

		case updateEvt:
			whichwindow = (WindowPtr)myevent.message;
			BeginUpdate(whichwindow);
			if (whichwindow == mywindow)
				{
				SetPort(mywindow);		/* update log window */
				}

			EndUpdate(whichwindow);
			break;
		}
    } while (doneflag == 0);
}

SHAR_EOF
if test -f 'macplot.rc'
then
	echo shar: over-writing existing file "'macplot.rc'"
fi
cat << \SHAR_EOF > 'macplot.rc'

macplot.rsrc

Type CODE
	macplot.out,0
SHAR_EOF
if test -f 'README'
then
	echo shar: over-writing existing file "'README'"
fi
cat << \SHAR_EOF > 'README'
The enclosed files are a crude little hack that extract geographical
data from the UUCP map '#L' lines and draw a map, in plot(3) form,
on the standard output.  Only small modifications are required to
map other parts of the world.

This is very quick and dirty (if it was any good, I'd post it to
mod.sources instead of net.sources).  No allowance is made for the
curvature of the earth, so the larger the area you plot, the worse
it gets in terms of accuracy.  The names and locations of cities that
are plotted as reference points are wired in to the code.  And the
method for scanning the '#L' lines is very crude (it does, however,
work for almost all the bizarre formats I've seen in the map).

Oh -- color() is a VENIX-specific routine that sets the color for
the output display.  You can probably just remove the calls to it
if you don't have one.

Feel free to hack this -- I would appreciate receiving copies of
improved versions.  It makes a nifty little demo when you're trying
to explain the net to someone.
--
Larry Campbell                             The Boston Software Works, Inc.
ARPA: campbell%maynard.uucp@harvard.ARPA   120 Fulton Street, Boston MA 02109
UUCP: {alliant,wjh12}!maynard!campbell     (617) 367-6846

SHAR_EOF
if test -f 'Makefile'
then
	echo shar: over-writing existing file "'Makefile'"
fi
cat << \SHAR_EOF > 'Makefile'
#
# Makefile for compiling uplot with generic plot(5) output
#

#CFLAGS = -z -i
#LDFLAGS= -ltrb
LDFLAGS= -lplot
SHARFILES = README uplot.c uplot.sed uplot.sh Makefile

uplot: uplot.c
	cc -o uplot $(CFLAGS) uplot.c $(LDFLAGS)

uplot.shar: $(SHARFILES)
	shar $(SHARFILES) >uplot.shar

macplot: macplot.rsrc
	macput -r macplot.rsrc -n macplot

macplot.rsrc: macplot.out
	mmaker macplot.rc

macplot.out: macplot.o
	mmlink -o macplot.out macplot.o

macplot.o: macplot.c
	mmcc -c -DMAC macplot.c
SHAR_EOF
if test -f 'uplot.c'
then
	echo shar: over-writing existing file "'uplot.c'"
fi
cat << \SHAR_EOF > 'uplot.c'
/*
 * uplot.c
 *
 *	Crude hack for drawing a map of the UUCP net - reads on standard
 *	input a highly massaged version of the '#L' lines from the UUCP map,
 *	processed by uplot.sed and sorted, and writes plot(3) instructions
 *	on standard output.
 *
 *	Released to the public domain August, 1986.
 *	Larry Campbell	(maynard!campbell)
 *	The Boston Software Works, Inc.
 *	120 Fulton Street, Boston, MA 02109
 */

#include <stdio.h>

/* These defines set the bounds of the rectangle being drawn */

#define MINLAT 25
#define MAXLAT 50

#define MINLON (-125)
#define MAXLON (-60)

struct
    {
    int deg;
    int min;
    } lat, lon;

int n, x, y, lastx, lasty, weight, col, maxweight,
    goodpoints, badpoints, outpoints, uniques, debug;

char buf[256];

main(argc, argv)
char *argv[];
{
if (argc > 1) debug++;
openpl();
erase();
/* space(MINLON*60, MINLAT*60, (MAXLON-30)*60, MAXLAT*60); */
space(MINLON*60, MINLAT*60, MAXLON*60, MAXLAT*60);
if (debug) fprintf(stderr, "space (%d, %d, %d, %d)\n",
MINLON*60, MINLAT*60, MAXLON*60, MAXLAT*60);

city("Boston",		42,	-71);
city("Chicago",		42,	-88);
city("Dallas",		33,	-97);
city("DC",		39,	-77);
city("Denver",		40,	-105);
city("Houston",		30,	-95);
city("LA",		34,	-118);
city("Miami",		26,	-80);
city("NYC",		41,	-74);
city("SF",		38,	-122);
city("Seattle",		47,	-123);
city("Toronto",		43,	-79);
city("Vancouver",	49,	-124);

lastx = lasty = 0;

while (gets(buf) != NULL)
    {
    n = sscanf(buf, "%d %d N / %d %d W", &lat.deg, &lat.min, &lon.deg, &lon.min);
    if (n != 4)
	n = sscanf(buf, "%d %d %*d N / %d %d %*d W", &lat.deg, &lat.min, &lon.deg, &lon.min);
    if (n != 4)
	n = sscanf(buf, "%d %d N %d %d W", &lat.deg, &lat.min, &lon.deg, &lon.min);
    if (n != 4)
	n = sscanf(buf, "%d %d %*d N %d %d %*d W", &lat.deg, &lat.min, &lon.deg, &lon.min);
    if (n != 4)
	n = sscanf(buf, "%d %d %*d %*d N / %d %d %*d %*d W", &lat.deg, &lat.min, &lon.deg, &lon.min);
    if (n != 4)
	n = sscanf(buf, "%d %d W / %d %d N", &lon.deg, &lon.min, &lat.deg, &lat.min);
    if (n != 4)
	n = sscanf(buf, "%d %d %*d W / %d %d %*d N", &lon.deg, &lon.min, &lat.deg, &lat.min);
    if (n != 4)
	n = sscanf(buf, "%d %d W %d %d N", &lon.deg, &lon.min, &lat.deg, &lat.min);
    if (n != 4)
	n = sscanf(buf, "%d %d %*d W %d %d %*d N", &lon.deg, &lon.min, &lat.deg, &lat.min);
    if (n != 4)
	n = sscanf(buf, "%d %d %*d %*d W / %d %d %*d %*d N", &lon.deg, &lon.min, &lat.deg, &lat.min);
    if (n != 4)
	{
	n = sscanf(buf, "%d N / %d W", &lat.deg, &lon.deg) + 2;
	lat.min = lon.min = 0;
	}
    if (n != 4)
	{
	n = sscanf(buf, "%d W / %d N", &lon.deg, &lat.deg) + 2;
	lat.min = lon.min = 0;
	}
    if (n != 4)
	{
	badpoints++;
	if (debug)
	    fprintf(stderr, "bad: %s\n", buf);
	}
    else
	{
	goodpoints++;
	lon.deg = -lon.deg;
	lon.min = -lon.min;
	if (lat.deg >= MAXLAT || lat.deg < MINLAT ||
	     lon.deg >= MAXLON || lon.deg < MINLON)
	    {
	    outpoints++;
	    continue;
	    }
	x = lon.deg * 60 + lon.min;
	y = lat.deg * 60 + lat.min;
	if (x == lastx && y == lasty)
	    weight++;
	else
	    {
	    uniques++;
	    if (weight > maxweight) maxweight = weight;
	    switch (weight)
	    	{
	    	case 0: col = 1; break;
	    	case 1: col = 2; break;
	    	default: col = 3; break;
	    	}
	    if (debug)
		fprintf(stderr, "lastx = %d, lasty = %d, weight = %d, color = %d\n",
					lastx, lasty, weight, col);
	    if (lastx && lasty)
	    	{
		color(col);
		point(lastx, lasty);
	    	}
	    weight = 0;
	    lastx = x;
	    lasty = y;
	    }
	}
    }
fprintf(stderr, "Good: %d, bad: %d, out of range: %d, max: %d, uniques: %d\n", goodpoints, badpoints, outpoints, maxweight, uniques);

closepl();
}

city(s, lat, lon)
char *s;
int lat, lon;
{
char buf[80];

if (lat < MINLAT || lat >= MAXLAT) return;
if (lon < MINLON || lon >= MAXLON) return;

color(2);
move(lon*60, lat*60);
if (debug) fprintf(stderr, "city %s at %d, %d\n", s, lon*60, lat*60);
sprintf(buf, ".%s", s);
label(buf);
}

color()
{
}
SHAR_EOF
if test -f 'uplot.sed'
then
	echo shar: over-writing existing file "'uplot.sed'"
fi
cat << \SHAR_EOF > 'uplot.sed'
s/^.*:#L//
s/	/ /g
s/[Ll]at./ /g
s/[Ll]at/ /g
s/[Ll]ong./ /g
s/[Ll]ong/ /g
s/[Ll]on./ /g
s/[Ll]on/ /g
s/[Dd]eg./ /g
s/[Dd]eg/ /g
s/'/ /g
s/"/ /g
s/:/ /g
s/\./ /g
s/  / /g
s/  / /g
s/  / /g
s/  / /g
s/^ //g
s/ $//g
s/[Cc]ity$//
s/(.*)$//
s/West/W/
s/East/E/
s/North/N/
s/South/S/
s/o //g
s| x | / |
s|,|/|
s|N/|N /|
s/  / /g
s/  / /g
/^$/d

SHAR_EOF
if test -f 'uplot.sh'
then
	echo shar: over-writing existing file "'uplot.sh'"
fi
cat << \SHAR_EOF > 'uplot.sh'
: plot uucp map on graphics gizmo
MAPDIR=/usr/spool/uucpmap
grep '^#L' $MAPDIR/u.usa.* | sed -f uplot.sed | sort | uplot
SHAR_EOF
chmod +x 'uplot.sh'
#	End of shell archive
exit 0
-- 

J Bradford Parker
General Computer (HyperDrive Beach, 3rd Cabana)
harvard!gcc-milo!brad

Good Sex is easier than a good slow roll. ("Left Stick! Right Rudder!...")