lean@sbcs.UUCP (Lean L. Loh) (09/18/87)
Since quite a few people asked for this, here is the BASIC program for UUDECODE. Use this to uudecode a uuencoded real UUDECODING program (get one), and use the resulting UUDECODE.ttp subsequently because this BASIC version is very slow. ---------------------------- 10 ' UUDECODE PROGRAM 11 ' /* 12 ' * Uudecode -- decode a uuencoded file back to binary form 13 ' * 14 ' * Slightly modified from a version posted to net.sources once; 15 ' * suitable for compilation on an IBM PC. 16 ' * 17 ' * modified for Lattice C on the ST - 11.05.86 by MSD 18 ' * 19 ' * rewritten for ST BASIC on the Atari ST - September 9, 1986, 20 ' * by Patrick Simon 21 ' * 22 ' */ 23 ' Initializations. 24 DIM I(4) 25 FULLW 2 : CLEARW 2 ' Use full output window, clear it. 26 MASK = 63 : SP = ASC(" ") 30 ' Get input filename and open file. 40 INPUT "Enter name of uuencoded file > ", IFILEN$ 50 OPEN "I", #1, IFILEN$ 60 ' Get output filename, open, and set up pointers. 70 INPUT "Enter name of output file > ", OFILEN$ 80 OPEN "R", #2, OFILEN$, 45 90 FIELD #2, 45 AS CBUF$ 110 ' Input and ignore first line of input file (original filename). 120 LINE INPUT #1, INLINE$ ' Due to a bug in ST BASIC, LINE INPUT # 130 LINE INPUT #1, INLINE$ ' must be called 2x, just to get first 140 ' line. Even then we lose the 1st character. 150 ' Now set up screen for user. 160 CLEARW 2 170 GOTOXY 1,2 : PRINT "Decoding "; IFILEN$; " to "; OFILEN$ 180 GOTOXY 1,4 : PRINT "# lines read in: " 190 GOTOXY 1,5 : PRINT "# bytes output: " 200 ' Initialize some variables for main body of program. 210 NUML = 0 : BYTEOUT = 0 220 LINELOOP: ' Now loop for as long as there are input lines. 230 LINE INPUT #1, INLINE$ ' LINE INPUT should work OK by now! 231 IF INLINE$ = "end" THEN GOTO 500 ' All done 232 NUML = NUML + 1 240 ' For each line, must "decode" each byte. 241 ' First byte contains # bytes to ***output*** from this line. 242 ' Then, after decoding, each set of 4 input bytes contains 6*4 = 24 243 ' bits of information to output, 8 bits per output byte, thus 244 ' 3 output bytes. 250 ' Set up string position pointer for INLINE$ 260 SPTR = 1 270 ' Get first byte = # bytes to output; exit if line has zero to output 280 GOSUB DECODE : NN = C : N = NN : IF NN = 0 THEN GOTO 500 285 ' Process one line of input 290 MPTR = 1 300 WHILE N > 0 ' Decode set of 4 input bytes. 310 FOR J = 1 TO 4 320 GOSUB DECODE : I(J) = C 330 NEXT J 340 C1 = ((I(1) * 4) MOD 256) + INT(I(2) / 16) 350 C2 = ((I(2) * 16) MOD 256) + INT(I(3) / 4) 360 C3 = ((I(3) * 64) MOD 256) + I(4) 370 IF N>0 THEN MID$(CBUF$,MPTR,1)=CHR$(C1) : MPTR = MPTR + 1 380 IF N>1 THEN MID$(CBUF$,MPTR,1)=CHR$(C2) : MPTR = MPTR + 1 390 IF N>2 THEN MID$(CBUF$,MPTR,1)=CHR$(C3) : MPTR = MPTR + 1 400 N = N - 3 410 WEND ' If more in this line, go back again. 415 ' Finished processing line. 420 PUT #2, NUML ' Send decoded stuff to output file. 430 BYTEOUT = BYTEOUT + NN ' Show status to user. 440 GOTOXY 20,4 : PRINT NUML 445 GOTOXY 20,5 : PRINT BYTEOUT 450 GOTO LINELOOP ' Get next line ... 500 ' Hopefully, we have now decoded the input file. 510 CLOSE #1 : CLOSE #2 520 END 1000 DECODE: ' Subroutine to decode a single character 1010 IF LEN(MID$(INLINE$,SPTR)) = 0 THEN INLINE$ = INLINE$ + " " 1020 CH$ = MID$(INLINE$, SPTR, 1) : SPTR = SPTR + 1 1030 C = (ASC(CH$) - SP) AND MASK 1040 RETURN -- CSNET: lean@sbcs.csnet ARPA: lean%suny-sb.csnet@csnet-relay.arpa UUCP: {allegra, hocsd, philabs, ogcvax}!sbcs!lean