mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-30 16:53:41 +02:00
1612 lines
55 KiB
PHP
1612 lines
55 KiB
PHP
{
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 2000,2001 by the Free Pascal development team
|
|
|
|
Interface and OS-dependent part of variant support
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
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.
|
|
|
|
**********************************************************************}
|
|
|
|
Resourcestring
|
|
|
|
SNoInterfaces = 'No interfaces supported';
|
|
|
|
Procedure NoInterfaces;
|
|
|
|
begin
|
|
Raise Exception.Create(SNoInterfaces);
|
|
end;
|
|
|
|
Procedure VariantTypeMismatch; overload;
|
|
begin
|
|
Raise EVariantError.CreateCode(VAR_TYPEMISMATCH);
|
|
end;
|
|
|
|
Procedure VariantTypeMismatch(const SourceType, DestType: TVarType);
|
|
begin
|
|
{ ignore the types for now ... }
|
|
Raise EVariantError.CreateCode(VAR_TYPEMISMATCH);
|
|
end;
|
|
|
|
|
|
Function ExceptionToVariantError (E : Exception): HResult;
|
|
|
|
begin
|
|
If E is EoutOfMemory then
|
|
Result:=VAR_OUTOFMEMORY
|
|
else
|
|
Result:=VAR_EXCEPTION;
|
|
end;
|
|
|
|
{ ---------------------------------------------------------------------
|
|
OS-independent functions not present in Windows
|
|
---------------------------------------------------------------------}
|
|
|
|
{--- SmallInt ---}
|
|
|
|
Function WStrToSmallInt(p: Pointer) : SmallInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varSmallInt);
|
|
end;
|
|
|
|
Function LStrToSmallInt(p: Pointer) : SmallInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varSmallInt);
|
|
end;
|
|
|
|
function UStrToSmallInt(p: Pointer): SmallInt;
|
|
var
|
|
Error: Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varSmallInt);
|
|
end;
|
|
|
|
Function VariantToSmallInt(const VargSrc : TVarData) : SmallInt;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToSmallInt', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := smallint(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := smallint(Round(vSingle));
|
|
varDouble : Result := smallint(Round(vDouble));
|
|
varDate : Result := smallint(Round(vDate));
|
|
{$endif}
|
|
varCurrency : Result := smallint(Round(vCurrency));
|
|
varBoolean : Result := smallint(SmallInt(vBoolean));
|
|
varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := smallint(vWord);
|
|
varLongWord : Result := smallint(vLongWord);
|
|
varInt64 : Result := smallint(vInt64);
|
|
varQword : Result := smallint(vQWord);
|
|
varOleStr : Result := WStrToSmallInt(vOleStr);
|
|
varString : Result := LStrToSmallInt(vString);
|
|
varUString : Result := UStrToSmallInt(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varSmallInt);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := smallint(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := smallint(Round(PSingle(vPointer)^));
|
|
varDouble : Result := smallint(Round(PDouble(vPointer)^));
|
|
varDate : Result := smallint(Round(PDate(vPointer)^));
|
|
{$endif}
|
|
varCurrency : Result := smallint(Round(PCurrency(vPointer)^));
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := smallint(PWord(vPointer)^);
|
|
varLongWord : Result := smallint(PLongWord(vPointer)^);
|
|
varInt64 : Result := smallint(PInt64(vPointer)^);
|
|
varQword : Result := smallint(PQWord(vPointer)^);
|
|
varOleStr : Result := WStrToSmallInt(PPointer(vPointer)^);
|
|
varString : Result := LStrToSmallInt(PPointer(vPointer)^);
|
|
varUString : Result := UStrToSmallInt(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varSmallInt);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varSmallInt);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varSmallInt);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToSmallInt -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- ShortInt ---}
|
|
|
|
Function WStrToShortInt(p: Pointer) : ShortInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varShortInt);
|
|
end;
|
|
|
|
Function LStrToShortInt(p: Pointer) : ShortInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varShortInt);
|
|
end;
|
|
|
|
Function UStrToShortInt(p: Pointer) : ShortInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varShortInt);
|
|
end;
|
|
|
|
Function VariantToShortInt(const VargSrc : TVarData) : ShortInt;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToShortInt', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := shortint(vSmallInt);
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := shortint(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := shortint(Round(vSingle));
|
|
varDouble : Result := shortint(Round(vDouble));
|
|
varDate : Result := shortint(Round(vDate));
|
|
{$endif}
|
|
varCurrency : Result := shortint(Round(vCurrency));
|
|
varBoolean : Result := shortint(vBoolean);
|
|
varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
|
|
varByte : Result := shortint(vByte);
|
|
varWord : Result := shortint(vWord);
|
|
varLongWord : Result := shortint(vLongWord);
|
|
varInt64 : Result := shortint(vInt64);
|
|
varQword : Result := shortint(vQWord);
|
|
varOleStr : Result := WStrToShortInt(vOleStr);
|
|
varString : Result := LStrToShortInt(vString);
|
|
varUString : Result := UStrToShortInt(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varShortInt);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := shortint(PSmallInt(vPointer)^);
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := shortint(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := shortint(Round(PSingle(vPointer)^));
|
|
varDouble : Result := shortint(Round(PDouble(vPointer)^));
|
|
varDate : Result := shortint(Round(PDate(vPointer)^));
|
|
{$endif}
|
|
varCurrency : Result := shortint(Round(PCurrency(vPointer)^));
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
|
|
varByte : Result := shortint(PByte(vPointer)^);
|
|
varWord : Result := shortint(PWord(vPointer)^);
|
|
varLongWord : Result := shortint(PLongWord(vPointer)^);
|
|
varInt64 : Result := shortint(PInt64(vPointer)^);
|
|
varQword : Result := shortint(PQWord(vPointer)^);
|
|
varOleStr : Result := WStrToShortInt(PPointer(vPointer)^);
|
|
varString : Result := LStrToShortInt(PPointer(vPointer)^);
|
|
varUString : Result := UStrToShortInt(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varShortInt);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varShortInt);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varShortInt);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToShortInt -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- LongInt ---}
|
|
|
|
Function WStrToLongInt(p: Pointer) : LongInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varInteger);
|
|
end;
|
|
|
|
Function LStrToLongInt(p: Pointer) : LongInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varInteger);
|
|
end;
|
|
|
|
Function UStrToLongInt(p: Pointer) : LongInt;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varInteger);
|
|
end;
|
|
|
|
Function VariantToLongInt(const VargSrc : TVarData) : LongInt;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToLongInt', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := vInteger;
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := longint(Round(vSingle));
|
|
varDouble : Result := longint(Round(vDouble));
|
|
varDate : Result := longint(Round(vDate));
|
|
{$endif}
|
|
varCurrency : Result := longint(Round(vCurrency));
|
|
varBoolean : Result := SmallInt(vBoolean);
|
|
varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := longint(vLongWord);
|
|
varInt64 : Result := longint(vInt64);
|
|
varQword : Result := longint(vQWord);
|
|
varOleStr : Result := WStrToLongInt(vOleStr);
|
|
varString : Result := LStrToLongInt(vString);
|
|
varUString : Result := UStrToLongInt(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varInteger);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := PInteger(vPointer)^;
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := longint(Round(PSingle(vPointer)^));
|
|
varDouble : Result := longint(Round(PDouble(vPointer)^));
|
|
varDate : Result := longint(Round(PDate(vPointer)^));
|
|
{$endif}
|
|
varCurrency : Result := longint(Round(PCurrency(vPointer)^));
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := longint(PLongWord(vPointer)^);
|
|
varInt64 : Result := longint(PInt64(vPointer)^);
|
|
varQword : Result := longint(PQWord(vPointer)^);
|
|
varOleStr : Result := WStrToLongInt(PPointer(vPointer)^);
|
|
varString : Result := LStrToLongInt(PPointer(vPointer)^);
|
|
varUString : Result := UStrToLongInt(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varInteger);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varInteger);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varInteger);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToLongInt -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- Cardinal ---}
|
|
|
|
Function WStrToCardinal(p: Pointer) : Cardinal;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varLongWord);
|
|
end;
|
|
|
|
Function LStrToCardinal(p: Pointer) : Cardinal;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varLongWord);
|
|
end;
|
|
|
|
Function UStrToCardinal(p: Pointer) : Cardinal;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varLongWord);
|
|
end;
|
|
|
|
Function VariantToCardinal(const VargSrc : TVarData) : Cardinal;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToCardinal', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := cardinal(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := cardinal(Round(vSingle));
|
|
varDouble : Result := cardinal(Round(vDouble));
|
|
varDate : Result := cardinal(Round(vDate));
|
|
{$endif}
|
|
varCurrency : Result := cardinal(Round(vCurrency));
|
|
varBoolean : Result := cardinal(SmallInt(vBoolean));
|
|
varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := cardinal(vInt64);
|
|
varQword : Result := cardinal(vQWord);
|
|
varOleStr : Result := WStrToCardinal(vOleStr);
|
|
varString : Result := LStrToCardinal(vString);
|
|
varUString : Result := UStrToCardinal(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varLongWord);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := cardinal(PSmallInt(vPointer)^);
|
|
varShortInt : Result := cardinal(PShortInt(vPointer)^);
|
|
varInteger : Result := cardinal(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := cardinal(Round(PSingle(vPointer)^));
|
|
varDouble : Result := cardinal(Round(PDouble(vPointer)^));
|
|
varDate : Result := cardinal(Round(PDate(vPointer)^));
|
|
{$endif}
|
|
varCurrency : Result := cardinal(Round(PCurrency(vPointer)^));
|
|
varBoolean : Result := cardinal(SmallInt(PWordBool(vPointer)^));
|
|
varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := cardinal(PInt64(vPointer)^);
|
|
varQword : Result := cardinal(PQWord(vPointer)^);
|
|
varOleStr : Result := WStrToCardinal(PPointer(vPointer)^);
|
|
varString : Result := LStrToCardinal(PPointer(vPointer)^);
|
|
varUString : Result := UStrToCardinal(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varLongWord);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varLongWord);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varLongWord);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToCardinal -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
procedure PrepareFloatStr(var s: ShortString);
|
|
var
|
|
i, j : Byte;
|
|
begin
|
|
j := 1;
|
|
for i := 1 to Length(s) do
|
|
if s[i] <> ThousandSeparator then begin
|
|
if s[i] = DecimalSeparator then
|
|
s[j] := '.'
|
|
else
|
|
s[j] := s[i];
|
|
Inc(j);
|
|
end;
|
|
SetLength(s, Pred(j));
|
|
end;
|
|
|
|
{--- Single ---}
|
|
|
|
{$ifndef FPUNONE}
|
|
|
|
Function WStrToSingle(p: Pointer) : Single;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
begin
|
|
if Length(WideString(p)) > 255 then
|
|
VariantTypeMismatch(varOleStr, varSingle);
|
|
|
|
s := WideString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
Val(s, Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varSingle);
|
|
end;
|
|
|
|
Function LStrToSingle(p: Pointer) : Single;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
begin
|
|
if Length(AnsiString(p)) > 255 then
|
|
VariantTypeMismatch(varString, varSingle);
|
|
|
|
s := AnsiString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
Val(s, Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varSingle);
|
|
end;
|
|
|
|
Function UStrToSingle(p: Pointer) : Single;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
begin
|
|
if Length(UnicodeString(p)) > 255 then
|
|
VariantTypeMismatch(varUString, varSingle);
|
|
|
|
s := UnicodeString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
Val(s, Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varSingle);
|
|
end;
|
|
|
|
|
|
Function VariantToSingle(const VargSrc : TVarData) : Single;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToSingle', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := vInteger;
|
|
varSingle : Result := vSingle;
|
|
varDouble : Result := vDouble;
|
|
varCurrency : Result := vCurrency;
|
|
varDate : Result := vDate;
|
|
varBoolean : Result := SmallInt(vBoolean);
|
|
varVariant : Result := VariantToSingle(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := vInt64;
|
|
varQword : Result := vQWord;
|
|
varOleStr : Result := WStrToSingle(vOleStr);
|
|
varString : Result := LStrToSingle(vString);
|
|
varUString : Result := UStrToSingle(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varSingle);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := PInteger(vPointer)^;
|
|
varSingle : Result := PSingle(vPointer)^;
|
|
varDouble : Result := PDouble(vPointer)^;
|
|
varCurrency : Result := PCurrency(vPointer)^;
|
|
varDate : Result := PDate(vPointer)^;
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToSingle(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := PInt64(vPointer)^;
|
|
varQword : Result := PQWord(vPointer)^;
|
|
varOleStr : Result := WStrToSingle(PPointer(vPointer)^);
|
|
varString : Result := LStrToSingle(PPointer(vPointer)^);
|
|
varUString : Result := UStrToSingle(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varSingle);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varSingle);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varSingle);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToSingle -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- Double ---}
|
|
|
|
Function WStrToDouble(p: Pointer) : Double;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
begin
|
|
if Length(WideString(p)) > 255 then
|
|
VariantTypeMismatch(varOleStr, varDouble);
|
|
|
|
s := WideString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
Val(s, Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varDouble);
|
|
end;
|
|
|
|
Function LStrToDouble(p: Pointer) : Double;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
begin
|
|
if Length(AnsiString(p)) > 255 then
|
|
VariantTypeMismatch(varString, varDouble);
|
|
|
|
s := AnsiString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
Val(s, Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varDouble);
|
|
end;
|
|
|
|
Function UStrToDouble(p: Pointer) : Double;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
begin
|
|
if Length(UnicodeString(p)) > 255 then
|
|
VariantTypeMismatch(varUString, varDouble);
|
|
|
|
s := UnicodeString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
Val(s, Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varDouble);
|
|
end;
|
|
|
|
Function VariantToDouble(const VargSrc : TVarData) : Double;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToDouble', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := vInteger;
|
|
varSingle : Result := vSingle;
|
|
varDouble : Result := vDouble;
|
|
varCurrency : Result := vCurrency;
|
|
varDate : Result := vDate;
|
|
varBoolean : Result := SmallInt(vBoolean);
|
|
varVariant : Result := VariantToDouble(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := vInt64;
|
|
varQword : Result := vQWord;
|
|
varOleStr : Result := WStrToDouble(vOleStr);
|
|
varString : Result := LStrToDouble(vString);
|
|
varUString : Result := UStrToDouble(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varDouble);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := PInteger(vPointer)^;
|
|
varSingle : Result := PSingle(vPointer)^;
|
|
varDouble : Result := PDouble(vPointer)^;
|
|
varCurrency : Result := PCurrency(vPointer)^;
|
|
varDate : Result := PDate(vPointer)^;
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToDouble(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := PInt64(vPointer)^;
|
|
varQword : Result := PQWord(vPointer)^;
|
|
varOleStr : Result := WStrToDouble(PPointer(vPointer)^);
|
|
varString : Result := LStrToDouble(PPointer(vPointer)^);
|
|
varUString : Result := UStrToDouble(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varDouble);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varDouble);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varDouble);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToDouble -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{$endif FPUNONE}
|
|
|
|
{--- Currency ---}
|
|
|
|
Function WStrToCurrency(p: Pointer) : Currency;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
{$IFNDEF FPC_HAS_STR_CURRENCY}
|
|
Temp : Extended;
|
|
{$ENDIF FPC_HAS_STR_CURRENCY}
|
|
begin
|
|
if Length(WideString(p)) > 255 then
|
|
VariantTypeMismatch(varOleStr, varCurrency);
|
|
|
|
s := WideString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
{$IFDEF FPC_HAS_STR_CURRENCY}
|
|
Val(s, Result, Error);
|
|
{$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
|
|
Val(s, Temp, Error);
|
|
Result := Temp;
|
|
{$ENDIF FPC_HAS_STR_CURRENCY}
|
|
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varCurrency);
|
|
end;
|
|
|
|
Function LStrToCurrency(p: Pointer) : Currency;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
{$IFNDEF FPC_HAS_STR_CURRENCY}
|
|
Temp : Extended;
|
|
{$ENDIF FPC_HAS_STR_CURRENCY}
|
|
begin
|
|
if Length(AnsiString(p)) > 255 then
|
|
VariantTypeMismatch(varString, varCurrency);
|
|
|
|
s := AnsiString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
{$IFDEF FPC_HAS_STR_CURRENCY}
|
|
Val(s, Result, Error);
|
|
{$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
|
|
Val(s, Temp, Error);
|
|
Result := Temp;
|
|
{$ENDIF FPC_HAS_STR_CURRENCY}
|
|
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varCurrency);
|
|
end;
|
|
|
|
Function UStrToCurrency(p: Pointer) : Currency;
|
|
var
|
|
s : ShortString;
|
|
Error : Word;
|
|
{$IFNDEF FPC_HAS_STR_CURRENCY}
|
|
Temp : Extended;
|
|
{$ENDIF FPC_HAS_STR_CURRENCY}
|
|
begin
|
|
if Length(UnicodeString(p)) > 255 then
|
|
VariantTypeMismatch(varUString, varCurrency);
|
|
|
|
s := UnicodeString(p);
|
|
PrepareFloatStr(s);
|
|
|
|
{$IFDEF FPC_HAS_STR_CURRENCY}
|
|
Val(s, Result, Error);
|
|
{$ELSE FPC_HAS_STR_CURRENCY} { needed for platforms where Currency = Int64 }
|
|
Val(s, Temp, Error);
|
|
Result := Temp;
|
|
{$ENDIF FPC_HAS_STR_CURRENCY}
|
|
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varCurrency);
|
|
end;
|
|
|
|
Function VariantToCurrency(const VargSrc : TVarData) : Currency;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToCurrency', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := vInteger;
|
|
{$ifndef FPUNONE}
|
|
varSingle : begin
|
|
if (vSingle > MaxCurrency) or (vSingle < MinCurrency) then
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
Result := vSingle;
|
|
end;
|
|
varDouble : begin
|
|
if (vDouble > MaxCurrency) or (vDouble < MinCurrency) then
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
Result := vDouble;
|
|
end;
|
|
varDate : begin
|
|
if (vDate > MaxCurrency) or (vDate < MinCurrency) then
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
Result := vDate;
|
|
end;
|
|
{$endif}
|
|
varCurrency : Result := vCurrency;
|
|
varBoolean : Result := SmallInt(vBoolean);
|
|
varVariant : Result := VariantToCurrency(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := vInt64;
|
|
varQword : Result := currency(vQWord);
|
|
varOleStr : Result := WStrToCurrency(vOleStr);
|
|
varString : Result := LStrToCurrency(vString);
|
|
varUString : Result := UStrToCurrency(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := PInteger(vPointer)^;
|
|
{$ifndef FPUNONE}
|
|
varSingle : begin
|
|
if (PSingle(vPointer)^ > MaxCurrency) or (PSingle(vPointer)^ < MinCurrency) then
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
Result := PSingle(vPointer)^;
|
|
end;
|
|
varDouble : begin
|
|
if (PDouble(vPointer)^ > MaxCurrency) or (PDouble(vPointer)^ < MinCurrency) then
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
Result := PDouble(vPointer)^;
|
|
end;
|
|
varDate : begin
|
|
if (PDate(vPointer)^ > MaxCurrency) or (PDate(vPointer)^ < MinCurrency) then
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
Result := PDate(vPointer)^;
|
|
end;
|
|
{$endif}
|
|
varCurrency : Result := PCurrency(vPointer)^;
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToCurrency(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := PInt64(vPointer)^;
|
|
varQword : Result := currency(PQWord(vPointer)^);
|
|
varOleStr : Result := WStrToCurrency(PPointer(vPointer)^);
|
|
varString : Result := LStrToCurrency(PPointer(vPointer)^);
|
|
varUString : Result := UStrToCurrency(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varCurrency);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToCurrency -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- Date ---}
|
|
|
|
{$ifndef FPUNONE}
|
|
|
|
Function WStrToDate(p: Pointer) : TDateTime;
|
|
var
|
|
s: string;
|
|
begin
|
|
s := WideString(p);
|
|
|
|
if not (TryStrToDateTime(s, Result) or
|
|
TryStrToDate(s, Result) or
|
|
TryStrToTime(s, Result)) then
|
|
VariantTypeMismatch(varOleStr, varDate);
|
|
end;
|
|
|
|
Function LStrToDate(p: Pointer) : TDateTime;
|
|
begin
|
|
if not (TryStrToDateTime(AnsiString(p), Result) or
|
|
TryStrToDate(AnsiString(p), Result) or
|
|
TryStrToTime(AnsiString(p), Result)) then
|
|
VariantTypeMismatch(varString, varDate);
|
|
end;
|
|
|
|
Function UStrToDate(p: Pointer) : TDateTime;
|
|
begin
|
|
if not (TryStrToDateTime(UnicodeString(p), Result) or
|
|
TryStrToDate(UnicodeString(p), Result) or
|
|
TryStrToTime(UnicodeString(p), Result)) then
|
|
VariantTypeMismatch(varUString, varDate);
|
|
end;
|
|
|
|
Function VariantToDate(const VargSrc : TVarData) : TDateTime;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToDate', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := vInteger;
|
|
varSingle : Result := vSingle;
|
|
varDouble : Result := vDouble;
|
|
varCurrency : Result := vCurrency;
|
|
varDate : Result := vDate;
|
|
varBoolean : Result := SmallInt(vBoolean);
|
|
varVariant : Result := VariantToDate(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := vInt64;
|
|
varQword : Result := vQWord;
|
|
varOleStr : Result := WStrToDate(vOleStr);
|
|
varString : Result := LStrToDate(vString);
|
|
varUString : Result := UStrToDate(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varDate);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := PInteger(vPointer)^;
|
|
varSingle : Result := PSingle(vPointer)^;
|
|
varDouble : Result := PDouble(vPointer)^;
|
|
varCurrency : Result := PCurrency(vPointer)^;
|
|
varDate : Result := PDate(vPointer)^;
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToDate(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := PInt64(vPointer)^;
|
|
varQword : Result := PQWord(vPointer)^;
|
|
varOleStr : Result := WStrToDate(PPointer(vPointer)^);
|
|
varString : Result := LStrToDate(PPointer(vPointer)^);
|
|
varUString : Result := UStrToDate(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varDate);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varDate);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varDate);
|
|
end;
|
|
if (Result < MinDateTime) or (Result > MaxDateTime) then
|
|
VariantTypeMismatch(VargSrc.vType, varDate);
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToDate -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{$endif}
|
|
|
|
{--- Boolean ---}
|
|
|
|
Function WStrToBoolean(p: Pointer) : Boolean;
|
|
begin
|
|
if not TryStrToBool(WideString(p), Result) then
|
|
VariantTypeMismatch(varOleStr, varBoolean);
|
|
end;
|
|
|
|
Function LStrToBoolean(p: Pointer) : Boolean;
|
|
begin
|
|
if not TryStrToBool(AnsiString(p), Result) then
|
|
VariantTypeMismatch(varString, varBoolean);
|
|
end;
|
|
|
|
Function UStrToBoolean(p: Pointer) : Boolean;
|
|
begin
|
|
if not TryStrToBool(UnicodeString(p), Result) then
|
|
VariantTypeMismatch(varUString, varBoolean);
|
|
end;
|
|
|
|
Function VariantToBoolean(const VargSrc : TVarData) : Boolean;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToBoolean', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := False;
|
|
varSmallInt : Result := vSmallInt <> 0;
|
|
varShortInt : Result := vShortInt <> 0;
|
|
varInteger : Result := vInteger <> 0;
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := vSingle <> 0;
|
|
varDouble : Result := vDouble <> 0;
|
|
varCurrency : Result := vCurrency <> 0;
|
|
varDate : Result := vDate <> 0;
|
|
{$endif}
|
|
varBoolean : Result := vBoolean;
|
|
varVariant : Result := VariantToBoolean(PVarData(vPointer)^);
|
|
varByte : Result := vByte <> 0;
|
|
varWord : Result := vWord <> 0;
|
|
varLongWord : Result := vLongWord <> 0;
|
|
varInt64 : Result := vInt64 <> 0;
|
|
varQword : Result := vQWord <> 0;
|
|
varOleStr : Result := WStrToBoolean(vOleStr);
|
|
varString : Result := LStrToBoolean(vString);
|
|
varUString : Result := UStrToBoolean(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varBoolean);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^ <> 0;
|
|
varShortInt : Result := PShortInt(vPointer)^ <> 0;
|
|
varInteger : Result := PInteger(vPointer)^ <> 0;
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := PSingle(vPointer)^ <> 0;
|
|
varDouble : Result := PDouble(vPointer)^ <> 0;
|
|
varCurrency : Result := PCurrency(vPointer)^ <> 0;
|
|
varDate : Result := PDate(vPointer)^ <> 0;
|
|
{$endif}
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^) <> 0;
|
|
varVariant : Result := VariantToBoolean(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^ <> 0;
|
|
varWord : Result := PWord(vPointer)^ <> 0;
|
|
varLongWord : Result := PLongWord(vPointer)^ <> 0;
|
|
varInt64 : Result := PInt64(vPointer)^ <> 0;
|
|
varQword : Result := PQWord(vPointer)^ <> 0;
|
|
varOleStr : Result := WStrToBoolean(PPointer(vPointer)^);
|
|
varString : Result := LStrToBoolean(PPointer(vPointer)^);
|
|
varUString : Result := UStrToBoolean(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varBoolean);
|
|
end else { pointer is nil }
|
|
Result := False;
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varBoolean);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToBoolean -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- Byte ---}
|
|
|
|
Function WStrToByte(p: Pointer) : Byte;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varByte);
|
|
end;
|
|
|
|
Function LStrToByte(p: Pointer) : Byte;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varByte);
|
|
end;
|
|
|
|
Function UStrToByte(p: Pointer) : Byte;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varByte);
|
|
end;
|
|
|
|
Function VariantToByte(const VargSrc : TVarData) : Byte;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToByte', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := byte(vSmallInt);
|
|
varShortInt : Result := byte(vShortInt);
|
|
varInteger : Result := byte(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := byte(Round(vSingle));
|
|
varDouble : Result := byte(Round(vDouble));
|
|
varCurrency : Result := byte(Round(vCurrency));
|
|
varDate : Result := byte(Round(vDate));
|
|
{$endif}
|
|
varBoolean : Result := byte(SmallInt(vBoolean));
|
|
varVariant : Result := VariantToByte(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := byte(vWord);
|
|
varLongWord : Result := byte(vLongWord);
|
|
varInt64 : Result := byte(vInt64);
|
|
varQword : Result := byte(vQWord);
|
|
varOleStr : Result := WStrToByte(vOleStr);
|
|
varString : Result := LStrToByte(vString);
|
|
varUString : Result := UStrToByte(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varByte);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := byte(PSmallInt(vPointer)^);
|
|
varShortInt : Result := byte(PShortInt(vPointer)^);
|
|
varInteger : Result := byte(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := byte(Round(PSingle(vPointer)^));
|
|
varDouble : Result := byte(Round(PDouble(vPointer)^));
|
|
varCurrency : Result := byte(Round(PCurrency(vPointer)^));
|
|
varDate : Result := byte(Round(PDate(vPointer)^));
|
|
{$endif}
|
|
varBoolean : Result := byte(SmallInt(PWordBool(vPointer)^));
|
|
varVariant : Result := byte(VariantToByte(PVarData(vPointer)^));
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := byte(PWord(vPointer)^);
|
|
varLongWord : Result := byte(PLongWord(vPointer)^);
|
|
varInt64 : Result := byte(PInt64(vPointer)^);
|
|
varQword : Result := byte(PQWord(vPointer)^);
|
|
varOleStr : Result := WStrToByte(PPointer(vPointer)^);
|
|
varString : Result := LStrToByte(PPointer(vPointer)^);
|
|
varUString : Result := UStrToByte(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varByte);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varByte);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varByte);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToByte -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- Int64 ---}
|
|
|
|
Function WStrToInt64(p: Pointer) : Int64;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varInt64);
|
|
end;
|
|
|
|
Function LStrToInt64(p: Pointer) : Int64;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varInt64);
|
|
end;
|
|
|
|
Function UStrToInt64(p: Pointer) : Int64;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varInt64);
|
|
end;
|
|
|
|
Function VariantToInt64(const VargSrc : TVarData) : Int64;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToInt64', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := vSmallInt;
|
|
varShortInt : Result := vShortInt;
|
|
varInteger : Result := vInteger;
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := Round(vSingle);
|
|
varDouble : Result := Round(vDouble);
|
|
varCurrency : Result := Round(vCurrency);
|
|
varDate : Result := Round(vDate);
|
|
{$endif}
|
|
varBoolean : Result := SmallInt(vBoolean);
|
|
varVariant : Result := VariantToInt64(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := vInt64;
|
|
varQword : Result := int64(vQWord);
|
|
varOleStr : Result := WStrToInt64(vOleStr);
|
|
varString : Result := LStrToInt64(vString);
|
|
varUString : Result := UStrToInt64(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varInt64);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := PSmallInt(vPointer)^;
|
|
varShortInt : Result := PShortInt(vPointer)^;
|
|
varInteger : Result := PInteger(vPointer)^;
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := Round(PSingle(vPointer)^);
|
|
varDouble : Result := Round(PDouble(vPointer)^);
|
|
varCurrency : Result := Round(PCurrency(vPointer)^);
|
|
varDate : Result := Round(PDate(vPointer)^);
|
|
{$endif}
|
|
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
|
|
varVariant : Result := VariantToInt64(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := PInt64(vPointer)^;
|
|
varQword : Result := PQWord(vPointer)^;
|
|
varOleStr : Result := WStrToInt64(PPointer(vPointer)^);
|
|
varString : Result := LStrToInt64(PPointer(vPointer)^);
|
|
varUString : Result := UStrToInt64(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varInt64);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varInt64);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varInt64);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToInt64 -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- QWord ---}
|
|
|
|
Function WStrToQWord(p: Pointer) : QWord;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(WideString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varOleStr, varQWord);
|
|
end;
|
|
|
|
Function LStrToQWord(p: Pointer) : QWord;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(AnsiString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varString, varQWord);
|
|
end;
|
|
|
|
Function UStrToQWord(p: Pointer) : QWord;
|
|
var
|
|
Error : Word;
|
|
begin
|
|
Val(UnicodeString(p), Result, Error);
|
|
if Error <> 0 then
|
|
VariantTypeMismatch(varUString, varQWord);
|
|
end;
|
|
|
|
Function VariantToQWord(const VargSrc : TVarData) : QWord;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToQWord', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := 0;
|
|
varSmallInt : Result := qword(vSmallInt);
|
|
varShortInt : Result := qword(vShortInt);
|
|
varInteger : Result := qword(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := qword(Round(vSingle));
|
|
varDouble : Result := qword(Round(vDouble));
|
|
varCurrency : Result := qword(Round(vCurrency));
|
|
varDate : Result := qword(Round(vDate));
|
|
{$endif}
|
|
varBoolean : Result := qword(SmallInt(vBoolean));
|
|
varVariant : Result := VariantToQWord(PVarData(vPointer)^);
|
|
varByte : Result := vByte;
|
|
varWord : Result := vWord;
|
|
varLongWord : Result := vLongWord;
|
|
varInt64 : Result := qword(vInt64);
|
|
varQword : Result := vQWord;
|
|
varOleStr : Result := WStrToQWord(vOleStr);
|
|
varString : Result := LStrToQWord(vString);
|
|
varUString : Result := UStrToQWord(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varQWord);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := qword(PSmallInt(vPointer)^);
|
|
varShortInt : Result := qword(PShortInt(vPointer)^);
|
|
varInteger : Result := qword(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := qword(Round(PSingle(vPointer)^));
|
|
varDouble : Result := qword(Round(PDouble(vPointer)^));
|
|
varCurrency : Result := qword(Round(PCurrency(vPointer)^));
|
|
varDate : Result := qword(Round(PDate(vPointer)^));
|
|
{$endif}
|
|
varBoolean : Result := qword(SmallInt(PWordBool(vPointer)^));
|
|
varVariant : Result := VariantToQWord(PVarData(vPointer)^);
|
|
varByte : Result := PByte(vPointer)^;
|
|
varWord : Result := PWord(vPointer)^;
|
|
varLongWord : Result := PLongWord(vPointer)^;
|
|
varInt64 : Result := qword(PInt64(vPointer)^);
|
|
varQword : Result := PQWord(vPointer)^;
|
|
varOleStr : Result := WStrToQWord(PPointer(vPointer)^);
|
|
varString : Result := LStrToQWord(PPointer(vPointer)^);
|
|
varUString : Result := UStrToQWord(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varQWord);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varQWord);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varQWord);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToQWord -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- WideString ---}
|
|
|
|
Function VariantToWideString(const VargSrc : TVarData) : WideString;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToWideString', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := '';
|
|
varSmallInt : Result := IntToStr(vSmallInt);
|
|
varShortInt : Result := IntToStr(vShortInt);
|
|
varInteger : Result := IntToStr(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := FloatToStr(vSingle);
|
|
varDouble : Result := FloatToStr(vDouble);
|
|
varCurrency : Result := FloatToStr(vCurrency);
|
|
varDate : Result := FloatToStr(vDate);
|
|
{$endif}
|
|
varBoolean : Result := BoolToStr(vBoolean, True);
|
|
varVariant : Result := VariantToWideString(PVarData(vPointer)^);
|
|
varByte : Result := IntToStr(vByte);
|
|
varWord : Result := IntToStr(vWord);
|
|
varLongWord : Result := IntToStr(vLongWord);
|
|
varInt64 : Result := IntToStr(vInt64);
|
|
varQword : Result := IntToStr(vQWord);
|
|
varOleStr : Result := WideString(Pointer(vOleStr));
|
|
varString : Result := AnsiString(vString);
|
|
varUString : Result := UnicodeString(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varOleStr);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := IntToStr(PSmallInt(vPointer)^);
|
|
varShortInt : Result := IntToStr(PShortInt(vPointer)^);
|
|
varInteger : Result := IntToStr(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := FloatToStr(PSingle(vPointer)^);
|
|
varDouble : Result := FloatToStr(PDouble(vPointer)^);
|
|
varCurrency : Result := FloatToStr(PCurrency(vPointer)^);
|
|
varDate : Result := FloatToStr(PDate(vPointer)^);
|
|
{$endif}
|
|
varBoolean : Result := BoolToStr(PWordBool(vPointer)^, True);
|
|
varVariant : Result := VariantToWideString(PVarData(vPointer)^);
|
|
varByte : Result := IntToStr(PByte(vPointer)^);
|
|
varWord : Result := IntToStr(PWord(vPointer)^);
|
|
varLongWord : Result := IntToStr(PLongWord(vPointer)^);
|
|
varInt64 : Result := IntToStr(PInt64(vPointer)^);
|
|
varQword : Result := IntToStr(PQWord(vPointer)^);
|
|
varOleStr : Result := WideString(PPointer(vPointer)^);
|
|
varString : Result := AnsiString(PPointer(vPointer)^);
|
|
varUString : Result := UnicodeString(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varOleStr);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varOleStr);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varOleStr);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToWideString -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
{--- AnsiString ---}
|
|
|
|
Function VariantToAnsiString(const VargSrc : TVarData) : AnsiString;
|
|
begin
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
DumpVariant('VariantToAnsiString', VargSrc);
|
|
end; {$ENDIF}
|
|
|
|
with VargSrc do
|
|
case vType and not varTypeMask of
|
|
0: case vType of
|
|
varEmpty : Result := '';
|
|
varSmallInt : Result := IntToStr(vSmallInt);
|
|
varShortInt : Result := IntToStr(vShortInt);
|
|
varInteger : Result := IntToStr(vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := FloatToStr(vSingle);
|
|
varDouble : Result := FloatToStr(vDouble);
|
|
varCurrency : Result := FloatToStr(vCurrency);
|
|
varDate : Result := DateToStr(vDate);
|
|
{$endif}
|
|
varBoolean : Result := BoolToStr(vBoolean, True);
|
|
varVariant : Result := VariantToAnsiString(PVarData(vPointer)^);
|
|
varByte : Result := IntToStr(vByte);
|
|
varWord : Result := IntToStr(vWord);
|
|
varLongWord : Result := IntToStr(vLongWord);
|
|
varInt64 : Result := IntToStr(vInt64);
|
|
varQword : Result := IntToStr(vQWord);
|
|
varOleStr : Result := WideString(Pointer(vOleStr));
|
|
varString : Result := AnsiString(vString);
|
|
varUString : Result := UnicodeString(vString);
|
|
else
|
|
VariantTypeMismatch(vType, varString);
|
|
end;
|
|
varByRef: if Assigned(vPointer) then case vType and varTypeMask of
|
|
varSmallInt : Result := IntToStr(PSmallInt(vPointer)^);
|
|
varShortInt : Result := IntToStr(PShortInt(vPointer)^);
|
|
varInteger : Result := IntToStr(PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Result := FloatToStr(PSingle(vPointer)^);
|
|
varDouble : Result := FloatToStr(PDouble(vPointer)^);
|
|
varCurrency : Result := FloatToStr(PCurrency(vPointer)^);
|
|
varDate : Result := DateToStr(PDate(vPointer)^);
|
|
{$endif}
|
|
varBoolean : Result := BoolToStr(PWordBool(vPointer)^, True);
|
|
varVariant : Result := VariantToAnsiString(PVarData(vPointer)^);
|
|
varByte : Result := IntToStr(PByte(vPointer)^);
|
|
varWord : Result := IntToStr(PWord(vPointer)^);
|
|
varLongWord : Result := IntToStr(PLongWord(vPointer)^);
|
|
varInt64 : Result := IntToStr(PInt64(vPointer)^);
|
|
varQword : Result := IntToStr(PQWord(vPointer)^);
|
|
varOleStr : Result := WideString(PPointer(vPointer)^);
|
|
varString : Result := AnsiString(PPointer(vPointer)^);
|
|
varUString : Result := UnicodeString(PPointer(vPointer)^);
|
|
else { other vtype }
|
|
VariantTypeMismatch(vType, varString);
|
|
end else { pointer is nil }
|
|
VariantTypeMismatch(vType, varString);
|
|
else { array or something like that }
|
|
VariantTypeMismatch(vType, varString);
|
|
end;
|
|
|
|
{$IFDEF DEBUG_VARUTILS} if __DEBUG_VARUTILS then begin
|
|
WriteLn('VariantToAnsiString -> ', Result);
|
|
end; {$ENDIF}
|
|
end;
|
|
|
|
|
|
Function VariantToShortString(const VargSrc : TVarData) : ShortString;
|
|
begin
|
|
Result:=VariantToAnsiString(VargSrc);
|
|
end;
|
|
|
|
{ ---------------------------------------------------------------------
|
|
Some debug routines
|
|
---------------------------------------------------------------------}
|
|
|
|
|
|
Procedure DumpVariant(const VSrc : Variant);
|
|
begin
|
|
DumpVariant(Output, '', TVarData(VSrc));
|
|
end;
|
|
|
|
Procedure DumpVariant(const aName: string; const VSrc : Variant);
|
|
begin
|
|
DumpVariant(Output, aName, TVarData(VSrc));
|
|
end;
|
|
|
|
Procedure DumpVariant(Var F : Text; const VSrc : Variant);
|
|
begin
|
|
DumpVariant(F, '', TVarData(VSrc));
|
|
end;
|
|
|
|
procedure DumpVariant(var F : Text; const aName: string; const VSrc : Variant);
|
|
begin
|
|
DumpVariant(F, aName, TVarData(VSrc));
|
|
end;
|
|
|
|
Procedure DumpVariant(const VargSrc : TVarData);
|
|
begin
|
|
DumpVariant(Output, '', VargSrc);
|
|
end;
|
|
|
|
Procedure DumpVariant(const aName: string; const VargSrc : TVarData);
|
|
begin
|
|
DumpVariant(Output, aName, VargSrc);
|
|
end;
|
|
|
|
Procedure DumpVariant(Var F : Text; const VargSrc : TVarData);
|
|
begin
|
|
DumpVariant(F, '', VargSrc);
|
|
end;
|
|
|
|
const
|
|
VarTypeStrings : array [varEmpty..varQword] of string = (
|
|
'empty', { varempty = 0 }
|
|
'null', { varnull = 1 }
|
|
'smallint', { varsmallint = 2 }
|
|
'integer', { varinteger = 3 }
|
|
'single', { varsingle = 4 }
|
|
'double', { vardouble = 5 }
|
|
'currency', { varcurrency = 6 }
|
|
'date', { vardate = 7 }
|
|
'olestr', { varolestr = 8 }
|
|
'dispatch', { vardispatch = 9 }
|
|
'error', { varerror = 10 }
|
|
'boolean', { varboolean = 11 }
|
|
'variant', { varvariant = 12 }
|
|
'unknown', { varunknown = 13 }
|
|
'decimal', { vardecimal = 14 }
|
|
'undefined',
|
|
'shortint', { varshortint = 16 }
|
|
'byte', { varbyte = 17 }
|
|
'word', { varword = 18 }
|
|
'longword', { varlongword = 19 }
|
|
'int64', { varint64 = 20 }
|
|
'qword'); { varqword = 21 }
|
|
|
|
Procedure DumpVariant(Var F : Text; const aName: string; const VargSrc : TVarData);
|
|
|
|
Var
|
|
i: Integer;
|
|
|
|
begin
|
|
Writeln(F,'---> ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' <----------------');
|
|
with VargSrc do begin
|
|
|
|
if vType and varByRef = varByRef then
|
|
Writeln(F,'Variant is by reference.');
|
|
|
|
if vType and varArray = varArray then
|
|
Writeln(F,'Variant is an array.');
|
|
|
|
if vType and not (varTypeMask or varArray or varByRef) <> 0 then
|
|
Writeln(F,'Variant has unknown flags set in type: $', IntToHex(vType, 4));
|
|
|
|
|
|
If (vType and varTypeMask) in [varEmpty..varQword] then
|
|
Writeln(F,'Variant has type : ', VarTypeStrings[vType and varTypeMask])
|
|
else If (vType and varTypeMask) = varString then
|
|
Writeln(F,'Variant has type : string')
|
|
else if (vType and varTypeMask) = varUString then
|
|
Writeln(F,'Variant has type : UnicodeString')
|
|
else
|
|
Writeln(F,'Variant has unknown type : $', IntToHex(vType and varTypeMask, 4));
|
|
|
|
Write('Bytes :');
|
|
for i := 0 to 13 do
|
|
Write(IntToHex(VBytes[i], 2),' ');
|
|
WriteLn;
|
|
|
|
if vType and varArray = varArray then begin
|
|
Writeln(F,'---< ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' >----------------');
|
|
Writeln(F);
|
|
Exit;
|
|
end;
|
|
|
|
If vType <> varEmpty then begin
|
|
Write(F,'Value is: [');
|
|
|
|
if (vType and varByRef = varByRef) or (vType and varTypeMask = varVariant) then
|
|
if not Assigned(vPointer) then begin
|
|
WriteLn(F, 'nil]');
|
|
Writeln(F,'---< ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' >----------------');
|
|
Writeln(F);
|
|
Exit;
|
|
end;
|
|
|
|
case vType of
|
|
varNull : Write(F, 'Null');
|
|
varSmallInt : Write(F, vSmallInt);
|
|
varInteger : Write(F, vInteger);
|
|
{$ifndef FPUNONE}
|
|
varSingle : Write(F, vSingle);
|
|
varDouble : Write(F, vDouble);
|
|
varCurrency : Write(F, vCurrency);
|
|
varDate : Write(F, vDate);
|
|
{$endif}
|
|
varOleStr : Write(F, WideString(Pointer(vOleStr)));
|
|
varError : Write(F, IntToHex(Cardinal(vError), 8));
|
|
varBoolean : Write(F, vBoolean);
|
|
varVariant, varVariant or varByRef : begin
|
|
WriteLn(' dereferencing -> ]');
|
|
DumpVariant(F, aName+'^', PVarData(vPointer)^);
|
|
Exit;
|
|
end;
|
|
varShortInt : Write(F, vShortInt);
|
|
varByte : Write(F, vByte);
|
|
varWord : Write(F, vWord);
|
|
varLongWord : Write(F, vLongWord);
|
|
varInt64 : Write(F, vInt64);
|
|
varQword : Write(F, vQWord);
|
|
varString : Write(F, AnsiString(vString));
|
|
varNull or varByRef : Write(F, 'Null');
|
|
varSmallInt or varByRef : Write(F, PSmallInt(vPointer)^);
|
|
varInteger or varByRef : Write(F, PInteger(vPointer)^);
|
|
{$ifndef FPUNONE}
|
|
varSingle or varByRef : Write(F, PSingle(vPointer)^);
|
|
varDouble or varByRef : Write(F, PDouble(vPointer)^);
|
|
varCurrency or varByRef : Write(F, PCurrency(vPointer)^);
|
|
varDate or varByRef : Write(F, PDate(vPointer)^);
|
|
{$endif}
|
|
varOleStr or varByRef : Write(F, WideString(PPointer(vPointer)^));
|
|
varError or varByRef : Write(F, IntToHex(Cardinal(PLongWord(vPointer)^), 8));
|
|
varBoolean or varByRef : Write(F, PWordBool(vPointer)^);
|
|
varShortInt or varByRef : Write(F, PShortInt(vPointer)^);
|
|
varByte or varByRef : Write(F, PByte(vPointer)^);
|
|
varWord or varByRef : Write(F, PWord(vPointer)^);
|
|
varLongWord or varByRef : Write(F, PLongWord(vPointer)^);
|
|
varInt64 or varByRef : Write(F, PInt64(vPointer)^);
|
|
varQword or varByRef : Write(F, PQWord(vPointer)^);
|
|
varString or varByRef : Write(F, AnsiString(PPointer(vPointer)^));
|
|
else
|
|
Write(F, 'Unsupported');
|
|
end;
|
|
WriteLn(F, ']');
|
|
end;
|
|
end;
|
|
|
|
Writeln(F,'---< ', aName, ' at $', IntToHex(Cardinal(@VargSrc), 8), ' >----------------');
|
|
Writeln(F);
|
|
end;
|
|
|
|
|
|
|