{$MODE OBJFPC} { -*- delphi -*- }
{$INCLUDE settings.inc}
{
This file is based on base64.pp in the Free Component Library (FCL)
Copyright (c) 1999-2000 by Michael Van Canneyt and Florian Klaempfl
base64 encoder & decoder (c) 1999 Sebastian Guenther
Simplified for use without the FCL by Ian Hickson, 2012
The source code of the Free Pascal Runtime Libraries and packages,
and thus this derivative work, are distributed under the Library
GNU General Public License (see the file COPYING.LGPL) with the
following modification:
As a special exception, the copyright holders of this library give
you permission to link this library with independent modules to
produce an executable, regardless of the license terms of these
independent modules, and to copy and distribute the resulting
executable under terms of your choice, provided that you also
meet, for each linked independent module, the terms and conditions
of the license of that module. An independent module is a module
which is not derived from or based on this library. If you modify
this library, you may extend this exception to your version of the
library, but you are not obligated to do so. If you do not wish to
do so, delete this exception statement from your version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
unit base64encoder;
interface
function Base64(const S: RawByteString): RawByteString;
implementation
const
EncodingTable: String[64] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
function Base64(const S: RawByteString): RawByteString;
var
Index, Offset: Cardinal;
begin
Result := '';
Index := 1;
while (Index+2 <= Length(S)) do
begin
Offset := Length(Result); {BOGUS Warning: Type size mismatch, possible loss of data / range check error}
SetLength(Result, Length(Result)+4);
Result[Offset+1] := EncodingTable[1+(Ord(S[Index]) shr 2)];
Result[Offset+2] := EncodingTable[1+((Ord(S[Index]) and 3) shl 4 or (Ord(S[Index+1]) shr 4))];
Result[Offset+3] := EncodingTable[1+((Ord(S[Index+1]) and 15) shl 2 or (Ord(S[Index+2]) shr 6))];
Result[Offset+4] := EncodingTable[1+(Ord(S[Index+2]) and 63)];
Inc(Index, 3);
end;
if (Index <= Length(S)) then
begin
Assert(Length(S) - Index <= 2);
Offset := Length(Result); {BOGUS Warning: Type size mismatch, possible loss of data / range check error}
SetLength(Result, Length(Result)+4);
case (Length(S)-Index) of
0: begin
Result[Offset+1] := EncodingTable[1+(Ord(S[Index]) shr 2)];
Result[Offset+2] := EncodingTable[1+((Ord(S[Index]) and 3) shl 4)];
Result[Offset+3] := '=';
Result[Offset+4] := '=';
end;
1: begin
Result[Offset+1] := EncodingTable[1+(Ord(S[Index]) shr 2)];
Result[Offset+2] := EncodingTable[1+((Ord(S[Index]) and 3) shl 4 or (Ord(S[Index+1]) shr 4))];
Result[Offset+3] := EncodingTable[1+((Ord(S[Index+1]) and 15) shl 2)];
Result[Offset+4] := '=';
end;
end;
end;
end;
end.