{ Pascal program to UUDECODE files which were processed with UUENCODE. Or it will DECODE files which were processed by ENCODE Paul Robinson TDARCOS@MCIMAIL.COM Tansin A. Darcos & Company June 26, 1993 } var inf,outf:text; open:boolean; ch:char; buflen,tag:char; tagfiller:array[1..80] of char; buf:string[80] absolute buflen; tag3:array[1..3] of char absolute tag; tag6:array[1..6] of char absolute tag; outfn:string[80]; bp,n:integer; function dec(c:char):byte; begin dec := (ord(c) - ord(' ')) and 63 end; procedure short(msg:string); begin writeln(msg); close(inf); if open then close(outf); halt(1); end; procedure skip; begin while buf[bp] = ' ' do begin bp := bp+1; if bp>=length(buf) then short('Error 01 Bad begin line'); end; while buf[bp] <> ' ' do begin bp := bp+1; if bp>=length(buf) then short('Error 02 Bad begin line'); end; while buf[bp] = ' ' do begin bp := bp+1; if bp>=length(buf) then short('Error 03 Bad begin line'); end; while (buf[bp] <> ' ') do begin outfn := outfn+buf[bp]; bp := bp+1; end; end; { output a group of 3 bytes (4 input characters). the input chars are pointed to by bp. n is used to tell us not to output all of them at the end of the file. } procedure outdec(bp,n:integer); var c1,c2,c3:byte; begin c1 := (DEC(buf[bp]) shl 2) or (dec(buf[bp+1]) shr 4); c2 := (dec(buf[bp+1]) shl 4) or (dec(buf[bp+2]) shr 2); c3 := (dec(buf[bp+2]) shl 6) or dec(buf[bp+3]); if n >= 1 then write(outf,chr(c1)); if n >= 2 then write(outf,chr(c2)); if n >= 3 then write(outf,chr(c3)); end; procedure decode; begin if eof(inf) then short('Premature EOF'); repeat readln(inf,buf); if length(buf)>0 then begin n := dec(buf[1]); if n > 0 then begin bp := 2; while n>0 do begin outdec(bp, n); bp := bp+4; n := n-3; end; end; end; until length(buf)<2; end; begin if (paramcount <1) or ((paramcount >=1) and (paramstr(1)='/?')) then begin writeln('Pascal UUDECODER by Paul Robinson - TDARCOS@MCIMAIL.COM'); writeln('Usage: DECODE filename'); halt(0); end; assign(inf,paramstr(1)); open := false; {$I-} reset(inf); {$I+} if IORESULT <> 0 then short('File '+paramstr(1)+' cannot be opened.'); if not eof(inf) then readln(inf,buf) else short('Empty file'); while tag6 <> 'begin ' do if not eof(inf) then readln(inf,buf) else short('No begin line'); bp := 6; buf := buf+' '; { format is 'begin nnn filename' skip spaces before the nnn skip the nnn skip spaces after the nnn } skip; assign(outf,outfn); {$I-} rewrite(outf); {$I+} if IORESULT = 0 then open := true else short('Cannot create file '+outfn); decode; readln(inf,buf); if tag3 <> 'end' then short('Warning: no end line'); close(inf); if open then close(outf); end.