Contributor: BOB SWART                

{
From: BOB SWART
Subj: UUDECODE.PAS
Here is my version of UUDECODE.PAS (also fully compatible):
}

{$IFDEF VER70}
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S+,T-,V-,X-}
{$ELSE}
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S+,V-,X-}
{$ENDIF}
{$M 8192,0,0}
{
  UUDeCode 3.0
  Borland Pascal (Objects) 7.0.
  Copr. (c) 9-29-1993 DwarFools & Consultancy drs. Robert E. Swart
                      P.O. box 799
                      5702 NP  Helmond
                      The Netherlands
  Code size: 4832 bytes
  Data size: 1330 bytes
  .EXE size: 3337 bytes
  ----------------------------------------------------------------
  This program uudecodes files.
}

Const
  SP = Byte(' ');

  Type
  TTriplet = Array[0..2] of Byte;
  TKwartet = Array[0..3] of Byte;

var f: Text;
    g: File of Byte;
    FileName: String[12];
    Buffer: String;
    Kwartets: record
                lengte: Byte;
                aantal: Byte;
                kwart: Array[1..64] of TKwartet;
              end absolute Buffer;
    Trip: TTriplet;
    i: Integer;

    FUNCTION UpperStr(S : STRING) : STRING;
    VAR sLen : BYTE ABSOLUTE S;
        I    : BYTE;
    BEGIN
    FOR I := 1 TO sLEN DO S := UpCase(S[i]);
    UpperStr := S;
    END;

    procedure Kwartet2Triplet(Kwartet: TKwartet; var Triplet: TTriplet);
    begin
      Triplet[0] :=  ((Kwartet[0] - SP) SHL 2) +
                    (((Kwartet[1] - SP) AND $30) SHR 4);
      Triplet[1] := (((Kwartet[1] - SP) AND $0F) SHL 4) +
                    (((Kwartet[2] - SP) AND $3C) SHR 2);
      Triplet[2] := (((Kwartet[2] - SP) AND $03) SHL 6) +
                     ((Kwartet[3] - SP) AND $3F)
    end {Kwartet2Triplet};


begin
  writeln('UUDeCode 3.1 (c) 1993 DwarFools & Consultancy' +
                              ', by drs. Robert E. Swart'#13#10);
  if ParamCount = 0 then
  begin
    writeln('Usage: UUDeCode infile [outfile]');
    Halt
  end;

  if UpperStr(ParamStr(1)) = UpperStr(ParamStr(2)) then
  begin
    writeln('Error: infile = outfile');
    Halt(1)
  end;

  Assign(f,ParamStr(1));
  FileMode := $40;
  reset(f);
  if IOResult <> 0 then
  begin
    writeln('Error: could not open file ',ParamStr(1));
    Halt(2)
  end;
  repeat
    readln(f,Buffer) { skip }
  until eof(f) or (Copy(Buffer,1,5) = 'begin');
  if Buffer[11] = #32 then FileName := Copy(Buffer,12,12)
  else
    if Buffer[10] = #32 then FileName := Copy(Buffer,11,12)
                        else FileName := ParamStr(2);
  {$IFDEF DEBUG}
  writeln(FileName);
  {$ENDIF}

  if UpperStr(ParamStr(1)) = UpperStr(FileName) then
  begin
    writeln('Error: input file = output file');
    Halt(1)
  end;

  Assign(g,FileName);
  if ParamCount > 1 then
  begin
    FileMode := $02;
    reset(g);
    if IOResult = 0 then
    begin
      writeln('Error: file ',FileName,' already exists.');
      Halt(3)
    end
  end;
  rewrite(g);
  if IOResult <> 0 then
  begin
    writeln('Error: could not create file ',FileName);
    Halt(4)
  end;

  while (not eof(f)) and (Buffer <> 'end') do
  begin
    FillChar(Buffer,SizeOf(Buffer),#32);
    readln(f,Buffer);
    if Buffer <> 'end' then
    begin
      for i:=1 to (Kwartets.aantal-32) div 3 do
      begin
        Kwartet2Triplet(Kwartets.kwart[i],Trip);
        write(g,Trip[0],Trip[1],Trip[2])
      end;
      if ((Kwartets.aantal-32) mod 3) > 0 then
      begin
        Kwartet2Triplet(Kwartets.kwart[i+1],Trip);
        for i:=1 to ((Kwartets.aantal-32) mod 3) do write(g,Trip[i-1])
      end
    end
  end;
  close(f);
  close(g);

  if ParamCount > 1 then
    writeln('UUDeCoded file ',FileName,' created.');
  writeln
end.