/* ------------------------------------------------------------------ */ /* UUDECODE.CMD - uudecode a file */ /* */ /* usage: uudecode encodedFile {>decodedFile} */ /* */ /* where: encodedFile - file to UUDecode */ /* decodedFile - UUDecoded file */ /* */ /* authors: */ /* Based on original by Stefan Haubenthal 1992/94 */ /* Hacked for OS/2 by Graham Bingham (grahamb@iacces.za), Dec 1994 */ /* Hacked for more speed and accuracy near EOF by Xtian, Dec 1994 */ /* */ /* do not allow uninitialized variables */ signal on NOVALUE /* get the parameter */ parse arg input if input = "" then do /* show usage */ call LineOut, "Usage: UUDECODE encodedFile {>decodedFile}" exit 1 end /* if input = "" then */ do forever /* search the start of the UUEncoded data */ do until datatype( mode ) = "NUM" line = linein( input ) if stream( input, "S" ) <> "READY" then exit parse value line with "begin" mode dest . end /* do until ... */ say "uudecoding "dest"..." if stream( dest, "C", "QUERY EXISTS" ) <> "" then "@ERASE" dest "2>NUL 1>NUL" call time( "e" ) do lines=1 line=linein( input ) if line = "end" then leave len=c2d( decode( 1,left( line,1 ) ) ) if len > 0 then call charout dest,decode( len,substr( line,2,trunc((len+2)/3)*4 ) ) end /* do lines=1 */ say trunc( lines/time( "e" ) * 60)" lines per minute" call stream dest, "C", "CLOSE" end /* do forever */ exit 0 /* ------------------------------------------------------------------ */ /* Function: UUDecode a line */ /* */ /* Usage: Decode p1, p2 */ /* */ /* where: p1 = ? */ /* p2 = ? */ /* */ /* returns: the UUdecoded line */ /* */ /* Notes: */ /* xx765432 xx107654 xx321076 xx543210 -> 76543210 76543210 76543210 */ /* */ DECODE: PROCEDURE /* sub & del */ bin=c2b( translate( arg(2),xrange("00"x,"5f"x),xrange("20"x,"7f"x) ) ) do n=1 to length( bin ) by 6 bin=delstr( bin,n,2 ) end /* do n=1 ... */ if length( bin ) < 8 then return b2c( right( bin,8,"0" ) ) return b2c( left( bin,arg(1)*8,"0" ) ) /* ------------------------------------------------------------------ */ /* subroutines from DECODE */ c2b: PROCEDURE return x2b( c2x( arg(1) ) ) b2c: PROCEDURE return x2c( b2x( arg(1) ) ) /* ------------------------------------------------------------------ */