atari-sources-request@daisy.UUCP (11/09/87)
Submitted by: imagen!ucbvax!decvax!sbcs!lean (Lean L. Loh) comp.sources.atari.st: Volume 0, Issue 35 Archive-name: uucode.bas =++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++= [Editor's Note] My basic disk is trashed (shows you how much i use it) so i will have to believe the submitter that this works. This is a 'bootsrap' version of uudecode that you can you use to decode the next posting of the real uuen/decode binaries, arc will follow soon after =++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++=++= Hello, Here's the BASIC version of UUDECODE that I pulled off the net ages ago, which served as my 'bootstrap'. ============================================================ 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 ==========================================