598 lines
12 KiB
PHP
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;
|