beatyr@pur-ee.UUCP (Robert Beaty) (09/12/86)
<<<<<>>>>>
This is the uuencode program to go with the uudecode program
posted previously. Same things apply - cut at the marks, remove
address at the end of this posting, and feed to OSS Pascal.
Have Fun!
****** cut here ******
Program uuencode;
CONST
{$I gemconst }
header = 'begin';
trailer = 'end';
defaultMode = '644';
defaultExtension = '.uue';
offset = 32;
charsPerLine = 60;
bytesPerHunk = 3;
sixBitMask = $3F;
TYPE
{$I gemtype }
string80 = string[80];
VAR
infile: file of integer;
outfile: text;
infilename, outfilename, mode, mess : string80;
lineLength, numbytes, bytesInLine: integer;
uuline: array [0..59] of char;
hunk: array [0..2] of integer;
chars: array [0..3] of integer;
x : Str255;
i : integer;
one_waiting, eof_infile : Boolean;
waiting_Byte : integer;
{$I gemsubs }
procedure Abort (message: string80);
begin {abort}
x:=Concat( '[3][ ', message,' ][ Exit ]' );
i:=Do_Alert( x, 1 );
close(infile);
close(outfile);
halt
end; {abort}
procedure Init;
procedure GetFiles;
VAR i: integer;
temp: string80;
ch: char;
path, name : Path_Name;
begin {GetFiles}
path:='A:\*.*'; { this is the default path for the input file }
name:=''; { reset the name of the file }
if not(Get_In_File( path, name )) then
abort ('No input file specified.');
infilename := name;
IO_Check( False );
Reset(infile, infilename);
IO_Check( True );
if IO_Result <> 0 then
begin
mess:=Concat( 'Cannot open file ', infilename );
abort( mess );
end;
i := pos('.', infilename);
if i = 0 then
outfilename := infilename
else
outfilename := copy (infilename, 1, pred(i));
outfilename := concat(outfilename, defaultExtension);
mode := defaultMode;
x:=Concat( '[0][ Coding to file ', outfilename, ' ][ Fine ]' );
i:=Do_Alert( x, 1 );
IO_Check( False );
reset(outfile, outfilename);
IO_Check( True );
if IO_Result = 0 then
begin
x:='[2][';
x:=Concat(x,' Overwrite current |');
x:=Concat(x,outfilename,'? ]');
x:=Concat(x,'[ Yes | No ]');
i:=Do_Alert( x, 0 );
if i = 2 then abort ('Overwrite cancelled.');
end;
close(outfile);
IO_Check( False );
rewrite(outfile, outfilename);
IO_Check( True );
if IO_Result <> 0 then
begin
mess:=Concat( 'Cannot open ', outfilename );
abort( mess );
end;
end; {getfiles}
begin {Init}
GetFiles;
bytesInLine := 0;
lineLength := 0;
numbytes := 0;
writeln (outfile, header, ' ', mode, ' ', infilename);
end; {init}
procedure FlushLine;
VAR i: integer;
procedure writeout(ch: char);
begin {writeout}
if ch = ' ' then write(outfile, '`')
else write(outfile, ch)
end; {writeout}
begin {FlushLine}
writeout(chr(bytesInLine + offset));
for i := 0 to pred(lineLength) do
writeout(uuline[i]);
writeln (outfile);
lineLength := 0;
bytesInLine := 0
end; {FlushLine}
procedure FlushHunk;
VAR i: integer;
begin {FlushHunk}
if lineLength = charsPerLine then FlushLine;
chars[0] := ShR( hunk[0], 2 );
chars[1] := ( ShL(hunk[0],4) ) + ( ShR(hunk[1],4) );
chars[2] := ( ShL(hunk[1],2) ) + ( ShR(hunk[2],6) );
chars[3] := hunk[2] & sixBitMask;
for i := 0 to 3 do
begin
uuline[lineLength] := chr((chars[i] & sixBitMask) + offset);
lineLength := succ(lineLength)
end;
bytesInLine := bytesInLine + numbytes;
numbytes := 0
end; {FlushHunk}
function get_a_byte : integer;
{ This function returns a byte input from the file 'infile'
a file of two byte integers. }
var
two_bytes : integer;
begin
if one_waiting then
begin
get_a_byte:=waiting_byte;
one_waiting:=False;
end
else
begin
two_bytes:=infile^;
IO_Check( False );
Get(infile); { get two bytes from the file }
IO_Check( True );
if IO_Result=0 then
begin { this is a normal in the file read }
get_a_byte:=ShR( two_bytes, 8 ) & $00FF; { get the first byte }
waiting_byte:=two_bytes & $00FF; { and the lower second byte }
one_waiting:=True;
end
else
begin { this is an EOF mark }
get_a_byte:=ShR( two_bytes, 8 ) & $00FF; { get the first byte }
eof_infile:=True; { stop all this }
end;
end;
end;
procedure encode1;
begin {encode1};
if numbytes = bytesperhunk then flushhunk;
hunk[numbytes]:=get_a_byte;
numbytes := succ(numbytes)
end; {encode1}
procedure terminate;
begin {terminate}
if numbytes > 0 then flushhunk;
if lineLength > 0
then
begin
flushLine;
flushLine;
end
else flushline;
writeln (outfile, trailer);
close (outfile);
close (infile);
end; {terminate}
begin {uuencode}
if Init_GEM >= 0 then
begin
Init;
eof_infile:=false;
while not eof_infile do encode1;
terminate;
Exit_GEM;
end;
end. {uuencode}
****** cut here ******
----------
... ihnp4!pur-ee!beatyr <- usenet
... beatyr@ed.ecn.purdue.edu <- arpa-net
... beatyr@pur-ee.UUCP <- UUCP
----------