[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]