[Back to MISC SWAG index] [Back to Main SWAG index] [Original]

    {
       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.

[Back to MISC SWAG index] [Back to Main SWAG index] [Original]