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

    {
    From: BOB SWART
    Subj: UUENCODE.PAS
    Here is my version of UUENCODE.PAS (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}
    {
      UUEnCode 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: 4880 bytes
      Data size: 1122 bytes
      .EXE size: 3441 bytes
      ----------------------------------------------------------------
      This program uuencodes files.
    }

    Const
      SP = Byte(' ');

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

    var Triplets: Array[1..15] of TTriplet;
        kwar: TKwartet;
        FileName: String[12];
        i,j: Integer;
        f: File;
        g: Text;

        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 Triplet2Kwartet(Triplet: TTriplet; var Kwartet: TKwartet);
        var i: Integer;
        begin
          Kwartet[0] := (Triplet[0] SHR 2);
          Kwartet[1] := ((Triplet[0] SHL 4) AND $30) +
                        ((Triplet[1] SHR 4) AND $0F);
          Kwartet[2] := ((Triplet[1] SHL 2) AND $3C) +
                        ((Triplet[2] SHR 6) AND $03);
          Kwartet[3] := (Triplet[2] AND $3F);
          for i:=0 to 3 do
          begin
            if Kwartet[i] = 0 then Kwartet[i] := $40;
            Inc(Kwartet[i],SP)
          end
        end {Triplet2Kwartet};

    begin
      writeln('UUEnCode 3.0 (c) 1993 DwarFools & Consultancy' +
                                  ', by drs. Robert E. Swart'#13#10);
      if ParamCount = 0 then
      begin
        writeln('Usage: UUEnCode 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,1);
      if IOResult <> 0 then
      begin
        writeln('Error: could not open file ',ParamStr(1));
        Halt(2)
      end;

      if ParamCount <> 2 then
      begin
        FileName := ParamStr(1);
        i := Pos('.',FileName);
        if i > 0 then Delete(FileName,i,Length(FileName));
        FileName := FileName + '.UUE'
      end
      else FileName := ParamStr(2);

      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;

      writeln(g,'begin 0777 ',ParamStr(1));
      repeat
        FillChar(Triplets,SizeOf(Triplets),#0);
        BlockRead(f,Triplets,SizeOf(Triplets),i);
        write(g,Char(SP+i));
        for j:=1 to (i+2) div 3 do
        begin
          Triplet2Kwartet(Triplets[j],kwar);
          write(g,Char(kwar[0]),Char(kwar[1]),Char(kwar[2]),Char(kwar[3]))
        end;
        writeln(g)
      until (i < SizeOf(Triplets));
      writeln(g,'end');
      close(f);
      close(g);

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

    The basic scheme is to break groups of 3 eight bit characters (24 bits) into 4
    six bit characters and then add 32 (a space) to each six bit character which
    maps it into the readily transmittable character.  Another way of phrasing this
    is to say that the encoded 6 bit characters are mapped into the set:

           !"#$%&'()*+,-./012356789:;<=>?@ABC...XYZ[\]^_

    for transmission over communications lines.

    As some transmission mechanisms compress or remove spaces, spaces are changed
    into back-quote characters (a 96).  (A better scheme might be to use a bias of
    33 so the space is not created, but this is not done.)

    The advantage of this over just hex encoding is that it put in 6 bits of signal
    per byte, instead of just 4.  The target is to get the smallest uncompressed
    size, since the assumption is that you've already compressed as much redundancy
    as possible out of the original.

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