PSIMON%PPC.MFENET@LLL-MFE.ARPA (09/12/86)
No more tears out there in NETLAND for all those inaccessible uuencoded programs. I have written a version of UUDECODE in ST BASIC. The program is included below. How to use -- Simply run this like any other BASIC program. It will prompt for the input file name (the uuencoded file), and the output file name. I have successfully decoded three programs (four files) on my ATARI 1040ST using this program, including UNITERM and microEMACS, which were posted on this BBS. I haven't had any failures yet. Caveats: 1. I had to work around several ST BASIC bugs, some of which are mentioned in the comments to the program. This means that if ST BASIC is updated, or if the bugs are somehow specific to my system, you may have to edit this program to get it to work. 2. The output file name must be specified by the user at the appropriate point. This is unlike "standard" UUDECODE, where the output file name is read from the "begin..." line of the input filename. This is due to problems with the BASIC statement LINE INPUT #. These problems only seem to occur after opening a file. 3. The first line of the UUENCODED file should be the "begin..." line. This first line is ignored. Encoded binary is assumed to begin on the second line. (Also not standard UUDECODE, and also due to the LINE INPUT # bugs.) 4. If your UUENCODED file does not contain exactly 45 encoded bytes per line, then this program will not operate correctly as is. There is no problem here if every line in your encoded file begins with M. Only special case: last line of encoded binary can begin with any character between ! and M (refer to an ascii table). (While this is not "standard", I have run across no exceptions as yet.) 5. The program assumes it has completed if it reads in a line -- which reads "end"; or -- which begins with a space; or -- which is blank. (Only the first of these is standard, but as before, I haven't found any problems yet.) Despite the caveats, I have not had any trouble UUDECODING anything yet. (But, I regret that I cannot assume legal responsibility for any losses incurred by the user.) As far as I know, UUDECODE is public domain. Presumeably, then, this program is also. (Could I really find anyone who'd pay for ThiS?) GOOD LUCK! and let me know how things turn out. -- Patrick Simon September 11, 1986 PSIMON%PPC.MFENET@LLL-MFE.ARPA **********ACKNOWLEDGEMENTS*************************************************** I have to thank John Sangster (jhs@mitre-bedford.ARPA) for providing me with the functional specs of UUDECODE. **********STANDARD DISCLAIMERS, ETC.***************************************** If this program fails to operate as specified, return for a full refund. As with any test(y) program, please exercise appropriate caution in the use of this decode program. In particular, I suggest that if the disk you are using contains the only copy of anything important, you aren't using appropriate caution. Princeton University bears no responsibility for any part of this bulletin. (Is it legal for me to say the same for me?) ---------------------- cut here --------------------------------------- 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
PSIMON%PPC.MFENET@LLL-MFE.ARPA (09/15/86)
This is a follow up to the UUDECODE program in ST BASIC I posted to this BBS. Additional notes: 1. The UUDECODE program does append spaces to the end of the line if it thinks they were removed in transit. 2. The file length (in bytes) is always a multiple of 45. The extra bytes are filled with garbage and hopefully ignored. (This is not standard UUDECODE.) 3. This being a BASIC program, it is slow. Typical time, about 1 sec per line of coded info (using a ram disk). [about 40 minutes for UNITERM, which was 135,000+ bytes before decoding.] 4. I had trouble UUDECODING the MONST program posted recently here. It turns out there were 2 carriage returns at the end of each line. Editting with either UEMACS or 1ST WORD fixed the problem (enter editor, make no changes except to save the file). The problem was probably caused initially by me using KERMIT incorrectly. I have received several messages from network servers warning me that my original message was not delivered. If anyone needs a copy, let me know. Also, if anyone finds any bugs and or helpful fixes, let me know. Thanks, and good luck! ---Patrick Simon PSIMON%PPC.MFENET@LLL-MFE.ARPA 9-15-86