[net.micro.cbm] uuencode/uudecode

cagordon@watnot.UUCP (Chris Gordon ) (10/23/86)

For all of you out there who could use uuencode or uudecode on your Commodore
128, here is a BASIC (no comments please!) program to do it.  Regrettably, this
program only works on the 128. It should be fairly simple to convert it to work
on the 64. If you want it for the 64 and don't feel up to changing it, I'd be
happy to.

Otherwise ... enjoy!

---cut here and at the end (.signature)-------- 
   10 dim hu(2),ch(3)
   15 print
   20 print"[DOWN][DOWN][DOWN][RIGHT][RIGHT]uu[RVS_ON]e[RVS_OFF]ncode
   30 print"[RIGHT][RIGHT]uu[RVS_ON]d[RVS_OFF]ecode
   40 print"[RIGHT][RIGHT][RVS_ON]q[RVS_OFF]uit
   50 print"[DOWN][DOWN][RIGHT][RIGHT]which?
   60 getkeya$:ifinstr("edqp",a$)=0then60
   70 ifa$="q"thenclr:end
   80 ifa$="e"then1000
   85 ifa$="p"then10000
   90 goto2000
 1000 print:print:print
 1005 input"input file";fi$
 1006 fo$=fi$+".uue":iflen(fo$)>16thenfo$=right$(fo$,16)
 1010 print"output file (default '"fo$"')";:inputfo$
 1015 fh$="":fori=1tolen(fi$):ifmid$(fi$,i,1)<>" "thenfh$=fh$+mid$(fi$,i,1)
 1016 next
 1020 print"filename in header (default '"fh$"')";:inputfh$:ifinstr(fh$," ")<>0thenprint"filename must not contain spaces":goto1015
 1022 mo$="644":print"mode in header (default '"mo$"')";:inputmo$
 1025 open15,8,15
 1030 open1,8,8,fi$+",p,r":s1=st
 1035 ifds=0then1050
 1040 close1:open1,8,8,fi$+",s,r":s1=st
 1045 ifds=0then1050
 1046 m$="can't open '"+fi$+"': "+ds$:goto3900
 1050 open2,8,3,fo$+",s,w"
 1055 ifds=0then1080
 1060 ifds<>63thenm$="can't open '"+fo$+"': "+ds$:goto3900
 1065 print"overwrite existing '"fo$"'? [y/n] ";
 1070 getkeya$:ifa$<>"y"anda$<>"n"then1070
 1075 ifa$="y"thenprint"yes":print#15,"s:"fo$:close2:goto1050
 1076 print"no":m$="overwrite cancelled":goto3900
 1080 fast:print#2,"begin "mo$" "fh$
 1085 if64ands1then1400
 1088 gosub1800:li=0:iflen(li$)=0then1400
 1090 lo$=chr$(len(li$)+32)
 1095 do while (len(li$)<>3*int(len(li$)/3)):li$=li$+chr$(0):loop
 1100 forj=1tolen(li$)/3
 1105 fori=0to2:li=li+1:hu(i)=asc(mid$(li$,li,1)):nexti
 1110 ch(0)=hu(0)/4
 1115 ch(1)=(hu(0)*16+hu(1)/16)and63
 1120 ch(2)=(hu(1)*4+hu(2)/64)and63
 1125 ch(3)=hu(2)and63
 1130 fori=0to3:lo$=lo$+chr$(ch(i)+32):nexti
 1135 nextj
 1136 print".";
 1140 print#2,lo$
 1145 goto1085
 1400 print#2," "
 1405 print#2,"end"
 1410 close1:close2:close15:slow:run10
 1800 li$="":lo$=""
 1805 forii=1to45
 1810 get#1,z$:s1=st:ifz$=""thenz$=chr$(0)
 1820 li$=li$+z$:if64ands1thenii=45
 1825 nextii:return
 2000 print:print:print:ln=0
 2005 open15,8,15
 2010 input"filename";ff$
 2015 open1,8,3,ff$+",s,r":s1=st
 2020 ifds=0then2030
 2028 m$="cannot open '"+ff$+"': "+ds$:goto3900
 2030 if64ands1thendclose:m$="nothing to decode":goto3900
 2040 gosub3000:ifleft$(ln$,6)="begin "then2060
 2045 goto2030
 2060 ii=7:ln$=ln$+" ":fo$=""
 2061 gosub2065:gosub2065:fo$=wo$:goto2100
 2065 wo$="":do while mid$(ln$,ii,1)=" "
 2070 ii=ii+1:ifii>len(ln$)thenm$="incomplete header":goto3900
 2075 loop
 2080 do while mid$(ln$,ii,1)<>" ":wo$=wo$+mid$(ln$,ii,1)
 2085 ii=ii+1:ifii>len(ln$)thenm$="incomplete header":goto3900
 2090 loop
 2095 return
 2100 print"destination: '"fo$"'"
 2105 print"program or sequential? [p/s] ";
 2110 getkeyft$:ifft$<>"p"andft$<>"s"then2110
 2115 ifft$="p"thenprint"program":elseprint"sequential
 2120 open2,8,2,fo$+","+ft$+",w":s2=st
 2125 ifds=0then2150
 2130 ifds<>63thenm$="unable to open '"+fo$+"': "+ds$:goto3900
 2135 print"overwrite existing '"fo$"'? [y/n] ";
 2140 getkeya$:ifa$<>"y"anda$<>"n"then2140
 2145 ifa$="y"thenprint"yes":print#15,"s:"fo$:close2:goto2120
 2146 print"no":m$="overwrite cancelled":goto3900
 2150 fast:gosub3000:li=0:bn=3
 2155 gosub3100:co=asc(ch$)-32:ifco=0then2230
 2160 forj=1toco
 2165 ifbn<3then2200
 2170 fori=0to3:gosub3100:ch(i)=asc(ch$)-32:next
 2175 hu(0)=(ch(0)*4+ch(1)/16)and255
 2180 hu(1)=(ch(1)*16+ch(2)/4)and255
 2185 hu(2)=(ch(2)*64+ch(3))and255
 2190 bn=0
 2200 print#2,chr$(hu(bn));
 2205 bn=bn+1
 2210 nextj
 2220 goto2150
 2230 gosub3000
 2240 ifln$<>"end"thenm$="abnormal end":goto3900
 2250 close1:close2:close15:slow:run10
 3000 ln$="":print".";:ln=ln+1
 3005 get#1,z$:s1=st:ifz$=""thenz$=chr$(0)
 3010 ifz$=chr$(13)then3035
 3020 ln$=ln$+z$:if64ands1then3035
 3030 goto3005
 3035 iflen(ln$)=0thenprint"blank line in file":dclose:run10
 3040 return
 3100 li=li+1:ifli>len(ln$)thenm$="line too short":goto3900
 3105 ch$=mid$(ln$,li,1)
 3110 ifch$<" "orasc(ch$)>96thenm$="illegal character in line: "+ch$:goto3900
 3120 ifch$=chr$(96)thench$=" "
 3130 return
 3900 slow:ifln>0thenprintusing"line ####: ";ln;
 3910 printm$:dclose:run10
10000 open15,8,15
10005 input"filename";f$
10010 open8,8,8,f$:ss=st
10015 ifds<>0thenprintds$:dclose:end
10020 if64andssthendclose:end
10025 get#8,a$:ss=st:poke244,1:poke245,1:printchr$(asc(a$));:goto10020
---- cut here ------------
-- 
-------------------------------------------------------------------------------
Chris Gordon                     UUCP: {abunchasystems}!watmath!watnot!cagordon
U of Waterloo, Ont         CompuServe: Don't know yet
-------------------------------------------------------------------------------
"...Life...in the fast lane... (AND bits of egg!)"