[comp.sys.atari.st] GFA UUENCODE/UUDECODE

Z4648252@SFAUSTIN.BITNET (Z4648252) (04/29/89)

The following file was received from John M. Logajan and was given
to me so that I and other St'ers out there could decode/encode their
files easily.  It is a little slow as he indicated to me, but it was
tested by me on Desktop.INF and does indeed work.

Larry Rymal <Z4648252@SFAUSTIN.BITNET>

---------------------------------------------------------------------
I think you asked for a way to decode ascii encoded binaries.
Here is a version I wrote in GFA Basic.  It is slow, but it seems to
work.  I also included a copy of a program that encodes, in case you
want to do the opposite operation.
- John M. Logajan @ Network Systems; 7600 Boone Ave; Brooklyn Park, MN 55428  -
- logajan@ns.network.com / ...rutgers!umn-cs!ns!logajan / john@logajan.mn.org -
* uudecode in gfa basic
Line Input "Name of file to decode";F$
Line Input "Name of file to receive decoded data";D$
Open "I",#1,F$
Open "O",#2,D$
Fl%=Lof(#1)
Dim A%(Fl%/4+1),B%(100/4)
Ap%=Varptr(A%(0))
Flt%=Fl%+Ap%
Bp%=Varptr(B%(0))
Bget #1,Ap%,Fl%
App%=Ap%
N$=""
Repeat
  While Peek(App%)<>Asc("b")
    Inc App%
  Wend
  N$=""
  For N%=0 To 4
    N$=N$+Chr$(Peek(App%+N%))
  Next N%
  Inc App%
Until N$="begin"
Do
  While Peek(App%)<>&HD And Peek(App%)<>&HA
    Inc App%
    Exit If App%>Flt%
  Wend
  While Peek(App%)=&HD Or Peek(App%)=&HA
    Inc App%
  Wend
  Exit If Peek(App%)=Asc("e")
  Exit If App%>Flt%
  Bl%=Peek(App%)-32
  Exit If Bl%<=0
  Inc App%
  For J%=0 To Bl%-1 Step 3
    Poke Bp%+J%,(Peek(App%)-32)*4 Or (Peek(App%+1)-32)/16
    Poke Bp%+J%+1,(Peek(App%+1)-32)*16 Or (Peek(App%+2)-32)/4
    Poke Bp%+J%+2,(Peek(App%+2)-32)*64 Or (Peek(App%+3)-32)
    App%=App%+4
  Next J%
  Bput #2,Bp%,Bl%
Loop
End
* uuencode in gfa basic
Line Input "Name of file to encode";A$
Line Input "Name to put in header";C$
Line Input "Name of file to receive encoded file";B$
Open "I",#1,A$
Open "O",#2,B$
Fl%=Lof(#1)
Dim B%(Fl%/4+1),A%(70/4)
Bp%=Varptr(B%(0))
Ap%=Varptr(A%(0))
Bget #1,Bp%,Fl%
Print #2,"begin 644 ";C$
Bc%=0
While Bc%<Fl%
  Rm%=Fl%-Bc%
  If Rm%>=45
    Poke Ap%,45+32
    Al%=60
  Else
    Poke Ap%,Rm%+32
    Al%=Int((Rm%+2)*4/3)
  Endif
  For J%=1 To Al% Step 4
    Poke Ap%+J%,Peek(Bp%+Bc%)/4+32
    Poke Ap%+J%+1,(((Peek(Bp%+Bc%)*16) Or (Peek(Bp%+Bc%+1)/16)) And &H3F)+32
    Poke Ap%+J%+2,(((Peek(Bp%+Bc%+1)*4) Or (Peek(Bp%+Bc%+2)/64)) And &H3F)+32
    Poke Ap%+J%+3,(Peek(Bp%+Bc%+2) And &H3F)+32
    Bc%=Bc%+3
  Next J%
  Poke Ap%+Al%+1,&HD
  Poke Ap%+Al%+2,&HA
  Bput #2,Ap%,Al%+3
Wend
Print #2
Print #2,"end"
End