xtool/contrib/CoreCipher/Source/CoreEndian.inc

598 lines
12 KiB
PHP

{ ****************************************************************************** }
{ * https://zpascal.net * }
{ * https://github.com/PassByYou888/zAI * }
{ * https://github.com/PassByYou888/ZServer4D * }
{ * https://github.com/PassByYou888/PascalString * }
{ * https://github.com/PassByYou888/zRasterization * }
{ * https://github.com/PassByYou888/CoreCipher * }
{ * https://github.com/PassByYou888/zSound * }
{ * https://github.com/PassByYou888/zChinese * }
{ * https://github.com/PassByYou888/zExpression * }
{ * https://github.com/PassByYou888/zGameWare * }
{ * https://github.com/PassByYou888/zAnalysis * }
{ * https://github.com/PassByYou888/FFMPEG-Header * }
{ * https://github.com/PassByYou888/zTranslate * }
{ * https://github.com/PassByYou888/InfiniteIoT * }
{ * https://github.com/PassByYou888/FastMD5 * }
{ ****************************************************************************** }
{$IFDEF OverflowCheck}{$Q-}{$ENDIF}
{$IFDEF RangeCheck}{$R-}{$ENDIF}
function ROL8(const Value: Byte; Shift: Byte): Byte;
begin
Shift := Shift and $07;
Result := Byte((Value shl Shift) or (Value shr (8 - Shift)));
end;
function ROL16(const Value: Word; Shift: Byte): Word;
begin
Shift := Shift and $0F;
Result := Word((Value shl Shift) or (Value shr (16 - Shift)));
end;
function ROL32(const Value: Cardinal; Shift: Byte): Cardinal;
begin
Shift := Shift and $1F;
Result := Cardinal((Value shl Shift) or (Value shr (32 - Shift)));
end;
function ROL64(const Value: UInt64; Shift: Byte): UInt64;
begin
Shift := Shift and $3F;
Result := UInt64((Value shl Shift) or (Value shr (64 - Shift)));
end;
function ROR8(const Value: Byte; Shift: Byte): Byte;
begin
Shift := Shift and $07;
Result := UInt8((Value shr Shift) or (Value shl (8 - Shift)));
end;
function ROR16(const Value: Word; Shift: Byte): Word;
begin
Shift := Shift and $0F;
Result := Word((Value shr Shift) or (Value shl (16 - Shift)));
end;
function ROR32(const Value: Cardinal; Shift: Byte): Cardinal;
begin
Shift := Shift and $1F;
Result := Cardinal((Value shr Shift) or (Value shl (32 - Shift)));
end;
function ROR64(const Value: UInt64; Shift: Byte): UInt64;
begin
Shift := Shift and $3F;
Result := UInt64((Value shr Shift) or (Value shl (64 - Shift)));
end;
function Endian(const AValue: SmallInt): SmallInt;
begin
{ the extra Word type cast is necessary because the "AValue shr 8" }
{ is turned into "Integer(AValue) shr 8", so if AValue < 0 then }
{ the sign bits from the upper 16 bits are shifted in rather than }
{ zeroes. }
Result := SmallInt((Word(AValue) shr 8) or (Word(AValue) shl 8));
end;
function Endian(const AValue: Word): Word;
begin
Result := Word((AValue shr 8) or (AValue shl 8));
end;
function Endian(const AValue: Integer): Integer;
begin
Result := ((Cardinal(AValue) shl 8) and $FF00FF00) or ((Cardinal(AValue) shr 8) and $00FF00FF);
Result := (Cardinal(Result) shl 16) or (Cardinal(Result) shr 16);
end;
function Endian(const AValue: Cardinal): Cardinal;
begin
Result := ((AValue shl 8) and $FF00FF00) or ((AValue shr 8) and $00FF00FF);
Result := (Result shl 16) or (Result shr 16);
end;
function Endian(const AValue: Int64): Int64;
begin
Result := ((UInt64(AValue) shl 8) and $FF00FF00FF00FF00) or ((UInt64(AValue) shr 8) and $00FF00FF00FF00FF);
Result := ((UInt64(Result) shl 16) and $FFFF0000FFFF0000) or ((UInt64(Result) shr 16) and $0000FFFF0000FFFF);
Result := (UInt64(Result) shl 32) or ((UInt64(Result) shr 32));
end;
function Endian(const AValue: UInt64): UInt64;
begin
Result := ((AValue shl 8) and $FF00FF00FF00FF00) or ((AValue shr 8) and $00FF00FF00FF00FF);
Result := ((Result shl 16) and $FFFF0000FFFF0000) or ((Result shr 16) and $0000FFFF0000FFFF);
Result := (Result shl 32) or ((Result shr 32));
end;
function BE2N(const AValue: SmallInt): SmallInt;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function BE2N(const AValue: Word): Word;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function BE2N(const AValue: Integer): Integer;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function BE2N(const AValue: Cardinal): Cardinal;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function BE2N(const AValue: Int64): Int64;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function BE2N(const AValue: UInt64): UInt64;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function LE2N(const AValue: SmallInt): SmallInt;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function LE2N(const AValue: Word): Word;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function LE2N(const AValue: Integer): Integer;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function LE2N(const AValue: Cardinal): Cardinal;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function LE2N(const AValue: Int64): Int64;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function LE2N(const AValue: UInt64): UInt64;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2BE(const AValue: SmallInt): SmallInt;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2BE(const AValue: Word): Word;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2BE(const AValue: Integer): Integer;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2BE(const AValue: Cardinal): Cardinal;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2BE(const AValue: Int64): Int64;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2BE(const AValue: UInt64): UInt64;
begin
{$IFDEF BIG_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2LE(const AValue: SmallInt): SmallInt;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2LE(const AValue: Word): Word;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2LE(const AValue: Integer): Integer;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2LE(const AValue: Cardinal): Cardinal;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2LE(const AValue: Int64): Int64;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
function N2LE(const AValue: UInt64): UInt64;
begin
{$IFDEF LITTLE_ENDIAN}
Result := AValue;
{$ELSE}
Result := Endian(AValue);
{$ENDIF}
end;
procedure Swap(var v1, v2: Byte);
var
v: Byte;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Word);
var
v: Word;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Integer);
var
v: Integer;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Cardinal);
var
v: Cardinal;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Int64);
var
v: Int64;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: UInt64);
var
v: UInt64;
begin
v := v1;
v1 := v2;
v2 := v;
end;
{$IFDEF OVERLOAD_NATIVEINT}
procedure Swap(var v1, v2: NativeInt);
var
v: NativeInt;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: NativeUInt);
var
v: NativeUInt;
begin
v := v1;
v1 := v2;
v2 := v;
end;
{$ENDIF OVERLOAD_NATIVEINT}
procedure Swap(var v1, v2: string);
var
v: string;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Single);
var
v: Single;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Double);
var
v: Double;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure Swap(var v1, v2: Pointer);
var
v: Pointer;
begin
v := v1;
v1 := v2;
v2 := v;
end;
procedure SwapVariant(var v1, v2: Variant);
var
v: Variant;
begin
v := v1;
v1 := v2;
v2 := v;
end;
function Swap(const v: Word): Word;
begin
Result := Endian(v);
end;
function Swap(const v: Cardinal): Cardinal;
begin
Result := Endian(v);
end;
function Swap(const v: UInt64): UInt64;
begin
Result := Endian(v);
end;
function SAR16(const AValue: SmallInt; const Shift: Byte): SmallInt;
begin
Result := SmallInt(
Word(Word(Word(AValue) shr (Shift and 15)) or
(Word(SmallInt(Word(0 - Word(Word(AValue) shr 15)) and Word(SmallInt(0 - (Ord((Shift and 15) <> 0) { and 1 } ))))) shl (16 - (Shift and 15)))));
end;
function SAR32(const AValue: Integer; Shift: Byte): Integer;
begin
Result := Integer(
Cardinal(Cardinal(Cardinal(AValue) shr (Shift and 31)) or
(Cardinal(Integer(Cardinal(0 - Cardinal(Cardinal(AValue) shr 31)) and Cardinal(Integer(0 - (Ord((Shift and 31) <> 0) { and 1 } ))))) shl (32 - (Shift and 31)))));
end;
function SAR64(const AValue: Int64; Shift: Byte): Int64;
begin
Result := Int64(
UInt64(UInt64(UInt64(AValue) shr (Shift and 63)) or
(UInt64(Int64(UInt64(0 - UInt64(UInt64(AValue) shr 63)) and UInt64(Int64(0 - (Ord((Shift and 63) <> 0) { and 1 } ))))) shl (64 - (Shift and 63)))));
end;
function MemoryAlign(addr: Pointer; alignment_: NativeUInt): Pointer;
var
tmp: NativeUInt;
begin
tmp := NativeUInt(addr) + (alignment_ - 1);
Result := Pointer(tmp - (tmp mod alignment_));
end;
{$IFDEF OverflowCheck}{$Q+}{$ENDIF}
{$IFDEF RangeCheck}{$R+}{$ENDIF}
function if_(const bool_: Boolean; const True_, False_: Boolean): Boolean;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: ShortInt): ShortInt;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: SmallInt): SmallInt;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Integer): Integer;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Int64): Int64;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Byte): Byte;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Word): Word;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Cardinal): Cardinal;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: UInt64): UInt64;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Single): Single;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: Double): Double;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function if_(const bool_: Boolean; const True_, False_: string): string;
begin
if bool_ then
Result := True_
else
Result := False_;
end;
function ifv_(const bool_: Boolean; const True_, False_: Variant): Variant;
begin
if bool_ then
Result := True_
else
Result := False_;
end;